diff --git a/boring_to_beautiful/codelab_rebuild.yaml b/boring_to_beautiful/codelab_rebuild.yaml index adb96fcf8a..c16fd18ba3 100644 --- a/boring_to_beautiful/codelab_rebuild.yaml +++ b/boring_to_beautiful/codelab_rebuild.yaml @@ -77,23 +77,21 @@ steps: com.apple.security.cs.allow-jit - + com.apple.security.network.client - + com.apple.security.network.server + + com.apple.security.network.client + + - name: Patch macos/Runner/Release.entitlements path: myartist/macos/Runner/Release.entitlements patch-u: | --- b/boring_to_beautiful/step_01/macos/Runner/Release.entitlements +++ a/boring_to_beautiful/step_01/macos/Runner/Release.entitlements - @@ -4,5 +4,9 @@ + @@ -4,5 +4,7 @@ com.apple.security.app-sandbox + com.apple.security.network.client - + - + com.apple.security.network.server + @@ -73806,12 +73804,12 @@ steps: - name: flutter doctor path: myartist flutter: doctor - - name: flutter pub run build_runner + - name: dart run build_runner build --delete-conflicting-outputs path: myartist - flutter: pub run build_runner build - - name: Format generated file + dart: run build_runner build --delete-conflicting-outputs + - name: dart analyze path: myartist - dart: format ./lib/src/shared/playback/bloc/playback_bloc.freezed.dart + dart: analyze --fatal-infos - name: Build iOS simulator bundle platforms: [macos] path: myartist @@ -73828,12 +73826,6 @@ steps: platforms: [windows] path: myartist flutter: build windows - - name: dart run build_runner build --delete-conflicting-outputs - path: myartist - dart: run build_runner build --delete-conflicting-outputs - - name: dart analyze - path: myartist - dart: analyze --fatal-infos - name: Copy step_01 copydir: from: myartist @@ -73873,17 +73865,6 @@ steps: route: '/artists', ), ]; - - name: dart analyze - path: myartist - dart: analyze --fatal-infos - - name: Copy step_02 - copydir: - from: myartist - to: step_02 - - name: step_03 - steps: - - name: Remove generated code. - rmdir: step_03 - name: Add google_fonts path: myartist flutter: pub add google_fonts @@ -73908,14 +73889,17 @@ steps: - name: dart analyze path: myartist dart: analyze --fatal-infos - - name: Copy step_03 + - name: Copy step_02 copydir: from: myartist - to: step_03 - - name: step_04 + to: step_02 + - name: Flutter clean + path: step_02 + flutter: clean + - name: step_03 steps: - name: Remove generated code. - rmdir: step_04 + rmdir: step_03 - name: Patch lib/src/shared/app.dart path: myartist/lib/src/shared/app.dart patch-u: | @@ -73960,14 +73944,17 @@ steps: - name: dart analyze path: myartist dart: analyze --fatal-infos - - name: Copy step_04 + - name: Copy step_03 copydir: from: myartist - to: step_04 - - name: step_05 + to: step_03 + - name: Flutter clean + path: step_03 + flutter: clean + - name: step_04 steps: - name: Remove generated code. - rmdir: step_05 + rmdir: step_04 - name: Patch lib/src/features/home/view/home_screen.dart path: myartist/lib/src/features/home/view/home_screen.dart patch-u: | @@ -74087,14 +74074,67 @@ steps: - name: dart analyze path: myartist dart: analyze --fatal-infos - - name: Copy step_05 + - name: Copy step_04 copydir: from: myartist - to: step_05 - - name: step_06 + to: step_04 + - name: Flutter clean + path: step_04 + flutter: clean + - name: step_05_a steps: - name: Remove generated code. - rmdir: step_06 + rmdir: step_05_a + - name: Patch lib/src/features/home/view/home_screen.dart + path: myartist/lib/src/features/home/view/home_screen.dart + patch-u: | + --- b/boring_to_beautiful/step_05_a/lib/src/features/home/view/home_screen.dart + +++ a/boring_to_beautiful/step_05_a/lib/src/features/home/view/home_screen.dart + @@ -81,7 +81,7 @@ class _HomeScreenState extends State { + AdaptiveContainer( + columnSpan: 12, + child: Padding( + - padding: const EdgeInsets.all(2), + + padding: const EdgeInsets.all(35), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + @@ -117,7 +117,7 @@ class _HomeScreenState extends State { + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + - padding: const EdgeInsets.all(2), + + padding: const EdgeInsets.all(35), + child: Text( + 'Recently played', + style: context.headlineSmall, + @@ -130,7 +130,7 @@ class _HomeScreenState extends State { + AdaptiveContainer( + columnSpan: 12, + child: Padding( + - padding: const EdgeInsets.all(2), + + padding: const EdgeInsets.all(35), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + @@ -141,7 +141,7 @@ class _HomeScreenState extends State { + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + - padding: const EdgeInsets.all(2), + + padding: const EdgeInsets.all(35), + child: Text( + 'Top Songs Today', + style: context.titleLarge, + @@ -164,7 +164,7 @@ class _HomeScreenState extends State { + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + - padding: const EdgeInsets.all(2), + + padding: const EdgeInsets.all(35), + child: Text( + 'New Releases', + style: context.titleLarge, - name: Patch lib/src/features/home/view/home_highlight.dart path: myartist/lib/src/features/home/view/home_highlight.dart patch-u: | @@ -74109,16 +74149,57 @@ steps: child: Clickable( child: SizedBox( height: 275, + - name: dart analyze + path: myartist + dart: analyze --fatal-infos + - name: Copy step_05_a + copydir: + from: myartist + to: step_05_a + - name: Flutter clean + path: step_05_a + flutter: clean + - name: step_05_b + steps: + - name: Remove generated code. + rmdir: step_05_b + - name: Patch lib/src/features/home/view/home_screen.dart + path: myartist/lib/src/features/home/view/home_screen.dart + patch-u: | + --- b/boring_to_beautiful/step_05_b/lib/src/features/home/view/home_screen.dart + +++ a/boring_to_beautiful/step_05_b/lib/src/features/home/view/home_screen.dart + @@ -157,6 +157,7 @@ class _HomeScreenState extends State { + ], + ), + ), + + const SizedBox(width: 35), + Flexible( + flex: 10, + child: Column( + - name: dart analyze + path: myartist + dart: analyze --fatal-infos + - name: Copy step_05_b + copydir: + from: myartist + to: step_05_b + - name: Flutter clean + path: step_05_b + flutter: clean + - name: step_05_c + steps: + - name: Remove generated code. + rmdir: step_05_c - name: Patch lib/src/features/home/view/home_screen.dart path: myartist/lib/src/features/home/view/home_screen.dart patch-u: | - --- b/boring_to_beautiful/step_06/lib/src/features/home/view/home_screen.dart - +++ a/boring_to_beautiful/step_06/lib/src/features/home/view/home_screen.dart + --- b/boring_to_beautiful/step_05_c/lib/src/features/home/view/home_screen.dart + +++ a/boring_to_beautiful/step_05_c/lib/src/features/home/view/home_screen.dart @@ -81,7 +81,7 @@ class _HomeScreenState extends State { AdaptiveContainer( columnSpan: 12, child: Padding( - - padding: const EdgeInsets.all(2), + - padding: const EdgeInsets.all(35), + padding: const EdgeInsets.fromLTRB(20, 25, 20, 10), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -74127,7 +74208,7 @@ steps: crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - - padding: const EdgeInsets.all(2), + - padding: const EdgeInsets.all(35), + padding: const EdgeInsets.symmetric( + horizontal: 15, + vertical: 10, @@ -74139,7 +74220,7 @@ steps: AdaptiveContainer( columnSpan: 12, child: Padding( - - padding: const EdgeInsets.all(2), + - padding: const EdgeInsets.all(35), + padding: const EdgeInsets.all(15), child: Row( crossAxisAlignment: CrossAxisAlignment.start, @@ -74148,7 +74229,7 @@ steps: crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - - padding: const EdgeInsets.all(2), + - padding: const EdgeInsets.all(35), + padding: const EdgeInsets.only( + left: 8, + bottom: 8, @@ -74156,19 +74237,20 @@ steps: child: Text( 'Top Songs Today', style: context.titleLarge, - @@ -157,6 +163,7 @@ class _HomeScreenState extends State { + @@ -157,7 +163,7 @@ class _HomeScreenState extends State { ], ), ), + - const SizedBox(width: 35), + const SizedBox(width: 25), Flexible( flex: 10, child: Column( - @@ -164,7 +171,10 @@ class _HomeScreenState extends State { + @@ -165,7 +171,10 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - - padding: const EdgeInsets.all(2), + - padding: const EdgeInsets.all(35), + padding: const EdgeInsets.only( + left: 8, + bottom: 8, @@ -74176,17 +74258,34 @@ steps: child: Text( 'New Releases', style: context.titleLarge, + - name: Patch lib/src/features/home/view/home_highlight.dart + path: myartist/lib/src/features/home/view/home_highlight.dart + patch-u: | + --- b/boring_to_beautiful/step_05_c/lib/src/features/home/view/home_highlight.dart + +++ a/boring_to_beautiful/step_05_c/lib/src/features/home/view/home_highlight.dart + @@ -16,7 +16,7 @@ class HomeHighlight extends StatelessWidget { + children: [ + Expanded( + child: Padding( + - padding: const EdgeInsets.all(15), + + padding: const EdgeInsets.symmetric(horizontal: 35, vertical: 5), + child: Clickable( + child: SizedBox( + height: 275, - name: dart analyze path: myartist dart: analyze --fatal-infos - - name: Copy step_06 + - name: Copy step_05_c copydir: from: myartist - to: step_06 - - name: step_07 + to: step_05_c + - name: Flutter clean + path: step_05_c + flutter: clean + - name: step_06 steps: - name: Remove generated code. - rmdir: step_07 + rmdir: step_06 - name: Patch lib/src/shared/providers/theme.dart path: myartist/lib/src/shared/providers/theme.dart patch-u: | @@ -74211,14 +74310,17 @@ steps: - name: dart analyze path: myartist dart: analyze --fatal-infos - - name: Copy step_07 + - name: Copy step_06 copydir: from: myartist - to: step_07 - - name: final + to: step_06 + - name: Flutter clean + path: step_06 + flutter: clean + - name: step_07 steps: - name: Remove generated code. - rmdir: final + rmdir: step_07 - name: Patch lib/src/features/playlists/view/playlist_songs.dart path: myartist/lib/src/features/playlists/view/playlist_songs.dart patch-u: | @@ -74331,12 +74433,12 @@ steps: - name: Build Web app path: myartist flutter: build web - - name: Copy final + - name: Copy step_07 copydir: from: myartist - to: final + to: step_07 - name: Flutter clean - path: final + path: step_07 flutter: clean - name: Cleanup rmdir: myartist diff --git a/boring_to_beautiful/final/lib/src/shared/views/outlined_card.dart b/boring_to_beautiful/final/lib/src/shared/views/outlined_card.dart deleted file mode 100644 index 1523f99587..0000000000 --- a/boring_to_beautiful/final/lib/src/shared/views/outlined_card.dart +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2022 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter/material.dart'; - -class OutlinedCard extends StatefulWidget { - const OutlinedCard({super.key, required this.child, this.clickable = true}); - - final Widget child; - final bool clickable; - - @override - State createState() => _OutlinedCardState(); -} - -class _OutlinedCardState extends State { - bool _hovered = false; - - @override - Widget build(BuildContext context) { - final borderRadius = BorderRadius.circular(_hovered ? 20 : 8); - const animationCurve = Curves.easeInOut; - return MouseRegion( - onEnter: (_) { - if (!widget.clickable) return; - setState(() { - _hovered = true; - }); - }, - onExit: (_) { - if (!widget.clickable) return; - setState(() { - _hovered = false; - }); - }, - cursor: widget.clickable - ? SystemMouseCursors.click - : SystemMouseCursors.basic, - child: AnimatedContainer( - duration: kThemeAnimationDuration, - curve: animationCurve, - decoration: BoxDecoration( - border: Border.all( - color: Theme.of(context).colorScheme.outline, - width: 1, - ), - borderRadius: borderRadius, - ), - foregroundDecoration: BoxDecoration( - color: Theme.of( - context, - ).colorScheme.onSurface.withAlpha(_hovered ? 30 : 0), - borderRadius: borderRadius, - ), - child: TweenAnimationBuilder( - duration: kThemeAnimationDuration, - curve: animationCurve, - tween: Tween(begin: BorderRadius.zero, end: borderRadius), - builder: (context, borderRadius, child) => ClipRRect( - clipBehavior: Clip.antiAlias, - borderRadius: borderRadius, - child: child, - ), - child: widget.child, - ), - ), - ); - } -} diff --git a/boring_to_beautiful/step_01/ios/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_01/ios/Runner.xcodeproj/project.pbxproj index ebb1244e8b..c30322fdf6 100644 --- a/boring_to_beautiful/step_01/ios/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_01/ios/Runner.xcodeproj/project.pbxproj @@ -7,15 +7,15 @@ objects = { /* Begin PBXBuildFile section */ - 0BA3C72CFF7FB3D58116BBE0 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 28D4EB9BC109C11A38856D7C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */; }; + 31AC9F1F861163CE474DC0DF /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BA15459E839D3553B26934 /* Pods_Runner.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 */; }; + C4EE9B5B592653F634344186 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,20 +42,18 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 018597106C8E38C2A20B56DC /* 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 = ""; }; - 1454C98E0DB9BDD277830752 /* 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 = ""; }; + 06C27BF5D7B993BB5DCB8D21 /* 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 = ""; }; 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 = ""; }; - 164233455F6E52D976E7619C /* 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 = ""; }; - 203DA535161F6F2E1631CA2F /* 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 = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3421F167A26D263533D9C0F8 /* 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 = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4ABA081B421BEA588642248C /* 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 = ""; }; 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 = ""; }; - 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8367A59A9CDAA6556FC2822B /* 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 = ""; }; 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; }; @@ -63,8 +61,10 @@ 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 = ""; }; - E367CC7226100F29F71405B1 /* 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 = ""; }; - FAB89AD13AACCB9650BBE6EA /* 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 = ""; }; + 9BB58392A543FF4660B2490F /* 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 = ""; }; + D0BA15459E839D3553B26934 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F7B65A9BC4B475ABEC573986 /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,15 +72,15 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 28D4EB9BC109C11A38856D7C /* Pods_Runner.framework in Frameworks */, + 31AC9F1F861163CE474DC0DF /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - BFB82CA3C890A718124E1EDE /* Frameworks */ = { + F9E0A4607079935C37BF168F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0BA3C72CFF7FB3D58116BBE0 /* Pods_RunnerTests.framework in Frameworks */, + C4EE9B5B592653F634344186 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 7A1ACBFB4AEFAC5081D802E1 /* Pods */ = { + 44BD8D06CB822F8C423FCD72 /* Pods */ = { isa = PBXGroup; children = ( - E367CC7226100F29F71405B1 /* Pods-Runner.debug.xcconfig */, - 1454C98E0DB9BDD277830752 /* Pods-Runner.release.xcconfig */, - 203DA535161F6F2E1631CA2F /* Pods-Runner.profile.xcconfig */, - FAB89AD13AACCB9650BBE6EA /* Pods-RunnerTests.debug.xcconfig */, - 018597106C8E38C2A20B56DC /* Pods-RunnerTests.release.xcconfig */, - 164233455F6E52D976E7619C /* Pods-RunnerTests.profile.xcconfig */, + 3421F167A26D263533D9C0F8 /* Pods-Runner.debug.xcconfig */, + 8367A59A9CDAA6556FC2822B /* Pods-Runner.release.xcconfig */, + 06C27BF5D7B993BB5DCB8D21 /* Pods-Runner.profile.xcconfig */, + F7B65A9BC4B475ABEC573986 /* Pods-RunnerTests.debug.xcconfig */, + 4ABA081B421BEA588642248C /* Pods-RunnerTests.release.xcconfig */, + 9BB58392A543FF4660B2490F /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 7A1ACBFB4AEFAC5081D802E1 /* Pods */, - AD091A7825928A7EC8BC6AD6 /* Frameworks */, + 44BD8D06CB822F8C423FCD72 /* Pods */, + D054066A4956E2C378EF4A32 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - AD091A7825928A7EC8BC6AD6 /* Frameworks */ = { + D054066A4956E2C378EF4A32 /* Frameworks */ = { isa = PBXGroup; children = ( - 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */, - 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */, + D0BA15459E839D3553B26934 /* Pods_Runner.framework */, + E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D8787C4471D00A25C41EA2CB /* [CP] Check Pods Manifest.lock */, + 001D1E85333DF9609D34BC08 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - BFB82CA3C890A718124E1EDE /* Frameworks */, + F9E0A4607079935C37BF168F /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 62E6FB6D8F5E3A7C56D8737D /* [CP] Check Pods Manifest.lock */, + 1975AD24A5DD7DE3F4DE1B61 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 72DCD364ECC5EFBE76A41B99 /* [CP] Embed Pods Frameworks */, + 26E7569DC25C33E17720D218 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,23 +270,29 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 001D1E85333DF9609D34BC08 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + 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; }; - 62E6FB6D8F5E3A7C56D8737D /* [CP] Check Pods Manifest.lock */ = { + 1975AD24A5DD7DE3F4DE1B61 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -308,7 +314,7 @@ 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; }; - 72DCD364ECC5EFBE76A41B99 /* [CP] Embed Pods Frameworks */ = { + 26E7569DC25C33E17720D218 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -325,42 +331,36 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); - name = "Run Script"; + name = "Thin Binary"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - D8787C4471D00A25C41EA2CB /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; 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; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FAB89AD13AACCB9650BBE6EA /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = F7B65A9BC4B475ABEC573986 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 018597106C8E38C2A20B56DC /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 4ABA081B421BEA588642248C /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 164233455F6E52D976E7619C /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 9BB58392A543FF4660B2490F /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/boring_to_beautiful/step_01/macos/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_01/macos/Runner.xcodeproj/project.pbxproj index 6ae862c37d..79fced16c3 100644 --- a/boring_to_beautiful/step_01/macos/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_01/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 120C1A7E7D320A31C1211A4A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 6A705DC52900C471DF6E1EC6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */; }; - 9AEA2C669381F3905C501B66 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */; }; + E344FE031826102CEDE46647 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,7 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 049E4603B0A09E05087E56FA /* 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 = ""; }; + 2BCC07C46EB4E01CE044DBB6 /* 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 = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -79,15 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 54CECCDD830654297CBE27CA /* 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 = ""; }; + 3E5DC3FB470EEF77149E71DD /* 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 = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 93864140E5DDD8350C71D815 /* 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 = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 9FFE8F2CDA409CA0E1B27D98 /* 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 = ""; }; - A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CE866162E3EE650EB52F3385 /* 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 = ""; }; - DF7AD973C56F21946082FE37 /* 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 = ""; }; - E9D755A13E508067E98F3444 /* 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 = ""; }; + 9B293DEC88BD59786AD94EBD /* 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 = ""; }; + AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EEFA0ABEA58A1E38E7AD7041 /* 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 = ""; }; + FDBDA46A6FE6381EE95E5A7A /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9AEA2C669381F3905C501B66 /* Pods_RunnerTests.framework in Frameworks */, + 120C1A7E7D320A31C1211A4A /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6A705DC52900C471DF6E1EC6 /* Pods_Runner.framework in Frameworks */, + E344FE031826102CEDE46647 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - D3381829CD41C2D96B6F2B3E /* Pods */, + 6CDFAAD29A585E1E7DFB128C /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - D3381829CD41C2D96B6F2B3E /* Pods */ = { + 6CDFAAD29A585E1E7DFB128C /* Pods */ = { isa = PBXGroup; children = ( - E9D755A13E508067E98F3444 /* Pods-Runner.debug.xcconfig */, - CE866162E3EE650EB52F3385 /* Pods-Runner.release.xcconfig */, - DF7AD973C56F21946082FE37 /* Pods-Runner.profile.xcconfig */, - 9FFE8F2CDA409CA0E1B27D98 /* Pods-RunnerTests.debug.xcconfig */, - 049E4603B0A09E05087E56FA /* Pods-RunnerTests.release.xcconfig */, - 54CECCDD830654297CBE27CA /* Pods-RunnerTests.profile.xcconfig */, + 3E5DC3FB470EEF77149E71DD /* Pods-Runner.debug.xcconfig */, + 2BCC07C46EB4E01CE044DBB6 /* Pods-Runner.release.xcconfig */, + 9B293DEC88BD59786AD94EBD /* Pods-Runner.profile.xcconfig */, + 93864140E5DDD8350C71D815 /* Pods-RunnerTests.debug.xcconfig */, + FDBDA46A6FE6381EE95E5A7A /* Pods-RunnerTests.release.xcconfig */, + EEFA0ABEA58A1E38E7AD7041 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */, - A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */, + E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */, + AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - C59A11FAACC96E6D468156D2 /* [CP] Check Pods Manifest.lock */, + 36CFF57A21336FA90DED8C50 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 33528B7408CACCE07D6DAD0F /* [CP] Check Pods Manifest.lock */, + 41EDDA96C09EE65F003D69E0 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - C6A4842BF1A9A85A617B12E2 /* [CP] Embed Pods Frameworks */, + 0F169C1C0F5EE8E3D274E72F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,26 +323,21 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 33528B7408CACCE07D6DAD0F /* [CP] Check Pods Manifest.lock */ = { + 0F169C1C0F5EE8E3D274E72F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); 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"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 3399D490228B24CF009A79C7 /* ShellScript */ = { @@ -383,7 +378,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - C59A11FAACC96E6D468156D2 /* [CP] Check Pods Manifest.lock */ = { + 36CFF57A21336FA90DED8C50 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -405,21 +400,26 @@ 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; }; - C6A4842BF1A9A85A617B12E2 /* [CP] Embed Pods Frameworks */ = { + 41EDDA96C09EE65F003D69E0 /* [CP] Check Pods Manifest.lock */ = { 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"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + 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; }; /* End PBXShellScriptBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9FFE8F2CDA409CA0E1B27D98 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 93864140E5DDD8350C71D815 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 049E4603B0A09E05087E56FA /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = FDBDA46A6FE6381EE95E5A7A /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 54CECCDD830654297CBE27CA /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = EEFA0ABEA58A1E38E7AD7041 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/boring_to_beautiful/step_01/macos/Runner/DebugProfile.entitlements b/boring_to_beautiful/step_01/macos/Runner/DebugProfile.entitlements index 3ba6c1266f..08c3ab17cc 100644 --- a/boring_to_beautiful/step_01/macos/Runner/DebugProfile.entitlements +++ b/boring_to_beautiful/step_01/macos/Runner/DebugProfile.entitlements @@ -6,9 +6,9 @@ com.apple.security.cs.allow-jit - com.apple.security.network.client - com.apple.security.network.server + com.apple.security.network.client + diff --git a/boring_to_beautiful/step_01/macos/Runner/Release.entitlements b/boring_to_beautiful/step_01/macos/Runner/Release.entitlements index 7a2230dc33..ee95ab7e58 100644 --- a/boring_to_beautiful/step_01/macos/Runner/Release.entitlements +++ b/boring_to_beautiful/step_01/macos/Runner/Release.entitlements @@ -6,7 +6,5 @@ com.apple.security.network.client - com.apple.security.network.server - diff --git a/boring_to_beautiful/step_01/pubspec.yaml b/boring_to_beautiful/step_01/pubspec.yaml index f5f445fc3a..c05ce106e8 100644 --- a/boring_to_beautiful/step_01/pubspec.yaml +++ b/boring_to_beautiful/step_01/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: english_words: ^4.0.0 flutter_bloc: ^9.1.1 freezed_annotation: ^3.0.0 - go_router: ^15.1.2 + go_router: ^15.1.3 material_color_utilities: any universal_platform: ^1.1.0 url_launcher: ^6.3.1 diff --git a/boring_to_beautiful/step_02/ios/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_02/ios/Runner.xcodeproj/project.pbxproj index ebb1244e8b..c30322fdf6 100644 --- a/boring_to_beautiful/step_02/ios/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_02/ios/Runner.xcodeproj/project.pbxproj @@ -7,15 +7,15 @@ objects = { /* Begin PBXBuildFile section */ - 0BA3C72CFF7FB3D58116BBE0 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 28D4EB9BC109C11A38856D7C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */; }; + 31AC9F1F861163CE474DC0DF /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BA15459E839D3553B26934 /* Pods_Runner.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 */; }; + C4EE9B5B592653F634344186 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,20 +42,18 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 018597106C8E38C2A20B56DC /* 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 = ""; }; - 1454C98E0DB9BDD277830752 /* 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 = ""; }; + 06C27BF5D7B993BB5DCB8D21 /* 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 = ""; }; 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 = ""; }; - 164233455F6E52D976E7619C /* 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 = ""; }; - 203DA535161F6F2E1631CA2F /* 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 = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3421F167A26D263533D9C0F8 /* 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 = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4ABA081B421BEA588642248C /* 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 = ""; }; 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 = ""; }; - 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8367A59A9CDAA6556FC2822B /* 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 = ""; }; 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; }; @@ -63,8 +61,10 @@ 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 = ""; }; - E367CC7226100F29F71405B1 /* 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 = ""; }; - FAB89AD13AACCB9650BBE6EA /* 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 = ""; }; + 9BB58392A543FF4660B2490F /* 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 = ""; }; + D0BA15459E839D3553B26934 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F7B65A9BC4B475ABEC573986 /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,15 +72,15 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 28D4EB9BC109C11A38856D7C /* Pods_Runner.framework in Frameworks */, + 31AC9F1F861163CE474DC0DF /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - BFB82CA3C890A718124E1EDE /* Frameworks */ = { + F9E0A4607079935C37BF168F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0BA3C72CFF7FB3D58116BBE0 /* Pods_RunnerTests.framework in Frameworks */, + C4EE9B5B592653F634344186 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 7A1ACBFB4AEFAC5081D802E1 /* Pods */ = { + 44BD8D06CB822F8C423FCD72 /* Pods */ = { isa = PBXGroup; children = ( - E367CC7226100F29F71405B1 /* Pods-Runner.debug.xcconfig */, - 1454C98E0DB9BDD277830752 /* Pods-Runner.release.xcconfig */, - 203DA535161F6F2E1631CA2F /* Pods-Runner.profile.xcconfig */, - FAB89AD13AACCB9650BBE6EA /* Pods-RunnerTests.debug.xcconfig */, - 018597106C8E38C2A20B56DC /* Pods-RunnerTests.release.xcconfig */, - 164233455F6E52D976E7619C /* Pods-RunnerTests.profile.xcconfig */, + 3421F167A26D263533D9C0F8 /* Pods-Runner.debug.xcconfig */, + 8367A59A9CDAA6556FC2822B /* Pods-Runner.release.xcconfig */, + 06C27BF5D7B993BB5DCB8D21 /* Pods-Runner.profile.xcconfig */, + F7B65A9BC4B475ABEC573986 /* Pods-RunnerTests.debug.xcconfig */, + 4ABA081B421BEA588642248C /* Pods-RunnerTests.release.xcconfig */, + 9BB58392A543FF4660B2490F /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 7A1ACBFB4AEFAC5081D802E1 /* Pods */, - AD091A7825928A7EC8BC6AD6 /* Frameworks */, + 44BD8D06CB822F8C423FCD72 /* Pods */, + D054066A4956E2C378EF4A32 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - AD091A7825928A7EC8BC6AD6 /* Frameworks */ = { + D054066A4956E2C378EF4A32 /* Frameworks */ = { isa = PBXGroup; children = ( - 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */, - 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */, + D0BA15459E839D3553B26934 /* Pods_Runner.framework */, + E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D8787C4471D00A25C41EA2CB /* [CP] Check Pods Manifest.lock */, + 001D1E85333DF9609D34BC08 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - BFB82CA3C890A718124E1EDE /* Frameworks */, + F9E0A4607079935C37BF168F /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 62E6FB6D8F5E3A7C56D8737D /* [CP] Check Pods Manifest.lock */, + 1975AD24A5DD7DE3F4DE1B61 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 72DCD364ECC5EFBE76A41B99 /* [CP] Embed Pods Frameworks */, + 26E7569DC25C33E17720D218 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,23 +270,29 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 001D1E85333DF9609D34BC08 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + 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; }; - 62E6FB6D8F5E3A7C56D8737D /* [CP] Check Pods Manifest.lock */ = { + 1975AD24A5DD7DE3F4DE1B61 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -308,7 +314,7 @@ 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; }; - 72DCD364ECC5EFBE76A41B99 /* [CP] Embed Pods Frameworks */ = { + 26E7569DC25C33E17720D218 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -325,42 +331,36 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); - name = "Run Script"; + name = "Thin Binary"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - D8787C4471D00A25C41EA2CB /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; 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; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FAB89AD13AACCB9650BBE6EA /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = F7B65A9BC4B475ABEC573986 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 018597106C8E38C2A20B56DC /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 4ABA081B421BEA588642248C /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 164233455F6E52D976E7619C /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 9BB58392A543FF4660B2490F /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/boring_to_beautiful/step_02/lib/src/shared/extensions.dart b/boring_to_beautiful/step_02/lib/src/shared/extensions.dart index 0d51f11a24..fe65add57c 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/extensions.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/extensions.dart @@ -3,10 +3,11 @@ // found in the LICENSE file. import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; extension TypographyUtils on BuildContext { ThemeData get theme => Theme.of(this); - TextTheme get textTheme => theme.textTheme; + TextTheme get textTheme => GoogleFonts.montserratTextTheme(theme.textTheme); ColorScheme get colors => theme.colorScheme; TextStyle? get displayLarge => textTheme.displayLarge?.copyWith(color: colors.onSurface); diff --git a/boring_to_beautiful/step_02/macos/Flutter/GeneratedPluginRegistrant.swift b/boring_to_beautiful/step_02/macos/Flutter/GeneratedPluginRegistrant.swift index e79d7f5452..b79b17e327 100644 --- a/boring_to_beautiful/step_02/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/boring_to_beautiful/step_02/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,10 +7,12 @@ import Foundation import desktop_window import dynamic_color +import path_provider_foundation import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { DesktopWindowPlugin.register(with: registry.registrar(forPlugin: "DesktopWindowPlugin")) DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) } diff --git a/boring_to_beautiful/step_02/macos/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_02/macos/Runner.xcodeproj/project.pbxproj index 6ae862c37d..79fced16c3 100644 --- a/boring_to_beautiful/step_02/macos/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_02/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 120C1A7E7D320A31C1211A4A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 6A705DC52900C471DF6E1EC6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */; }; - 9AEA2C669381F3905C501B66 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */; }; + E344FE031826102CEDE46647 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,7 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 049E4603B0A09E05087E56FA /* 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 = ""; }; + 2BCC07C46EB4E01CE044DBB6 /* 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 = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -79,15 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 54CECCDD830654297CBE27CA /* 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 = ""; }; + 3E5DC3FB470EEF77149E71DD /* 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 = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 93864140E5DDD8350C71D815 /* 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 = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 9FFE8F2CDA409CA0E1B27D98 /* 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 = ""; }; - A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CE866162E3EE650EB52F3385 /* 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 = ""; }; - DF7AD973C56F21946082FE37 /* 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 = ""; }; - E9D755A13E508067E98F3444 /* 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 = ""; }; + 9B293DEC88BD59786AD94EBD /* 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 = ""; }; + AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EEFA0ABEA58A1E38E7AD7041 /* 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 = ""; }; + FDBDA46A6FE6381EE95E5A7A /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9AEA2C669381F3905C501B66 /* Pods_RunnerTests.framework in Frameworks */, + 120C1A7E7D320A31C1211A4A /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6A705DC52900C471DF6E1EC6 /* Pods_Runner.framework in Frameworks */, + E344FE031826102CEDE46647 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - D3381829CD41C2D96B6F2B3E /* Pods */, + 6CDFAAD29A585E1E7DFB128C /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - D3381829CD41C2D96B6F2B3E /* Pods */ = { + 6CDFAAD29A585E1E7DFB128C /* Pods */ = { isa = PBXGroup; children = ( - E9D755A13E508067E98F3444 /* Pods-Runner.debug.xcconfig */, - CE866162E3EE650EB52F3385 /* Pods-Runner.release.xcconfig */, - DF7AD973C56F21946082FE37 /* Pods-Runner.profile.xcconfig */, - 9FFE8F2CDA409CA0E1B27D98 /* Pods-RunnerTests.debug.xcconfig */, - 049E4603B0A09E05087E56FA /* Pods-RunnerTests.release.xcconfig */, - 54CECCDD830654297CBE27CA /* Pods-RunnerTests.profile.xcconfig */, + 3E5DC3FB470EEF77149E71DD /* Pods-Runner.debug.xcconfig */, + 2BCC07C46EB4E01CE044DBB6 /* Pods-Runner.release.xcconfig */, + 9B293DEC88BD59786AD94EBD /* Pods-Runner.profile.xcconfig */, + 93864140E5DDD8350C71D815 /* Pods-RunnerTests.debug.xcconfig */, + FDBDA46A6FE6381EE95E5A7A /* Pods-RunnerTests.release.xcconfig */, + EEFA0ABEA58A1E38E7AD7041 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */, - A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */, + E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */, + AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - C59A11FAACC96E6D468156D2 /* [CP] Check Pods Manifest.lock */, + 36CFF57A21336FA90DED8C50 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 33528B7408CACCE07D6DAD0F /* [CP] Check Pods Manifest.lock */, + 41EDDA96C09EE65F003D69E0 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - C6A4842BF1A9A85A617B12E2 /* [CP] Embed Pods Frameworks */, + 0F169C1C0F5EE8E3D274E72F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,26 +323,21 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 33528B7408CACCE07D6DAD0F /* [CP] Check Pods Manifest.lock */ = { + 0F169C1C0F5EE8E3D274E72F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); 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"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 3399D490228B24CF009A79C7 /* ShellScript */ = { @@ -383,7 +378,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - C59A11FAACC96E6D468156D2 /* [CP] Check Pods Manifest.lock */ = { + 36CFF57A21336FA90DED8C50 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -405,21 +400,26 @@ 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; }; - C6A4842BF1A9A85A617B12E2 /* [CP] Embed Pods Frameworks */ = { + 41EDDA96C09EE65F003D69E0 /* [CP] Check Pods Manifest.lock */ = { 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"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + 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; }; /* End PBXShellScriptBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9FFE8F2CDA409CA0E1B27D98 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 93864140E5DDD8350C71D815 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 049E4603B0A09E05087E56FA /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = FDBDA46A6FE6381EE95E5A7A /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 54CECCDD830654297CBE27CA /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = EEFA0ABEA58A1E38E7AD7041 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/boring_to_beautiful/step_02/macos/Runner/DebugProfile.entitlements b/boring_to_beautiful/step_02/macos/Runner/DebugProfile.entitlements index 3ba6c1266f..08c3ab17cc 100644 --- a/boring_to_beautiful/step_02/macos/Runner/DebugProfile.entitlements +++ b/boring_to_beautiful/step_02/macos/Runner/DebugProfile.entitlements @@ -6,9 +6,9 @@ com.apple.security.cs.allow-jit - com.apple.security.network.client - com.apple.security.network.server + com.apple.security.network.client + diff --git a/boring_to_beautiful/step_02/macos/Runner/Release.entitlements b/boring_to_beautiful/step_02/macos/Runner/Release.entitlements index 7a2230dc33..ee95ab7e58 100644 --- a/boring_to_beautiful/step_02/macos/Runner/Release.entitlements +++ b/boring_to_beautiful/step_02/macos/Runner/Release.entitlements @@ -6,7 +6,5 @@ com.apple.security.network.client - com.apple.security.network.server - diff --git a/boring_to_beautiful/step_02/pubspec.yaml b/boring_to_beautiful/step_02/pubspec.yaml index f5f445fc3a..817f7d00c0 100644 --- a/boring_to_beautiful/step_02/pubspec.yaml +++ b/boring_to_beautiful/step_02/pubspec.yaml @@ -17,10 +17,11 @@ dependencies: english_words: ^4.0.0 flutter_bloc: ^9.1.1 freezed_annotation: ^3.0.0 - go_router: ^15.1.2 + go_router: ^15.1.3 material_color_utilities: any universal_platform: ^1.1.0 url_launcher: ^6.3.1 + google_fonts: ^6.2.1 dev_dependencies: flutter_test: diff --git a/boring_to_beautiful/step_03/ios/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_03/ios/Runner.xcodeproj/project.pbxproj index ebb1244e8b..c30322fdf6 100644 --- a/boring_to_beautiful/step_03/ios/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_03/ios/Runner.xcodeproj/project.pbxproj @@ -7,15 +7,15 @@ objects = { /* Begin PBXBuildFile section */ - 0BA3C72CFF7FB3D58116BBE0 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 28D4EB9BC109C11A38856D7C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */; }; + 31AC9F1F861163CE474DC0DF /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BA15459E839D3553B26934 /* Pods_Runner.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 */; }; + C4EE9B5B592653F634344186 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,20 +42,18 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 018597106C8E38C2A20B56DC /* 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 = ""; }; - 1454C98E0DB9BDD277830752 /* 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 = ""; }; + 06C27BF5D7B993BB5DCB8D21 /* 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 = ""; }; 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 = ""; }; - 164233455F6E52D976E7619C /* 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 = ""; }; - 203DA535161F6F2E1631CA2F /* 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 = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3421F167A26D263533D9C0F8 /* 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 = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4ABA081B421BEA588642248C /* 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 = ""; }; 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 = ""; }; - 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8367A59A9CDAA6556FC2822B /* 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 = ""; }; 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; }; @@ -63,8 +61,10 @@ 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 = ""; }; - E367CC7226100F29F71405B1 /* 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 = ""; }; - FAB89AD13AACCB9650BBE6EA /* 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 = ""; }; + 9BB58392A543FF4660B2490F /* 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 = ""; }; + D0BA15459E839D3553B26934 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F7B65A9BC4B475ABEC573986 /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,15 +72,15 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 28D4EB9BC109C11A38856D7C /* Pods_Runner.framework in Frameworks */, + 31AC9F1F861163CE474DC0DF /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - BFB82CA3C890A718124E1EDE /* Frameworks */ = { + F9E0A4607079935C37BF168F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0BA3C72CFF7FB3D58116BBE0 /* Pods_RunnerTests.framework in Frameworks */, + C4EE9B5B592653F634344186 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 7A1ACBFB4AEFAC5081D802E1 /* Pods */ = { + 44BD8D06CB822F8C423FCD72 /* Pods */ = { isa = PBXGroup; children = ( - E367CC7226100F29F71405B1 /* Pods-Runner.debug.xcconfig */, - 1454C98E0DB9BDD277830752 /* Pods-Runner.release.xcconfig */, - 203DA535161F6F2E1631CA2F /* Pods-Runner.profile.xcconfig */, - FAB89AD13AACCB9650BBE6EA /* Pods-RunnerTests.debug.xcconfig */, - 018597106C8E38C2A20B56DC /* Pods-RunnerTests.release.xcconfig */, - 164233455F6E52D976E7619C /* Pods-RunnerTests.profile.xcconfig */, + 3421F167A26D263533D9C0F8 /* Pods-Runner.debug.xcconfig */, + 8367A59A9CDAA6556FC2822B /* Pods-Runner.release.xcconfig */, + 06C27BF5D7B993BB5DCB8D21 /* Pods-Runner.profile.xcconfig */, + F7B65A9BC4B475ABEC573986 /* Pods-RunnerTests.debug.xcconfig */, + 4ABA081B421BEA588642248C /* Pods-RunnerTests.release.xcconfig */, + 9BB58392A543FF4660B2490F /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 7A1ACBFB4AEFAC5081D802E1 /* Pods */, - AD091A7825928A7EC8BC6AD6 /* Frameworks */, + 44BD8D06CB822F8C423FCD72 /* Pods */, + D054066A4956E2C378EF4A32 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - AD091A7825928A7EC8BC6AD6 /* Frameworks */ = { + D054066A4956E2C378EF4A32 /* Frameworks */ = { isa = PBXGroup; children = ( - 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */, - 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */, + D0BA15459E839D3553B26934 /* Pods_Runner.framework */, + E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D8787C4471D00A25C41EA2CB /* [CP] Check Pods Manifest.lock */, + 001D1E85333DF9609D34BC08 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - BFB82CA3C890A718124E1EDE /* Frameworks */, + F9E0A4607079935C37BF168F /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 62E6FB6D8F5E3A7C56D8737D /* [CP] Check Pods Manifest.lock */, + 1975AD24A5DD7DE3F4DE1B61 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 72DCD364ECC5EFBE76A41B99 /* [CP] Embed Pods Frameworks */, + 26E7569DC25C33E17720D218 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,23 +270,29 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 001D1E85333DF9609D34BC08 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + 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; }; - 62E6FB6D8F5E3A7C56D8737D /* [CP] Check Pods Manifest.lock */ = { + 1975AD24A5DD7DE3F4DE1B61 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -308,7 +314,7 @@ 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; }; - 72DCD364ECC5EFBE76A41B99 /* [CP] Embed Pods Frameworks */ = { + 26E7569DC25C33E17720D218 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -325,42 +331,36 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); - name = "Run Script"; + name = "Thin Binary"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - D8787C4471D00A25C41EA2CB /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; 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; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FAB89AD13AACCB9650BBE6EA /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = F7B65A9BC4B475ABEC573986 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 018597106C8E38C2A20B56DC /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 4ABA081B421BEA588642248C /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 164233455F6E52D976E7619C /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 9BB58392A543FF4660B2490F /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/boring_to_beautiful/step_03/lib/src/shared/app.dart b/boring_to_beautiful/step_03/lib/src/shared/app.dart index 85dc86385b..87f9d9bfe0 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/app.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/app.dart @@ -39,9 +39,13 @@ class _MyAppState extends State { child: ValueListenableBuilder( valueListenable: settings, builder: (context, value, _) { + final theme = ThemeProvider.of(context); return MaterialApp.router( debugShowCheckedModeBanner: false, title: 'Flutter Demo', + theme: theme.light(settings.value.sourceColor), + darkTheme: theme.dark(settings.value.sourceColor), + themeMode: theme.themeMode(), routeInformationParser: appRouter.routeInformationParser, routeInformationProvider: appRouter.routeInformationProvider, routerDelegate: appRouter.routerDelegate, diff --git a/boring_to_beautiful/step_03/lib/src/shared/views/outlined_card.dart b/boring_to_beautiful/step_03/lib/src/shared/views/outlined_card.dart index 83e9157aa6..5225518d9f 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/views/outlined_card.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/views/outlined_card.dart @@ -21,7 +21,15 @@ class _OutlinedCardState extends State { cursor: widget.clickable ? SystemMouseCursors.click : SystemMouseCursors.basic, - child: Container(child: widget.child), + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: Theme.of(context).colorScheme.outline, + width: 1, + ), + ), + child: widget.child, + ), ); } } diff --git a/boring_to_beautiful/step_03/macos/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_03/macos/Runner.xcodeproj/project.pbxproj index 6ae862c37d..79fced16c3 100644 --- a/boring_to_beautiful/step_03/macos/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_03/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 120C1A7E7D320A31C1211A4A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 6A705DC52900C471DF6E1EC6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */; }; - 9AEA2C669381F3905C501B66 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */; }; + E344FE031826102CEDE46647 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,7 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 049E4603B0A09E05087E56FA /* 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 = ""; }; + 2BCC07C46EB4E01CE044DBB6 /* 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 = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -79,15 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 54CECCDD830654297CBE27CA /* 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 = ""; }; + 3E5DC3FB470EEF77149E71DD /* 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 = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 93864140E5DDD8350C71D815 /* 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 = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 9FFE8F2CDA409CA0E1B27D98 /* 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 = ""; }; - A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CE866162E3EE650EB52F3385 /* 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 = ""; }; - DF7AD973C56F21946082FE37 /* 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 = ""; }; - E9D755A13E508067E98F3444 /* 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 = ""; }; + 9B293DEC88BD59786AD94EBD /* 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 = ""; }; + AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EEFA0ABEA58A1E38E7AD7041 /* 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 = ""; }; + FDBDA46A6FE6381EE95E5A7A /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9AEA2C669381F3905C501B66 /* Pods_RunnerTests.framework in Frameworks */, + 120C1A7E7D320A31C1211A4A /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6A705DC52900C471DF6E1EC6 /* Pods_Runner.framework in Frameworks */, + E344FE031826102CEDE46647 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - D3381829CD41C2D96B6F2B3E /* Pods */, + 6CDFAAD29A585E1E7DFB128C /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - D3381829CD41C2D96B6F2B3E /* Pods */ = { + 6CDFAAD29A585E1E7DFB128C /* Pods */ = { isa = PBXGroup; children = ( - E9D755A13E508067E98F3444 /* Pods-Runner.debug.xcconfig */, - CE866162E3EE650EB52F3385 /* Pods-Runner.release.xcconfig */, - DF7AD973C56F21946082FE37 /* Pods-Runner.profile.xcconfig */, - 9FFE8F2CDA409CA0E1B27D98 /* Pods-RunnerTests.debug.xcconfig */, - 049E4603B0A09E05087E56FA /* Pods-RunnerTests.release.xcconfig */, - 54CECCDD830654297CBE27CA /* Pods-RunnerTests.profile.xcconfig */, + 3E5DC3FB470EEF77149E71DD /* Pods-Runner.debug.xcconfig */, + 2BCC07C46EB4E01CE044DBB6 /* Pods-Runner.release.xcconfig */, + 9B293DEC88BD59786AD94EBD /* Pods-Runner.profile.xcconfig */, + 93864140E5DDD8350C71D815 /* Pods-RunnerTests.debug.xcconfig */, + FDBDA46A6FE6381EE95E5A7A /* Pods-RunnerTests.release.xcconfig */, + EEFA0ABEA58A1E38E7AD7041 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */, - A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */, + E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */, + AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - C59A11FAACC96E6D468156D2 /* [CP] Check Pods Manifest.lock */, + 36CFF57A21336FA90DED8C50 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 33528B7408CACCE07D6DAD0F /* [CP] Check Pods Manifest.lock */, + 41EDDA96C09EE65F003D69E0 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - C6A4842BF1A9A85A617B12E2 /* [CP] Embed Pods Frameworks */, + 0F169C1C0F5EE8E3D274E72F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,26 +323,21 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 33528B7408CACCE07D6DAD0F /* [CP] Check Pods Manifest.lock */ = { + 0F169C1C0F5EE8E3D274E72F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); 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"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 3399D490228B24CF009A79C7 /* ShellScript */ = { @@ -383,7 +378,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - C59A11FAACC96E6D468156D2 /* [CP] Check Pods Manifest.lock */ = { + 36CFF57A21336FA90DED8C50 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -405,21 +400,26 @@ 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; }; - C6A4842BF1A9A85A617B12E2 /* [CP] Embed Pods Frameworks */ = { + 41EDDA96C09EE65F003D69E0 /* [CP] Check Pods Manifest.lock */ = { 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"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + 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; }; /* End PBXShellScriptBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9FFE8F2CDA409CA0E1B27D98 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 93864140E5DDD8350C71D815 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 049E4603B0A09E05087E56FA /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = FDBDA46A6FE6381EE95E5A7A /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 54CECCDD830654297CBE27CA /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = EEFA0ABEA58A1E38E7AD7041 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/boring_to_beautiful/step_03/macos/Runner/DebugProfile.entitlements b/boring_to_beautiful/step_03/macos/Runner/DebugProfile.entitlements index 3ba6c1266f..08c3ab17cc 100644 --- a/boring_to_beautiful/step_03/macos/Runner/DebugProfile.entitlements +++ b/boring_to_beautiful/step_03/macos/Runner/DebugProfile.entitlements @@ -6,9 +6,9 @@ com.apple.security.cs.allow-jit - com.apple.security.network.client - com.apple.security.network.server + com.apple.security.network.client + diff --git a/boring_to_beautiful/step_03/macos/Runner/Release.entitlements b/boring_to_beautiful/step_03/macos/Runner/Release.entitlements index 7a2230dc33..ee95ab7e58 100644 --- a/boring_to_beautiful/step_03/macos/Runner/Release.entitlements +++ b/boring_to_beautiful/step_03/macos/Runner/Release.entitlements @@ -6,7 +6,5 @@ com.apple.security.network.client - com.apple.security.network.server - diff --git a/boring_to_beautiful/step_03/pubspec.yaml b/boring_to_beautiful/step_03/pubspec.yaml index e6cd6dfab6..817f7d00c0 100644 --- a/boring_to_beautiful/step_03/pubspec.yaml +++ b/boring_to_beautiful/step_03/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: english_words: ^4.0.0 flutter_bloc: ^9.1.1 freezed_annotation: ^3.0.0 - go_router: ^15.1.2 + go_router: ^15.1.3 material_color_utilities: any universal_platform: ^1.1.0 url_launcher: ^6.3.1 diff --git a/boring_to_beautiful/step_04/ios/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_04/ios/Runner.xcodeproj/project.pbxproj index ebb1244e8b..c30322fdf6 100644 --- a/boring_to_beautiful/step_04/ios/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_04/ios/Runner.xcodeproj/project.pbxproj @@ -7,15 +7,15 @@ objects = { /* Begin PBXBuildFile section */ - 0BA3C72CFF7FB3D58116BBE0 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 28D4EB9BC109C11A38856D7C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */; }; + 31AC9F1F861163CE474DC0DF /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BA15459E839D3553B26934 /* Pods_Runner.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 */; }; + C4EE9B5B592653F634344186 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,20 +42,18 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 018597106C8E38C2A20B56DC /* 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 = ""; }; - 1454C98E0DB9BDD277830752 /* 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 = ""; }; + 06C27BF5D7B993BB5DCB8D21 /* 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 = ""; }; 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 = ""; }; - 164233455F6E52D976E7619C /* 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 = ""; }; - 203DA535161F6F2E1631CA2F /* 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 = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3421F167A26D263533D9C0F8 /* 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 = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4ABA081B421BEA588642248C /* 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 = ""; }; 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 = ""; }; - 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8367A59A9CDAA6556FC2822B /* 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 = ""; }; 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; }; @@ -63,8 +61,10 @@ 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 = ""; }; - E367CC7226100F29F71405B1 /* 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 = ""; }; - FAB89AD13AACCB9650BBE6EA /* 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 = ""; }; + 9BB58392A543FF4660B2490F /* 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 = ""; }; + D0BA15459E839D3553B26934 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F7B65A9BC4B475ABEC573986 /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,15 +72,15 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 28D4EB9BC109C11A38856D7C /* Pods_Runner.framework in Frameworks */, + 31AC9F1F861163CE474DC0DF /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - BFB82CA3C890A718124E1EDE /* Frameworks */ = { + F9E0A4607079935C37BF168F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0BA3C72CFF7FB3D58116BBE0 /* Pods_RunnerTests.framework in Frameworks */, + C4EE9B5B592653F634344186 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 7A1ACBFB4AEFAC5081D802E1 /* Pods */ = { + 44BD8D06CB822F8C423FCD72 /* Pods */ = { isa = PBXGroup; children = ( - E367CC7226100F29F71405B1 /* Pods-Runner.debug.xcconfig */, - 1454C98E0DB9BDD277830752 /* Pods-Runner.release.xcconfig */, - 203DA535161F6F2E1631CA2F /* Pods-Runner.profile.xcconfig */, - FAB89AD13AACCB9650BBE6EA /* Pods-RunnerTests.debug.xcconfig */, - 018597106C8E38C2A20B56DC /* Pods-RunnerTests.release.xcconfig */, - 164233455F6E52D976E7619C /* Pods-RunnerTests.profile.xcconfig */, + 3421F167A26D263533D9C0F8 /* Pods-Runner.debug.xcconfig */, + 8367A59A9CDAA6556FC2822B /* Pods-Runner.release.xcconfig */, + 06C27BF5D7B993BB5DCB8D21 /* Pods-Runner.profile.xcconfig */, + F7B65A9BC4B475ABEC573986 /* Pods-RunnerTests.debug.xcconfig */, + 4ABA081B421BEA588642248C /* Pods-RunnerTests.release.xcconfig */, + 9BB58392A543FF4660B2490F /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 7A1ACBFB4AEFAC5081D802E1 /* Pods */, - AD091A7825928A7EC8BC6AD6 /* Frameworks */, + 44BD8D06CB822F8C423FCD72 /* Pods */, + D054066A4956E2C378EF4A32 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - AD091A7825928A7EC8BC6AD6 /* Frameworks */ = { + D054066A4956E2C378EF4A32 /* Frameworks */ = { isa = PBXGroup; children = ( - 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */, - 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */, + D0BA15459E839D3553B26934 /* Pods_Runner.framework */, + E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D8787C4471D00A25C41EA2CB /* [CP] Check Pods Manifest.lock */, + 001D1E85333DF9609D34BC08 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - BFB82CA3C890A718124E1EDE /* Frameworks */, + F9E0A4607079935C37BF168F /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 62E6FB6D8F5E3A7C56D8737D /* [CP] Check Pods Manifest.lock */, + 1975AD24A5DD7DE3F4DE1B61 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 72DCD364ECC5EFBE76A41B99 /* [CP] Embed Pods Frameworks */, + 26E7569DC25C33E17720D218 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,23 +270,29 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 001D1E85333DF9609D34BC08 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + 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; }; - 62E6FB6D8F5E3A7C56D8737D /* [CP] Check Pods Manifest.lock */ = { + 1975AD24A5DD7DE3F4DE1B61 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -308,7 +314,7 @@ 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; }; - 72DCD364ECC5EFBE76A41B99 /* [CP] Embed Pods Frameworks */ = { + 26E7569DC25C33E17720D218 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -325,42 +331,36 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); - name = "Run Script"; + name = "Thin Binary"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - D8787C4471D00A25C41EA2CB /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; 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; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FAB89AD13AACCB9650BBE6EA /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = F7B65A9BC4B475ABEC573986 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 018597106C8E38C2A20B56DC /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 4ABA081B421BEA588642248C /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 164233455F6E52D976E7619C /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 9BB58392A543FF4660B2490F /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/boring_to_beautiful/step_04/lib/src/features/home/view/home_screen.dart b/boring_to_beautiful/step_04/lib/src/features/home/view/home_screen.dart index ff61f22d8c..e7fc8a876d 100644 --- a/boring_to_beautiful/step_04/lib/src/features/home/view/home_screen.dart +++ b/boring_to_beautiful/step_04/lib/src/features/home/view/home_screen.dart @@ -30,6 +30,50 @@ class _HomeScreenState extends State { final List artists = artistsProvider.artists; return LayoutBuilder( builder: (context, constraints) { + if (constraints.isMobile) { + return DefaultTabController( + length: 4, + child: Scaffold( + appBar: AppBar( + centerTitle: false, + title: const Text('Good morning'), + actions: const [BrightnessToggle()], + bottom: const TabBar( + isScrollable: true, + tabs: [ + Tab(text: 'Home'), + Tab(text: 'Recently Played'), + Tab(text: 'New Releases'), + Tab(text: 'Top Songs'), + ], + ), + ), + body: LayoutBuilder( + builder: (context, constraints) => TabBarView( + children: [ + SingleChildScrollView( + child: Column( + children: [ + const HomeHighlight(), + HomeArtists( + artists: artists, + constraints: constraints, + ), + ], + ), + ), + HomeRecent(playlists: playlists, axis: Axis.vertical), + PlaylistSongs(playlist: topSongs, constraints: constraints), + PlaylistSongs( + playlist: newReleases, + constraints: constraints, + ), + ], + ), + ), + ), + ); + } return Scaffold( body: SingleChildScrollView( child: AdaptiveColumn( diff --git a/boring_to_beautiful/step_04/lib/src/shared/views/adaptive_navigation.dart b/boring_to_beautiful/step_04/lib/src/shared/views/adaptive_navigation.dart index 77fd135e26..17fd8f0e8a 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/views/adaptive_navigation.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/views/adaptive_navigation.dart @@ -22,25 +22,36 @@ class AdaptiveNavigation extends StatelessWidget { Widget build(BuildContext context) { return LayoutBuilder( builder: (context, dimens) { + if (dimens.maxWidth >= 600) { + return Scaffold( + body: Row( + children: [ + NavigationRail( + extended: dimens.maxWidth >= 800, + minExtendedWidth: 180, + destinations: destinations + .map( + (e) => NavigationRailDestination( + icon: e.icon, + label: Text(e.label), + ), + ) + .toList(), + selectedIndex: selectedIndex, + onDestinationSelected: onDestinationSelected, + ), + Expanded(child: child), + ], + ), + ); + } + // Mobile Layout return Scaffold( - body: Row( - children: [ - NavigationRail( - extended: dimens.maxWidth >= 800, - minExtendedWidth: 180, - destinations: destinations - .map( - (e) => NavigationRailDestination( - icon: e.icon, - label: Text(e.label), - ), - ) - .toList(), - selectedIndex: selectedIndex, - onDestinationSelected: onDestinationSelected, - ), - Expanded(child: child), - ], + body: child, + bottomNavigationBar: NavigationBar( + destinations: destinations, + selectedIndex: selectedIndex, + onDestinationSelected: onDestinationSelected, ), ); }, diff --git a/boring_to_beautiful/step_04/macos/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_04/macos/Runner.xcodeproj/project.pbxproj index 6ae862c37d..79fced16c3 100644 --- a/boring_to_beautiful/step_04/macos/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_04/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 120C1A7E7D320A31C1211A4A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 6A705DC52900C471DF6E1EC6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */; }; - 9AEA2C669381F3905C501B66 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */; }; + E344FE031826102CEDE46647 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,7 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 049E4603B0A09E05087E56FA /* 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 = ""; }; + 2BCC07C46EB4E01CE044DBB6 /* 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 = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -79,15 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 54CECCDD830654297CBE27CA /* 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 = ""; }; + 3E5DC3FB470EEF77149E71DD /* 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 = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 93864140E5DDD8350C71D815 /* 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 = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 9FFE8F2CDA409CA0E1B27D98 /* 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 = ""; }; - A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CE866162E3EE650EB52F3385 /* 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 = ""; }; - DF7AD973C56F21946082FE37 /* 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 = ""; }; - E9D755A13E508067E98F3444 /* 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 = ""; }; + 9B293DEC88BD59786AD94EBD /* 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 = ""; }; + AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EEFA0ABEA58A1E38E7AD7041 /* 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 = ""; }; + FDBDA46A6FE6381EE95E5A7A /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9AEA2C669381F3905C501B66 /* Pods_RunnerTests.framework in Frameworks */, + 120C1A7E7D320A31C1211A4A /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6A705DC52900C471DF6E1EC6 /* Pods_Runner.framework in Frameworks */, + E344FE031826102CEDE46647 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - D3381829CD41C2D96B6F2B3E /* Pods */, + 6CDFAAD29A585E1E7DFB128C /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - D3381829CD41C2D96B6F2B3E /* Pods */ = { + 6CDFAAD29A585E1E7DFB128C /* Pods */ = { isa = PBXGroup; children = ( - E9D755A13E508067E98F3444 /* Pods-Runner.debug.xcconfig */, - CE866162E3EE650EB52F3385 /* Pods-Runner.release.xcconfig */, - DF7AD973C56F21946082FE37 /* Pods-Runner.profile.xcconfig */, - 9FFE8F2CDA409CA0E1B27D98 /* Pods-RunnerTests.debug.xcconfig */, - 049E4603B0A09E05087E56FA /* Pods-RunnerTests.release.xcconfig */, - 54CECCDD830654297CBE27CA /* Pods-RunnerTests.profile.xcconfig */, + 3E5DC3FB470EEF77149E71DD /* Pods-Runner.debug.xcconfig */, + 2BCC07C46EB4E01CE044DBB6 /* Pods-Runner.release.xcconfig */, + 9B293DEC88BD59786AD94EBD /* Pods-Runner.profile.xcconfig */, + 93864140E5DDD8350C71D815 /* Pods-RunnerTests.debug.xcconfig */, + FDBDA46A6FE6381EE95E5A7A /* Pods-RunnerTests.release.xcconfig */, + EEFA0ABEA58A1E38E7AD7041 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */, - A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */, + E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */, + AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - C59A11FAACC96E6D468156D2 /* [CP] Check Pods Manifest.lock */, + 36CFF57A21336FA90DED8C50 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 33528B7408CACCE07D6DAD0F /* [CP] Check Pods Manifest.lock */, + 41EDDA96C09EE65F003D69E0 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - C6A4842BF1A9A85A617B12E2 /* [CP] Embed Pods Frameworks */, + 0F169C1C0F5EE8E3D274E72F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,26 +323,21 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 33528B7408CACCE07D6DAD0F /* [CP] Check Pods Manifest.lock */ = { + 0F169C1C0F5EE8E3D274E72F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); 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"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 3399D490228B24CF009A79C7 /* ShellScript */ = { @@ -383,7 +378,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - C59A11FAACC96E6D468156D2 /* [CP] Check Pods Manifest.lock */ = { + 36CFF57A21336FA90DED8C50 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -405,21 +400,26 @@ 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; }; - C6A4842BF1A9A85A617B12E2 /* [CP] Embed Pods Frameworks */ = { + 41EDDA96C09EE65F003D69E0 /* [CP] Check Pods Manifest.lock */ = { 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"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + 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; }; /* End PBXShellScriptBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9FFE8F2CDA409CA0E1B27D98 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 93864140E5DDD8350C71D815 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 049E4603B0A09E05087E56FA /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = FDBDA46A6FE6381EE95E5A7A /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 54CECCDD830654297CBE27CA /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = EEFA0ABEA58A1E38E7AD7041 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/boring_to_beautiful/step_04/macos/Runner/DebugProfile.entitlements b/boring_to_beautiful/step_04/macos/Runner/DebugProfile.entitlements index 3ba6c1266f..08c3ab17cc 100644 --- a/boring_to_beautiful/step_04/macos/Runner/DebugProfile.entitlements +++ b/boring_to_beautiful/step_04/macos/Runner/DebugProfile.entitlements @@ -6,9 +6,9 @@ com.apple.security.cs.allow-jit - com.apple.security.network.client - com.apple.security.network.server + com.apple.security.network.client + diff --git a/boring_to_beautiful/step_04/macos/Runner/Release.entitlements b/boring_to_beautiful/step_04/macos/Runner/Release.entitlements index 7a2230dc33..ee95ab7e58 100644 --- a/boring_to_beautiful/step_04/macos/Runner/Release.entitlements +++ b/boring_to_beautiful/step_04/macos/Runner/Release.entitlements @@ -6,7 +6,5 @@ com.apple.security.network.client - com.apple.security.network.server - diff --git a/boring_to_beautiful/step_04/pubspec.yaml b/boring_to_beautiful/step_04/pubspec.yaml index e6cd6dfab6..817f7d00c0 100644 --- a/boring_to_beautiful/step_04/pubspec.yaml +++ b/boring_to_beautiful/step_04/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: english_words: ^4.0.0 flutter_bloc: ^9.1.1 freezed_annotation: ^3.0.0 - go_router: ^15.1.2 + go_router: ^15.1.3 material_color_utilities: any universal_platform: ^1.1.0 url_launcher: ^6.3.1 diff --git a/boring_to_beautiful/final/.gitignore b/boring_to_beautiful/step_05_a/.gitignore similarity index 100% rename from boring_to_beautiful/final/.gitignore rename to boring_to_beautiful/step_05_a/.gitignore diff --git a/boring_to_beautiful/final/.vscode/launch.json b/boring_to_beautiful/step_05_a/.vscode/launch.json similarity index 100% rename from boring_to_beautiful/final/.vscode/launch.json rename to boring_to_beautiful/step_05_a/.vscode/launch.json diff --git a/boring_to_beautiful/final/analysis_options.yaml b/boring_to_beautiful/step_05_a/analysis_options.yaml similarity index 100% rename from boring_to_beautiful/final/analysis_options.yaml rename to boring_to_beautiful/step_05_a/analysis_options.yaml diff --git a/boring_to_beautiful/final/android/.gitignore b/boring_to_beautiful/step_05_a/android/.gitignore similarity index 100% rename from boring_to_beautiful/final/android/.gitignore rename to boring_to_beautiful/step_05_a/android/.gitignore diff --git a/boring_to_beautiful/final/android/app/build.gradle.kts b/boring_to_beautiful/step_05_a/android/app/build.gradle.kts similarity index 100% rename from boring_to_beautiful/final/android/app/build.gradle.kts rename to boring_to_beautiful/step_05_a/android/app/build.gradle.kts diff --git a/boring_to_beautiful/final/android/app/src/debug/AndroidManifest.xml b/boring_to_beautiful/step_05_a/android/app/src/debug/AndroidManifest.xml similarity index 100% rename from boring_to_beautiful/final/android/app/src/debug/AndroidManifest.xml rename to boring_to_beautiful/step_05_a/android/app/src/debug/AndroidManifest.xml diff --git a/boring_to_beautiful/final/android/app/src/main/AndroidManifest.xml b/boring_to_beautiful/step_05_a/android/app/src/main/AndroidManifest.xml similarity index 100% rename from boring_to_beautiful/final/android/app/src/main/AndroidManifest.xml rename to boring_to_beautiful/step_05_a/android/app/src/main/AndroidManifest.xml diff --git a/boring_to_beautiful/final/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt b/boring_to_beautiful/step_05_a/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt similarity index 100% rename from boring_to_beautiful/final/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt rename to boring_to_beautiful/step_05_a/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt diff --git a/boring_to_beautiful/final/android/app/src/main/res/drawable-v21/launch_background.xml b/boring_to_beautiful/step_05_a/android/app/src/main/res/drawable-v21/launch_background.xml similarity index 100% rename from boring_to_beautiful/final/android/app/src/main/res/drawable-v21/launch_background.xml rename to boring_to_beautiful/step_05_a/android/app/src/main/res/drawable-v21/launch_background.xml diff --git a/boring_to_beautiful/final/android/app/src/main/res/drawable/launch_background.xml b/boring_to_beautiful/step_05_a/android/app/src/main/res/drawable/launch_background.xml similarity index 100% rename from boring_to_beautiful/final/android/app/src/main/res/drawable/launch_background.xml rename to boring_to_beautiful/step_05_a/android/app/src/main/res/drawable/launch_background.xml diff --git a/boring_to_beautiful/final/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/boring_to_beautiful/step_05_a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from boring_to_beautiful/final/android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to boring_to_beautiful/step_05_a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/boring_to_beautiful/final/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/boring_to_beautiful/step_05_a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from boring_to_beautiful/final/android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to boring_to_beautiful/step_05_a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/boring_to_beautiful/final/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/boring_to_beautiful/step_05_a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from boring_to_beautiful/final/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to boring_to_beautiful/step_05_a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/boring_to_beautiful/final/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/boring_to_beautiful/step_05_a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from boring_to_beautiful/final/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to boring_to_beautiful/step_05_a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/boring_to_beautiful/final/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/boring_to_beautiful/step_05_a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from boring_to_beautiful/final/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to boring_to_beautiful/step_05_a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/boring_to_beautiful/final/android/app/src/main/res/values-night/styles.xml b/boring_to_beautiful/step_05_a/android/app/src/main/res/values-night/styles.xml similarity index 100% rename from boring_to_beautiful/final/android/app/src/main/res/values-night/styles.xml rename to boring_to_beautiful/step_05_a/android/app/src/main/res/values-night/styles.xml diff --git a/boring_to_beautiful/final/android/app/src/main/res/values/styles.xml b/boring_to_beautiful/step_05_a/android/app/src/main/res/values/styles.xml similarity index 100% rename from boring_to_beautiful/final/android/app/src/main/res/values/styles.xml rename to boring_to_beautiful/step_05_a/android/app/src/main/res/values/styles.xml diff --git a/boring_to_beautiful/final/android/app/src/profile/AndroidManifest.xml b/boring_to_beautiful/step_05_a/android/app/src/profile/AndroidManifest.xml similarity index 100% rename from boring_to_beautiful/final/android/app/src/profile/AndroidManifest.xml rename to boring_to_beautiful/step_05_a/android/app/src/profile/AndroidManifest.xml diff --git a/boring_to_beautiful/final/android/build.gradle.kts b/boring_to_beautiful/step_05_a/android/build.gradle.kts similarity index 100% rename from boring_to_beautiful/final/android/build.gradle.kts rename to boring_to_beautiful/step_05_a/android/build.gradle.kts diff --git a/boring_to_beautiful/final/android/gradle.properties b/boring_to_beautiful/step_05_a/android/gradle.properties similarity index 100% rename from boring_to_beautiful/final/android/gradle.properties rename to boring_to_beautiful/step_05_a/android/gradle.properties diff --git a/boring_to_beautiful/final/android/gradle/wrapper/gradle-wrapper.properties b/boring_to_beautiful/step_05_a/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from boring_to_beautiful/final/android/gradle/wrapper/gradle-wrapper.properties rename to boring_to_beautiful/step_05_a/android/gradle/wrapper/gradle-wrapper.properties diff --git a/boring_to_beautiful/final/android/settings.gradle.kts b/boring_to_beautiful/step_05_a/android/settings.gradle.kts similarity index 100% rename from boring_to_beautiful/final/android/settings.gradle.kts rename to boring_to_beautiful/step_05_a/android/settings.gradle.kts diff --git a/boring_to_beautiful/final/assets/images/albums/artist1-album1.jpg b/boring_to_beautiful/step_05_a/assets/images/albums/artist1-album1.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/albums/artist1-album1.jpg rename to boring_to_beautiful/step_05_a/assets/images/albums/artist1-album1.jpg diff --git a/boring_to_beautiful/final/assets/images/albums/artist1-album2.jpg b/boring_to_beautiful/step_05_a/assets/images/albums/artist1-album2.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/albums/artist1-album2.jpg rename to boring_to_beautiful/step_05_a/assets/images/albums/artist1-album2.jpg diff --git a/boring_to_beautiful/final/assets/images/albums/artist1-album3.jpg b/boring_to_beautiful/step_05_a/assets/images/albums/artist1-album3.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/albums/artist1-album3.jpg rename to boring_to_beautiful/step_05_a/assets/images/albums/artist1-album3.jpg diff --git a/boring_to_beautiful/final/assets/images/albums/artist2-album2.jpg b/boring_to_beautiful/step_05_a/assets/images/albums/artist2-album2.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/albums/artist2-album2.jpg rename to boring_to_beautiful/step_05_a/assets/images/albums/artist2-album2.jpg diff --git a/boring_to_beautiful/final/assets/images/albums/artist3-album1.jpg b/boring_to_beautiful/step_05_a/assets/images/albums/artist3-album1.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/albums/artist3-album1.jpg rename to boring_to_beautiful/step_05_a/assets/images/albums/artist3-album1.jpg diff --git a/boring_to_beautiful/final/assets/images/albums/artist4-album1.jpg b/boring_to_beautiful/step_05_a/assets/images/albums/artist4-album1.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/albums/artist4-album1.jpg rename to boring_to_beautiful/step_05_a/assets/images/albums/artist4-album1.jpg diff --git a/boring_to_beautiful/final/assets/images/albums/artist4-album2.jpg b/boring_to_beautiful/step_05_a/assets/images/albums/artist4-album2.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/albums/artist4-album2.jpg rename to boring_to_beautiful/step_05_a/assets/images/albums/artist4-album2.jpg diff --git a/boring_to_beautiful/final/assets/images/albums/artist4-album3.jpg b/boring_to_beautiful/step_05_a/assets/images/albums/artist4-album3.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/albums/artist4-album3.jpg rename to boring_to_beautiful/step_05_a/assets/images/albums/artist4-album3.jpg diff --git a/boring_to_beautiful/final/assets/images/albums/artist5-album1.jpg b/boring_to_beautiful/step_05_a/assets/images/albums/artist5-album1.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/albums/artist5-album1.jpg rename to boring_to_beautiful/step_05_a/assets/images/albums/artist5-album1.jpg diff --git a/boring_to_beautiful/final/assets/images/albums/artist5-album2.jpg b/boring_to_beautiful/step_05_a/assets/images/albums/artist5-album2.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/albums/artist5-album2.jpg rename to boring_to_beautiful/step_05_a/assets/images/albums/artist5-album2.jpg diff --git a/boring_to_beautiful/final/assets/images/albums/artist6-album1.jpg b/boring_to_beautiful/step_05_a/assets/images/albums/artist6-album1.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/albums/artist6-album1.jpg rename to boring_to_beautiful/step_05_a/assets/images/albums/artist6-album1.jpg diff --git a/boring_to_beautiful/final/assets/images/albums/artist6-album2.jpg b/boring_to_beautiful/step_05_a/assets/images/albums/artist6-album2.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/albums/artist6-album2.jpg rename to boring_to_beautiful/step_05_a/assets/images/albums/artist6-album2.jpg diff --git a/boring_to_beautiful/final/assets/images/albums/artist6-album3.jpg b/boring_to_beautiful/step_05_a/assets/images/albums/artist6-album3.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/albums/artist6-album3.jpg rename to boring_to_beautiful/step_05_a/assets/images/albums/artist6-album3.jpg diff --git a/boring_to_beautiful/final/assets/images/artists/joe.jpg b/boring_to_beautiful/step_05_a/assets/images/artists/joe.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/artists/joe.jpg rename to boring_to_beautiful/step_05_a/assets/images/artists/joe.jpg diff --git a/boring_to_beautiful/final/assets/images/artists/woman.jpeg b/boring_to_beautiful/step_05_a/assets/images/artists/woman.jpeg similarity index 100% rename from boring_to_beautiful/final/assets/images/artists/woman.jpeg rename to boring_to_beautiful/step_05_a/assets/images/artists/woman.jpeg diff --git a/boring_to_beautiful/final/assets/images/news/concert.jpeg b/boring_to_beautiful/step_05_a/assets/images/news/concert.jpeg similarity index 100% rename from boring_to_beautiful/final/assets/images/news/concert.jpeg rename to boring_to_beautiful/step_05_a/assets/images/news/concert.jpeg diff --git a/boring_to_beautiful/final/assets/images/news/concert_heart.jpg b/boring_to_beautiful/step_05_a/assets/images/news/concert_heart.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/news/concert_heart.jpg rename to boring_to_beautiful/step_05_a/assets/images/news/concert_heart.jpg diff --git a/boring_to_beautiful/final/assets/images/news/recording_studio.jpg b/boring_to_beautiful/step_05_a/assets/images/news/recording_studio.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/news/recording_studio.jpg rename to boring_to_beautiful/step_05_a/assets/images/news/recording_studio.jpg diff --git a/boring_to_beautiful/final/assets/images/playlists/austin.jpg b/boring_to_beautiful/step_05_a/assets/images/playlists/austin.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/playlists/austin.jpg rename to boring_to_beautiful/step_05_a/assets/images/playlists/austin.jpg diff --git a/boring_to_beautiful/final/assets/images/playlists/calm.jpg b/boring_to_beautiful/step_05_a/assets/images/playlists/calm.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/playlists/calm.jpg rename to boring_to_beautiful/step_05_a/assets/images/playlists/calm.jpg diff --git a/boring_to_beautiful/final/assets/images/playlists/coffee.jpg b/boring_to_beautiful/step_05_a/assets/images/playlists/coffee.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/playlists/coffee.jpg rename to boring_to_beautiful/step_05_a/assets/images/playlists/coffee.jpg diff --git a/boring_to_beautiful/final/assets/images/playlists/favorite.jpg b/boring_to_beautiful/step_05_a/assets/images/playlists/favorite.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/playlists/favorite.jpg rename to boring_to_beautiful/step_05_a/assets/images/playlists/favorite.jpg diff --git a/boring_to_beautiful/final/assets/images/playlists/jazz.jpg b/boring_to_beautiful/step_05_a/assets/images/playlists/jazz.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/playlists/jazz.jpg rename to boring_to_beautiful/step_05_a/assets/images/playlists/jazz.jpg diff --git a/boring_to_beautiful/final/assets/images/playlists/piano.jpg b/boring_to_beautiful/step_05_a/assets/images/playlists/piano.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/playlists/piano.jpg rename to boring_to_beautiful/step_05_a/assets/images/playlists/piano.jpg diff --git a/boring_to_beautiful/final/assets/images/playlists/reading.jpg b/boring_to_beautiful/step_05_a/assets/images/playlists/reading.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/playlists/reading.jpg rename to boring_to_beautiful/step_05_a/assets/images/playlists/reading.jpg diff --git a/boring_to_beautiful/final/assets/images/playlists/studying.jpg b/boring_to_beautiful/step_05_a/assets/images/playlists/studying.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/playlists/studying.jpg rename to boring_to_beautiful/step_05_a/assets/images/playlists/studying.jpg diff --git a/boring_to_beautiful/final/assets/images/playlists/workout.jpg b/boring_to_beautiful/step_05_a/assets/images/playlists/workout.jpg similarity index 100% rename from boring_to_beautiful/final/assets/images/playlists/workout.jpg rename to boring_to_beautiful/step_05_a/assets/images/playlists/workout.jpg diff --git a/boring_to_beautiful/final/assets/images/record.jpeg b/boring_to_beautiful/step_05_a/assets/images/record.jpeg similarity index 100% rename from boring_to_beautiful/final/assets/images/record.jpeg rename to boring_to_beautiful/step_05_a/assets/images/record.jpeg diff --git a/boring_to_beautiful/final/ios/.gitignore b/boring_to_beautiful/step_05_a/ios/.gitignore similarity index 100% rename from boring_to_beautiful/final/ios/.gitignore rename to boring_to_beautiful/step_05_a/ios/.gitignore diff --git a/boring_to_beautiful/final/ios/Flutter/AppFrameworkInfo.plist b/boring_to_beautiful/step_05_a/ios/Flutter/AppFrameworkInfo.plist similarity index 100% rename from boring_to_beautiful/final/ios/Flutter/AppFrameworkInfo.plist rename to boring_to_beautiful/step_05_a/ios/Flutter/AppFrameworkInfo.plist diff --git a/boring_to_beautiful/final/ios/Flutter/Debug.xcconfig b/boring_to_beautiful/step_05_a/ios/Flutter/Debug.xcconfig similarity index 100% rename from boring_to_beautiful/final/ios/Flutter/Debug.xcconfig rename to boring_to_beautiful/step_05_a/ios/Flutter/Debug.xcconfig diff --git a/boring_to_beautiful/final/ios/Flutter/Release.xcconfig b/boring_to_beautiful/step_05_a/ios/Flutter/Release.xcconfig similarity index 100% rename from boring_to_beautiful/final/ios/Flutter/Release.xcconfig rename to boring_to_beautiful/step_05_a/ios/Flutter/Release.xcconfig diff --git a/boring_to_beautiful/final/ios/Podfile b/boring_to_beautiful/step_05_a/ios/Podfile similarity index 100% rename from boring_to_beautiful/final/ios/Podfile rename to boring_to_beautiful/step_05_a/ios/Podfile diff --git a/boring_to_beautiful/final/ios/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_05_a/ios/Runner.xcodeproj/project.pbxproj similarity index 92% rename from boring_to_beautiful/final/ios/Runner.xcodeproj/project.pbxproj rename to boring_to_beautiful/step_05_a/ios/Runner.xcodeproj/project.pbxproj index ebb1244e8b..c30322fdf6 100644 --- a/boring_to_beautiful/final/ios/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_05_a/ios/Runner.xcodeproj/project.pbxproj @@ -7,15 +7,15 @@ objects = { /* Begin PBXBuildFile section */ - 0BA3C72CFF7FB3D58116BBE0 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 28D4EB9BC109C11A38856D7C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */; }; + 31AC9F1F861163CE474DC0DF /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BA15459E839D3553B26934 /* Pods_Runner.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 */; }; + C4EE9B5B592653F634344186 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,20 +42,18 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 018597106C8E38C2A20B56DC /* 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 = ""; }; - 1454C98E0DB9BDD277830752 /* 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 = ""; }; + 06C27BF5D7B993BB5DCB8D21 /* 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 = ""; }; 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 = ""; }; - 164233455F6E52D976E7619C /* 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 = ""; }; - 203DA535161F6F2E1631CA2F /* 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 = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3421F167A26D263533D9C0F8 /* 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 = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4ABA081B421BEA588642248C /* 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 = ""; }; 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 = ""; }; - 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8367A59A9CDAA6556FC2822B /* 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 = ""; }; 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; }; @@ -63,8 +61,10 @@ 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 = ""; }; - E367CC7226100F29F71405B1 /* 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 = ""; }; - FAB89AD13AACCB9650BBE6EA /* 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 = ""; }; + 9BB58392A543FF4660B2490F /* 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 = ""; }; + D0BA15459E839D3553B26934 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F7B65A9BC4B475ABEC573986 /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,15 +72,15 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 28D4EB9BC109C11A38856D7C /* Pods_Runner.framework in Frameworks */, + 31AC9F1F861163CE474DC0DF /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - BFB82CA3C890A718124E1EDE /* Frameworks */ = { + F9E0A4607079935C37BF168F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0BA3C72CFF7FB3D58116BBE0 /* Pods_RunnerTests.framework in Frameworks */, + C4EE9B5B592653F634344186 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 7A1ACBFB4AEFAC5081D802E1 /* Pods */ = { + 44BD8D06CB822F8C423FCD72 /* Pods */ = { isa = PBXGroup; children = ( - E367CC7226100F29F71405B1 /* Pods-Runner.debug.xcconfig */, - 1454C98E0DB9BDD277830752 /* Pods-Runner.release.xcconfig */, - 203DA535161F6F2E1631CA2F /* Pods-Runner.profile.xcconfig */, - FAB89AD13AACCB9650BBE6EA /* Pods-RunnerTests.debug.xcconfig */, - 018597106C8E38C2A20B56DC /* Pods-RunnerTests.release.xcconfig */, - 164233455F6E52D976E7619C /* Pods-RunnerTests.profile.xcconfig */, + 3421F167A26D263533D9C0F8 /* Pods-Runner.debug.xcconfig */, + 8367A59A9CDAA6556FC2822B /* Pods-Runner.release.xcconfig */, + 06C27BF5D7B993BB5DCB8D21 /* Pods-Runner.profile.xcconfig */, + F7B65A9BC4B475ABEC573986 /* Pods-RunnerTests.debug.xcconfig */, + 4ABA081B421BEA588642248C /* Pods-RunnerTests.release.xcconfig */, + 9BB58392A543FF4660B2490F /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 7A1ACBFB4AEFAC5081D802E1 /* Pods */, - AD091A7825928A7EC8BC6AD6 /* Frameworks */, + 44BD8D06CB822F8C423FCD72 /* Pods */, + D054066A4956E2C378EF4A32 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - AD091A7825928A7EC8BC6AD6 /* Frameworks */ = { + D054066A4956E2C378EF4A32 /* Frameworks */ = { isa = PBXGroup; children = ( - 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */, - 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */, + D0BA15459E839D3553B26934 /* Pods_Runner.framework */, + E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D8787C4471D00A25C41EA2CB /* [CP] Check Pods Manifest.lock */, + 001D1E85333DF9609D34BC08 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - BFB82CA3C890A718124E1EDE /* Frameworks */, + F9E0A4607079935C37BF168F /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 62E6FB6D8F5E3A7C56D8737D /* [CP] Check Pods Manifest.lock */, + 1975AD24A5DD7DE3F4DE1B61 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 72DCD364ECC5EFBE76A41B99 /* [CP] Embed Pods Frameworks */, + 26E7569DC25C33E17720D218 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,23 +270,29 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 001D1E85333DF9609D34BC08 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + 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; }; - 62E6FB6D8F5E3A7C56D8737D /* [CP] Check Pods Manifest.lock */ = { + 1975AD24A5DD7DE3F4DE1B61 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -308,7 +314,7 @@ 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; }; - 72DCD364ECC5EFBE76A41B99 /* [CP] Embed Pods Frameworks */ = { + 26E7569DC25C33E17720D218 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -325,42 +331,36 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); - name = "Run Script"; + name = "Thin Binary"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - D8787C4471D00A25C41EA2CB /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; 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; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FAB89AD13AACCB9650BBE6EA /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = F7B65A9BC4B475ABEC573986 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 018597106C8E38C2A20B56DC /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 4ABA081B421BEA588642248C /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 164233455F6E52D976E7619C /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 9BB58392A543FF4660B2490F /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/boring_to_beautiful/final/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/boring_to_beautiful/step_05_a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from boring_to_beautiful/final/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to boring_to_beautiful/step_05_a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/boring_to_beautiful/final/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/boring_to_beautiful/step_05_a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from boring_to_beautiful/final/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to boring_to_beautiful/step_05_a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/boring_to_beautiful/final/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/boring_to_beautiful/step_05_a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from boring_to_beautiful/final/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to boring_to_beautiful/step_05_a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/boring_to_beautiful/final/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/step_05_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from boring_to_beautiful/final/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to boring_to_beautiful/step_05_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/boring_to_beautiful/final/ios/Runner.xcworkspace/contents.xcworkspacedata b/boring_to_beautiful/step_05_a/ios/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from boring_to_beautiful/final/ios/Runner.xcworkspace/contents.xcworkspacedata rename to boring_to_beautiful/step_05_a/ios/Runner.xcworkspace/contents.xcworkspacedata diff --git a/boring_to_beautiful/final/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/boring_to_beautiful/step_05_a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from boring_to_beautiful/final/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to boring_to_beautiful/step_05_a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/boring_to_beautiful/final/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/boring_to_beautiful/step_05_a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from boring_to_beautiful/final/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to boring_to_beautiful/step_05_a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/boring_to_beautiful/final/ios/Runner/AppDelegate.swift b/boring_to_beautiful/step_05_a/ios/Runner/AppDelegate.swift similarity index 100% rename from boring_to_beautiful/final/ios/Runner/AppDelegate.swift rename to boring_to_beautiful/step_05_a/ios/Runner/AppDelegate.swift diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png diff --git a/boring_to_beautiful/final/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md rename to boring_to_beautiful/step_05_a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md diff --git a/boring_to_beautiful/final/ios/Runner/Base.lproj/LaunchScreen.storyboard b/boring_to_beautiful/step_05_a/ios/Runner/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Base.lproj/LaunchScreen.storyboard rename to boring_to_beautiful/step_05_a/ios/Runner/Base.lproj/LaunchScreen.storyboard diff --git a/boring_to_beautiful/final/ios/Runner/Base.lproj/Main.storyboard b/boring_to_beautiful/step_05_a/ios/Runner/Base.lproj/Main.storyboard similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Base.lproj/Main.storyboard rename to boring_to_beautiful/step_05_a/ios/Runner/Base.lproj/Main.storyboard diff --git a/boring_to_beautiful/final/ios/Runner/Info.plist b/boring_to_beautiful/step_05_a/ios/Runner/Info.plist similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Info.plist rename to boring_to_beautiful/step_05_a/ios/Runner/Info.plist diff --git a/boring_to_beautiful/final/ios/Runner/Runner-Bridging-Header.h b/boring_to_beautiful/step_05_a/ios/Runner/Runner-Bridging-Header.h similarity index 100% rename from boring_to_beautiful/final/ios/Runner/Runner-Bridging-Header.h rename to boring_to_beautiful/step_05_a/ios/Runner/Runner-Bridging-Header.h diff --git a/boring_to_beautiful/final/ios/RunnerTests/RunnerTests.swift b/boring_to_beautiful/step_05_a/ios/RunnerTests/RunnerTests.swift similarity index 100% rename from boring_to_beautiful/final/ios/RunnerTests/RunnerTests.swift rename to boring_to_beautiful/step_05_a/ios/RunnerTests/RunnerTests.swift diff --git a/boring_to_beautiful/final/lib/main.dart b/boring_to_beautiful/step_05_a/lib/main.dart similarity index 100% rename from boring_to_beautiful/final/lib/main.dart rename to boring_to_beautiful/step_05_a/lib/main.dart diff --git a/boring_to_beautiful/final/lib/src/features/artists/artists.dart b/boring_to_beautiful/step_05_a/lib/src/features/artists/artists.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/features/artists/artists.dart rename to boring_to_beautiful/step_05_a/lib/src/features/artists/artists.dart diff --git a/boring_to_beautiful/final/lib/src/features/artists/view/artist_bio.dart b/boring_to_beautiful/step_05_a/lib/src/features/artists/view/artist_bio.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/features/artists/view/artist_bio.dart rename to boring_to_beautiful/step_05_a/lib/src/features/artists/view/artist_bio.dart diff --git a/boring_to_beautiful/final/lib/src/features/artists/view/artist_card.dart b/boring_to_beautiful/step_05_a/lib/src/features/artists/view/artist_card.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/features/artists/view/artist_card.dart rename to boring_to_beautiful/step_05_a/lib/src/features/artists/view/artist_card.dart diff --git a/boring_to_beautiful/final/lib/src/features/artists/view/artist_events.dart b/boring_to_beautiful/step_05_a/lib/src/features/artists/view/artist_events.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/features/artists/view/artist_events.dart rename to boring_to_beautiful/step_05_a/lib/src/features/artists/view/artist_events.dart diff --git a/boring_to_beautiful/final/lib/src/features/artists/view/artist_news.dart b/boring_to_beautiful/step_05_a/lib/src/features/artists/view/artist_news.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/features/artists/view/artist_news.dart rename to boring_to_beautiful/step_05_a/lib/src/features/artists/view/artist_news.dart diff --git a/boring_to_beautiful/final/lib/src/features/artists/view/artist_ranked_songs.dart b/boring_to_beautiful/step_05_a/lib/src/features/artists/view/artist_ranked_songs.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/features/artists/view/artist_ranked_songs.dart rename to boring_to_beautiful/step_05_a/lib/src/features/artists/view/artist_ranked_songs.dart diff --git a/boring_to_beautiful/final/lib/src/features/artists/view/artist_screen.dart b/boring_to_beautiful/step_05_a/lib/src/features/artists/view/artist_screen.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/features/artists/view/artist_screen.dart rename to boring_to_beautiful/step_05_a/lib/src/features/artists/view/artist_screen.dart diff --git a/boring_to_beautiful/final/lib/src/features/artists/view/artist_updates.dart b/boring_to_beautiful/step_05_a/lib/src/features/artists/view/artist_updates.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/features/artists/view/artist_updates.dart rename to boring_to_beautiful/step_05_a/lib/src/features/artists/view/artist_updates.dart diff --git a/boring_to_beautiful/final/lib/src/features/artists/view/artists_screen.dart b/boring_to_beautiful/step_05_a/lib/src/features/artists/view/artists_screen.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/features/artists/view/artists_screen.dart rename to boring_to_beautiful/step_05_a/lib/src/features/artists/view/artists_screen.dart diff --git a/boring_to_beautiful/final/lib/src/features/artists/view/view.dart b/boring_to_beautiful/step_05_a/lib/src/features/artists/view/view.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/features/artists/view/view.dart rename to boring_to_beautiful/step_05_a/lib/src/features/artists/view/view.dart diff --git a/boring_to_beautiful/final/lib/src/features/home/home.dart b/boring_to_beautiful/step_05_a/lib/src/features/home/home.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/features/home/home.dart rename to boring_to_beautiful/step_05_a/lib/src/features/home/home.dart diff --git a/boring_to_beautiful/final/lib/src/features/home/view/home_artists.dart b/boring_to_beautiful/step_05_a/lib/src/features/home/view/home_artists.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/features/home/view/home_artists.dart rename to boring_to_beautiful/step_05_a/lib/src/features/home/view/home_artists.dart diff --git a/boring_to_beautiful/final/lib/src/features/home/view/home_highlight.dart b/boring_to_beautiful/step_05_a/lib/src/features/home/view/home_highlight.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/features/home/view/home_highlight.dart rename to boring_to_beautiful/step_05_a/lib/src/features/home/view/home_highlight.dart diff --git a/boring_to_beautiful/final/lib/src/features/home/view/home_recent.dart b/boring_to_beautiful/step_05_a/lib/src/features/home/view/home_recent.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/features/home/view/home_recent.dart rename to boring_to_beautiful/step_05_a/lib/src/features/home/view/home_recent.dart diff --git a/boring_to_beautiful/step_05/lib/src/features/home/view/home_screen.dart b/boring_to_beautiful/step_05_a/lib/src/features/home/view/home_screen.dart similarity index 95% rename from boring_to_beautiful/step_05/lib/src/features/home/view/home_screen.dart rename to boring_to_beautiful/step_05_a/lib/src/features/home/view/home_screen.dart index e7fc8a876d..e0b5001d46 100644 --- a/boring_to_beautiful/step_05/lib/src/features/home/view/home_screen.dart +++ b/boring_to_beautiful/step_05_a/lib/src/features/home/view/home_screen.dart @@ -81,7 +81,7 @@ class _HomeScreenState extends State { AdaptiveContainer( columnSpan: 12, child: Padding( - padding: const EdgeInsets.all(2), + padding: const EdgeInsets.all(35), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -117,7 +117,7 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.all(2), + padding: const EdgeInsets.all(35), child: Text( 'Recently played', style: context.headlineSmall, @@ -130,7 +130,7 @@ class _HomeScreenState extends State { AdaptiveContainer( columnSpan: 12, child: Padding( - padding: const EdgeInsets.all(2), + padding: const EdgeInsets.all(35), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -141,7 +141,7 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.all(2), + padding: const EdgeInsets.all(35), child: Text( 'Top Songs Today', style: context.titleLarge, @@ -164,7 +164,7 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.all(2), + padding: const EdgeInsets.all(35), child: Text( 'New Releases', style: context.titleLarge, diff --git a/boring_to_beautiful/final/lib/src/features/home/view/view.dart b/boring_to_beautiful/step_05_a/lib/src/features/home/view/view.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/features/home/view/view.dart rename to boring_to_beautiful/step_05_a/lib/src/features/home/view/view.dart diff --git a/boring_to_beautiful/final/lib/src/features/playlists/playlists.dart b/boring_to_beautiful/step_05_a/lib/src/features/playlists/playlists.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/features/playlists/playlists.dart rename to boring_to_beautiful/step_05_a/lib/src/features/playlists/playlists.dart diff --git a/boring_to_beautiful/final/lib/src/features/playlists/view/playlist_home_screen.dart b/boring_to_beautiful/step_05_a/lib/src/features/playlists/view/playlist_home_screen.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/features/playlists/view/playlist_home_screen.dart rename to boring_to_beautiful/step_05_a/lib/src/features/playlists/view/playlist_home_screen.dart diff --git a/boring_to_beautiful/final/lib/src/features/playlists/view/playlist_screen.dart b/boring_to_beautiful/step_05_a/lib/src/features/playlists/view/playlist_screen.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/features/playlists/view/playlist_screen.dart rename to boring_to_beautiful/step_05_a/lib/src/features/playlists/view/playlist_screen.dart diff --git a/boring_to_beautiful/step_05/lib/src/features/playlists/view/playlist_songs.dart b/boring_to_beautiful/step_05_a/lib/src/features/playlists/view/playlist_songs.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/features/playlists/view/playlist_songs.dart rename to boring_to_beautiful/step_05_a/lib/src/features/playlists/view/playlist_songs.dart diff --git a/boring_to_beautiful/final/lib/src/features/playlists/view/view.dart b/boring_to_beautiful/step_05_a/lib/src/features/playlists/view/view.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/features/playlists/view/view.dart rename to boring_to_beautiful/step_05_a/lib/src/features/playlists/view/view.dart diff --git a/boring_to_beautiful/final/lib/src/shared/app.dart b/boring_to_beautiful/step_05_a/lib/src/shared/app.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/app.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/app.dart diff --git a/boring_to_beautiful/final/lib/src/shared/classes/artist.dart b/boring_to_beautiful/step_05_a/lib/src/shared/classes/artist.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/classes/artist.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/classes/artist.dart diff --git a/boring_to_beautiful/final/lib/src/shared/classes/classes.dart b/boring_to_beautiful/step_05_a/lib/src/shared/classes/classes.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/classes/classes.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/classes/classes.dart diff --git a/boring_to_beautiful/final/lib/src/shared/classes/event.dart b/boring_to_beautiful/step_05_a/lib/src/shared/classes/event.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/classes/event.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/classes/event.dart diff --git a/boring_to_beautiful/final/lib/src/shared/classes/image.dart b/boring_to_beautiful/step_05_a/lib/src/shared/classes/image.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/classes/image.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/classes/image.dart diff --git a/boring_to_beautiful/final/lib/src/shared/classes/news.dart b/boring_to_beautiful/step_05_a/lib/src/shared/classes/news.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/classes/news.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/classes/news.dart diff --git a/boring_to_beautiful/final/lib/src/shared/classes/playlist.dart b/boring_to_beautiful/step_05_a/lib/src/shared/classes/playlist.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/classes/playlist.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/classes/playlist.dart diff --git a/boring_to_beautiful/final/lib/src/shared/classes/ranked_song.dart b/boring_to_beautiful/step_05_a/lib/src/shared/classes/ranked_song.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/classes/ranked_song.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/classes/ranked_song.dart diff --git a/boring_to_beautiful/final/lib/src/shared/classes/song.dart b/boring_to_beautiful/step_05_a/lib/src/shared/classes/song.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/classes/song.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/classes/song.dart diff --git a/boring_to_beautiful/final/lib/src/shared/extensions.dart b/boring_to_beautiful/step_05_a/lib/src/shared/extensions.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/extensions.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/extensions.dart diff --git a/boring_to_beautiful/final/lib/src/shared/playback/bloc/bloc.dart b/boring_to_beautiful/step_05_a/lib/src/shared/playback/bloc/bloc.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/playback/bloc/bloc.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/playback/bloc/bloc.dart diff --git a/boring_to_beautiful/final/lib/src/shared/playback/bloc/playback_bloc.dart b/boring_to_beautiful/step_05_a/lib/src/shared/playback/bloc/playback_bloc.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/playback/bloc/playback_bloc.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/playback/bloc/playback_bloc.dart diff --git a/boring_to_beautiful/final/lib/src/shared/playback/bloc/playback_bloc.freezed.dart b/boring_to_beautiful/step_05_a/lib/src/shared/playback/bloc/playback_bloc.freezed.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/playback/bloc/playback_bloc.freezed.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/playback/bloc/playback_bloc.freezed.dart diff --git a/boring_to_beautiful/final/lib/src/shared/playback/bloc/playback_event.dart b/boring_to_beautiful/step_05_a/lib/src/shared/playback/bloc/playback_event.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/playback/bloc/playback_event.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/playback/bloc/playback_event.dart diff --git a/boring_to_beautiful/final/lib/src/shared/playback/bloc/playback_state.dart b/boring_to_beautiful/step_05_a/lib/src/shared/playback/bloc/playback_state.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/playback/bloc/playback_state.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/playback/bloc/playback_state.dart diff --git a/boring_to_beautiful/final/lib/src/shared/providers/artists.dart b/boring_to_beautiful/step_05_a/lib/src/shared/providers/artists.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/providers/artists.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/providers/artists.dart diff --git a/boring_to_beautiful/final/lib/src/shared/providers/playlists.dart b/boring_to_beautiful/step_05_a/lib/src/shared/providers/playlists.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/providers/playlists.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/providers/playlists.dart diff --git a/boring_to_beautiful/final/lib/src/shared/providers/providers.dart b/boring_to_beautiful/step_05_a/lib/src/shared/providers/providers.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/providers/providers.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/providers/providers.dart diff --git a/boring_to_beautiful/final/lib/src/shared/providers/songs.dart b/boring_to_beautiful/step_05_a/lib/src/shared/providers/songs.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/providers/songs.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/providers/songs.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/providers/theme.dart b/boring_to_beautiful/step_05_a/lib/src/shared/providers/theme.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/providers/theme.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/providers/theme.dart diff --git a/boring_to_beautiful/final/lib/src/shared/router.dart b/boring_to_beautiful/step_05_a/lib/src/shared/router.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/router.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/router.dart diff --git a/boring_to_beautiful/final/lib/src/shared/views/adaptive_image_card.dart b/boring_to_beautiful/step_05_a/lib/src/shared/views/adaptive_image_card.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/views/adaptive_image_card.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/views/adaptive_image_card.dart diff --git a/boring_to_beautiful/final/lib/src/shared/views/adaptive_navigation.dart b/boring_to_beautiful/step_05_a/lib/src/shared/views/adaptive_navigation.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/views/adaptive_navigation.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/views/adaptive_navigation.dart diff --git a/boring_to_beautiful/final/lib/src/shared/views/adaptive_table.dart b/boring_to_beautiful/step_05_a/lib/src/shared/views/adaptive_table.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/views/adaptive_table.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/views/adaptive_table.dart diff --git a/boring_to_beautiful/final/lib/src/shared/views/article_content.dart b/boring_to_beautiful/step_05_a/lib/src/shared/views/article_content.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/views/article_content.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/views/article_content.dart diff --git a/boring_to_beautiful/final/lib/src/shared/views/bottom_bar.dart b/boring_to_beautiful/step_05_a/lib/src/shared/views/bottom_bar.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/views/bottom_bar.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/views/bottom_bar.dart diff --git a/boring_to_beautiful/final/lib/src/shared/views/brightness_toggle.dart b/boring_to_beautiful/step_05_a/lib/src/shared/views/brightness_toggle.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/views/brightness_toggle.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/views/brightness_toggle.dart diff --git a/boring_to_beautiful/final/lib/src/shared/views/center_row.dart b/boring_to_beautiful/step_05_a/lib/src/shared/views/center_row.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/views/center_row.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/views/center_row.dart diff --git a/boring_to_beautiful/final/lib/src/shared/views/clickable.dart b/boring_to_beautiful/step_05_a/lib/src/shared/views/clickable.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/views/clickable.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/views/clickable.dart diff --git a/boring_to_beautiful/final/lib/src/shared/views/events.dart b/boring_to_beautiful/step_05_a/lib/src/shared/views/events.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/views/events.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/views/events.dart diff --git a/boring_to_beautiful/final/lib/src/shared/views/hover_toggle.dart b/boring_to_beautiful/step_05_a/lib/src/shared/views/hover_toggle.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/views/hover_toggle.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/views/hover_toggle.dart diff --git a/boring_to_beautiful/final/lib/src/shared/views/hoverable_song_play_button.dart b/boring_to_beautiful/step_05_a/lib/src/shared/views/hoverable_song_play_button.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/views/hoverable_song_play_button.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/views/hoverable_song_play_button.dart diff --git a/boring_to_beautiful/final/lib/src/shared/views/image_card.dart b/boring_to_beautiful/step_05_a/lib/src/shared/views/image_card.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/views/image_card.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/views/image_card.dart diff --git a/boring_to_beautiful/final/lib/src/shared/views/image_clipper.dart b/boring_to_beautiful/step_05_a/lib/src/shared/views/image_clipper.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/views/image_clipper.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/views/image_clipper.dart diff --git a/boring_to_beautiful/final/lib/src/shared/views/image_tile.dart b/boring_to_beautiful/step_05_a/lib/src/shared/views/image_tile.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/views/image_tile.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/views/image_tile.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/outlined_card.dart b/boring_to_beautiful/step_05_a/lib/src/shared/views/outlined_card.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/views/outlined_card.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/views/outlined_card.dart diff --git a/boring_to_beautiful/final/lib/src/shared/views/play_pause_listener.dart b/boring_to_beautiful/step_05_a/lib/src/shared/views/play_pause_listener.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/views/play_pause_listener.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/views/play_pause_listener.dart diff --git a/boring_to_beautiful/final/lib/src/shared/views/root_layout.dart b/boring_to_beautiful/step_05_a/lib/src/shared/views/root_layout.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/views/root_layout.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/views/root_layout.dart diff --git a/boring_to_beautiful/final/lib/src/shared/views/sidebar.dart b/boring_to_beautiful/step_05_a/lib/src/shared/views/sidebar.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/views/sidebar.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/views/sidebar.dart diff --git a/boring_to_beautiful/final/lib/src/shared/views/views.dart b/boring_to_beautiful/step_05_a/lib/src/shared/views/views.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/shared/views/views.dart rename to boring_to_beautiful/step_05_a/lib/src/shared/views/views.dart diff --git a/boring_to_beautiful/final/lib/src/utils/adaptive_breakpoints.dart b/boring_to_beautiful/step_05_a/lib/src/utils/adaptive_breakpoints.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/utils/adaptive_breakpoints.dart rename to boring_to_beautiful/step_05_a/lib/src/utils/adaptive_breakpoints.dart diff --git a/boring_to_beautiful/final/lib/src/utils/adaptive_column.dart b/boring_to_beautiful/step_05_a/lib/src/utils/adaptive_column.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/utils/adaptive_column.dart rename to boring_to_beautiful/step_05_a/lib/src/utils/adaptive_column.dart diff --git a/boring_to_beautiful/final/lib/src/utils/adaptive_components.dart b/boring_to_beautiful/step_05_a/lib/src/utils/adaptive_components.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/utils/adaptive_components.dart rename to boring_to_beautiful/step_05_a/lib/src/utils/adaptive_components.dart diff --git a/boring_to_beautiful/final/lib/src/utils/adaptive_container.dart b/boring_to_beautiful/step_05_a/lib/src/utils/adaptive_container.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/utils/adaptive_container.dart rename to boring_to_beautiful/step_05_a/lib/src/utils/adaptive_container.dart diff --git a/boring_to_beautiful/final/linux/.gitignore b/boring_to_beautiful/step_05_a/linux/.gitignore similarity index 100% rename from boring_to_beautiful/final/linux/.gitignore rename to boring_to_beautiful/step_05_a/linux/.gitignore diff --git a/boring_to_beautiful/final/linux/CMakeLists.txt b/boring_to_beautiful/step_05_a/linux/CMakeLists.txt similarity index 100% rename from boring_to_beautiful/final/linux/CMakeLists.txt rename to boring_to_beautiful/step_05_a/linux/CMakeLists.txt diff --git a/boring_to_beautiful/final/linux/flutter/CMakeLists.txt b/boring_to_beautiful/step_05_a/linux/flutter/CMakeLists.txt similarity index 100% rename from boring_to_beautiful/final/linux/flutter/CMakeLists.txt rename to boring_to_beautiful/step_05_a/linux/flutter/CMakeLists.txt diff --git a/boring_to_beautiful/final/linux/flutter/generated_plugin_registrant.cc b/boring_to_beautiful/step_05_a/linux/flutter/generated_plugin_registrant.cc similarity index 100% rename from boring_to_beautiful/final/linux/flutter/generated_plugin_registrant.cc rename to boring_to_beautiful/step_05_a/linux/flutter/generated_plugin_registrant.cc diff --git a/boring_to_beautiful/final/linux/flutter/generated_plugin_registrant.h b/boring_to_beautiful/step_05_a/linux/flutter/generated_plugin_registrant.h similarity index 100% rename from boring_to_beautiful/final/linux/flutter/generated_plugin_registrant.h rename to boring_to_beautiful/step_05_a/linux/flutter/generated_plugin_registrant.h diff --git a/boring_to_beautiful/final/linux/flutter/generated_plugins.cmake b/boring_to_beautiful/step_05_a/linux/flutter/generated_plugins.cmake similarity index 100% rename from boring_to_beautiful/final/linux/flutter/generated_plugins.cmake rename to boring_to_beautiful/step_05_a/linux/flutter/generated_plugins.cmake diff --git a/boring_to_beautiful/final/linux/runner/CMakeLists.txt b/boring_to_beautiful/step_05_a/linux/runner/CMakeLists.txt similarity index 100% rename from boring_to_beautiful/final/linux/runner/CMakeLists.txt rename to boring_to_beautiful/step_05_a/linux/runner/CMakeLists.txt diff --git a/boring_to_beautiful/final/linux/runner/main.cc b/boring_to_beautiful/step_05_a/linux/runner/main.cc similarity index 100% rename from boring_to_beautiful/final/linux/runner/main.cc rename to boring_to_beautiful/step_05_a/linux/runner/main.cc diff --git a/boring_to_beautiful/final/linux/runner/my_application.cc b/boring_to_beautiful/step_05_a/linux/runner/my_application.cc similarity index 100% rename from boring_to_beautiful/final/linux/runner/my_application.cc rename to boring_to_beautiful/step_05_a/linux/runner/my_application.cc diff --git a/boring_to_beautiful/final/linux/runner/my_application.h b/boring_to_beautiful/step_05_a/linux/runner/my_application.h similarity index 100% rename from boring_to_beautiful/final/linux/runner/my_application.h rename to boring_to_beautiful/step_05_a/linux/runner/my_application.h diff --git a/boring_to_beautiful/final/macos/.gitignore b/boring_to_beautiful/step_05_a/macos/.gitignore similarity index 100% rename from boring_to_beautiful/final/macos/.gitignore rename to boring_to_beautiful/step_05_a/macos/.gitignore diff --git a/boring_to_beautiful/final/macos/Flutter/Flutter-Debug.xcconfig b/boring_to_beautiful/step_05_a/macos/Flutter/Flutter-Debug.xcconfig similarity index 100% rename from boring_to_beautiful/final/macos/Flutter/Flutter-Debug.xcconfig rename to boring_to_beautiful/step_05_a/macos/Flutter/Flutter-Debug.xcconfig diff --git a/boring_to_beautiful/final/macos/Flutter/Flutter-Release.xcconfig b/boring_to_beautiful/step_05_a/macos/Flutter/Flutter-Release.xcconfig similarity index 100% rename from boring_to_beautiful/final/macos/Flutter/Flutter-Release.xcconfig rename to boring_to_beautiful/step_05_a/macos/Flutter/Flutter-Release.xcconfig diff --git a/boring_to_beautiful/final/macos/Flutter/GeneratedPluginRegistrant.swift b/boring_to_beautiful/step_05_a/macos/Flutter/GeneratedPluginRegistrant.swift similarity index 100% rename from boring_to_beautiful/final/macos/Flutter/GeneratedPluginRegistrant.swift rename to boring_to_beautiful/step_05_a/macos/Flutter/GeneratedPluginRegistrant.swift diff --git a/boring_to_beautiful/final/macos/Podfile b/boring_to_beautiful/step_05_a/macos/Podfile similarity index 100% rename from boring_to_beautiful/final/macos/Podfile rename to boring_to_beautiful/step_05_a/macos/Podfile diff --git a/boring_to_beautiful/final/macos/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_05_a/macos/Runner.xcodeproj/project.pbxproj similarity index 93% rename from boring_to_beautiful/final/macos/Runner.xcodeproj/project.pbxproj rename to boring_to_beautiful/step_05_a/macos/Runner.xcodeproj/project.pbxproj index 6ae862c37d..79fced16c3 100644 --- a/boring_to_beautiful/final/macos/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_05_a/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 120C1A7E7D320A31C1211A4A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 6A705DC52900C471DF6E1EC6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */; }; - 9AEA2C669381F3905C501B66 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */; }; + E344FE031826102CEDE46647 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,7 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 049E4603B0A09E05087E56FA /* 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 = ""; }; + 2BCC07C46EB4E01CE044DBB6 /* 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 = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -79,15 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 54CECCDD830654297CBE27CA /* 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 = ""; }; + 3E5DC3FB470EEF77149E71DD /* 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 = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 93864140E5DDD8350C71D815 /* 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 = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 9FFE8F2CDA409CA0E1B27D98 /* 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 = ""; }; - A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CE866162E3EE650EB52F3385 /* 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 = ""; }; - DF7AD973C56F21946082FE37 /* 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 = ""; }; - E9D755A13E508067E98F3444 /* 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 = ""; }; + 9B293DEC88BD59786AD94EBD /* 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 = ""; }; + AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EEFA0ABEA58A1E38E7AD7041 /* 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 = ""; }; + FDBDA46A6FE6381EE95E5A7A /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9AEA2C669381F3905C501B66 /* Pods_RunnerTests.framework in Frameworks */, + 120C1A7E7D320A31C1211A4A /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6A705DC52900C471DF6E1EC6 /* Pods_Runner.framework in Frameworks */, + E344FE031826102CEDE46647 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - D3381829CD41C2D96B6F2B3E /* Pods */, + 6CDFAAD29A585E1E7DFB128C /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - D3381829CD41C2D96B6F2B3E /* Pods */ = { + 6CDFAAD29A585E1E7DFB128C /* Pods */ = { isa = PBXGroup; children = ( - E9D755A13E508067E98F3444 /* Pods-Runner.debug.xcconfig */, - CE866162E3EE650EB52F3385 /* Pods-Runner.release.xcconfig */, - DF7AD973C56F21946082FE37 /* Pods-Runner.profile.xcconfig */, - 9FFE8F2CDA409CA0E1B27D98 /* Pods-RunnerTests.debug.xcconfig */, - 049E4603B0A09E05087E56FA /* Pods-RunnerTests.release.xcconfig */, - 54CECCDD830654297CBE27CA /* Pods-RunnerTests.profile.xcconfig */, + 3E5DC3FB470EEF77149E71DD /* Pods-Runner.debug.xcconfig */, + 2BCC07C46EB4E01CE044DBB6 /* Pods-Runner.release.xcconfig */, + 9B293DEC88BD59786AD94EBD /* Pods-Runner.profile.xcconfig */, + 93864140E5DDD8350C71D815 /* Pods-RunnerTests.debug.xcconfig */, + FDBDA46A6FE6381EE95E5A7A /* Pods-RunnerTests.release.xcconfig */, + EEFA0ABEA58A1E38E7AD7041 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */, - A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */, + E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */, + AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - C59A11FAACC96E6D468156D2 /* [CP] Check Pods Manifest.lock */, + 36CFF57A21336FA90DED8C50 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 33528B7408CACCE07D6DAD0F /* [CP] Check Pods Manifest.lock */, + 41EDDA96C09EE65F003D69E0 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - C6A4842BF1A9A85A617B12E2 /* [CP] Embed Pods Frameworks */, + 0F169C1C0F5EE8E3D274E72F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,26 +323,21 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 33528B7408CACCE07D6DAD0F /* [CP] Check Pods Manifest.lock */ = { + 0F169C1C0F5EE8E3D274E72F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); 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"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 3399D490228B24CF009A79C7 /* ShellScript */ = { @@ -383,7 +378,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - C59A11FAACC96E6D468156D2 /* [CP] Check Pods Manifest.lock */ = { + 36CFF57A21336FA90DED8C50 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -405,21 +400,26 @@ 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; }; - C6A4842BF1A9A85A617B12E2 /* [CP] Embed Pods Frameworks */ = { + 41EDDA96C09EE65F003D69E0 /* [CP] Check Pods Manifest.lock */ = { 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"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + 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; }; /* End PBXShellScriptBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9FFE8F2CDA409CA0E1B27D98 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 93864140E5DDD8350C71D815 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 049E4603B0A09E05087E56FA /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = FDBDA46A6FE6381EE95E5A7A /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 54CECCDD830654297CBE27CA /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = EEFA0ABEA58A1E38E7AD7041 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/boring_to_beautiful/final/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/boring_to_beautiful/step_05_a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from boring_to_beautiful/final/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to boring_to_beautiful/step_05_a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/boring_to_beautiful/final/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/step_05_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from boring_to_beautiful/final/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to boring_to_beautiful/step_05_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/boring_to_beautiful/final/macos/Runner.xcworkspace/contents.xcworkspacedata b/boring_to_beautiful/step_05_a/macos/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from boring_to_beautiful/final/macos/Runner.xcworkspace/contents.xcworkspacedata rename to boring_to_beautiful/step_05_a/macos/Runner.xcworkspace/contents.xcworkspacedata diff --git a/boring_to_beautiful/final/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/boring_to_beautiful/step_05_a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from boring_to_beautiful/final/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to boring_to_beautiful/step_05_a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/boring_to_beautiful/final/macos/Runner/AppDelegate.swift b/boring_to_beautiful/step_05_a/macos/Runner/AppDelegate.swift similarity index 100% rename from boring_to_beautiful/final/macos/Runner/AppDelegate.swift rename to boring_to_beautiful/step_05_a/macos/Runner/AppDelegate.swift diff --git a/boring_to_beautiful/final/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/boring_to_beautiful/step_05_a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from boring_to_beautiful/final/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to boring_to_beautiful/step_05_a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/boring_to_beautiful/final/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/boring_to_beautiful/step_05_a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png similarity index 100% rename from boring_to_beautiful/final/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png rename to boring_to_beautiful/step_05_a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png diff --git a/boring_to_beautiful/final/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/boring_to_beautiful/step_05_a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png similarity index 100% rename from boring_to_beautiful/final/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png rename to boring_to_beautiful/step_05_a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png diff --git a/boring_to_beautiful/final/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/boring_to_beautiful/step_05_a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png similarity index 100% rename from boring_to_beautiful/final/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png rename to boring_to_beautiful/step_05_a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png diff --git a/boring_to_beautiful/final/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/boring_to_beautiful/step_05_a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png similarity index 100% rename from boring_to_beautiful/final/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png rename to boring_to_beautiful/step_05_a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png diff --git a/boring_to_beautiful/final/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/boring_to_beautiful/step_05_a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png similarity index 100% rename from boring_to_beautiful/final/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png rename to boring_to_beautiful/step_05_a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png diff --git a/boring_to_beautiful/final/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/boring_to_beautiful/step_05_a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png similarity index 100% rename from boring_to_beautiful/final/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png rename to boring_to_beautiful/step_05_a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png diff --git a/boring_to_beautiful/final/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/boring_to_beautiful/step_05_a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png similarity index 100% rename from boring_to_beautiful/final/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png rename to boring_to_beautiful/step_05_a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png diff --git a/boring_to_beautiful/final/macos/Runner/Base.lproj/MainMenu.xib b/boring_to_beautiful/step_05_a/macos/Runner/Base.lproj/MainMenu.xib similarity index 100% rename from boring_to_beautiful/final/macos/Runner/Base.lproj/MainMenu.xib rename to boring_to_beautiful/step_05_a/macos/Runner/Base.lproj/MainMenu.xib diff --git a/boring_to_beautiful/final/macos/Runner/Configs/AppInfo.xcconfig b/boring_to_beautiful/step_05_a/macos/Runner/Configs/AppInfo.xcconfig similarity index 100% rename from boring_to_beautiful/final/macos/Runner/Configs/AppInfo.xcconfig rename to boring_to_beautiful/step_05_a/macos/Runner/Configs/AppInfo.xcconfig diff --git a/boring_to_beautiful/final/macos/Runner/Configs/Debug.xcconfig b/boring_to_beautiful/step_05_a/macos/Runner/Configs/Debug.xcconfig similarity index 100% rename from boring_to_beautiful/final/macos/Runner/Configs/Debug.xcconfig rename to boring_to_beautiful/step_05_a/macos/Runner/Configs/Debug.xcconfig diff --git a/boring_to_beautiful/final/macos/Runner/Configs/Release.xcconfig b/boring_to_beautiful/step_05_a/macos/Runner/Configs/Release.xcconfig similarity index 100% rename from boring_to_beautiful/final/macos/Runner/Configs/Release.xcconfig rename to boring_to_beautiful/step_05_a/macos/Runner/Configs/Release.xcconfig diff --git a/boring_to_beautiful/final/macos/Runner/Configs/Warnings.xcconfig b/boring_to_beautiful/step_05_a/macos/Runner/Configs/Warnings.xcconfig similarity index 100% rename from boring_to_beautiful/final/macos/Runner/Configs/Warnings.xcconfig rename to boring_to_beautiful/step_05_a/macos/Runner/Configs/Warnings.xcconfig diff --git a/boring_to_beautiful/final/macos/Runner/DebugProfile.entitlements b/boring_to_beautiful/step_05_a/macos/Runner/DebugProfile.entitlements similarity index 100% rename from boring_to_beautiful/final/macos/Runner/DebugProfile.entitlements rename to boring_to_beautiful/step_05_a/macos/Runner/DebugProfile.entitlements index 3ba6c1266f..08c3ab17cc 100644 --- a/boring_to_beautiful/final/macos/Runner/DebugProfile.entitlements +++ b/boring_to_beautiful/step_05_a/macos/Runner/DebugProfile.entitlements @@ -6,9 +6,9 @@ com.apple.security.cs.allow-jit - com.apple.security.network.client - com.apple.security.network.server + com.apple.security.network.client + diff --git a/boring_to_beautiful/final/macos/Runner/Info.plist b/boring_to_beautiful/step_05_a/macos/Runner/Info.plist similarity index 100% rename from boring_to_beautiful/final/macos/Runner/Info.plist rename to boring_to_beautiful/step_05_a/macos/Runner/Info.plist diff --git a/boring_to_beautiful/final/macos/Runner/MainFlutterWindow.swift b/boring_to_beautiful/step_05_a/macos/Runner/MainFlutterWindow.swift similarity index 100% rename from boring_to_beautiful/final/macos/Runner/MainFlutterWindow.swift rename to boring_to_beautiful/step_05_a/macos/Runner/MainFlutterWindow.swift diff --git a/boring_to_beautiful/step_05/macos/Runner/Release.entitlements b/boring_to_beautiful/step_05_a/macos/Runner/Release.entitlements similarity index 84% rename from boring_to_beautiful/step_05/macos/Runner/Release.entitlements rename to boring_to_beautiful/step_05_a/macos/Runner/Release.entitlements index 7a2230dc33..ee95ab7e58 100644 --- a/boring_to_beautiful/step_05/macos/Runner/Release.entitlements +++ b/boring_to_beautiful/step_05_a/macos/Runner/Release.entitlements @@ -6,7 +6,5 @@ com.apple.security.network.client - com.apple.security.network.server - diff --git a/boring_to_beautiful/final/macos/RunnerTests/RunnerTests.swift b/boring_to_beautiful/step_05_a/macos/RunnerTests/RunnerTests.swift similarity index 100% rename from boring_to_beautiful/final/macos/RunnerTests/RunnerTests.swift rename to boring_to_beautiful/step_05_a/macos/RunnerTests/RunnerTests.swift diff --git a/boring_to_beautiful/final/pubspec.yaml b/boring_to_beautiful/step_05_a/pubspec.yaml similarity index 97% rename from boring_to_beautiful/final/pubspec.yaml rename to boring_to_beautiful/step_05_a/pubspec.yaml index e6cd6dfab6..817f7d00c0 100644 --- a/boring_to_beautiful/final/pubspec.yaml +++ b/boring_to_beautiful/step_05_a/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: english_words: ^4.0.0 flutter_bloc: ^9.1.1 freezed_annotation: ^3.0.0 - go_router: ^15.1.2 + go_router: ^15.1.3 material_color_utilities: any universal_platform: ^1.1.0 url_launcher: ^6.3.1 diff --git a/boring_to_beautiful/final/web/favicon.png b/boring_to_beautiful/step_05_a/web/favicon.png similarity index 100% rename from boring_to_beautiful/final/web/favicon.png rename to boring_to_beautiful/step_05_a/web/favicon.png diff --git a/boring_to_beautiful/final/web/icons/Icon-192.png b/boring_to_beautiful/step_05_a/web/icons/Icon-192.png similarity index 100% rename from boring_to_beautiful/final/web/icons/Icon-192.png rename to boring_to_beautiful/step_05_a/web/icons/Icon-192.png diff --git a/boring_to_beautiful/final/web/icons/Icon-512.png b/boring_to_beautiful/step_05_a/web/icons/Icon-512.png similarity index 100% rename from boring_to_beautiful/final/web/icons/Icon-512.png rename to boring_to_beautiful/step_05_a/web/icons/Icon-512.png diff --git a/boring_to_beautiful/final/web/icons/Icon-maskable-192.png b/boring_to_beautiful/step_05_a/web/icons/Icon-maskable-192.png similarity index 100% rename from boring_to_beautiful/final/web/icons/Icon-maskable-192.png rename to boring_to_beautiful/step_05_a/web/icons/Icon-maskable-192.png diff --git a/boring_to_beautiful/final/web/icons/Icon-maskable-512.png b/boring_to_beautiful/step_05_a/web/icons/Icon-maskable-512.png similarity index 100% rename from boring_to_beautiful/final/web/icons/Icon-maskable-512.png rename to boring_to_beautiful/step_05_a/web/icons/Icon-maskable-512.png diff --git a/boring_to_beautiful/final/web/index.html b/boring_to_beautiful/step_05_a/web/index.html similarity index 100% rename from boring_to_beautiful/final/web/index.html rename to boring_to_beautiful/step_05_a/web/index.html diff --git a/boring_to_beautiful/final/web/manifest.json b/boring_to_beautiful/step_05_a/web/manifest.json similarity index 100% rename from boring_to_beautiful/final/web/manifest.json rename to boring_to_beautiful/step_05_a/web/manifest.json diff --git a/boring_to_beautiful/final/windows/.gitignore b/boring_to_beautiful/step_05_a/windows/.gitignore similarity index 100% rename from boring_to_beautiful/final/windows/.gitignore rename to boring_to_beautiful/step_05_a/windows/.gitignore diff --git a/boring_to_beautiful/final/windows/CMakeLists.txt b/boring_to_beautiful/step_05_a/windows/CMakeLists.txt similarity index 100% rename from boring_to_beautiful/final/windows/CMakeLists.txt rename to boring_to_beautiful/step_05_a/windows/CMakeLists.txt diff --git a/boring_to_beautiful/final/windows/flutter/CMakeLists.txt b/boring_to_beautiful/step_05_a/windows/flutter/CMakeLists.txt similarity index 100% rename from boring_to_beautiful/final/windows/flutter/CMakeLists.txt rename to boring_to_beautiful/step_05_a/windows/flutter/CMakeLists.txt diff --git a/boring_to_beautiful/final/windows/flutter/generated_plugin_registrant.cc b/boring_to_beautiful/step_05_a/windows/flutter/generated_plugin_registrant.cc similarity index 100% rename from boring_to_beautiful/final/windows/flutter/generated_plugin_registrant.cc rename to boring_to_beautiful/step_05_a/windows/flutter/generated_plugin_registrant.cc diff --git a/boring_to_beautiful/final/windows/flutter/generated_plugin_registrant.h b/boring_to_beautiful/step_05_a/windows/flutter/generated_plugin_registrant.h similarity index 100% rename from boring_to_beautiful/final/windows/flutter/generated_plugin_registrant.h rename to boring_to_beautiful/step_05_a/windows/flutter/generated_plugin_registrant.h diff --git a/boring_to_beautiful/final/windows/flutter/generated_plugins.cmake b/boring_to_beautiful/step_05_a/windows/flutter/generated_plugins.cmake similarity index 100% rename from boring_to_beautiful/final/windows/flutter/generated_plugins.cmake rename to boring_to_beautiful/step_05_a/windows/flutter/generated_plugins.cmake diff --git a/boring_to_beautiful/final/windows/runner/CMakeLists.txt b/boring_to_beautiful/step_05_a/windows/runner/CMakeLists.txt similarity index 100% rename from boring_to_beautiful/final/windows/runner/CMakeLists.txt rename to boring_to_beautiful/step_05_a/windows/runner/CMakeLists.txt diff --git a/boring_to_beautiful/final/windows/runner/Runner.rc b/boring_to_beautiful/step_05_a/windows/runner/Runner.rc similarity index 100% rename from boring_to_beautiful/final/windows/runner/Runner.rc rename to boring_to_beautiful/step_05_a/windows/runner/Runner.rc diff --git a/boring_to_beautiful/final/windows/runner/flutter_window.cpp b/boring_to_beautiful/step_05_a/windows/runner/flutter_window.cpp similarity index 100% rename from boring_to_beautiful/final/windows/runner/flutter_window.cpp rename to boring_to_beautiful/step_05_a/windows/runner/flutter_window.cpp diff --git a/boring_to_beautiful/final/windows/runner/flutter_window.h b/boring_to_beautiful/step_05_a/windows/runner/flutter_window.h similarity index 100% rename from boring_to_beautiful/final/windows/runner/flutter_window.h rename to boring_to_beautiful/step_05_a/windows/runner/flutter_window.h diff --git a/boring_to_beautiful/final/windows/runner/main.cpp b/boring_to_beautiful/step_05_a/windows/runner/main.cpp similarity index 100% rename from boring_to_beautiful/final/windows/runner/main.cpp rename to boring_to_beautiful/step_05_a/windows/runner/main.cpp diff --git a/boring_to_beautiful/final/windows/runner/resource.h b/boring_to_beautiful/step_05_a/windows/runner/resource.h similarity index 100% rename from boring_to_beautiful/final/windows/runner/resource.h rename to boring_to_beautiful/step_05_a/windows/runner/resource.h diff --git a/boring_to_beautiful/final/windows/runner/resources/app_icon.ico b/boring_to_beautiful/step_05_a/windows/runner/resources/app_icon.ico similarity index 100% rename from boring_to_beautiful/final/windows/runner/resources/app_icon.ico rename to boring_to_beautiful/step_05_a/windows/runner/resources/app_icon.ico diff --git a/boring_to_beautiful/final/windows/runner/runner.exe.manifest b/boring_to_beautiful/step_05_a/windows/runner/runner.exe.manifest similarity index 100% rename from boring_to_beautiful/final/windows/runner/runner.exe.manifest rename to boring_to_beautiful/step_05_a/windows/runner/runner.exe.manifest diff --git a/boring_to_beautiful/final/windows/runner/utils.cpp b/boring_to_beautiful/step_05_a/windows/runner/utils.cpp similarity index 100% rename from boring_to_beautiful/final/windows/runner/utils.cpp rename to boring_to_beautiful/step_05_a/windows/runner/utils.cpp diff --git a/boring_to_beautiful/final/windows/runner/utils.h b/boring_to_beautiful/step_05_a/windows/runner/utils.h similarity index 100% rename from boring_to_beautiful/final/windows/runner/utils.h rename to boring_to_beautiful/step_05_a/windows/runner/utils.h diff --git a/boring_to_beautiful/final/windows/runner/win32_window.cpp b/boring_to_beautiful/step_05_a/windows/runner/win32_window.cpp similarity index 100% rename from boring_to_beautiful/final/windows/runner/win32_window.cpp rename to boring_to_beautiful/step_05_a/windows/runner/win32_window.cpp diff --git a/boring_to_beautiful/final/windows/runner/win32_window.h b/boring_to_beautiful/step_05_a/windows/runner/win32_window.h similarity index 100% rename from boring_to_beautiful/final/windows/runner/win32_window.h rename to boring_to_beautiful/step_05_a/windows/runner/win32_window.h diff --git a/boring_to_beautiful/step_05/.gitignore b/boring_to_beautiful/step_05_b/.gitignore similarity index 100% rename from boring_to_beautiful/step_05/.gitignore rename to boring_to_beautiful/step_05_b/.gitignore diff --git a/boring_to_beautiful/step_05/.vscode/launch.json b/boring_to_beautiful/step_05_b/.vscode/launch.json similarity index 100% rename from boring_to_beautiful/step_05/.vscode/launch.json rename to boring_to_beautiful/step_05_b/.vscode/launch.json diff --git a/boring_to_beautiful/step_05/analysis_options.yaml b/boring_to_beautiful/step_05_b/analysis_options.yaml similarity index 100% rename from boring_to_beautiful/step_05/analysis_options.yaml rename to boring_to_beautiful/step_05_b/analysis_options.yaml diff --git a/boring_to_beautiful/step_05/android/.gitignore b/boring_to_beautiful/step_05_b/android/.gitignore similarity index 100% rename from boring_to_beautiful/step_05/android/.gitignore rename to boring_to_beautiful/step_05_b/android/.gitignore diff --git a/boring_to_beautiful/step_05/android/app/build.gradle.kts b/boring_to_beautiful/step_05_b/android/app/build.gradle.kts similarity index 100% rename from boring_to_beautiful/step_05/android/app/build.gradle.kts rename to boring_to_beautiful/step_05_b/android/app/build.gradle.kts diff --git a/boring_to_beautiful/step_05/android/app/src/debug/AndroidManifest.xml b/boring_to_beautiful/step_05_b/android/app/src/debug/AndroidManifest.xml similarity index 100% rename from boring_to_beautiful/step_05/android/app/src/debug/AndroidManifest.xml rename to boring_to_beautiful/step_05_b/android/app/src/debug/AndroidManifest.xml diff --git a/boring_to_beautiful/step_05/android/app/src/main/AndroidManifest.xml b/boring_to_beautiful/step_05_b/android/app/src/main/AndroidManifest.xml similarity index 100% rename from boring_to_beautiful/step_05/android/app/src/main/AndroidManifest.xml rename to boring_to_beautiful/step_05_b/android/app/src/main/AndroidManifest.xml diff --git a/boring_to_beautiful/step_05/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt b/boring_to_beautiful/step_05_b/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt similarity index 100% rename from boring_to_beautiful/step_05/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt rename to boring_to_beautiful/step_05_b/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt diff --git a/boring_to_beautiful/step_05/android/app/src/main/res/drawable-v21/launch_background.xml b/boring_to_beautiful/step_05_b/android/app/src/main/res/drawable-v21/launch_background.xml similarity index 100% rename from boring_to_beautiful/step_05/android/app/src/main/res/drawable-v21/launch_background.xml rename to boring_to_beautiful/step_05_b/android/app/src/main/res/drawable-v21/launch_background.xml diff --git a/boring_to_beautiful/step_05/android/app/src/main/res/drawable/launch_background.xml b/boring_to_beautiful/step_05_b/android/app/src/main/res/drawable/launch_background.xml similarity index 100% rename from boring_to_beautiful/step_05/android/app/src/main/res/drawable/launch_background.xml rename to boring_to_beautiful/step_05_b/android/app/src/main/res/drawable/launch_background.xml diff --git a/boring_to_beautiful/step_05/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/boring_to_beautiful/step_05_b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from boring_to_beautiful/step_05/android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to boring_to_beautiful/step_05_b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/boring_to_beautiful/step_05/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/boring_to_beautiful/step_05_b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from boring_to_beautiful/step_05/android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to boring_to_beautiful/step_05_b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/boring_to_beautiful/step_05/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/boring_to_beautiful/step_05_b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from boring_to_beautiful/step_05/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to boring_to_beautiful/step_05_b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/boring_to_beautiful/step_05/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/boring_to_beautiful/step_05_b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from boring_to_beautiful/step_05/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to boring_to_beautiful/step_05_b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/boring_to_beautiful/step_05/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/boring_to_beautiful/step_05_b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from boring_to_beautiful/step_05/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to boring_to_beautiful/step_05_b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/boring_to_beautiful/step_05/android/app/src/main/res/values-night/styles.xml b/boring_to_beautiful/step_05_b/android/app/src/main/res/values-night/styles.xml similarity index 100% rename from boring_to_beautiful/step_05/android/app/src/main/res/values-night/styles.xml rename to boring_to_beautiful/step_05_b/android/app/src/main/res/values-night/styles.xml diff --git a/boring_to_beautiful/step_05/android/app/src/main/res/values/styles.xml b/boring_to_beautiful/step_05_b/android/app/src/main/res/values/styles.xml similarity index 100% rename from boring_to_beautiful/step_05/android/app/src/main/res/values/styles.xml rename to boring_to_beautiful/step_05_b/android/app/src/main/res/values/styles.xml diff --git a/boring_to_beautiful/step_05/android/app/src/profile/AndroidManifest.xml b/boring_to_beautiful/step_05_b/android/app/src/profile/AndroidManifest.xml similarity index 100% rename from boring_to_beautiful/step_05/android/app/src/profile/AndroidManifest.xml rename to boring_to_beautiful/step_05_b/android/app/src/profile/AndroidManifest.xml diff --git a/boring_to_beautiful/step_05/android/build.gradle.kts b/boring_to_beautiful/step_05_b/android/build.gradle.kts similarity index 100% rename from boring_to_beautiful/step_05/android/build.gradle.kts rename to boring_to_beautiful/step_05_b/android/build.gradle.kts diff --git a/boring_to_beautiful/step_05/android/gradle.properties b/boring_to_beautiful/step_05_b/android/gradle.properties similarity index 100% rename from boring_to_beautiful/step_05/android/gradle.properties rename to boring_to_beautiful/step_05_b/android/gradle.properties diff --git a/boring_to_beautiful/step_05/android/gradle/wrapper/gradle-wrapper.properties b/boring_to_beautiful/step_05_b/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from boring_to_beautiful/step_05/android/gradle/wrapper/gradle-wrapper.properties rename to boring_to_beautiful/step_05_b/android/gradle/wrapper/gradle-wrapper.properties diff --git a/boring_to_beautiful/step_05/android/settings.gradle.kts b/boring_to_beautiful/step_05_b/android/settings.gradle.kts similarity index 100% rename from boring_to_beautiful/step_05/android/settings.gradle.kts rename to boring_to_beautiful/step_05_b/android/settings.gradle.kts diff --git a/boring_to_beautiful/step_05/assets/images/albums/artist1-album1.jpg b/boring_to_beautiful/step_05_b/assets/images/albums/artist1-album1.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/albums/artist1-album1.jpg rename to boring_to_beautiful/step_05_b/assets/images/albums/artist1-album1.jpg diff --git a/boring_to_beautiful/step_05/assets/images/albums/artist1-album2.jpg b/boring_to_beautiful/step_05_b/assets/images/albums/artist1-album2.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/albums/artist1-album2.jpg rename to boring_to_beautiful/step_05_b/assets/images/albums/artist1-album2.jpg diff --git a/boring_to_beautiful/step_05/assets/images/albums/artist1-album3.jpg b/boring_to_beautiful/step_05_b/assets/images/albums/artist1-album3.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/albums/artist1-album3.jpg rename to boring_to_beautiful/step_05_b/assets/images/albums/artist1-album3.jpg diff --git a/boring_to_beautiful/step_05/assets/images/albums/artist2-album2.jpg b/boring_to_beautiful/step_05_b/assets/images/albums/artist2-album2.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/albums/artist2-album2.jpg rename to boring_to_beautiful/step_05_b/assets/images/albums/artist2-album2.jpg diff --git a/boring_to_beautiful/step_05/assets/images/albums/artist3-album1.jpg b/boring_to_beautiful/step_05_b/assets/images/albums/artist3-album1.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/albums/artist3-album1.jpg rename to boring_to_beautiful/step_05_b/assets/images/albums/artist3-album1.jpg diff --git a/boring_to_beautiful/step_05/assets/images/albums/artist4-album1.jpg b/boring_to_beautiful/step_05_b/assets/images/albums/artist4-album1.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/albums/artist4-album1.jpg rename to boring_to_beautiful/step_05_b/assets/images/albums/artist4-album1.jpg diff --git a/boring_to_beautiful/step_05/assets/images/albums/artist4-album2.jpg b/boring_to_beautiful/step_05_b/assets/images/albums/artist4-album2.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/albums/artist4-album2.jpg rename to boring_to_beautiful/step_05_b/assets/images/albums/artist4-album2.jpg diff --git a/boring_to_beautiful/step_05/assets/images/albums/artist4-album3.jpg b/boring_to_beautiful/step_05_b/assets/images/albums/artist4-album3.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/albums/artist4-album3.jpg rename to boring_to_beautiful/step_05_b/assets/images/albums/artist4-album3.jpg diff --git a/boring_to_beautiful/step_05/assets/images/albums/artist5-album1.jpg b/boring_to_beautiful/step_05_b/assets/images/albums/artist5-album1.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/albums/artist5-album1.jpg rename to boring_to_beautiful/step_05_b/assets/images/albums/artist5-album1.jpg diff --git a/boring_to_beautiful/step_05/assets/images/albums/artist5-album2.jpg b/boring_to_beautiful/step_05_b/assets/images/albums/artist5-album2.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/albums/artist5-album2.jpg rename to boring_to_beautiful/step_05_b/assets/images/albums/artist5-album2.jpg diff --git a/boring_to_beautiful/step_05/assets/images/albums/artist6-album1.jpg b/boring_to_beautiful/step_05_b/assets/images/albums/artist6-album1.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/albums/artist6-album1.jpg rename to boring_to_beautiful/step_05_b/assets/images/albums/artist6-album1.jpg diff --git a/boring_to_beautiful/step_05/assets/images/albums/artist6-album2.jpg b/boring_to_beautiful/step_05_b/assets/images/albums/artist6-album2.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/albums/artist6-album2.jpg rename to boring_to_beautiful/step_05_b/assets/images/albums/artist6-album2.jpg diff --git a/boring_to_beautiful/step_05/assets/images/albums/artist6-album3.jpg b/boring_to_beautiful/step_05_b/assets/images/albums/artist6-album3.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/albums/artist6-album3.jpg rename to boring_to_beautiful/step_05_b/assets/images/albums/artist6-album3.jpg diff --git a/boring_to_beautiful/step_05/assets/images/artists/joe.jpg b/boring_to_beautiful/step_05_b/assets/images/artists/joe.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/artists/joe.jpg rename to boring_to_beautiful/step_05_b/assets/images/artists/joe.jpg diff --git a/boring_to_beautiful/step_05/assets/images/artists/woman.jpeg b/boring_to_beautiful/step_05_b/assets/images/artists/woman.jpeg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/artists/woman.jpeg rename to boring_to_beautiful/step_05_b/assets/images/artists/woman.jpeg diff --git a/boring_to_beautiful/step_05/assets/images/news/concert.jpeg b/boring_to_beautiful/step_05_b/assets/images/news/concert.jpeg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/news/concert.jpeg rename to boring_to_beautiful/step_05_b/assets/images/news/concert.jpeg diff --git a/boring_to_beautiful/step_05/assets/images/news/concert_heart.jpg b/boring_to_beautiful/step_05_b/assets/images/news/concert_heart.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/news/concert_heart.jpg rename to boring_to_beautiful/step_05_b/assets/images/news/concert_heart.jpg diff --git a/boring_to_beautiful/step_05/assets/images/news/recording_studio.jpg b/boring_to_beautiful/step_05_b/assets/images/news/recording_studio.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/news/recording_studio.jpg rename to boring_to_beautiful/step_05_b/assets/images/news/recording_studio.jpg diff --git a/boring_to_beautiful/step_05/assets/images/playlists/austin.jpg b/boring_to_beautiful/step_05_b/assets/images/playlists/austin.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/playlists/austin.jpg rename to boring_to_beautiful/step_05_b/assets/images/playlists/austin.jpg diff --git a/boring_to_beautiful/step_05/assets/images/playlists/calm.jpg b/boring_to_beautiful/step_05_b/assets/images/playlists/calm.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/playlists/calm.jpg rename to boring_to_beautiful/step_05_b/assets/images/playlists/calm.jpg diff --git a/boring_to_beautiful/step_05/assets/images/playlists/coffee.jpg b/boring_to_beautiful/step_05_b/assets/images/playlists/coffee.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/playlists/coffee.jpg rename to boring_to_beautiful/step_05_b/assets/images/playlists/coffee.jpg diff --git a/boring_to_beautiful/step_05/assets/images/playlists/favorite.jpg b/boring_to_beautiful/step_05_b/assets/images/playlists/favorite.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/playlists/favorite.jpg rename to boring_to_beautiful/step_05_b/assets/images/playlists/favorite.jpg diff --git a/boring_to_beautiful/step_05/assets/images/playlists/jazz.jpg b/boring_to_beautiful/step_05_b/assets/images/playlists/jazz.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/playlists/jazz.jpg rename to boring_to_beautiful/step_05_b/assets/images/playlists/jazz.jpg diff --git a/boring_to_beautiful/step_05/assets/images/playlists/piano.jpg b/boring_to_beautiful/step_05_b/assets/images/playlists/piano.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/playlists/piano.jpg rename to boring_to_beautiful/step_05_b/assets/images/playlists/piano.jpg diff --git a/boring_to_beautiful/step_05/assets/images/playlists/reading.jpg b/boring_to_beautiful/step_05_b/assets/images/playlists/reading.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/playlists/reading.jpg rename to boring_to_beautiful/step_05_b/assets/images/playlists/reading.jpg diff --git a/boring_to_beautiful/step_05/assets/images/playlists/studying.jpg b/boring_to_beautiful/step_05_b/assets/images/playlists/studying.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/playlists/studying.jpg rename to boring_to_beautiful/step_05_b/assets/images/playlists/studying.jpg diff --git a/boring_to_beautiful/step_05/assets/images/playlists/workout.jpg b/boring_to_beautiful/step_05_b/assets/images/playlists/workout.jpg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/playlists/workout.jpg rename to boring_to_beautiful/step_05_b/assets/images/playlists/workout.jpg diff --git a/boring_to_beautiful/step_05/assets/images/record.jpeg b/boring_to_beautiful/step_05_b/assets/images/record.jpeg similarity index 100% rename from boring_to_beautiful/step_05/assets/images/record.jpeg rename to boring_to_beautiful/step_05_b/assets/images/record.jpeg diff --git a/boring_to_beautiful/step_05/ios/.gitignore b/boring_to_beautiful/step_05_b/ios/.gitignore similarity index 100% rename from boring_to_beautiful/step_05/ios/.gitignore rename to boring_to_beautiful/step_05_b/ios/.gitignore diff --git a/boring_to_beautiful/step_05/ios/Flutter/AppFrameworkInfo.plist b/boring_to_beautiful/step_05_b/ios/Flutter/AppFrameworkInfo.plist similarity index 100% rename from boring_to_beautiful/step_05/ios/Flutter/AppFrameworkInfo.plist rename to boring_to_beautiful/step_05_b/ios/Flutter/AppFrameworkInfo.plist diff --git a/boring_to_beautiful/step_05/ios/Flutter/Debug.xcconfig b/boring_to_beautiful/step_05_b/ios/Flutter/Debug.xcconfig similarity index 100% rename from boring_to_beautiful/step_05/ios/Flutter/Debug.xcconfig rename to boring_to_beautiful/step_05_b/ios/Flutter/Debug.xcconfig diff --git a/boring_to_beautiful/step_05/ios/Flutter/Release.xcconfig b/boring_to_beautiful/step_05_b/ios/Flutter/Release.xcconfig similarity index 100% rename from boring_to_beautiful/step_05/ios/Flutter/Release.xcconfig rename to boring_to_beautiful/step_05_b/ios/Flutter/Release.xcconfig diff --git a/boring_to_beautiful/step_05/ios/Podfile b/boring_to_beautiful/step_05_b/ios/Podfile similarity index 100% rename from boring_to_beautiful/step_05/ios/Podfile rename to boring_to_beautiful/step_05_b/ios/Podfile diff --git a/boring_to_beautiful/step_05/ios/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_05_b/ios/Runner.xcodeproj/project.pbxproj similarity index 92% rename from boring_to_beautiful/step_05/ios/Runner.xcodeproj/project.pbxproj rename to boring_to_beautiful/step_05_b/ios/Runner.xcodeproj/project.pbxproj index ebb1244e8b..c30322fdf6 100644 --- a/boring_to_beautiful/step_05/ios/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_05_b/ios/Runner.xcodeproj/project.pbxproj @@ -7,15 +7,15 @@ objects = { /* Begin PBXBuildFile section */ - 0BA3C72CFF7FB3D58116BBE0 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 28D4EB9BC109C11A38856D7C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */; }; + 31AC9F1F861163CE474DC0DF /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BA15459E839D3553B26934 /* Pods_Runner.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 */; }; + C4EE9B5B592653F634344186 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,20 +42,18 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 018597106C8E38C2A20B56DC /* 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 = ""; }; - 1454C98E0DB9BDD277830752 /* 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 = ""; }; + 06C27BF5D7B993BB5DCB8D21 /* 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 = ""; }; 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 = ""; }; - 164233455F6E52D976E7619C /* 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 = ""; }; - 203DA535161F6F2E1631CA2F /* 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 = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3421F167A26D263533D9C0F8 /* 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 = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4ABA081B421BEA588642248C /* 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 = ""; }; 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 = ""; }; - 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8367A59A9CDAA6556FC2822B /* 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 = ""; }; 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; }; @@ -63,8 +61,10 @@ 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 = ""; }; - E367CC7226100F29F71405B1 /* 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 = ""; }; - FAB89AD13AACCB9650BBE6EA /* 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 = ""; }; + 9BB58392A543FF4660B2490F /* 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 = ""; }; + D0BA15459E839D3553B26934 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F7B65A9BC4B475ABEC573986 /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,15 +72,15 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 28D4EB9BC109C11A38856D7C /* Pods_Runner.framework in Frameworks */, + 31AC9F1F861163CE474DC0DF /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - BFB82CA3C890A718124E1EDE /* Frameworks */ = { + F9E0A4607079935C37BF168F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0BA3C72CFF7FB3D58116BBE0 /* Pods_RunnerTests.framework in Frameworks */, + C4EE9B5B592653F634344186 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 7A1ACBFB4AEFAC5081D802E1 /* Pods */ = { + 44BD8D06CB822F8C423FCD72 /* Pods */ = { isa = PBXGroup; children = ( - E367CC7226100F29F71405B1 /* Pods-Runner.debug.xcconfig */, - 1454C98E0DB9BDD277830752 /* Pods-Runner.release.xcconfig */, - 203DA535161F6F2E1631CA2F /* Pods-Runner.profile.xcconfig */, - FAB89AD13AACCB9650BBE6EA /* Pods-RunnerTests.debug.xcconfig */, - 018597106C8E38C2A20B56DC /* Pods-RunnerTests.release.xcconfig */, - 164233455F6E52D976E7619C /* Pods-RunnerTests.profile.xcconfig */, + 3421F167A26D263533D9C0F8 /* Pods-Runner.debug.xcconfig */, + 8367A59A9CDAA6556FC2822B /* Pods-Runner.release.xcconfig */, + 06C27BF5D7B993BB5DCB8D21 /* Pods-Runner.profile.xcconfig */, + F7B65A9BC4B475ABEC573986 /* Pods-RunnerTests.debug.xcconfig */, + 4ABA081B421BEA588642248C /* Pods-RunnerTests.release.xcconfig */, + 9BB58392A543FF4660B2490F /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 7A1ACBFB4AEFAC5081D802E1 /* Pods */, - AD091A7825928A7EC8BC6AD6 /* Frameworks */, + 44BD8D06CB822F8C423FCD72 /* Pods */, + D054066A4956E2C378EF4A32 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - AD091A7825928A7EC8BC6AD6 /* Frameworks */ = { + D054066A4956E2C378EF4A32 /* Frameworks */ = { isa = PBXGroup; children = ( - 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */, - 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */, + D0BA15459E839D3553B26934 /* Pods_Runner.framework */, + E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D8787C4471D00A25C41EA2CB /* [CP] Check Pods Manifest.lock */, + 001D1E85333DF9609D34BC08 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - BFB82CA3C890A718124E1EDE /* Frameworks */, + F9E0A4607079935C37BF168F /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 62E6FB6D8F5E3A7C56D8737D /* [CP] Check Pods Manifest.lock */, + 1975AD24A5DD7DE3F4DE1B61 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 72DCD364ECC5EFBE76A41B99 /* [CP] Embed Pods Frameworks */, + 26E7569DC25C33E17720D218 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,23 +270,29 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 001D1E85333DF9609D34BC08 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + 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; }; - 62E6FB6D8F5E3A7C56D8737D /* [CP] Check Pods Manifest.lock */ = { + 1975AD24A5DD7DE3F4DE1B61 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -308,7 +314,7 @@ 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; }; - 72DCD364ECC5EFBE76A41B99 /* [CP] Embed Pods Frameworks */ = { + 26E7569DC25C33E17720D218 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -325,42 +331,36 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); - name = "Run Script"; + name = "Thin Binary"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - D8787C4471D00A25C41EA2CB /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; 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; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FAB89AD13AACCB9650BBE6EA /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = F7B65A9BC4B475ABEC573986 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 018597106C8E38C2A20B56DC /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 4ABA081B421BEA588642248C /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 164233455F6E52D976E7619C /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 9BB58392A543FF4660B2490F /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/boring_to_beautiful/step_05/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/boring_to_beautiful/step_05_b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to boring_to_beautiful/step_05_b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/boring_to_beautiful/step_05/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/boring_to_beautiful/step_05_b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to boring_to_beautiful/step_05_b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/boring_to_beautiful/step_05/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/boring_to_beautiful/step_05_b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to boring_to_beautiful/step_05_b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/boring_to_beautiful/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/step_05_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to boring_to_beautiful/step_05_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/boring_to_beautiful/step_05/ios/Runner.xcworkspace/contents.xcworkspacedata b/boring_to_beautiful/step_05_b/ios/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner.xcworkspace/contents.xcworkspacedata rename to boring_to_beautiful/step_05_b/ios/Runner.xcworkspace/contents.xcworkspacedata diff --git a/boring_to_beautiful/step_05/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/boring_to_beautiful/step_05_b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to boring_to_beautiful/step_05_b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/boring_to_beautiful/step_05/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/boring_to_beautiful/step_05_b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to boring_to_beautiful/step_05_b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/boring_to_beautiful/step_05/ios/Runner/AppDelegate.swift b/boring_to_beautiful/step_05_b/ios/Runner/AppDelegate.swift similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/AppDelegate.swift rename to boring_to_beautiful/step_05_b/ios/Runner/AppDelegate.swift diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png diff --git a/boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md rename to boring_to_beautiful/step_05_b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md diff --git a/boring_to_beautiful/step_05/ios/Runner/Base.lproj/LaunchScreen.storyboard b/boring_to_beautiful/step_05_b/ios/Runner/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Base.lproj/LaunchScreen.storyboard rename to boring_to_beautiful/step_05_b/ios/Runner/Base.lproj/LaunchScreen.storyboard diff --git a/boring_to_beautiful/step_05/ios/Runner/Base.lproj/Main.storyboard b/boring_to_beautiful/step_05_b/ios/Runner/Base.lproj/Main.storyboard similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Base.lproj/Main.storyboard rename to boring_to_beautiful/step_05_b/ios/Runner/Base.lproj/Main.storyboard diff --git a/boring_to_beautiful/step_05/ios/Runner/Info.plist b/boring_to_beautiful/step_05_b/ios/Runner/Info.plist similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Info.plist rename to boring_to_beautiful/step_05_b/ios/Runner/Info.plist diff --git a/boring_to_beautiful/step_05/ios/Runner/Runner-Bridging-Header.h b/boring_to_beautiful/step_05_b/ios/Runner/Runner-Bridging-Header.h similarity index 100% rename from boring_to_beautiful/step_05/ios/Runner/Runner-Bridging-Header.h rename to boring_to_beautiful/step_05_b/ios/Runner/Runner-Bridging-Header.h diff --git a/boring_to_beautiful/step_05/ios/RunnerTests/RunnerTests.swift b/boring_to_beautiful/step_05_b/ios/RunnerTests/RunnerTests.swift similarity index 100% rename from boring_to_beautiful/step_05/ios/RunnerTests/RunnerTests.swift rename to boring_to_beautiful/step_05_b/ios/RunnerTests/RunnerTests.swift diff --git a/boring_to_beautiful/step_05/lib/main.dart b/boring_to_beautiful/step_05_b/lib/main.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/main.dart rename to boring_to_beautiful/step_05_b/lib/main.dart diff --git a/boring_to_beautiful/step_05/lib/src/features/artists/artists.dart b/boring_to_beautiful/step_05_b/lib/src/features/artists/artists.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/features/artists/artists.dart rename to boring_to_beautiful/step_05_b/lib/src/features/artists/artists.dart diff --git a/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_bio.dart b/boring_to_beautiful/step_05_b/lib/src/features/artists/view/artist_bio.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/features/artists/view/artist_bio.dart rename to boring_to_beautiful/step_05_b/lib/src/features/artists/view/artist_bio.dart diff --git a/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_card.dart b/boring_to_beautiful/step_05_b/lib/src/features/artists/view/artist_card.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/features/artists/view/artist_card.dart rename to boring_to_beautiful/step_05_b/lib/src/features/artists/view/artist_card.dart diff --git a/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_events.dart b/boring_to_beautiful/step_05_b/lib/src/features/artists/view/artist_events.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/features/artists/view/artist_events.dart rename to boring_to_beautiful/step_05_b/lib/src/features/artists/view/artist_events.dart diff --git a/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_news.dart b/boring_to_beautiful/step_05_b/lib/src/features/artists/view/artist_news.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/features/artists/view/artist_news.dart rename to boring_to_beautiful/step_05_b/lib/src/features/artists/view/artist_news.dart diff --git a/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_ranked_songs.dart b/boring_to_beautiful/step_05_b/lib/src/features/artists/view/artist_ranked_songs.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/features/artists/view/artist_ranked_songs.dart rename to boring_to_beautiful/step_05_b/lib/src/features/artists/view/artist_ranked_songs.dart diff --git a/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_screen.dart b/boring_to_beautiful/step_05_b/lib/src/features/artists/view/artist_screen.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/features/artists/view/artist_screen.dart rename to boring_to_beautiful/step_05_b/lib/src/features/artists/view/artist_screen.dart diff --git a/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_updates.dart b/boring_to_beautiful/step_05_b/lib/src/features/artists/view/artist_updates.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/features/artists/view/artist_updates.dart rename to boring_to_beautiful/step_05_b/lib/src/features/artists/view/artist_updates.dart diff --git a/boring_to_beautiful/step_05/lib/src/features/artists/view/artists_screen.dart b/boring_to_beautiful/step_05_b/lib/src/features/artists/view/artists_screen.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/features/artists/view/artists_screen.dart rename to boring_to_beautiful/step_05_b/lib/src/features/artists/view/artists_screen.dart diff --git a/boring_to_beautiful/step_05/lib/src/features/artists/view/view.dart b/boring_to_beautiful/step_05_b/lib/src/features/artists/view/view.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/features/artists/view/view.dart rename to boring_to_beautiful/step_05_b/lib/src/features/artists/view/view.dart diff --git a/boring_to_beautiful/step_05/lib/src/features/home/home.dart b/boring_to_beautiful/step_05_b/lib/src/features/home/home.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/features/home/home.dart rename to boring_to_beautiful/step_05_b/lib/src/features/home/home.dart diff --git a/boring_to_beautiful/step_05/lib/src/features/home/view/home_artists.dart b/boring_to_beautiful/step_05_b/lib/src/features/home/view/home_artists.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/features/home/view/home_artists.dart rename to boring_to_beautiful/step_05_b/lib/src/features/home/view/home_artists.dart diff --git a/boring_to_beautiful/step_05/lib/src/features/home/view/home_highlight.dart b/boring_to_beautiful/step_05_b/lib/src/features/home/view/home_highlight.dart similarity index 95% rename from boring_to_beautiful/step_05/lib/src/features/home/view/home_highlight.dart rename to boring_to_beautiful/step_05_b/lib/src/features/home/view/home_highlight.dart index 746250cec1..a4016761a6 100644 --- a/boring_to_beautiful/step_05/lib/src/features/home/view/home_highlight.dart +++ b/boring_to_beautiful/step_05_b/lib/src/features/home/view/home_highlight.dart @@ -16,7 +16,7 @@ class HomeHighlight extends StatelessWidget { children: [ Expanded( child: Padding( - padding: const EdgeInsets.all(2), + padding: const EdgeInsets.all(15), child: Clickable( child: SizedBox( height: 275, diff --git a/boring_to_beautiful/step_05/lib/src/features/home/view/home_recent.dart b/boring_to_beautiful/step_05_b/lib/src/features/home/view/home_recent.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/features/home/view/home_recent.dart rename to boring_to_beautiful/step_05_b/lib/src/features/home/view/home_recent.dart diff --git a/boring_to_beautiful/step_05_b/lib/src/features/home/view/home_screen.dart b/boring_to_beautiful/step_05_b/lib/src/features/home/view/home_screen.dart new file mode 100644 index 0000000000..283bc8f106 --- /dev/null +++ b/boring_to_beautiful/step_05_b/lib/src/features/home/view/home_screen.dart @@ -0,0 +1,195 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +import '../../../shared/classes/classes.dart'; +import '../../../shared/extensions.dart'; +import '../../../shared/providers/providers.dart'; +import '../../../shared/views/views.dart'; +import '../../../utils/adaptive_components.dart'; +import '../../playlists/view/playlist_songs.dart'; +import 'view.dart'; + +class HomeScreen extends StatefulWidget { + const HomeScreen({super.key}); + + @override + State createState() => _HomeScreenState(); +} + +class _HomeScreenState extends State { + @override + Widget build(BuildContext context) { + final PlaylistsProvider playlistProvider = PlaylistsProvider(); + final List playlists = playlistProvider.playlists; + final Playlist topSongs = playlistProvider.topSongs; + final Playlist newReleases = playlistProvider.newReleases; + final ArtistsProvider artistsProvider = ArtistsProvider(); + final List artists = artistsProvider.artists; + return LayoutBuilder( + builder: (context, constraints) { + if (constraints.isMobile) { + return DefaultTabController( + length: 4, + child: Scaffold( + appBar: AppBar( + centerTitle: false, + title: const Text('Good morning'), + actions: const [BrightnessToggle()], + bottom: const TabBar( + isScrollable: true, + tabs: [ + Tab(text: 'Home'), + Tab(text: 'Recently Played'), + Tab(text: 'New Releases'), + Tab(text: 'Top Songs'), + ], + ), + ), + body: LayoutBuilder( + builder: (context, constraints) => TabBarView( + children: [ + SingleChildScrollView( + child: Column( + children: [ + const HomeHighlight(), + HomeArtists( + artists: artists, + constraints: constraints, + ), + ], + ), + ), + HomeRecent(playlists: playlists, axis: Axis.vertical), + PlaylistSongs(playlist: topSongs, constraints: constraints), + PlaylistSongs( + playlist: newReleases, + constraints: constraints, + ), + ], + ), + ), + ), + ); + } + return Scaffold( + body: SingleChildScrollView( + child: AdaptiveColumn( + children: [ + AdaptiveContainer( + columnSpan: 12, + child: Padding( + padding: const EdgeInsets.all(35), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Text( + 'Good morning', + style: context.displaySmall, + ), + ), + const SizedBox(width: 20), + const BrightnessToggle(), + ], + ), + ), + ), + AdaptiveContainer( + columnSpan: 12, + child: Column( + children: [ + const HomeHighlight(), + LayoutBuilder( + builder: (context, constraints) => HomeArtists( + artists: artists, + constraints: constraints, + ), + ), + ], + ), + ), + AdaptiveContainer( + columnSpan: 12, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(35), + child: Text( + 'Recently played', + style: context.headlineSmall, + ), + ), + HomeRecent(playlists: playlists), + ], + ), + ), + AdaptiveContainer( + columnSpan: 12, + child: Padding( + padding: const EdgeInsets.all(35), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Flexible( + flex: 10, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(35), + child: Text( + 'Top Songs Today', + style: context.titleLarge, + ), + ), + LayoutBuilder( + builder: (context, constraints) => + PlaylistSongs( + playlist: topSongs, + constraints: constraints, + ), + ), + ], + ), + ), + const SizedBox(width: 35), + Flexible( + flex: 10, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(35), + child: Text( + 'New Releases', + style: context.titleLarge, + ), + ), + LayoutBuilder( + builder: (context, constraints) => + PlaylistSongs( + playlist: newReleases, + constraints: constraints, + ), + ), + ], + ), + ), + ], + ), + ), + ), + ], + ), + ), + ); + }, + ); + } +} diff --git a/boring_to_beautiful/step_05/lib/src/features/home/view/view.dart b/boring_to_beautiful/step_05_b/lib/src/features/home/view/view.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/features/home/view/view.dart rename to boring_to_beautiful/step_05_b/lib/src/features/home/view/view.dart diff --git a/boring_to_beautiful/step_05/lib/src/features/playlists/playlists.dart b/boring_to_beautiful/step_05_b/lib/src/features/playlists/playlists.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/features/playlists/playlists.dart rename to boring_to_beautiful/step_05_b/lib/src/features/playlists/playlists.dart diff --git a/boring_to_beautiful/step_05/lib/src/features/playlists/view/playlist_home_screen.dart b/boring_to_beautiful/step_05_b/lib/src/features/playlists/view/playlist_home_screen.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/features/playlists/view/playlist_home_screen.dart rename to boring_to_beautiful/step_05_b/lib/src/features/playlists/view/playlist_home_screen.dart diff --git a/boring_to_beautiful/step_05/lib/src/features/playlists/view/playlist_screen.dart b/boring_to_beautiful/step_05_b/lib/src/features/playlists/view/playlist_screen.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/features/playlists/view/playlist_screen.dart rename to boring_to_beautiful/step_05_b/lib/src/features/playlists/view/playlist_screen.dart diff --git a/boring_to_beautiful/final/lib/src/features/playlists/view/playlist_songs.dart b/boring_to_beautiful/step_05_b/lib/src/features/playlists/view/playlist_songs.dart similarity index 87% rename from boring_to_beautiful/final/lib/src/features/playlists/view/playlist_songs.dart rename to boring_to_beautiful/step_05_b/lib/src/features/playlists/view/playlist_songs.dart index 17daf2e6eb..e9c951b7a9 100644 --- a/boring_to_beautiful/final/lib/src/features/playlists/view/playlist_songs.dart +++ b/boring_to_beautiful/step_05_b/lib/src/features/playlists/view/playlist_songs.dart @@ -42,15 +42,8 @@ class PlaylistSongs extends StatelessWidget { index: index, cells: [ DataCell( - HoverableSongPlayButton( - hoverMode: HoverMode.overlay, - song: playlist.songs[index], - child: Center( - child: Text( - (index + 1).toString(), - textAlign: TextAlign.center, - ), - ), + Center( + child: Text((index + 1).toString(), textAlign: TextAlign.center), ), ), DataCell( diff --git a/boring_to_beautiful/step_05/lib/src/features/playlists/view/view.dart b/boring_to_beautiful/step_05_b/lib/src/features/playlists/view/view.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/features/playlists/view/view.dart rename to boring_to_beautiful/step_05_b/lib/src/features/playlists/view/view.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/app.dart b/boring_to_beautiful/step_05_b/lib/src/shared/app.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/app.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/app.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/classes/artist.dart b/boring_to_beautiful/step_05_b/lib/src/shared/classes/artist.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/classes/artist.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/classes/artist.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/classes/classes.dart b/boring_to_beautiful/step_05_b/lib/src/shared/classes/classes.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/classes/classes.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/classes/classes.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/classes/event.dart b/boring_to_beautiful/step_05_b/lib/src/shared/classes/event.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/classes/event.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/classes/event.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/classes/image.dart b/boring_to_beautiful/step_05_b/lib/src/shared/classes/image.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/classes/image.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/classes/image.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/classes/news.dart b/boring_to_beautiful/step_05_b/lib/src/shared/classes/news.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/classes/news.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/classes/news.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/classes/playlist.dart b/boring_to_beautiful/step_05_b/lib/src/shared/classes/playlist.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/classes/playlist.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/classes/playlist.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/classes/ranked_song.dart b/boring_to_beautiful/step_05_b/lib/src/shared/classes/ranked_song.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/classes/ranked_song.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/classes/ranked_song.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/classes/song.dart b/boring_to_beautiful/step_05_b/lib/src/shared/classes/song.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/classes/song.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/classes/song.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/extensions.dart b/boring_to_beautiful/step_05_b/lib/src/shared/extensions.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/extensions.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/extensions.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/playback/bloc/bloc.dart b/boring_to_beautiful/step_05_b/lib/src/shared/playback/bloc/bloc.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/playback/bloc/bloc.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/playback/bloc/bloc.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/playback/bloc/playback_bloc.dart b/boring_to_beautiful/step_05_b/lib/src/shared/playback/bloc/playback_bloc.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/playback/bloc/playback_bloc.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/playback/bloc/playback_bloc.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/playback/bloc/playback_bloc.freezed.dart b/boring_to_beautiful/step_05_b/lib/src/shared/playback/bloc/playback_bloc.freezed.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/playback/bloc/playback_bloc.freezed.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/playback/bloc/playback_bloc.freezed.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/playback/bloc/playback_event.dart b/boring_to_beautiful/step_05_b/lib/src/shared/playback/bloc/playback_event.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/playback/bloc/playback_event.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/playback/bloc/playback_event.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/playback/bloc/playback_state.dart b/boring_to_beautiful/step_05_b/lib/src/shared/playback/bloc/playback_state.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/playback/bloc/playback_state.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/playback/bloc/playback_state.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/providers/artists.dart b/boring_to_beautiful/step_05_b/lib/src/shared/providers/artists.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/providers/artists.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/providers/artists.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/providers/playlists.dart b/boring_to_beautiful/step_05_b/lib/src/shared/providers/playlists.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/providers/playlists.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/providers/playlists.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/providers/providers.dart b/boring_to_beautiful/step_05_b/lib/src/shared/providers/providers.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/providers/providers.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/providers/providers.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/providers/songs.dart b/boring_to_beautiful/step_05_b/lib/src/shared/providers/songs.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/providers/songs.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/providers/songs.dart diff --git a/boring_to_beautiful/final/lib/src/shared/providers/theme.dart b/boring_to_beautiful/step_05_b/lib/src/shared/providers/theme.dart similarity index 98% rename from boring_to_beautiful/final/lib/src/shared/providers/theme.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/providers/theme.dart index 66480919af..a8c3c7c92f 100644 --- a/boring_to_beautiful/final/lib/src/shared/providers/theme.dart +++ b/boring_to_beautiful/step_05_b/lib/src/shared/providers/theme.dart @@ -147,7 +147,6 @@ class ThemeProvider extends InheritedWidget { ThemeData light([Color? targetColor]) { final colorScheme = colors(Brightness.light, targetColor); return ThemeData.light().copyWith( - pageTransitionsTheme: pageTransitionsTheme, colorScheme: colorScheme, appBarTheme: appBarTheme(colorScheme), cardTheme: cardTheme(), @@ -164,7 +163,6 @@ class ThemeProvider extends InheritedWidget { ThemeData dark([Color? targetColor]) { final colorScheme = colors(Brightness.dark, targetColor); return ThemeData.dark().copyWith( - pageTransitionsTheme: pageTransitionsTheme, colorScheme: colorScheme, appBarTheme: appBarTheme(colorScheme), cardTheme: cardTheme(), diff --git a/boring_to_beautiful/step_05/lib/src/shared/router.dart b/boring_to_beautiful/step_05_b/lib/src/shared/router.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/router.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/router.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/adaptive_image_card.dart b/boring_to_beautiful/step_05_b/lib/src/shared/views/adaptive_image_card.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/views/adaptive_image_card.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/views/adaptive_image_card.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/adaptive_navigation.dart b/boring_to_beautiful/step_05_b/lib/src/shared/views/adaptive_navigation.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/views/adaptive_navigation.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/views/adaptive_navigation.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/adaptive_table.dart b/boring_to_beautiful/step_05_b/lib/src/shared/views/adaptive_table.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/views/adaptive_table.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/views/adaptive_table.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/article_content.dart b/boring_to_beautiful/step_05_b/lib/src/shared/views/article_content.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/views/article_content.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/views/article_content.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/bottom_bar.dart b/boring_to_beautiful/step_05_b/lib/src/shared/views/bottom_bar.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/views/bottom_bar.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/views/bottom_bar.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/brightness_toggle.dart b/boring_to_beautiful/step_05_b/lib/src/shared/views/brightness_toggle.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/views/brightness_toggle.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/views/brightness_toggle.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/center_row.dart b/boring_to_beautiful/step_05_b/lib/src/shared/views/center_row.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/views/center_row.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/views/center_row.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/clickable.dart b/boring_to_beautiful/step_05_b/lib/src/shared/views/clickable.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/views/clickable.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/views/clickable.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/events.dart b/boring_to_beautiful/step_05_b/lib/src/shared/views/events.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/views/events.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/views/events.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/hover_toggle.dart b/boring_to_beautiful/step_05_b/lib/src/shared/views/hover_toggle.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/views/hover_toggle.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/views/hover_toggle.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/hoverable_song_play_button.dart b/boring_to_beautiful/step_05_b/lib/src/shared/views/hoverable_song_play_button.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/views/hoverable_song_play_button.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/views/hoverable_song_play_button.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/image_card.dart b/boring_to_beautiful/step_05_b/lib/src/shared/views/image_card.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/views/image_card.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/views/image_card.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/image_clipper.dart b/boring_to_beautiful/step_05_b/lib/src/shared/views/image_clipper.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/views/image_clipper.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/views/image_clipper.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/image_tile.dart b/boring_to_beautiful/step_05_b/lib/src/shared/views/image_tile.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/views/image_tile.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/views/image_tile.dart diff --git a/boring_to_beautiful/step_05_b/lib/src/shared/views/outlined_card.dart b/boring_to_beautiful/step_05_b/lib/src/shared/views/outlined_card.dart new file mode 100644 index 0000000000..5225518d9f --- /dev/null +++ b/boring_to_beautiful/step_05_b/lib/src/shared/views/outlined_card.dart @@ -0,0 +1,35 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +class OutlinedCard extends StatefulWidget { + const OutlinedCard({super.key, required this.child, this.clickable = true}); + + final Widget child; + final bool clickable; + + @override + State createState() => _OutlinedCardState(); +} + +class _OutlinedCardState extends State { + @override + Widget build(BuildContext context) { + return MouseRegion( + cursor: widget.clickable + ? SystemMouseCursors.click + : SystemMouseCursors.basic, + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: Theme.of(context).colorScheme.outline, + width: 1, + ), + ), + child: widget.child, + ), + ); + } +} diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/play_pause_listener.dart b/boring_to_beautiful/step_05_b/lib/src/shared/views/play_pause_listener.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/views/play_pause_listener.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/views/play_pause_listener.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/root_layout.dart b/boring_to_beautiful/step_05_b/lib/src/shared/views/root_layout.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/views/root_layout.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/views/root_layout.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/sidebar.dart b/boring_to_beautiful/step_05_b/lib/src/shared/views/sidebar.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/views/sidebar.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/views/sidebar.dart diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/views.dart b/boring_to_beautiful/step_05_b/lib/src/shared/views/views.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/shared/views/views.dart rename to boring_to_beautiful/step_05_b/lib/src/shared/views/views.dart diff --git a/boring_to_beautiful/step_05/lib/src/utils/adaptive_breakpoints.dart b/boring_to_beautiful/step_05_b/lib/src/utils/adaptive_breakpoints.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/utils/adaptive_breakpoints.dart rename to boring_to_beautiful/step_05_b/lib/src/utils/adaptive_breakpoints.dart diff --git a/boring_to_beautiful/step_05/lib/src/utils/adaptive_column.dart b/boring_to_beautiful/step_05_b/lib/src/utils/adaptive_column.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/utils/adaptive_column.dart rename to boring_to_beautiful/step_05_b/lib/src/utils/adaptive_column.dart diff --git a/boring_to_beautiful/step_05/lib/src/utils/adaptive_components.dart b/boring_to_beautiful/step_05_b/lib/src/utils/adaptive_components.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/utils/adaptive_components.dart rename to boring_to_beautiful/step_05_b/lib/src/utils/adaptive_components.dart diff --git a/boring_to_beautiful/step_05/lib/src/utils/adaptive_container.dart b/boring_to_beautiful/step_05_b/lib/src/utils/adaptive_container.dart similarity index 100% rename from boring_to_beautiful/step_05/lib/src/utils/adaptive_container.dart rename to boring_to_beautiful/step_05_b/lib/src/utils/adaptive_container.dart diff --git a/boring_to_beautiful/step_05/linux/.gitignore b/boring_to_beautiful/step_05_b/linux/.gitignore similarity index 100% rename from boring_to_beautiful/step_05/linux/.gitignore rename to boring_to_beautiful/step_05_b/linux/.gitignore diff --git a/boring_to_beautiful/step_05/linux/CMakeLists.txt b/boring_to_beautiful/step_05_b/linux/CMakeLists.txt similarity index 100% rename from boring_to_beautiful/step_05/linux/CMakeLists.txt rename to boring_to_beautiful/step_05_b/linux/CMakeLists.txt diff --git a/boring_to_beautiful/step_05/linux/flutter/CMakeLists.txt b/boring_to_beautiful/step_05_b/linux/flutter/CMakeLists.txt similarity index 100% rename from boring_to_beautiful/step_05/linux/flutter/CMakeLists.txt rename to boring_to_beautiful/step_05_b/linux/flutter/CMakeLists.txt diff --git a/boring_to_beautiful/step_05/linux/flutter/generated_plugin_registrant.cc b/boring_to_beautiful/step_05_b/linux/flutter/generated_plugin_registrant.cc similarity index 100% rename from boring_to_beautiful/step_05/linux/flutter/generated_plugin_registrant.cc rename to boring_to_beautiful/step_05_b/linux/flutter/generated_plugin_registrant.cc diff --git a/boring_to_beautiful/step_05/linux/flutter/generated_plugin_registrant.h b/boring_to_beautiful/step_05_b/linux/flutter/generated_plugin_registrant.h similarity index 100% rename from boring_to_beautiful/step_05/linux/flutter/generated_plugin_registrant.h rename to boring_to_beautiful/step_05_b/linux/flutter/generated_plugin_registrant.h diff --git a/boring_to_beautiful/step_05/linux/flutter/generated_plugins.cmake b/boring_to_beautiful/step_05_b/linux/flutter/generated_plugins.cmake similarity index 100% rename from boring_to_beautiful/step_05/linux/flutter/generated_plugins.cmake rename to boring_to_beautiful/step_05_b/linux/flutter/generated_plugins.cmake diff --git a/boring_to_beautiful/step_05/linux/runner/CMakeLists.txt b/boring_to_beautiful/step_05_b/linux/runner/CMakeLists.txt similarity index 100% rename from boring_to_beautiful/step_05/linux/runner/CMakeLists.txt rename to boring_to_beautiful/step_05_b/linux/runner/CMakeLists.txt diff --git a/boring_to_beautiful/step_05/linux/runner/main.cc b/boring_to_beautiful/step_05_b/linux/runner/main.cc similarity index 100% rename from boring_to_beautiful/step_05/linux/runner/main.cc rename to boring_to_beautiful/step_05_b/linux/runner/main.cc diff --git a/boring_to_beautiful/step_05/linux/runner/my_application.cc b/boring_to_beautiful/step_05_b/linux/runner/my_application.cc similarity index 100% rename from boring_to_beautiful/step_05/linux/runner/my_application.cc rename to boring_to_beautiful/step_05_b/linux/runner/my_application.cc diff --git a/boring_to_beautiful/step_05/linux/runner/my_application.h b/boring_to_beautiful/step_05_b/linux/runner/my_application.h similarity index 100% rename from boring_to_beautiful/step_05/linux/runner/my_application.h rename to boring_to_beautiful/step_05_b/linux/runner/my_application.h diff --git a/boring_to_beautiful/step_05/macos/.gitignore b/boring_to_beautiful/step_05_b/macos/.gitignore similarity index 100% rename from boring_to_beautiful/step_05/macos/.gitignore rename to boring_to_beautiful/step_05_b/macos/.gitignore diff --git a/boring_to_beautiful/step_05/macos/Flutter/Flutter-Debug.xcconfig b/boring_to_beautiful/step_05_b/macos/Flutter/Flutter-Debug.xcconfig similarity index 100% rename from boring_to_beautiful/step_05/macos/Flutter/Flutter-Debug.xcconfig rename to boring_to_beautiful/step_05_b/macos/Flutter/Flutter-Debug.xcconfig diff --git a/boring_to_beautiful/step_05/macos/Flutter/Flutter-Release.xcconfig b/boring_to_beautiful/step_05_b/macos/Flutter/Flutter-Release.xcconfig similarity index 100% rename from boring_to_beautiful/step_05/macos/Flutter/Flutter-Release.xcconfig rename to boring_to_beautiful/step_05_b/macos/Flutter/Flutter-Release.xcconfig diff --git a/boring_to_beautiful/step_05/macos/Flutter/GeneratedPluginRegistrant.swift b/boring_to_beautiful/step_05_b/macos/Flutter/GeneratedPluginRegistrant.swift similarity index 100% rename from boring_to_beautiful/step_05/macos/Flutter/GeneratedPluginRegistrant.swift rename to boring_to_beautiful/step_05_b/macos/Flutter/GeneratedPluginRegistrant.swift diff --git a/boring_to_beautiful/step_05/macos/Podfile b/boring_to_beautiful/step_05_b/macos/Podfile similarity index 100% rename from boring_to_beautiful/step_05/macos/Podfile rename to boring_to_beautiful/step_05_b/macos/Podfile diff --git a/boring_to_beautiful/step_05/macos/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_05_b/macos/Runner.xcodeproj/project.pbxproj similarity index 93% rename from boring_to_beautiful/step_05/macos/Runner.xcodeproj/project.pbxproj rename to boring_to_beautiful/step_05_b/macos/Runner.xcodeproj/project.pbxproj index 6ae862c37d..79fced16c3 100644 --- a/boring_to_beautiful/step_05/macos/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_05_b/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 120C1A7E7D320A31C1211A4A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 6A705DC52900C471DF6E1EC6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */; }; - 9AEA2C669381F3905C501B66 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */; }; + E344FE031826102CEDE46647 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,7 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 049E4603B0A09E05087E56FA /* 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 = ""; }; + 2BCC07C46EB4E01CE044DBB6 /* 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 = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -79,15 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 54CECCDD830654297CBE27CA /* 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 = ""; }; + 3E5DC3FB470EEF77149E71DD /* 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 = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 93864140E5DDD8350C71D815 /* 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 = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 9FFE8F2CDA409CA0E1B27D98 /* 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 = ""; }; - A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CE866162E3EE650EB52F3385 /* 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 = ""; }; - DF7AD973C56F21946082FE37 /* 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 = ""; }; - E9D755A13E508067E98F3444 /* 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 = ""; }; + 9B293DEC88BD59786AD94EBD /* 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 = ""; }; + AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EEFA0ABEA58A1E38E7AD7041 /* 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 = ""; }; + FDBDA46A6FE6381EE95E5A7A /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9AEA2C669381F3905C501B66 /* Pods_RunnerTests.framework in Frameworks */, + 120C1A7E7D320A31C1211A4A /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6A705DC52900C471DF6E1EC6 /* Pods_Runner.framework in Frameworks */, + E344FE031826102CEDE46647 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - D3381829CD41C2D96B6F2B3E /* Pods */, + 6CDFAAD29A585E1E7DFB128C /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - D3381829CD41C2D96B6F2B3E /* Pods */ = { + 6CDFAAD29A585E1E7DFB128C /* Pods */ = { isa = PBXGroup; children = ( - E9D755A13E508067E98F3444 /* Pods-Runner.debug.xcconfig */, - CE866162E3EE650EB52F3385 /* Pods-Runner.release.xcconfig */, - DF7AD973C56F21946082FE37 /* Pods-Runner.profile.xcconfig */, - 9FFE8F2CDA409CA0E1B27D98 /* Pods-RunnerTests.debug.xcconfig */, - 049E4603B0A09E05087E56FA /* Pods-RunnerTests.release.xcconfig */, - 54CECCDD830654297CBE27CA /* Pods-RunnerTests.profile.xcconfig */, + 3E5DC3FB470EEF77149E71DD /* Pods-Runner.debug.xcconfig */, + 2BCC07C46EB4E01CE044DBB6 /* Pods-Runner.release.xcconfig */, + 9B293DEC88BD59786AD94EBD /* Pods-Runner.profile.xcconfig */, + 93864140E5DDD8350C71D815 /* Pods-RunnerTests.debug.xcconfig */, + FDBDA46A6FE6381EE95E5A7A /* Pods-RunnerTests.release.xcconfig */, + EEFA0ABEA58A1E38E7AD7041 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */, - A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */, + E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */, + AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - C59A11FAACC96E6D468156D2 /* [CP] Check Pods Manifest.lock */, + 36CFF57A21336FA90DED8C50 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 33528B7408CACCE07D6DAD0F /* [CP] Check Pods Manifest.lock */, + 41EDDA96C09EE65F003D69E0 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - C6A4842BF1A9A85A617B12E2 /* [CP] Embed Pods Frameworks */, + 0F169C1C0F5EE8E3D274E72F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,26 +323,21 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 33528B7408CACCE07D6DAD0F /* [CP] Check Pods Manifest.lock */ = { + 0F169C1C0F5EE8E3D274E72F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); 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"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 3399D490228B24CF009A79C7 /* ShellScript */ = { @@ -383,7 +378,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - C59A11FAACC96E6D468156D2 /* [CP] Check Pods Manifest.lock */ = { + 36CFF57A21336FA90DED8C50 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -405,21 +400,26 @@ 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; }; - C6A4842BF1A9A85A617B12E2 /* [CP] Embed Pods Frameworks */ = { + 41EDDA96C09EE65F003D69E0 /* [CP] Check Pods Manifest.lock */ = { 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"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + 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; }; /* End PBXShellScriptBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9FFE8F2CDA409CA0E1B27D98 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 93864140E5DDD8350C71D815 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 049E4603B0A09E05087E56FA /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = FDBDA46A6FE6381EE95E5A7A /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 54CECCDD830654297CBE27CA /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = EEFA0ABEA58A1E38E7AD7041 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/boring_to_beautiful/step_05/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/boring_to_beautiful/step_05_b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to boring_to_beautiful/step_05_b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/boring_to_beautiful/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/step_05_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to boring_to_beautiful/step_05_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/boring_to_beautiful/step_05/macos/Runner.xcworkspace/contents.xcworkspacedata b/boring_to_beautiful/step_05_b/macos/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner.xcworkspace/contents.xcworkspacedata rename to boring_to_beautiful/step_05_b/macos/Runner.xcworkspace/contents.xcworkspacedata diff --git a/boring_to_beautiful/step_05/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/boring_to_beautiful/step_05_b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to boring_to_beautiful/step_05_b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/boring_to_beautiful/step_05/macos/Runner/AppDelegate.swift b/boring_to_beautiful/step_05_b/macos/Runner/AppDelegate.swift similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner/AppDelegate.swift rename to boring_to_beautiful/step_05_b/macos/Runner/AppDelegate.swift diff --git a/boring_to_beautiful/step_05/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/boring_to_beautiful/step_05_b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to boring_to_beautiful/step_05_b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/boring_to_beautiful/step_05/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/boring_to_beautiful/step_05_b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png rename to boring_to_beautiful/step_05_b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png diff --git a/boring_to_beautiful/step_05/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/boring_to_beautiful/step_05_b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png rename to boring_to_beautiful/step_05_b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png diff --git a/boring_to_beautiful/step_05/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/boring_to_beautiful/step_05_b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png rename to boring_to_beautiful/step_05_b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png diff --git a/boring_to_beautiful/step_05/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/boring_to_beautiful/step_05_b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png rename to boring_to_beautiful/step_05_b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png diff --git a/boring_to_beautiful/step_05/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/boring_to_beautiful/step_05_b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png rename to boring_to_beautiful/step_05_b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png diff --git a/boring_to_beautiful/step_05/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/boring_to_beautiful/step_05_b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png rename to boring_to_beautiful/step_05_b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png diff --git a/boring_to_beautiful/step_05/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/boring_to_beautiful/step_05_b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png rename to boring_to_beautiful/step_05_b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png diff --git a/boring_to_beautiful/step_05/macos/Runner/Base.lproj/MainMenu.xib b/boring_to_beautiful/step_05_b/macos/Runner/Base.lproj/MainMenu.xib similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner/Base.lproj/MainMenu.xib rename to boring_to_beautiful/step_05_b/macos/Runner/Base.lproj/MainMenu.xib diff --git a/boring_to_beautiful/step_05/macos/Runner/Configs/AppInfo.xcconfig b/boring_to_beautiful/step_05_b/macos/Runner/Configs/AppInfo.xcconfig similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner/Configs/AppInfo.xcconfig rename to boring_to_beautiful/step_05_b/macos/Runner/Configs/AppInfo.xcconfig diff --git a/boring_to_beautiful/step_05/macos/Runner/Configs/Debug.xcconfig b/boring_to_beautiful/step_05_b/macos/Runner/Configs/Debug.xcconfig similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner/Configs/Debug.xcconfig rename to boring_to_beautiful/step_05_b/macos/Runner/Configs/Debug.xcconfig diff --git a/boring_to_beautiful/step_05/macos/Runner/Configs/Release.xcconfig b/boring_to_beautiful/step_05_b/macos/Runner/Configs/Release.xcconfig similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner/Configs/Release.xcconfig rename to boring_to_beautiful/step_05_b/macos/Runner/Configs/Release.xcconfig diff --git a/boring_to_beautiful/step_05/macos/Runner/Configs/Warnings.xcconfig b/boring_to_beautiful/step_05_b/macos/Runner/Configs/Warnings.xcconfig similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner/Configs/Warnings.xcconfig rename to boring_to_beautiful/step_05_b/macos/Runner/Configs/Warnings.xcconfig diff --git a/boring_to_beautiful/step_05/macos/Runner/DebugProfile.entitlements b/boring_to_beautiful/step_05_b/macos/Runner/DebugProfile.entitlements similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner/DebugProfile.entitlements rename to boring_to_beautiful/step_05_b/macos/Runner/DebugProfile.entitlements index 3ba6c1266f..08c3ab17cc 100644 --- a/boring_to_beautiful/step_05/macos/Runner/DebugProfile.entitlements +++ b/boring_to_beautiful/step_05_b/macos/Runner/DebugProfile.entitlements @@ -6,9 +6,9 @@ com.apple.security.cs.allow-jit - com.apple.security.network.client - com.apple.security.network.server + com.apple.security.network.client + diff --git a/boring_to_beautiful/step_05/macos/Runner/Info.plist b/boring_to_beautiful/step_05_b/macos/Runner/Info.plist similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner/Info.plist rename to boring_to_beautiful/step_05_b/macos/Runner/Info.plist diff --git a/boring_to_beautiful/step_05/macos/Runner/MainFlutterWindow.swift b/boring_to_beautiful/step_05_b/macos/Runner/MainFlutterWindow.swift similarity index 100% rename from boring_to_beautiful/step_05/macos/Runner/MainFlutterWindow.swift rename to boring_to_beautiful/step_05_b/macos/Runner/MainFlutterWindow.swift diff --git a/boring_to_beautiful/step_05_b/macos/Runner/Release.entitlements b/boring_to_beautiful/step_05_b/macos/Runner/Release.entitlements new file mode 100644 index 0000000000..ee95ab7e58 --- /dev/null +++ b/boring_to_beautiful/step_05_b/macos/Runner/Release.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.network.client + + + diff --git a/boring_to_beautiful/step_05/macos/RunnerTests/RunnerTests.swift b/boring_to_beautiful/step_05_b/macos/RunnerTests/RunnerTests.swift similarity index 100% rename from boring_to_beautiful/step_05/macos/RunnerTests/RunnerTests.swift rename to boring_to_beautiful/step_05_b/macos/RunnerTests/RunnerTests.swift diff --git a/boring_to_beautiful/step_05/pubspec.yaml b/boring_to_beautiful/step_05_b/pubspec.yaml similarity index 97% rename from boring_to_beautiful/step_05/pubspec.yaml rename to boring_to_beautiful/step_05_b/pubspec.yaml index e6cd6dfab6..817f7d00c0 100644 --- a/boring_to_beautiful/step_05/pubspec.yaml +++ b/boring_to_beautiful/step_05_b/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: english_words: ^4.0.0 flutter_bloc: ^9.1.1 freezed_annotation: ^3.0.0 - go_router: ^15.1.2 + go_router: ^15.1.3 material_color_utilities: any universal_platform: ^1.1.0 url_launcher: ^6.3.1 diff --git a/boring_to_beautiful/step_05/web/favicon.png b/boring_to_beautiful/step_05_b/web/favicon.png similarity index 100% rename from boring_to_beautiful/step_05/web/favicon.png rename to boring_to_beautiful/step_05_b/web/favicon.png diff --git a/boring_to_beautiful/step_05/web/icons/Icon-192.png b/boring_to_beautiful/step_05_b/web/icons/Icon-192.png similarity index 100% rename from boring_to_beautiful/step_05/web/icons/Icon-192.png rename to boring_to_beautiful/step_05_b/web/icons/Icon-192.png diff --git a/boring_to_beautiful/step_05/web/icons/Icon-512.png b/boring_to_beautiful/step_05_b/web/icons/Icon-512.png similarity index 100% rename from boring_to_beautiful/step_05/web/icons/Icon-512.png rename to boring_to_beautiful/step_05_b/web/icons/Icon-512.png diff --git a/boring_to_beautiful/step_05/web/icons/Icon-maskable-192.png b/boring_to_beautiful/step_05_b/web/icons/Icon-maskable-192.png similarity index 100% rename from boring_to_beautiful/step_05/web/icons/Icon-maskable-192.png rename to boring_to_beautiful/step_05_b/web/icons/Icon-maskable-192.png diff --git a/boring_to_beautiful/step_05/web/icons/Icon-maskable-512.png b/boring_to_beautiful/step_05_b/web/icons/Icon-maskable-512.png similarity index 100% rename from boring_to_beautiful/step_05/web/icons/Icon-maskable-512.png rename to boring_to_beautiful/step_05_b/web/icons/Icon-maskable-512.png diff --git a/boring_to_beautiful/step_05/web/index.html b/boring_to_beautiful/step_05_b/web/index.html similarity index 100% rename from boring_to_beautiful/step_05/web/index.html rename to boring_to_beautiful/step_05_b/web/index.html diff --git a/boring_to_beautiful/step_05/web/manifest.json b/boring_to_beautiful/step_05_b/web/manifest.json similarity index 100% rename from boring_to_beautiful/step_05/web/manifest.json rename to boring_to_beautiful/step_05_b/web/manifest.json diff --git a/boring_to_beautiful/step_05/windows/.gitignore b/boring_to_beautiful/step_05_b/windows/.gitignore similarity index 100% rename from boring_to_beautiful/step_05/windows/.gitignore rename to boring_to_beautiful/step_05_b/windows/.gitignore diff --git a/boring_to_beautiful/step_05/windows/CMakeLists.txt b/boring_to_beautiful/step_05_b/windows/CMakeLists.txt similarity index 100% rename from boring_to_beautiful/step_05/windows/CMakeLists.txt rename to boring_to_beautiful/step_05_b/windows/CMakeLists.txt diff --git a/boring_to_beautiful/step_05/windows/flutter/CMakeLists.txt b/boring_to_beautiful/step_05_b/windows/flutter/CMakeLists.txt similarity index 100% rename from boring_to_beautiful/step_05/windows/flutter/CMakeLists.txt rename to boring_to_beautiful/step_05_b/windows/flutter/CMakeLists.txt diff --git a/boring_to_beautiful/step_05/windows/flutter/generated_plugin_registrant.cc b/boring_to_beautiful/step_05_b/windows/flutter/generated_plugin_registrant.cc similarity index 100% rename from boring_to_beautiful/step_05/windows/flutter/generated_plugin_registrant.cc rename to boring_to_beautiful/step_05_b/windows/flutter/generated_plugin_registrant.cc diff --git a/boring_to_beautiful/step_05/windows/flutter/generated_plugin_registrant.h b/boring_to_beautiful/step_05_b/windows/flutter/generated_plugin_registrant.h similarity index 100% rename from boring_to_beautiful/step_05/windows/flutter/generated_plugin_registrant.h rename to boring_to_beautiful/step_05_b/windows/flutter/generated_plugin_registrant.h diff --git a/boring_to_beautiful/step_05/windows/flutter/generated_plugins.cmake b/boring_to_beautiful/step_05_b/windows/flutter/generated_plugins.cmake similarity index 100% rename from boring_to_beautiful/step_05/windows/flutter/generated_plugins.cmake rename to boring_to_beautiful/step_05_b/windows/flutter/generated_plugins.cmake diff --git a/boring_to_beautiful/step_05/windows/runner/CMakeLists.txt b/boring_to_beautiful/step_05_b/windows/runner/CMakeLists.txt similarity index 100% rename from boring_to_beautiful/step_05/windows/runner/CMakeLists.txt rename to boring_to_beautiful/step_05_b/windows/runner/CMakeLists.txt diff --git a/boring_to_beautiful/step_05/windows/runner/Runner.rc b/boring_to_beautiful/step_05_b/windows/runner/Runner.rc similarity index 100% rename from boring_to_beautiful/step_05/windows/runner/Runner.rc rename to boring_to_beautiful/step_05_b/windows/runner/Runner.rc diff --git a/boring_to_beautiful/step_05/windows/runner/flutter_window.cpp b/boring_to_beautiful/step_05_b/windows/runner/flutter_window.cpp similarity index 100% rename from boring_to_beautiful/step_05/windows/runner/flutter_window.cpp rename to boring_to_beautiful/step_05_b/windows/runner/flutter_window.cpp diff --git a/boring_to_beautiful/step_05/windows/runner/flutter_window.h b/boring_to_beautiful/step_05_b/windows/runner/flutter_window.h similarity index 100% rename from boring_to_beautiful/step_05/windows/runner/flutter_window.h rename to boring_to_beautiful/step_05_b/windows/runner/flutter_window.h diff --git a/boring_to_beautiful/step_05/windows/runner/main.cpp b/boring_to_beautiful/step_05_b/windows/runner/main.cpp similarity index 100% rename from boring_to_beautiful/step_05/windows/runner/main.cpp rename to boring_to_beautiful/step_05_b/windows/runner/main.cpp diff --git a/boring_to_beautiful/step_05/windows/runner/resource.h b/boring_to_beautiful/step_05_b/windows/runner/resource.h similarity index 100% rename from boring_to_beautiful/step_05/windows/runner/resource.h rename to boring_to_beautiful/step_05_b/windows/runner/resource.h diff --git a/boring_to_beautiful/step_05/windows/runner/resources/app_icon.ico b/boring_to_beautiful/step_05_b/windows/runner/resources/app_icon.ico similarity index 100% rename from boring_to_beautiful/step_05/windows/runner/resources/app_icon.ico rename to boring_to_beautiful/step_05_b/windows/runner/resources/app_icon.ico diff --git a/boring_to_beautiful/step_05/windows/runner/runner.exe.manifest b/boring_to_beautiful/step_05_b/windows/runner/runner.exe.manifest similarity index 100% rename from boring_to_beautiful/step_05/windows/runner/runner.exe.manifest rename to boring_to_beautiful/step_05_b/windows/runner/runner.exe.manifest diff --git a/boring_to_beautiful/step_05/windows/runner/utils.cpp b/boring_to_beautiful/step_05_b/windows/runner/utils.cpp similarity index 100% rename from boring_to_beautiful/step_05/windows/runner/utils.cpp rename to boring_to_beautiful/step_05_b/windows/runner/utils.cpp diff --git a/boring_to_beautiful/step_05/windows/runner/utils.h b/boring_to_beautiful/step_05_b/windows/runner/utils.h similarity index 100% rename from boring_to_beautiful/step_05/windows/runner/utils.h rename to boring_to_beautiful/step_05_b/windows/runner/utils.h diff --git a/boring_to_beautiful/step_05/windows/runner/win32_window.cpp b/boring_to_beautiful/step_05_b/windows/runner/win32_window.cpp similarity index 100% rename from boring_to_beautiful/step_05/windows/runner/win32_window.cpp rename to boring_to_beautiful/step_05_b/windows/runner/win32_window.cpp diff --git a/boring_to_beautiful/step_05/windows/runner/win32_window.h b/boring_to_beautiful/step_05_b/windows/runner/win32_window.h similarity index 100% rename from boring_to_beautiful/step_05/windows/runner/win32_window.h rename to boring_to_beautiful/step_05_b/windows/runner/win32_window.h diff --git a/boring_to_beautiful/step_05_c/.gitignore b/boring_to_beautiful/step_05_c/.gitignore new file mode 100644 index 0000000000..79c113f9b5 --- /dev/null +++ b/boring_to_beautiful/step_05_c/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/boring_to_beautiful/step_05_c/.vscode/launch.json b/boring_to_beautiful/step_05_c/.vscode/launch.json new file mode 100644 index 0000000000..2097dc2167 --- /dev/null +++ b/boring_to_beautiful/step_05_c/.vscode/launch.json @@ -0,0 +1,13 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "myartist", + "request": "launch", + "type": "dart" + } + ] +} diff --git a/boring_to_beautiful/step_05_c/analysis_options.yaml b/boring_to_beautiful/step_05_c/analysis_options.yaml new file mode 100644 index 0000000000..f04c6cf0f3 --- /dev/null +++ b/boring_to_beautiful/step_05_c/analysis_options.yaml @@ -0,0 +1 @@ +include: ../../analysis_options.yaml diff --git a/boring_to_beautiful/step_05_c/android/.gitignore b/boring_to_beautiful/step_05_c/android/.gitignore new file mode 100644 index 0000000000..be3943c96d --- /dev/null +++ b/boring_to_beautiful/step_05_c/android/.gitignore @@ -0,0 +1,14 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java +.cxx/ + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/boring_to_beautiful/step_05_c/android/app/build.gradle.kts b/boring_to_beautiful/step_05_c/android/app/build.gradle.kts new file mode 100644 index 0000000000..0abcb2cc86 --- /dev/null +++ b/boring_to_beautiful/step_05_c/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.myartist" + compileSdk = flutter.compileSdkVersion + ndkVersion = "27.0.12077973" + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.myartist" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/boring_to_beautiful/step_05_c/android/app/src/debug/AndroidManifest.xml b/boring_to_beautiful/step_05_c/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000000..399f6981d5 --- /dev/null +++ b/boring_to_beautiful/step_05_c/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/boring_to_beautiful/step_05_c/android/app/src/main/AndroidManifest.xml b/boring_to_beautiful/step_05_c/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..b952d6a4d2 --- /dev/null +++ b/boring_to_beautiful/step_05_c/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/boring_to_beautiful/step_05_c/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt b/boring_to_beautiful/step_05_c/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt new file mode 100644 index 0000000000..b724a01056 --- /dev/null +++ b/boring_to_beautiful/step_05_c/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt @@ -0,0 +1,5 @@ +package com.example.myartist + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity : FlutterActivity() diff --git a/boring_to_beautiful/step_05_c/android/app/src/main/res/drawable-v21/launch_background.xml b/boring_to_beautiful/step_05_c/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000000..f74085f3f6 --- /dev/null +++ b/boring_to_beautiful/step_05_c/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/boring_to_beautiful/step_05_c/android/app/src/main/res/drawable/launch_background.xml b/boring_to_beautiful/step_05_c/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000000..304732f884 --- /dev/null +++ b/boring_to_beautiful/step_05_c/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/boring_to_beautiful/step_05_c/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/boring_to_beautiful/step_05_c/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000..db77bb4b7b Binary files /dev/null and b/boring_to_beautiful/step_05_c/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/boring_to_beautiful/step_05_c/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/boring_to_beautiful/step_05_c/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000..17987b79bb Binary files /dev/null and b/boring_to_beautiful/step_05_c/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/boring_to_beautiful/step_05_c/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/boring_to_beautiful/step_05_c/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000..09d4391482 Binary files /dev/null and b/boring_to_beautiful/step_05_c/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/boring_to_beautiful/step_05_c/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/boring_to_beautiful/step_05_c/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000..d5f1c8d34e Binary files /dev/null and b/boring_to_beautiful/step_05_c/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/boring_to_beautiful/step_05_c/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/boring_to_beautiful/step_05_c/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000..4d6372eebd Binary files /dev/null and b/boring_to_beautiful/step_05_c/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/boring_to_beautiful/step_05_c/android/app/src/main/res/values-night/styles.xml b/boring_to_beautiful/step_05_c/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000000..06952be745 --- /dev/null +++ b/boring_to_beautiful/step_05_c/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/boring_to_beautiful/step_05_c/android/app/src/main/res/values/styles.xml b/boring_to_beautiful/step_05_c/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000000..cb1ef88056 --- /dev/null +++ b/boring_to_beautiful/step_05_c/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/boring_to_beautiful/step_05_c/android/app/src/profile/AndroidManifest.xml b/boring_to_beautiful/step_05_c/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000000..399f6981d5 --- /dev/null +++ b/boring_to_beautiful/step_05_c/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/boring_to_beautiful/step_05_c/android/build.gradle.kts b/boring_to_beautiful/step_05_c/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/boring_to_beautiful/step_05_c/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/boring_to_beautiful/step_05_c/android/gradle.properties b/boring_to_beautiful/step_05_c/android/gradle.properties new file mode 100644 index 0000000000..f018a61817 --- /dev/null +++ b/boring_to_beautiful/step_05_c/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +android.enableJetifier=true diff --git a/boring_to_beautiful/step_05_c/android/gradle/wrapper/gradle-wrapper.properties b/boring_to_beautiful/step_05_c/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..ac3b47926e --- /dev/null +++ b/boring_to_beautiful/step_05_c/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip diff --git a/boring_to_beautiful/step_05_c/android/settings.gradle.kts b/boring_to_beautiful/step_05_c/android/settings.gradle.kts new file mode 100644 index 0000000000..ab39a10a29 --- /dev/null +++ b/boring_to_beautiful/step_05_c/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.3" apply false + id("org.jetbrains.kotlin.android") version "2.1.0" apply false +} + +include(":app") diff --git a/boring_to_beautiful/step_05_c/assets/images/albums/artist1-album1.jpg b/boring_to_beautiful/step_05_c/assets/images/albums/artist1-album1.jpg new file mode 100644 index 0000000000..e73e8e33cf Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/albums/artist1-album1.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/albums/artist1-album2.jpg b/boring_to_beautiful/step_05_c/assets/images/albums/artist1-album2.jpg new file mode 100644 index 0000000000..a024f6ddc2 Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/albums/artist1-album2.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/albums/artist1-album3.jpg b/boring_to_beautiful/step_05_c/assets/images/albums/artist1-album3.jpg new file mode 100644 index 0000000000..ffd51a8f06 Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/albums/artist1-album3.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/albums/artist2-album2.jpg b/boring_to_beautiful/step_05_c/assets/images/albums/artist2-album2.jpg new file mode 100644 index 0000000000..2598ed5c3e Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/albums/artist2-album2.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/albums/artist3-album1.jpg b/boring_to_beautiful/step_05_c/assets/images/albums/artist3-album1.jpg new file mode 100644 index 0000000000..eb278129d8 Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/albums/artist3-album1.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/albums/artist4-album1.jpg b/boring_to_beautiful/step_05_c/assets/images/albums/artist4-album1.jpg new file mode 100644 index 0000000000..51ad3f6c86 Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/albums/artist4-album1.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/albums/artist4-album2.jpg b/boring_to_beautiful/step_05_c/assets/images/albums/artist4-album2.jpg new file mode 100644 index 0000000000..8096ace1d2 Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/albums/artist4-album2.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/albums/artist4-album3.jpg b/boring_to_beautiful/step_05_c/assets/images/albums/artist4-album3.jpg new file mode 100644 index 0000000000..817f6e6af1 Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/albums/artist4-album3.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/albums/artist5-album1.jpg b/boring_to_beautiful/step_05_c/assets/images/albums/artist5-album1.jpg new file mode 100644 index 0000000000..82b85cfb3c Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/albums/artist5-album1.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/albums/artist5-album2.jpg b/boring_to_beautiful/step_05_c/assets/images/albums/artist5-album2.jpg new file mode 100644 index 0000000000..acb4b8f200 Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/albums/artist5-album2.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/albums/artist6-album1.jpg b/boring_to_beautiful/step_05_c/assets/images/albums/artist6-album1.jpg new file mode 100644 index 0000000000..ec6c5e88fc Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/albums/artist6-album1.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/albums/artist6-album2.jpg b/boring_to_beautiful/step_05_c/assets/images/albums/artist6-album2.jpg new file mode 100644 index 0000000000..2911a2a1cc Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/albums/artist6-album2.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/albums/artist6-album3.jpg b/boring_to_beautiful/step_05_c/assets/images/albums/artist6-album3.jpg new file mode 100644 index 0000000000..3aaec3a16d Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/albums/artist6-album3.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/artists/joe.jpg b/boring_to_beautiful/step_05_c/assets/images/artists/joe.jpg new file mode 100644 index 0000000000..6ca6d5bd40 Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/artists/joe.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/artists/woman.jpeg b/boring_to_beautiful/step_05_c/assets/images/artists/woman.jpeg new file mode 100644 index 0000000000..78f6a59129 Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/artists/woman.jpeg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/news/concert.jpeg b/boring_to_beautiful/step_05_c/assets/images/news/concert.jpeg new file mode 100644 index 0000000000..e9c10f3f1f Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/news/concert.jpeg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/news/concert_heart.jpg b/boring_to_beautiful/step_05_c/assets/images/news/concert_heart.jpg new file mode 100644 index 0000000000..a7060aefe1 Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/news/concert_heart.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/news/recording_studio.jpg b/boring_to_beautiful/step_05_c/assets/images/news/recording_studio.jpg new file mode 100644 index 0000000000..47c463975f Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/news/recording_studio.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/playlists/austin.jpg b/boring_to_beautiful/step_05_c/assets/images/playlists/austin.jpg new file mode 100644 index 0000000000..234907a7b4 Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/playlists/austin.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/playlists/calm.jpg b/boring_to_beautiful/step_05_c/assets/images/playlists/calm.jpg new file mode 100644 index 0000000000..6da08a9bae Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/playlists/calm.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/playlists/coffee.jpg b/boring_to_beautiful/step_05_c/assets/images/playlists/coffee.jpg new file mode 100644 index 0000000000..3978dc6a78 Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/playlists/coffee.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/playlists/favorite.jpg b/boring_to_beautiful/step_05_c/assets/images/playlists/favorite.jpg new file mode 100644 index 0000000000..5118f739a7 Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/playlists/favorite.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/playlists/jazz.jpg b/boring_to_beautiful/step_05_c/assets/images/playlists/jazz.jpg new file mode 100644 index 0000000000..8bc65b8310 Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/playlists/jazz.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/playlists/piano.jpg b/boring_to_beautiful/step_05_c/assets/images/playlists/piano.jpg new file mode 100644 index 0000000000..2883c896b8 Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/playlists/piano.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/playlists/reading.jpg b/boring_to_beautiful/step_05_c/assets/images/playlists/reading.jpg new file mode 100644 index 0000000000..851c372b64 Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/playlists/reading.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/playlists/studying.jpg b/boring_to_beautiful/step_05_c/assets/images/playlists/studying.jpg new file mode 100644 index 0000000000..6e042bbe96 Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/playlists/studying.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/playlists/workout.jpg b/boring_to_beautiful/step_05_c/assets/images/playlists/workout.jpg new file mode 100644 index 0000000000..6f30835e47 Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/playlists/workout.jpg differ diff --git a/boring_to_beautiful/step_05_c/assets/images/record.jpeg b/boring_to_beautiful/step_05_c/assets/images/record.jpeg new file mode 100644 index 0000000000..eadcadf4d7 Binary files /dev/null and b/boring_to_beautiful/step_05_c/assets/images/record.jpeg differ diff --git a/boring_to_beautiful/step_05_c/ios/.gitignore b/boring_to_beautiful/step_05_c/ios/.gitignore new file mode 100644 index 0000000000..7a7f9873ad --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/boring_to_beautiful/step_05_c/ios/Flutter/AppFrameworkInfo.plist b/boring_to_beautiful/step_05_c/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000000..7c56964006 --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 + + diff --git a/boring_to_beautiful/step_05_c/ios/Flutter/Debug.xcconfig b/boring_to_beautiful/step_05_c/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000000..ec97fc6f30 --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/boring_to_beautiful/step_05_c/ios/Flutter/Release.xcconfig b/boring_to_beautiful/step_05_c/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000000..c4855bfe20 --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/boring_to_beautiful/step_05_c/ios/Podfile b/boring_to_beautiful/step_05_c/ios/Podfile new file mode 100644 index 0000000000..e549ee22f3 --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/Podfile @@ -0,0 +1,43 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '12.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/boring_to_beautiful/step_05_c/ios/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_05_c/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..c30322fdf6 --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,728 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 31AC9F1F861163CE474DC0DF /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BA15459E839D3553B26934 /* Pods_Runner.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 */; }; + C4EE9B5B592653F634344186 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 06C27BF5D7B993BB5DCB8D21 /* 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 = ""; }; + 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 = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3421F167A26D263533D9C0F8 /* 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 = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 4ABA081B421BEA588642248C /* 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 = ""; }; + 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 = ""; }; + 8367A59A9CDAA6556FC2822B /* 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 = ""; }; + 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; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 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 = ""; }; + 9BB58392A543FF4660B2490F /* 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 = ""; }; + D0BA15459E839D3553B26934 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F7B65A9BC4B475ABEC573986 /* 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 = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 31AC9F1F861163CE474DC0DF /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F9E0A4607079935C37BF168F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C4EE9B5B592653F634344186 /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 44BD8D06CB822F8C423FCD72 /* Pods */ = { + isa = PBXGroup; + children = ( + 3421F167A26D263533D9C0F8 /* Pods-Runner.debug.xcconfig */, + 8367A59A9CDAA6556FC2822B /* Pods-Runner.release.xcconfig */, + 06C27BF5D7B993BB5DCB8D21 /* Pods-Runner.profile.xcconfig */, + F7B65A9BC4B475ABEC573986 /* Pods-RunnerTests.debug.xcconfig */, + 4ABA081B421BEA588642248C /* Pods-RunnerTests.release.xcconfig */, + 9BB58392A543FF4660B2490F /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + 44BD8D06CB822F8C423FCD72 /* Pods */, + D054066A4956E2C378EF4A32 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; + D054066A4956E2C378EF4A32 /* Frameworks */ = { + isa = PBXGroup; + children = ( + D0BA15459E839D3553B26934 /* Pods_Runner.framework */, + E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 001D1E85333DF9609D34BC08 /* [CP] Check Pods Manifest.lock */, + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + F9E0A4607079935C37BF168F /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 1975AD24A5DD7DE3F4DE1B61 /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 26E7569DC25C33E17720D218 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 001D1E85333DF9609D34BC08 /* [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; + }; + 1975AD24A5DD7DE3F4DE1B61 /* [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; + }; + 26E7569DC25C33E17720D218 /* [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; + }; + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.myartist; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F7B65A9BC4B475ABEC573986 /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.myartist.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4ABA081B421BEA588642248C /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.myartist.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9BB58392A543FF4660B2490F /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.myartist.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.myartist; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.myartist; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/boring_to_beautiful/step_05_c/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/boring_to_beautiful/step_05_c/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..919434a625 --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/boring_to_beautiful/step_05_c/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/boring_to_beautiful/step_05_c/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000..18d981003d --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/boring_to_beautiful/step_05_c/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/boring_to_beautiful/step_05_c/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000000..f9b0d7c5ea --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/boring_to_beautiful/step_05_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/step_05_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000000..e3773d42e2 --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boring_to_beautiful/step_05_c/ios/Runner.xcworkspace/contents.xcworkspacedata b/boring_to_beautiful/step_05_c/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..21a3cc14c7 --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/boring_to_beautiful/step_05_c/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/boring_to_beautiful/step_05_c/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000..18d981003d --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/boring_to_beautiful/step_05_c/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/boring_to_beautiful/step_05_c/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000000..f9b0d7c5ea --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/boring_to_beautiful/step_05_c/ios/Runner/AppDelegate.swift b/boring_to_beautiful/step_05_c/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000000..626664468b --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Flutter +import UIKit + +@main +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..d36b1fab2d --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000..dc9ada4725 Binary files /dev/null and b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000..7353c41ecf Binary files /dev/null and b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000..797d452e45 Binary files /dev/null and b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000..6ed2d933e1 Binary files /dev/null and b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000..4cd7b0099c Binary files /dev/null and b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000..fe730945a0 Binary files /dev/null and b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000000..321773cd85 Binary files /dev/null and b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000000..797d452e45 Binary files /dev/null and b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000..502f463a9b Binary files /dev/null and b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000..0ec3034392 Binary files /dev/null and b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000..0ec3034392 Binary files /dev/null and b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000..e9f5fea27c Binary files /dev/null and b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000..84ac32ae7d Binary files /dev/null and b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000000..8953cba090 Binary files /dev/null and b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000..0467bf12aa Binary files /dev/null and b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000000..0bedcf2fd4 --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000..9da19eacad Binary files /dev/null and b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000..9da19eacad Binary files /dev/null and b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000..9da19eacad Binary files /dev/null and b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000000..89c2725b70 --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Base.lproj/LaunchScreen.storyboard b/boring_to_beautiful/step_05_c/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000000..f2e259c7c9 --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Base.lproj/Main.storyboard b/boring_to_beautiful/step_05_c/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000000..f3c28516fb --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Info.plist b/boring_to_beautiful/step_05_c/ios/Runner/Info.plist new file mode 100644 index 0000000000..4111d331d8 --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Myartist + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + myartist + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/boring_to_beautiful/step_05_c/ios/Runner/Runner-Bridging-Header.h b/boring_to_beautiful/step_05_c/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000000..308a2a560b --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/boring_to_beautiful/step_05_c/ios/RunnerTests/RunnerTests.swift b/boring_to_beautiful/step_05_c/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000000..86a7c3b1b6 --- /dev/null +++ b/boring_to_beautiful/step_05_c/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/boring_to_beautiful/step_05_c/lib/main.dart b/boring_to_beautiful/step_05_c/lib/main.dart new file mode 100644 index 0000000000..35d8750df6 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/main.dart @@ -0,0 +1,24 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:desktop_window/desktop_window.dart'; +import 'package:flutter/material.dart'; +import 'package:universal_platform/universal_platform.dart'; + +import 'src/shared/app.dart'; + +Future setDesktopWindow() async { + await DesktopWindow.setMinWindowSize(const Size(400, 400)); + await DesktopWindow.setWindowSize(const Size(1300, 900)); +} + +void main() { + WidgetsFlutterBinding.ensureInitialized(); + + if (UniversalPlatform.isDesktop) { + setDesktopWindow(); + } + + runApp(const MyApp()); +} diff --git a/boring_to_beautiful/step_05_c/lib/src/features/artists/artists.dart b/boring_to_beautiful/step_05_c/lib/src/features/artists/artists.dart new file mode 100644 index 0000000000..2545cc1e18 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/features/artists/artists.dart @@ -0,0 +1,5 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +export 'view/view.dart'; diff --git a/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_bio.dart b/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_bio.dart new file mode 100644 index 0000000000..8b614421db --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_bio.dart @@ -0,0 +1,25 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +import '../../../shared/classes/classes.dart'; +import '../../../shared/extensions.dart'; + +class ArtistBio extends StatelessWidget { + const ArtistBio({super.key, required this.artist}); + + final Artist artist; + + @override + Widget build(BuildContext context) { + return Text( + artist.bio, + style: context.bodyLarge!.copyWith( + fontSize: 16, + color: context.colors.onSurface.withAlpha(222), + ), + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_card.dart b/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_card.dart new file mode 100644 index 0000000000..40c47de2bb --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_card.dart @@ -0,0 +1,86 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:math'; + +import 'package:flutter/material.dart'; +import '../../../shared/classes/classes.dart'; +import '../../../shared/extensions.dart'; +import '../../../shared/views/outlined_card.dart'; +import '../../../shared/views/views.dart'; + +class ArtistCard extends StatelessWidget { + const ArtistCard({super.key, required this.artist}); + + final Artist artist; + + @override + Widget build(BuildContext context) { + Song nowPlaying = artist.songs[Random().nextInt(artist.songs.length)]; + + return OutlinedCard( + child: LayoutBuilder( + builder: (context, dimens) => Row( + children: [ + SizedBox( + width: dimens.maxWidth * 0.4, + child: Image.asset(artist.image.image, fit: BoxFit.cover), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only(left: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(0, 0, 15, 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + artist.name, + style: context.titleMedium, + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + const SizedBox(height: 10), + Text( + artist.bio, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 3, + ), + ], + ), + ), + if (dimens.maxHeight > 100) + Row( + children: [ + HoverableSongPlayButton( + size: const Size(50, 50), + song: nowPlaying, + child: Icon( + Icons.play_circle, + color: context.colors.tertiary, + ), + ), + Text( + nowPlaying.title, + maxLines: 1, + overflow: TextOverflow.clip, + style: context.labelMedium, + ), + ], + ), + ], + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_events.dart b/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_events.dart new file mode 100644 index 0000000000..166507d549 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_events.dart @@ -0,0 +1,100 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +import 'package:url_launcher/url_launcher.dart'; + +import '../../../shared/classes/classes.dart'; +import '../../../shared/providers/providers.dart'; +import '../../../shared/views/views.dart'; + +class ArtistEvents extends StatelessWidget { + const ArtistEvents({super.key, required this.artist}); + + final Artist artist; + + @override + Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + final colors = Theme.of(context).colorScheme; + return AdaptiveTable( + breakpoint: 720, + items: artist.events, + itemBuilder: (item, index) { + final dateParts = item.date.split('/'); + return ListTile( + leading: Container( + decoration: BoxDecoration( + color: colors.primaryContainer, + borderRadius: BorderRadius.circular(100), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text.rich( + TextSpan( + children: [ + TextSpan( + text: dateParts[0], + style: TextStyle( + fontSize: 18.0, + color: colors.onPrimaryContainer, + ), + ), + TextSpan( + text: '/', + style: TextStyle( + fontSize: 18.0, + color: colors.onPrimaryContainer, + ), + ), + TextSpan( + text: dateParts[1], + style: TextStyle( + fontSize: 14.0, + color: colors.onPrimaryContainer, + ), + ), + ], + ), + ), + ), + ), + title: Text(item.title), + subtitle: Text(item.location), + trailing: IconButton( + icon: const Icon(Icons.info_outline), + onPressed: () {}, + ), + ); + }, + columns: const [ + DataColumn(label: Text('Date'), numeric: true), + DataColumn(label: Text('Event')), + DataColumn(label: Text('Location')), + DataColumn(label: Text('More info')), + ], + rowBuilder: (item, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell(Text(item.date)), + DataCell(Row(children: [Expanded(child: Text(item.title))])), + DataCell(Text(item.location)), + DataCell( + Clickable( + child: Text( + item.link, + style: TextStyle( + color: linkColor.value(theme), + decoration: TextDecoration.underline, + ), + ), + onTap: () => launchUrl(Uri.parse('https://docs.flutter.dev')), + ), + ), + ], + ), + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_news.dart b/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_news.dart new file mode 100644 index 0000000000..bf6ae740e3 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_news.dart @@ -0,0 +1,39 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import '../../../shared/classes/classes.dart'; +import '../../../shared/views/views.dart'; + +class ArtistNews extends StatelessWidget { + const ArtistNews({super.key, required this.artist}); + + final Artist artist; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + for (final article in artist.news) + Clickable( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: ImageCard( + clickable: true, + title: article.title, + subtitle: article.author, + details: article.blurb, + image: article.image.image.toString(), + ), + ), + onTap: () { + launchUrl(Uri.parse('https://docs.flutter.dev')); + }, + ), + ], + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_ranked_songs.dart b/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_ranked_songs.dart new file mode 100644 index 0000000000..1152c1ca1f --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_ranked_songs.dart @@ -0,0 +1,66 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../../../shared/classes/classes.dart'; +import '../../../shared/extensions.dart'; +import '../../../shared/playback/bloc/bloc.dart'; +import '../../../shared/views/image_clipper.dart'; +import '../../../shared/views/views.dart'; + +class ArtistRankedSongs extends StatelessWidget { + const ArtistRankedSongs({super.key, required this.artist}); + + final Artist artist; + + @override + Widget build(BuildContext context) { + return AdaptiveTable( + items: artist.songs, + breakpoint: 450, + itemBuilder: (song, index) { + return ListTile( + leading: ClippedImage(song.image.image), + title: Text(song.title), + subtitle: Text(song.length.toHumanizedString()), + trailing: Text(song.ranking.toString()), + onTap: () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), + ); + }, + columns: const [ + DataColumn(label: Text('Ranking'), numeric: true), + DataColumn(label: Text('Title')), + DataColumn(label: Text('Length')), + ], + rowBuilder: (song, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell( + HoverableSongPlayButton( + song: song, + child: Center(child: Text(song.ranking.toString())), + ), + ), + DataCell( + Row( + children: [ + Padding( + padding: const EdgeInsets.all(2), + child: ClippedImage(song.image.image), + ), + const SizedBox(width: 5.0), + Expanded(child: Text(song.title)), + ], + ), + ), + DataCell(Text(song.length.toHumanizedString())), + ], + ), + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_screen.dart b/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_screen.dart new file mode 100644 index 0000000000..48a00cd8f0 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_screen.dart @@ -0,0 +1,125 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../shared/classes/classes.dart'; +import '../../../shared/extensions.dart'; +import '../../../shared/views/article_content.dart'; +import '../../../shared/views/image_clipper.dart'; +import 'view.dart'; + +class ArtistScreen extends StatelessWidget { + const ArtistScreen({required this.artist, super.key}); + + final Artist artist; + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + final colors = Theme.of(context).colorScheme; + double headerHeight = constraints.maxWidth > 500 ? 300 : 400; + return DefaultTabController( + length: 3, + child: Scaffold( + appBar: AppBar( + leading: BackButton( + onPressed: () => GoRouter.of(context).go('/artists'), + ), + title: Text('ARTIST - ${artist.name}'), + bottom: PreferredSize( + preferredSize: Size.fromHeight(kToolbarHeight + headerHeight), + child: Column( + children: [ + ArticleContent( + child: Builder( + builder: (context) { + if (constraints.maxWidth > 500) { + return SizedBox( + height: headerHeight, + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + ClippedImage( + artist.image.image, + fit: BoxFit.cover, + ), + Expanded( + child: Padding( + padding: const EdgeInsets.all(12), + child: Text( + artist.bio, + style: context.bodyLarge!.copyWith( + color: colors.onSurface, + fontSize: 16, + ), + textAlign: TextAlign.justify, + ), + ), + ), + ], + ), + ); + } + return SizedBox( + height: headerHeight, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + height: 300, + child: ClippedImage( + artist.image.image, + fit: BoxFit.cover, + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.all(12), + child: Text( + artist.bio, + style: context.bodyLarge!.copyWith( + color: colors.onSurface, + fontSize: 16, + ), + textAlign: TextAlign.justify, + ), + ), + ), + ], + ), + ); + }, + ), + ), + const TabBar( + tabs: [ + Tab(text: 'Songs'), + Tab(text: 'Events'), + Tab(text: 'News'), + ], + ), + ], + ), + ), + ), + body: TabBarView( + children: [ + SingleChildScrollView(child: ArtistRankedSongs(artist: artist)), + SingleChildScrollView(child: ArtistEvents(artist: artist)), + SingleChildScrollView(child: ArtistNews(artist: artist)), + ], + ), + ), + ); + }, + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_updates.dart b/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_updates.dart new file mode 100644 index 0000000000..a0fabf7330 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artist_updates.dart @@ -0,0 +1,37 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +import '../../../shared/classes/classes.dart'; +import '../../../shared/views/outlined_card.dart'; + +class ArtistUpdates extends StatelessWidget { + const ArtistUpdates({super.key, required this.artist}); + + final Artist artist; + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + for (final update in artist.updates) + Padding( + padding: const EdgeInsets.all(8.0), + child: OutlinedCard( + clickable: false, + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 15, + horizontal: 20, + ), + child: Text(update), + ), + ), + ), + ], + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artists_screen.dart b/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artists_screen.dart new file mode 100644 index 0000000000..225d74847b --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/features/artists/view/artists_screen.dart @@ -0,0 +1,49 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../shared/providers/artists.dart'; +import './artist_card.dart'; + +class ArtistsScreen extends StatelessWidget { + const ArtistsScreen({super.key}); + + @override + Widget build(BuildContext context) { + final artistsProvider = ArtistsProvider(); + final artists = artistsProvider.artists; + return LayoutBuilder( + builder: (context, constraints) { + return Scaffold( + primary: false, + appBar: AppBar( + title: const Text('ARTISTS'), + toolbarHeight: kToolbarHeight * 2, + ), + body: GridView.builder( + padding: const EdgeInsets.all(15), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: max(1, (constraints.maxWidth ~/ 400).toInt()), + childAspectRatio: 2.5, + mainAxisSpacing: 10, + crossAxisSpacing: 10, + ), + itemCount: artists.length, + itemBuilder: (context, index) { + final artist = artists[index]; + return GestureDetector( + child: ArtistCard(artist: artist), + onTap: () => GoRouter.of(context).go('/artists/${artist.id}'), + ); + }, + ), + ); + }, + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/features/artists/view/view.dart b/boring_to_beautiful/step_05_c/lib/src/features/artists/view/view.dart new file mode 100644 index 0000000000..7752a77cad --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/features/artists/view/view.dart @@ -0,0 +1,12 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +export 'artist_bio.dart'; +export 'artist_card.dart'; +export 'artist_events.dart'; +export 'artist_news.dart'; +export 'artist_ranked_songs.dart'; +export 'artist_screen.dart'; +export 'artist_updates.dart'; +export 'artists_screen.dart'; diff --git a/boring_to_beautiful/step_05_c/lib/src/features/home/home.dart b/boring_to_beautiful/step_05_c/lib/src/features/home/home.dart new file mode 100644 index 0000000000..2545cc1e18 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/features/home/home.dart @@ -0,0 +1,5 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +export 'view/view.dart'; diff --git a/boring_to_beautiful/step_05_c/lib/src/features/home/view/home_artists.dart b/boring_to_beautiful/step_05_c/lib/src/features/home/view/home_artists.dart new file mode 100644 index 0000000000..842f906b6a --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/features/home/view/home_artists.dart @@ -0,0 +1,56 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../shared/classes/classes.dart'; +import '../../../shared/extensions.dart'; + +class HomeArtists extends StatelessWidget { + const HomeArtists({ + super.key, + required this.artists, + required this.constraints, + }); + + final List artists; + final BoxConstraints constraints; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(15), + child: constraints.isMobile + ? Column( + children: [ + for (final artist in artists) buildTile(context, artist), + ], + ) + : Row( + children: [ + for (final artist in artists) + Flexible(flex: 1, child: buildTile(context, artist)), + ], + ), + ); + } + + Widget buildTile(BuildContext context, Artist artist) { + return ListTile( + leading: CircleAvatar(backgroundImage: AssetImage(artist.image.image)), + title: Text( + artist.updates.first, + maxLines: 2, + style: context.labelLarge, + overflow: TextOverflow.ellipsis, + ), + subtitle: Padding( + padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 0), + child: Text(artist.name, style: context.labelMedium), + ), + onTap: () => GoRouter.of(context).go('/artists/${artist.id}'), + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/features/home/view/home_highlight.dart b/boring_to_beautiful/step_05_c/lib/src/features/home/view/home_highlight.dart new file mode 100644 index 0000000000..191dac0284 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/features/home/view/home_highlight.dart @@ -0,0 +1,38 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import '../../../shared/views/views.dart'; + +class HomeHighlight extends StatelessWidget { + const HomeHighlight({super.key}); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 35, vertical: 5), + child: Clickable( + child: SizedBox( + height: 275, + child: ClipRRect( + borderRadius: BorderRadius.circular(10), + child: Image.asset( + 'assets/images/news/concert.jpeg', + fit: BoxFit.cover, + ), + ), + ), + onTap: () => launchUrl(Uri.parse('https://docs.flutter.dev')), + ), + ), + ), + ], + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/features/home/view/home_recent.dart b/boring_to_beautiful/step_05_c/lib/src/features/home/view/home_recent.dart new file mode 100644 index 0000000000..8ba86d117d --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/features/home/view/home_recent.dart @@ -0,0 +1,131 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../shared/classes/playlist.dart'; +import '../../../shared/extensions.dart'; +import '../../../shared/views/clickable.dart'; +import '../../../shared/views/image_clipper.dart'; +import '../../../shared/views/outlined_card.dart'; + +class HomeRecent extends StatelessWidget { + const HomeRecent({ + super.key, + required this.playlists, + this.axis = Axis.horizontal, + }); + + final List playlists; + final Axis axis; + + @override + Widget build(BuildContext context) { + if (axis == Axis.horizontal) { + return SizedBox( + height: 295, + child: ListView.builder( + scrollDirection: axis, + padding: const EdgeInsets.only(left: 10), + itemCount: playlists.length, + itemBuilder: (context, index) { + final playlist = playlists[index]; + return Clickable( + child: Padding( + padding: const EdgeInsets.only(right: 25), + child: OutlinedCard( + child: SizedBox( + width: 200, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: [ + Row( + children: [ + Expanded( + child: Image.asset( + playlist.cover.image, + fit: BoxFit.cover, + ), + ), + ], + ), + Padding( + padding: const EdgeInsets.fromLTRB(5, 10, 5, 0), + child: buildDetails(context, playlist), + ), + ], + ), + ), + ), + ), + onTap: () => GoRouter.of(context).go('/playlists/${playlist.id}'), + ); + }, + ), + ); + } + return ListView.builder( + scrollDirection: axis, + itemCount: playlists.length, + itemBuilder: (context, index) { + final playlist = playlists[index]; + return Padding( + padding: const EdgeInsets.all(8.0), + child: Clickable( + onTap: () => GoRouter.of(context).go('/playlists/${playlist.id}'), + child: SizedBox( + height: 200, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: [ + ClippedImage(playlist.cover.image, height: 200), + Expanded( + child: Center( + child: Padding( + padding: const EdgeInsets.all(20), + child: buildDetails(context, playlist), + ), + ), + ), + ], + ), + ), + ), + ); + }, + ); + } + + Widget buildDetails(BuildContext context, Playlist playlist) { + return Column( + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), + child: Text( + playlist.title, + style: context.titleSmall!.copyWith(fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + maxLines: 1, + textAlign: TextAlign.center, + ), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), + child: Text( + playlist.description, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 2, + textAlign: TextAlign.center, + ), + ), + ], + ); + } +} diff --git a/boring_to_beautiful/final/lib/src/features/home/view/home_screen.dart b/boring_to_beautiful/step_05_c/lib/src/features/home/view/home_screen.dart similarity index 100% rename from boring_to_beautiful/final/lib/src/features/home/view/home_screen.dart rename to boring_to_beautiful/step_05_c/lib/src/features/home/view/home_screen.dart diff --git a/boring_to_beautiful/step_05_c/lib/src/features/home/view/view.dart b/boring_to_beautiful/step_05_c/lib/src/features/home/view/view.dart new file mode 100644 index 0000000000..ef5f6984e2 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/features/home/view/view.dart @@ -0,0 +1,8 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +export 'home_artists.dart'; +export 'home_highlight.dart'; +export 'home_recent.dart'; +export 'home_screen.dart'; diff --git a/boring_to_beautiful/step_05_c/lib/src/features/playlists/playlists.dart b/boring_to_beautiful/step_05_c/lib/src/features/playlists/playlists.dart new file mode 100644 index 0000000000..2545cc1e18 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/features/playlists/playlists.dart @@ -0,0 +1,5 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +export 'view/view.dart'; diff --git a/boring_to_beautiful/step_05_c/lib/src/features/playlists/view/playlist_home_screen.dart b/boring_to_beautiful/step_05_c/lib/src/features/playlists/view/playlist_home_screen.dart new file mode 100644 index 0000000000..a80d767930 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/features/playlists/view/playlist_home_screen.dart @@ -0,0 +1,59 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../shared/classes/classes.dart'; +import '../../../shared/providers/providers.dart'; +import '../../../shared/views/views.dart'; + +class PlaylistHomeScreen extends StatelessWidget { + const PlaylistHomeScreen({super.key}); + + @override + Widget build(BuildContext context) { + PlaylistsProvider playlistProvider = PlaylistsProvider(); + List playlists = playlistProvider.playlists; + return LayoutBuilder( + builder: (context, constraints) { + return Scaffold( + primary: false, + appBar: AppBar( + title: const Text('PLAYLISTS'), + toolbarHeight: kToolbarHeight * 2, + ), + body: Column( + children: [ + Expanded( + child: GridView.builder( + padding: const EdgeInsets.all(15), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: (constraints.maxWidth ~/ 175).toInt(), + childAspectRatio: 0.70, + mainAxisSpacing: 10, + crossAxisSpacing: 10, + ), + itemCount: playlists.length, + itemBuilder: (context, index) { + final playlist = playlists[index]; + return GestureDetector( + child: ImageTile( + image: playlist.cover.image, + title: playlist.title, + subtitle: playlist.description, + ), + onTap: () => + GoRouter.of(context).go('/playlists/${playlist.id}'), + ); + }, + ), + ), + ], + ), + ); + }, + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/features/playlists/view/playlist_screen.dart b/boring_to_beautiful/step_05_c/lib/src/features/playlists/view/playlist_screen.dart new file mode 100644 index 0000000000..9719a7d6a1 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/features/playlists/view/playlist_screen.dart @@ -0,0 +1,134 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../shared/classes/classes.dart'; +import '../../../shared/extensions.dart'; +import '../../../shared/views/adaptive_image_card.dart'; +import '../../../shared/views/views.dart'; +import 'playlist_songs.dart'; + +class PlaylistScreen extends StatelessWidget { + const PlaylistScreen({required this.playlist, super.key}); + + final Playlist playlist; + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + final colors = Theme.of(context).colorScheme; + final double headerHeight = constraints.isMobile + ? max(constraints.biggest.height * 0.5, 450) + : max(constraints.biggest.height * 0.25, 250); + if (constraints.isMobile) { + return Scaffold( + appBar: AppBar( + leading: BackButton( + onPressed: () => GoRouter.of(context).go('/playlists'), + ), + title: Text(playlist.title), + actions: [ + IconButton( + icon: const Icon(Icons.play_circle_fill), + onPressed: () {}, + ), + IconButton(onPressed: () {}, icon: const Icon(Icons.shuffle)), + ], + ), + body: ArticleContent( + child: PlaylistSongs( + playlist: playlist, + constraints: constraints, + ), + ), + ); + } + return Scaffold( + body: CustomScrollView( + slivers: [ + SliverAppBar( + leading: BackButton( + onPressed: () => GoRouter.of(context).go('/playlists'), + ), + expandedHeight: headerHeight, + pinned: false, + flexibleSpace: FlexibleSpaceBar( + background: AdaptiveImageCard( + axis: constraints.isMobile + ? Axis.vertical + : Axis.horizontal, + constraints: constraints + .copyWith(maxHeight: headerHeight) + .normalize(), + image: playlist.cover.image, + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'PLAYLIST', + style: context.titleSmall!.copyWith( + color: colors.onSurface, + ), + ), + Text( + playlist.title, + style: context.displaySmall!.copyWith( + color: colors.onSurface, + ), + ), + Text( + playlist.description, + style: context.bodyLarge!.copyWith( + color: colors.onSurface.withAlpha(204), + ), + ), + const SizedBox(height: 8), + Row( + children: [ + IconButton( + icon: Icon( + Icons.play_circle_fill, + color: colors.tertiary, + ), + onPressed: () {}, + ), + TextButton.icon( + onPressed: () {}, + icon: Icon(Icons.shuffle, color: colors.tertiary), + label: Text( + 'Shuffle', + style: context.bodySmall!.copyWith( + color: colors.tertiary, + ), + ), + ), + ], + ), + ], + ), + ), + ), + ), + SliverToBoxAdapter( + child: ArticleContent( + child: PlaylistSongs( + playlist: playlist, + constraints: constraints, + ), + ), + ), + ], + ), + ); + }, + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/features/playlists/view/playlist_songs.dart b/boring_to_beautiful/step_05_c/lib/src/features/playlists/view/playlist_songs.dart new file mode 100644 index 0000000000..e9c951b7a9 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/features/playlists/view/playlist_songs.dart @@ -0,0 +1,76 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../../../shared/classes/classes.dart'; +import '../../../shared/extensions.dart'; +import '../../../shared/playback/bloc/bloc.dart'; +import '../../../shared/views/image_clipper.dart'; +import '../../../shared/views/views.dart'; + +class PlaylistSongs extends StatelessWidget { + const PlaylistSongs({ + super.key, + required this.playlist, + required this.constraints, + }); + + final Playlist playlist; + final BoxConstraints constraints; + + @override + Widget build(BuildContext context) { + return AdaptiveTable( + items: playlist.songs, + breakpoint: 450, + columns: const [ + DataColumn( + label: Padding(padding: EdgeInsets.only(left: 20), child: Text('#')), + ), + DataColumn(label: Text('Title')), + DataColumn( + label: Padding( + padding: EdgeInsets.only(right: 10), + child: Text('Length'), + ), + ), + ], + rowBuilder: (context, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell( + Center( + child: Text((index + 1).toString(), textAlign: TextAlign.center), + ), + ), + DataCell( + Row( + children: [ + Padding( + padding: const EdgeInsets.all(2), + child: ClippedImage(playlist.songs[index].image.image), + ), + const SizedBox(width: 10), + Expanded(child: Text(playlist.songs[index].title)), + ], + ), + ), + DataCell(Text(playlist.songs[index].length.toHumanizedString())), + ], + ), + itemBuilder: (song, index) { + return ListTile( + onTap: () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), + leading: ClippedImage(song.image.image), + title: Text(song.title), + subtitle: Text(song.length.toHumanizedString()), + ); + }, + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/features/playlists/view/view.dart b/boring_to_beautiful/step_05_c/lib/src/features/playlists/view/view.dart new file mode 100644 index 0000000000..b3e7267934 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/features/playlists/view/view.dart @@ -0,0 +1,6 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +export 'playlist_home_screen.dart'; +export 'playlist_screen.dart'; diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/app.dart b/boring_to_beautiful/step_05_c/lib/src/shared/app.dart new file mode 100644 index 0000000000..87f9d9bfe0 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/app.dart @@ -0,0 +1,63 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:dynamic_color/dynamic_color.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import 'playback/bloc/bloc.dart'; +import 'providers/theme.dart'; +import 'router.dart'; +import 'views/views.dart'; + +class MyApp extends StatefulWidget { + const MyApp({super.key}); + + @override + State createState() => _MyAppState(); +} + +class _MyAppState extends State { + final settings = ValueNotifier( + ThemeSettings(sourceColor: Colors.pink, themeMode: ThemeMode.system), + ); + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => PlaybackBloc(), + child: DynamicColorBuilder( + builder: (lightDynamic, darkDynamic) => ThemeProvider( + lightDynamic: lightDynamic, + darkDynamic: darkDynamic, + settings: settings, + child: NotificationListener( + onNotification: (notification) { + settings.value = notification.settings; + return true; + }, + child: ValueListenableBuilder( + valueListenable: settings, + builder: (context, value, _) { + final theme = ThemeProvider.of(context); + return MaterialApp.router( + debugShowCheckedModeBanner: false, + title: 'Flutter Demo', + theme: theme.light(settings.value.sourceColor), + darkTheme: theme.dark(settings.value.sourceColor), + themeMode: theme.themeMode(), + routeInformationParser: appRouter.routeInformationParser, + routeInformationProvider: appRouter.routeInformationProvider, + routerDelegate: appRouter.routerDelegate, + builder: (context, child) { + return PlayPauseListener(child: child!); + }, + ); + }, + ), + ), + ), + ), + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/classes/artist.dart b/boring_to_beautiful/step_05_c/lib/src/shared/classes/artist.dart new file mode 100644 index 0000000000..0529d361ea --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/classes/artist.dart @@ -0,0 +1,29 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../providers/providers.dart'; +import './classes.dart'; + +class Artist { + const Artist({ + required this.id, + required this.name, + required this.image, + required this.bio, + required this.events, + this.updates = const [], + this.news = const [], + }); + + final String id; + final String name; + final MyArtistImage image; + final String bio; + final List events; + final List updates; + final List news; + + List get songs => + SongsProvider.shared.songs.where((song) => song.artist.id == id).toList(); +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/classes/classes.dart b/boring_to_beautiful/step_05_c/lib/src/shared/classes/classes.dart new file mode 100644 index 0000000000..d554061868 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/classes/classes.dart @@ -0,0 +1,11 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +export './artist.dart'; +export './event.dart'; +export './image.dart'; +export './news.dart'; +export './playlist.dart'; +export './ranked_song.dart'; +export './song.dart'; diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/classes/event.dart b/boring_to_beautiful/step_05_c/lib/src/shared/classes/event.dart new file mode 100644 index 0000000000..6520761626 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/classes/event.dart @@ -0,0 +1,17 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +class Event { + const Event({ + required this.date, + required this.title, + required this.location, + required this.link, + }); + + final String date; + final String title; + final String location; + final String link; +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/classes/image.dart b/boring_to_beautiful/step_05_c/lib/src/shared/classes/image.dart new file mode 100644 index 0000000000..00a6472b4a --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/classes/image.dart @@ -0,0 +1,15 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +class MyArtistImage { + const MyArtistImage({ + required this.image, + required this.sourceName, + required this.sourceLink, + }); + + final String image; + final String sourceName; + final String sourceLink; +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/classes/news.dart b/boring_to_beautiful/step_05_c/lib/src/shared/classes/news.dart new file mode 100644 index 0000000000..0a913f22ad --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/classes/news.dart @@ -0,0 +1,19 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import './classes.dart'; + +class News { + const News({ + required this.title, + required this.author, + required this.blurb, + required this.image, + }); + + final String title; + final String author; + final String blurb; + final MyArtistImage image; +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/classes/playlist.dart b/boring_to_beautiful/step_05_c/lib/src/shared/classes/playlist.dart new file mode 100644 index 0000000000..5f0225059d --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/classes/playlist.dart @@ -0,0 +1,25 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import './classes.dart'; + +class Playlist { + final String id; + final String title; + final String description; + final List songs; + MyArtistImage cover; + + Playlist({ + required this.id, + required this.title, + this.description = '', + required this.songs, + this.cover = const MyArtistImage( + image: 'assets/images/record.jpeg', + sourceName: 'Adobe Stock Images', + sourceLink: '', + ), + }); +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/classes/ranked_song.dart b/boring_to_beautiful/step_05_c/lib/src/shared/classes/ranked_song.dart new file mode 100644 index 0000000000..2362bfae64 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/classes/ranked_song.dart @@ -0,0 +1,17 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import './classes.dart'; + +class RankedSong extends Song { + final int ranking; + + const RankedSong( + this.ranking, + String title, + Artist artist, + Duration length, + MyArtistImage image, + ) : super(title, artist, length, image); +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/classes/song.dart b/boring_to_beautiful/step_05_c/lib/src/shared/classes/song.dart new file mode 100644 index 0000000000..c3851be2fe --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/classes/song.dart @@ -0,0 +1,14 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import './classes.dart'; + +class Song { + final Artist artist; + final String title; + final Duration length; + final MyArtistImage image; + + const Song(this.title, this.artist, this.length, this.image); +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/extensions.dart b/boring_to_beautiful/step_05_c/lib/src/shared/extensions.dart new file mode 100644 index 0000000000..fe65add57c --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/extensions.dart @@ -0,0 +1,79 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +extension TypographyUtils on BuildContext { + ThemeData get theme => Theme.of(this); + TextTheme get textTheme => GoogleFonts.montserratTextTheme(theme.textTheme); + ColorScheme get colors => theme.colorScheme; + TextStyle? get displayLarge => + textTheme.displayLarge?.copyWith(color: colors.onSurface); + TextStyle? get displayMedium => + textTheme.displayMedium?.copyWith(color: colors.onSurface); + TextStyle? get displaySmall => + textTheme.displaySmall?.copyWith(color: colors.onSurface); + TextStyle? get headlineLarge => + textTheme.headlineLarge?.copyWith(color: colors.onSurface); + TextStyle? get headlineMedium => + textTheme.headlineMedium?.copyWith(color: colors.onSurface); + TextStyle? get headlineSmall => + textTheme.headlineSmall?.copyWith(color: colors.onSurface); + TextStyle? get titleLarge => + textTheme.titleLarge?.copyWith(color: colors.onSurface); + TextStyle? get titleMedium => + textTheme.titleMedium?.copyWith(color: colors.onSurface); + TextStyle? get titleSmall => + textTheme.titleSmall?.copyWith(color: colors.onSurface); + TextStyle? get labelLarge => + textTheme.labelLarge?.copyWith(color: colors.onSurface); + TextStyle? get labelMedium => + textTheme.labelMedium?.copyWith(color: colors.onSurface); + TextStyle? get labelSmall => + textTheme.labelSmall?.copyWith(color: colors.onSurface); + TextStyle? get bodyLarge => + textTheme.bodyLarge?.copyWith(color: colors.onSurface); + TextStyle? get bodyMedium => + textTheme.bodyMedium?.copyWith(color: colors.onSurface); + TextStyle? get bodySmall => + textTheme.bodySmall?.copyWith(color: colors.onSurface); +} + +extension BreakpointUtils on BoxConstraints { + bool get isTablet => maxWidth > 730; + bool get isDesktop => maxWidth > 1200; + bool get isMobile => !isTablet && !isDesktop; +} + +extension DurationString on String { + /// Assumes a string (roughly) of the format '\d{1,2}:\d{2}' + Duration toDuration() => switch (split(':')) { + [var minutes, var seconds] => Duration( + minutes: int.parse(minutes.trim()), + seconds: int.parse(seconds.trim()), + ), + [var hours, var minutes, var seconds] => Duration( + hours: int.parse(hours.trim()), + minutes: int.parse(minutes.trim()), + seconds: int.parse(seconds.trim()), + ), + _ => throw Exception('Invalid duration string: $this'), + }; +} + +extension HumanizedDuration on Duration { + String toHumanizedString() { + final seconds = '${inSeconds % 60}'.padLeft(2, '0'); + String minutes = '${inMinutes % 60}'; + if (inHours > 0 || inMinutes == 0) { + minutes = minutes.padLeft(2, '0'); + } + String value = '$minutes:$seconds'; + if (inHours > 0) { + value = '$inHours:$minutes:$seconds'; + } + return value; + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/playback/bloc/bloc.dart b/boring_to_beautiful/step_05_c/lib/src/shared/playback/bloc/bloc.dart new file mode 100644 index 0000000000..20d6edc8d0 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/playback/bloc/bloc.dart @@ -0,0 +1,5 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +export 'playback_bloc.dart'; diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/playback/bloc/playback_bloc.dart b/boring_to_beautiful/step_05_c/lib/src/shared/playback/bloc/playback_bloc.dart new file mode 100644 index 0000000000..51199ac561 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/playback/bloc/playback_bloc.dart @@ -0,0 +1,119 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:async'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import '../../classes/classes.dart'; + +part 'playback_event.dart'; +part 'playback_state.dart'; +part 'playback_bloc.freezed.dart'; + +class PlaybackBloc extends Bloc { + PlaybackBloc() : super(PlaybackState.initial()) { + on( + (event, emit) => switch (event) { + ChangeSong changeSong => _changeSong(changeSong, emit), + MoveToInSong moveToInSong => _moveToInSong(moveToInSong, emit), + SetVolume setVolume => _setVolume(setVolume, emit), + SongProgress songProgress => _songProgress(songProgress, emit), + ToggleMute toggleMute => _toggleMute(toggleMute, emit), + TogglePlayPause toggle => _togglePlayPause(toggle, emit), + PlaybackEvent event => throw UnimplementedError( + 'Unhandled event: $event', + ), + }, + ); + } + + static const _playbackUpdateInterval = Duration(milliseconds: 100); + StreamSubscription? _currentlyPlayingSubscription; + + Stream _startPlayingStream() async* { + while (state.songWithProgress!.progress < + state.songWithProgress!.song.length) { + await Future.delayed(_playbackUpdateInterval); + yield _playbackUpdateInterval; + if (state.songWithProgress!.progress >= + state.songWithProgress!.song.length) { + add(const PlaybackEvent.togglePlayPause()); + break; + } + } + } + + void _handlePlaybackProgress(Duration progress) => + add(PlaybackEvent.songProgress(progress)); + + void _togglePlayPause(TogglePlayPause event, Emitter emit) { + state.isPlaying ? _pausePlayback() : _resumePlayback(); + emit(state.copyWith(isPlaying: !state.isPlaying)); + } + + void _pausePlayback() => _currentlyPlayingSubscription!.cancel(); + + void _resumePlayback() => _currentlyPlayingSubscription = + _startPlayingStream().listen(_handlePlaybackProgress); + + void _changeSong(ChangeSong event, Emitter emit) { + emit( + state.copyWith( + isPlaying: true, + songWithProgress: SongWithProgress( + progress: const Duration(), + song: event.song, + ), + ), + ); + _resumePlayback(); + } + + void _songProgress(SongProgress event, Emitter emit) => emit( + state.copyWith( + songWithProgress: state.songWithProgress!.copyWith( + progress: state.songWithProgress!.progress + event.duration, + ), + ), + ); + void _setVolume(SetVolume event, Emitter emit) => emit( + state.copyWith(volume: event.value, isMuted: false, previousVolume: null), + ); + + void _toggleMute(ToggleMute event, Emitter emit) { + if (state.isMuted) { + emit( + state.copyWith( + isMuted: false, + volume: state.previousVolume!, + previousVolume: null, + ), + ); + } else { + emit( + state.copyWith(isMuted: true, volume: 0, previousVolume: state.volume), + ); + } + } + + void _moveToInSong(MoveToInSong event, Emitter emit) { + _pausePlayback(); + final targetMilliseconds = + state.songWithProgress!.song.length.inMilliseconds * event.percent; + emit( + state.copyWith( + isPlaying: false, + songWithProgress: state.songWithProgress!.copyWith( + progress: Duration(milliseconds: targetMilliseconds.toInt()), + ), + ), + ); + } + + @override + Future close() async { + await _currentlyPlayingSubscription?.cancel(); + await super.close(); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/playback/bloc/playback_bloc.freezed.dart b/boring_to_beautiful/step_05_c/lib/src/shared/playback/bloc/playback_bloc.freezed.dart new file mode 100644 index 0000000000..36ad6c4c1e --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/playback/bloc/playback_bloc.freezed.dart @@ -0,0 +1,670 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'playback_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; +/// @nodoc +mixin _$PlaybackEvent { + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PlaybackEvent); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'PlaybackEvent()'; +} + + +} + +/// @nodoc +class $PlaybackEventCopyWith<$Res> { +$PlaybackEventCopyWith(PlaybackEvent _, $Res Function(PlaybackEvent) __); +} + + +/// @nodoc + + +class TogglePlayPause implements PlaybackEvent { + const TogglePlayPause(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is TogglePlayPause); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'PlaybackEvent.togglePlayPause()'; +} + + +} + + + + +/// @nodoc + + +class ChangeSong implements PlaybackEvent { + const ChangeSong(this.song); + + + final Song song; + +/// Create a copy of PlaybackEvent +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ChangeSongCopyWith get copyWith => _$ChangeSongCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ChangeSong&&(identical(other.song, song) || other.song == song)); +} + + +@override +int get hashCode => Object.hash(runtimeType,song); + +@override +String toString() { + return 'PlaybackEvent.changeSong(song: $song)'; +} + + +} + +/// @nodoc +abstract mixin class $ChangeSongCopyWith<$Res> implements $PlaybackEventCopyWith<$Res> { + factory $ChangeSongCopyWith(ChangeSong value, $Res Function(ChangeSong) _then) = _$ChangeSongCopyWithImpl; +@useResult +$Res call({ + Song song +}); + + + + +} +/// @nodoc +class _$ChangeSongCopyWithImpl<$Res> + implements $ChangeSongCopyWith<$Res> { + _$ChangeSongCopyWithImpl(this._self, this._then); + + final ChangeSong _self; + final $Res Function(ChangeSong) _then; + +/// Create a copy of PlaybackEvent +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? song = null,}) { + return _then(ChangeSong( +null == song ? _self.song : song // ignore: cast_nullable_to_non_nullable +as Song, + )); +} + + +} + +/// @nodoc + + +class SetVolume implements PlaybackEvent { + const SetVolume(this.value); + + + final double value; + +/// Create a copy of PlaybackEvent +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$SetVolumeCopyWith get copyWith => _$SetVolumeCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is SetVolume&&(identical(other.value, value) || other.value == value)); +} + + +@override +int get hashCode => Object.hash(runtimeType,value); + +@override +String toString() { + return 'PlaybackEvent.setVolume(value: $value)'; +} + + +} + +/// @nodoc +abstract mixin class $SetVolumeCopyWith<$Res> implements $PlaybackEventCopyWith<$Res> { + factory $SetVolumeCopyWith(SetVolume value, $Res Function(SetVolume) _then) = _$SetVolumeCopyWithImpl; +@useResult +$Res call({ + double value +}); + + + + +} +/// @nodoc +class _$SetVolumeCopyWithImpl<$Res> + implements $SetVolumeCopyWith<$Res> { + _$SetVolumeCopyWithImpl(this._self, this._then); + + final SetVolume _self; + final $Res Function(SetVolume) _then; + +/// Create a copy of PlaybackEvent +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? value = null,}) { + return _then(SetVolume( +null == value ? _self.value : value // ignore: cast_nullable_to_non_nullable +as double, + )); +} + + +} + +/// @nodoc + + +class ToggleMute implements PlaybackEvent { + const ToggleMute(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ToggleMute); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'PlaybackEvent.toggleMute()'; +} + + +} + + + + +/// @nodoc + + +class MoveToInSong implements PlaybackEvent { + const MoveToInSong(this.percent); + + + final double percent; + +/// Create a copy of PlaybackEvent +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$MoveToInSongCopyWith get copyWith => _$MoveToInSongCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is MoveToInSong&&(identical(other.percent, percent) || other.percent == percent)); +} + + +@override +int get hashCode => Object.hash(runtimeType,percent); + +@override +String toString() { + return 'PlaybackEvent.moveToInSong(percent: $percent)'; +} + + +} + +/// @nodoc +abstract mixin class $MoveToInSongCopyWith<$Res> implements $PlaybackEventCopyWith<$Res> { + factory $MoveToInSongCopyWith(MoveToInSong value, $Res Function(MoveToInSong) _then) = _$MoveToInSongCopyWithImpl; +@useResult +$Res call({ + double percent +}); + + + + +} +/// @nodoc +class _$MoveToInSongCopyWithImpl<$Res> + implements $MoveToInSongCopyWith<$Res> { + _$MoveToInSongCopyWithImpl(this._self, this._then); + + final MoveToInSong _self; + final $Res Function(MoveToInSong) _then; + +/// Create a copy of PlaybackEvent +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? percent = null,}) { + return _then(MoveToInSong( +null == percent ? _self.percent : percent // ignore: cast_nullable_to_non_nullable +as double, + )); +} + + +} + +/// @nodoc + + +class SongProgress implements PlaybackEvent { + const SongProgress(this.duration); + + + final Duration duration; + +/// Create a copy of PlaybackEvent +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$SongProgressCopyWith get copyWith => _$SongProgressCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is SongProgress&&(identical(other.duration, duration) || other.duration == duration)); +} + + +@override +int get hashCode => Object.hash(runtimeType,duration); + +@override +String toString() { + return 'PlaybackEvent.songProgress(duration: $duration)'; +} + + +} + +/// @nodoc +abstract mixin class $SongProgressCopyWith<$Res> implements $PlaybackEventCopyWith<$Res> { + factory $SongProgressCopyWith(SongProgress value, $Res Function(SongProgress) _then) = _$SongProgressCopyWithImpl; +@useResult +$Res call({ + Duration duration +}); + + + + +} +/// @nodoc +class _$SongProgressCopyWithImpl<$Res> + implements $SongProgressCopyWith<$Res> { + _$SongProgressCopyWithImpl(this._self, this._then); + + final SongProgress _self; + final $Res Function(SongProgress) _then; + +/// Create a copy of PlaybackEvent +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? duration = null,}) { + return _then(SongProgress( +null == duration ? _self.duration : duration // ignore: cast_nullable_to_non_nullable +as Duration, + )); +} + + +} + +/// @nodoc +mixin _$PlaybackState { + +/// Legal values are between 0 and 1. + double get volume;/// Used to restore the volume after un-muting. + double? get previousVolume; bool get isMuted; bool get isPlaying; SongWithProgress? get songWithProgress; +/// Create a copy of PlaybackState +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PlaybackStateCopyWith get copyWith => _$PlaybackStateCopyWithImpl(this as PlaybackState, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PlaybackState&&(identical(other.volume, volume) || other.volume == volume)&&(identical(other.previousVolume, previousVolume) || other.previousVolume == previousVolume)&&(identical(other.isMuted, isMuted) || other.isMuted == isMuted)&&(identical(other.isPlaying, isPlaying) || other.isPlaying == isPlaying)&&(identical(other.songWithProgress, songWithProgress) || other.songWithProgress == songWithProgress)); +} + + +@override +int get hashCode => Object.hash(runtimeType,volume,previousVolume,isMuted,isPlaying,songWithProgress); + +@override +String toString() { + return 'PlaybackState(volume: $volume, previousVolume: $previousVolume, isMuted: $isMuted, isPlaying: $isPlaying, songWithProgress: $songWithProgress)'; +} + + +} + +/// @nodoc +abstract mixin class $PlaybackStateCopyWith<$Res> { + factory $PlaybackStateCopyWith(PlaybackState value, $Res Function(PlaybackState) _then) = _$PlaybackStateCopyWithImpl; +@useResult +$Res call({ + double volume, double? previousVolume, bool isMuted, bool isPlaying, SongWithProgress? songWithProgress +}); + + +$SongWithProgressCopyWith<$Res>? get songWithProgress; + +} +/// @nodoc +class _$PlaybackStateCopyWithImpl<$Res> + implements $PlaybackStateCopyWith<$Res> { + _$PlaybackStateCopyWithImpl(this._self, this._then); + + final PlaybackState _self; + final $Res Function(PlaybackState) _then; + +/// Create a copy of PlaybackState +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? volume = null,Object? previousVolume = freezed,Object? isMuted = null,Object? isPlaying = null,Object? songWithProgress = freezed,}) { + return _then(_self.copyWith( +volume: null == volume ? _self.volume : volume // ignore: cast_nullable_to_non_nullable +as double,previousVolume: freezed == previousVolume ? _self.previousVolume : previousVolume // ignore: cast_nullable_to_non_nullable +as double?,isMuted: null == isMuted ? _self.isMuted : isMuted // ignore: cast_nullable_to_non_nullable +as bool,isPlaying: null == isPlaying ? _self.isPlaying : isPlaying // ignore: cast_nullable_to_non_nullable +as bool,songWithProgress: freezed == songWithProgress ? _self.songWithProgress : songWithProgress // ignore: cast_nullable_to_non_nullable +as SongWithProgress?, + )); +} +/// Create a copy of PlaybackState +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$SongWithProgressCopyWith<$Res>? get songWithProgress { + if (_self.songWithProgress == null) { + return null; + } + + return $SongWithProgressCopyWith<$Res>(_self.songWithProgress!, (value) { + return _then(_self.copyWith(songWithProgress: value)); + }); +} +} + + +/// @nodoc + + +class _PlaybackState implements PlaybackState { + const _PlaybackState({this.volume = 0.5, this.previousVolume, this.isMuted = false, this.isPlaying = false, this.songWithProgress}); + + +/// Legal values are between 0 and 1. +@override@JsonKey() final double volume; +/// Used to restore the volume after un-muting. +@override final double? previousVolume; +@override@JsonKey() final bool isMuted; +@override@JsonKey() final bool isPlaying; +@override final SongWithProgress? songWithProgress; + +/// Create a copy of PlaybackState +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$PlaybackStateCopyWith<_PlaybackState> get copyWith => __$PlaybackStateCopyWithImpl<_PlaybackState>(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _PlaybackState&&(identical(other.volume, volume) || other.volume == volume)&&(identical(other.previousVolume, previousVolume) || other.previousVolume == previousVolume)&&(identical(other.isMuted, isMuted) || other.isMuted == isMuted)&&(identical(other.isPlaying, isPlaying) || other.isPlaying == isPlaying)&&(identical(other.songWithProgress, songWithProgress) || other.songWithProgress == songWithProgress)); +} + + +@override +int get hashCode => Object.hash(runtimeType,volume,previousVolume,isMuted,isPlaying,songWithProgress); + +@override +String toString() { + return 'PlaybackState(volume: $volume, previousVolume: $previousVolume, isMuted: $isMuted, isPlaying: $isPlaying, songWithProgress: $songWithProgress)'; +} + + +} + +/// @nodoc +abstract mixin class _$PlaybackStateCopyWith<$Res> implements $PlaybackStateCopyWith<$Res> { + factory _$PlaybackStateCopyWith(_PlaybackState value, $Res Function(_PlaybackState) _then) = __$PlaybackStateCopyWithImpl; +@override @useResult +$Res call({ + double volume, double? previousVolume, bool isMuted, bool isPlaying, SongWithProgress? songWithProgress +}); + + +@override $SongWithProgressCopyWith<$Res>? get songWithProgress; + +} +/// @nodoc +class __$PlaybackStateCopyWithImpl<$Res> + implements _$PlaybackStateCopyWith<$Res> { + __$PlaybackStateCopyWithImpl(this._self, this._then); + + final _PlaybackState _self; + final $Res Function(_PlaybackState) _then; + +/// Create a copy of PlaybackState +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? volume = null,Object? previousVolume = freezed,Object? isMuted = null,Object? isPlaying = null,Object? songWithProgress = freezed,}) { + return _then(_PlaybackState( +volume: null == volume ? _self.volume : volume // ignore: cast_nullable_to_non_nullable +as double,previousVolume: freezed == previousVolume ? _self.previousVolume : previousVolume // ignore: cast_nullable_to_non_nullable +as double?,isMuted: null == isMuted ? _self.isMuted : isMuted // ignore: cast_nullable_to_non_nullable +as bool,isPlaying: null == isPlaying ? _self.isPlaying : isPlaying // ignore: cast_nullable_to_non_nullable +as bool,songWithProgress: freezed == songWithProgress ? _self.songWithProgress : songWithProgress // ignore: cast_nullable_to_non_nullable +as SongWithProgress?, + )); +} + +/// Create a copy of PlaybackState +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$SongWithProgressCopyWith<$Res>? get songWithProgress { + if (_self.songWithProgress == null) { + return null; + } + + return $SongWithProgressCopyWith<$Res>(_self.songWithProgress!, (value) { + return _then(_self.copyWith(songWithProgress: value)); + }); +} +} + +/// @nodoc +mixin _$SongWithProgress { + + Duration get progress; Song get song; +/// Create a copy of SongWithProgress +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$SongWithProgressCopyWith get copyWith => _$SongWithProgressCopyWithImpl(this as SongWithProgress, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is SongWithProgress&&(identical(other.progress, progress) || other.progress == progress)&&(identical(other.song, song) || other.song == song)); +} + + +@override +int get hashCode => Object.hash(runtimeType,progress,song); + +@override +String toString() { + return 'SongWithProgress(progress: $progress, song: $song)'; +} + + +} + +/// @nodoc +abstract mixin class $SongWithProgressCopyWith<$Res> { + factory $SongWithProgressCopyWith(SongWithProgress value, $Res Function(SongWithProgress) _then) = _$SongWithProgressCopyWithImpl; +@useResult +$Res call({ + Duration progress, Song song +}); + + + + +} +/// @nodoc +class _$SongWithProgressCopyWithImpl<$Res> + implements $SongWithProgressCopyWith<$Res> { + _$SongWithProgressCopyWithImpl(this._self, this._then); + + final SongWithProgress _self; + final $Res Function(SongWithProgress) _then; + +/// Create a copy of SongWithProgress +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? progress = null,Object? song = null,}) { + return _then(_self.copyWith( +progress: null == progress ? _self.progress : progress // ignore: cast_nullable_to_non_nullable +as Duration,song: null == song ? _self.song : song // ignore: cast_nullable_to_non_nullable +as Song, + )); +} + +} + + +/// @nodoc + + +class _SongWithProgress implements SongWithProgress { + const _SongWithProgress({required this.progress, required this.song}); + + +@override final Duration progress; +@override final Song song; + +/// Create a copy of SongWithProgress +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$SongWithProgressCopyWith<_SongWithProgress> get copyWith => __$SongWithProgressCopyWithImpl<_SongWithProgress>(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _SongWithProgress&&(identical(other.progress, progress) || other.progress == progress)&&(identical(other.song, song) || other.song == song)); +} + + +@override +int get hashCode => Object.hash(runtimeType,progress,song); + +@override +String toString() { + return 'SongWithProgress(progress: $progress, song: $song)'; +} + + +} + +/// @nodoc +abstract mixin class _$SongWithProgressCopyWith<$Res> implements $SongWithProgressCopyWith<$Res> { + factory _$SongWithProgressCopyWith(_SongWithProgress value, $Res Function(_SongWithProgress) _then) = __$SongWithProgressCopyWithImpl; +@override @useResult +$Res call({ + Duration progress, Song song +}); + + + + +} +/// @nodoc +class __$SongWithProgressCopyWithImpl<$Res> + implements _$SongWithProgressCopyWith<$Res> { + __$SongWithProgressCopyWithImpl(this._self, this._then); + + final _SongWithProgress _self; + final $Res Function(_SongWithProgress) _then; + +/// Create a copy of SongWithProgress +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? progress = null,Object? song = null,}) { + return _then(_SongWithProgress( +progress: null == progress ? _self.progress : progress // ignore: cast_nullable_to_non_nullable +as Duration,song: null == song ? _self.song : song // ignore: cast_nullable_to_non_nullable +as Song, + )); +} + + +} + +// dart format on diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/playback/bloc/playback_event.dart b/boring_to_beautiful/step_05_c/lib/src/shared/playback/bloc/playback_event.dart new file mode 100644 index 0000000000..889ee97508 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/playback/bloc/playback_event.dart @@ -0,0 +1,21 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +part of 'playback_bloc.dart'; + +@Freezed() +class PlaybackEvent with _$PlaybackEvent { + const factory PlaybackEvent.togglePlayPause() = TogglePlayPause; + const factory PlaybackEvent.changeSong(Song song) = ChangeSong; + const factory PlaybackEvent.setVolume(double value) = SetVolume; + const factory PlaybackEvent.toggleMute() = ToggleMute; + + /// Used to move to a specific timestamp in a song, likely because the user + /// has dragged the playback bar. Values should be between 0 and 1. + const factory PlaybackEvent.moveToInSong(double percent) = MoveToInSong; + + /// Used to indicate incremental progress in the song that is currently + /// playing. + const factory PlaybackEvent.songProgress(Duration duration) = SongProgress; +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/playback/bloc/playback_state.dart b/boring_to_beautiful/step_05_c/lib/src/shared/playback/bloc/playback_state.dart new file mode 100644 index 0000000000..f02526e896 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/playback/bloc/playback_state.dart @@ -0,0 +1,31 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +part of 'playback_bloc.dart'; + +@Freezed() +abstract class PlaybackState with _$PlaybackState { + const factory PlaybackState({ + /// Legal values are between 0 and 1. + @Default(0.5) double volume, + + /// Used to restore the volume after un-muting. + double? previousVolume, + @Default(false) bool isMuted, + @Default(false) bool isPlaying, + SongWithProgress? songWithProgress, + }) = _PlaybackState; + + factory PlaybackState.initial() => const PlaybackState(); +} + +/// Helper which enforces our rule that our `song` and `progress` must either +/// both be `null`, or both have a real value. +@Freezed() +abstract class SongWithProgress with _$SongWithProgress { + const factory SongWithProgress({ + required Duration progress, + required Song song, + }) = _SongWithProgress; +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/providers/artists.dart b/boring_to_beautiful/step_05_c/lib/src/shared/providers/artists.dart new file mode 100644 index 0000000000..f9e4a8063e --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/providers/artists.dart @@ -0,0 +1,189 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:math'; + +import 'package:collection/collection.dart'; +import '../classes/classes.dart'; + +class ArtistsProvider { + static ArtistsProvider get shared => ArtistsProvider(); + + List get artists => const [ + Artist( + id: 'jmo', + name: 'Jessie Morrison', + image: MyArtistImage( + image: 'assets/images/artists/woman.jpeg', + sourceLink: 'https://unsplash.com/photos/w8wpFqiMpW8', + sourceName: 'Daniel Monteiro', + ), + bio: + 'Jessie "JMo" Morrison is an American singer, actress, and dancer. The following year she won over America\'s hearts first appearing in the 2004 movie Unexpected Engagement. Soon after she released her debut album, Hopeful Romantics.', + updates: [ + 'So happy that everyone is loving the new music! It\'s been my pride and joy to work on and I\'m thrilled that you finally get to hear it!', + 'Happy Valentine\'s Day y\'all!!! I love each and every one of you 💋😘', + '#HappyGalentinesDay!!! Chocolates. Ice Cream. Your favorite rom-com. Let\'s goo!!! 💕✨', + ], + events: [ + Event( + date: '1/20/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Mountain View, California', + link: 'Tickets', + ), + Event( + date: '1/22/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Austin, Texas', + link: 'Tickets', + ), + Event( + date: '1/23/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Houston, Texas', + link: 'Tickets', + ), + Event( + date: '2/8/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Los Angeles, California', + link: 'Tickets', + ), + ], + news: [ + News( + title: + 'Jessie Morrison a 26-stop cross country tour for the first time in 6 years.', + author: 'By Jacqueline Stewart', + blurb: + 'Our favorite triple-threat Jessie Morrison is back, this time with a 26 stop tour across the country. She\'ll kick things off in Mountain View on January 20th, 2022 in Mountain View California with more stops being announced over the next few weeks...', + image: MyArtistImage( + image: 'assets/images/news/concert.jpeg', + sourceLink: 'https://unsplash.com/photos/hzgs56Ze49s', + sourceName: 'Anthony DELANOIX', + ), + ), + ], + ), + Artist( + id: 'lb', + name: 'Lucas Bryant', + image: MyArtistImage( + image: 'assets/images/albums/artist1-album2.jpg', + sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', + sourceName: 'Keagan Henman', + ), + bio: + 'Lucas Bryant is an American country music singer and songwriter. He moved to Nashville at the age of 18 to pursue his country music career. With 34 awards to his name, he currently holds the record for most awards in country music.', + updates: [ + 'Who\'s ready to party this weekend?! See you tomorrow, Nashville! #LBlive', + 'Can\'t wait to get back on stage after so long. What songs do you want to hear?', + 'We\'re going all in this weekend! How are you doing, Vegas?!', + ], + events: [ + Event( + date: '5/16/22', + title: 'Back To My Hometown Tour', + location: 'Indianapolis, IN', + link: 'Tickets', + ), + Event( + date: '5/18/22', + title: 'Back To My Hometown Tour', + location: 'San Antonio, TX', + link: 'Tickets', + ), + Event( + date: '5/20/22', + title: 'Back To My Hometown Tour', + location: 'Phoenix, AZ', + link: 'Tickets', + ), + Event( + date: '5/23/22', + title: 'Back To My Hometown Tour', + location: 'San Diego, CA', + link: 'Tickets', + ), + ], + news: [ + News( + title: + 'Country Music Favorites Lucas Bryant, Mariam Lubbock, Michelle Delaney and Jackson Murray Join Forces For The Biggest Performance in Country History.', + author: 'Lonnie Hall', + blurb: + 'Calling all country music fans! Fasten your seat belts because the 2022 Best of Country Awards is expecting a huge performance from some of our favorite artists. Country music legends Mariam Lubbock and Jackson Murray will be joined by Lucas Bryant and Michelle Delaney for a performance we\'ll never forget.', + image: MyArtistImage( + image: 'assets/images/albums/artist1-album2.jpg', + sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', + sourceName: 'Keagan Henman', + ), + ), + ], + ), + Artist( + id: 'jonjames', + name: 'Jon James', + image: MyArtistImage( + image: 'assets/images/artists/joe.jpg', + sourceLink: 'https://unsplash.com/photos/k7UKO-tT5QU', + sourceName: 'Natalie Runnerstrom', + ), + bio: + 'Jon James is an American singer and songwriter. He\'s best known for his number one single "Never Going Back" which stayed atop the charts for 10 weeks.', + updates: [ + '3. MORE. DAYS. Who\'s ready for #FallingForYou?! Tune in tomorrow to see the full track list!', + '4 days until I get to share some of the favorite songs I\'ve ever written with you.', + '#FallingForYou dropping in 5 days! Send me your favorite music video concepts 🎥 😎', + ], + events: [ + Event( + date: '10/22/21', + title: 'Falling For You Tour', + location: 'Dallas, Texas', + link: 'Ticketmaster', + ), + Event( + date: '10/23/21', + title: 'Falling For You Tour', + location: 'Houston, Texas', + link: 'Ticketmaster', + ), + Event( + date: '10/26/21', + title: 'Falling For You Tour', + location: 'Phoenix, Arizona', + link: 'Ticketmaster', + ), + Event( + date: '10/27/21', + title: 'Falling For You Tour', + location: 'Los Angeles, California', + link: 'Ticketmaster', + ), + ], + news: [ + News( + title: + 'Jon James is excited for the release of his sixth album "Falling For You"', + author: 'Top Media Today', + blurb: + 'Jon James will be dropping his new album "Falling For You" on Friday to much fan excitement. The 6-time Grammy winning artist has spent the last year writing and recording for this album that\'s been dubbed "his best work yet."', + image: MyArtistImage( + image: 'assets/images/news/recording_studio.jpg', + sourceLink: 'https://unsplash.com/photos/CbOGmLA46JI', + sourceName: 'Yohann LIBOT', + ), + ), + ], + ), + ]; + + Artist? getArtist(String id) { + return artists.firstWhereOrNull((artist) => artist.id == id); + } + + Artist get randomArtist => artists[Random().nextInt(artists.length)]; +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/providers/playlists.dart b/boring_to_beautiful/step_05_c/lib/src/shared/providers/playlists.dart new file mode 100644 index 0000000000..f27f71b3ec --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/providers/playlists.dart @@ -0,0 +1,126 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:math'; +import 'package:collection/collection.dart'; +import 'package:english_words/english_words.dart'; + +import '../classes/classes.dart'; +import '../extensions.dart'; +import 'providers.dart'; + +class PlaylistsProvider { + List get playlists => _randomPlaylists; + Playlist get newReleases => randomPlaylist(numSongs: 10); + Playlist get topSongs => randomPlaylist(numSongs: 10); + + static List images() { + return [ + const MyArtistImage( + image: 'assets/images/playlists/favorite.jpg', + sourceLink: 'https://unsplash.com/photos/60GsdOMRFGc', + sourceName: 'Karsten Winegeart', + ), + const MyArtistImage( + image: 'assets/images/playlists/austin.jpg', + sourceLink: 'https://unsplash.com/photos/AlBgcDfDG_s', + sourceName: 'Carlos Alfonso', + ), + const MyArtistImage( + image: 'assets/images/playlists/reading.jpg', + sourceLink: 'https://unsplash.com/photos/wkgv7I2VTzM', + sourceName: 'Alexandra Fuller', + ), + const MyArtistImage( + image: 'assets/images/playlists/workout.jpg', + sourceLink: 'https://unsplash.com/photos/CnEEF5eJemQ', + sourceName: 'Karsten Winegeart', + ), + const MyArtistImage( + image: 'assets/images/playlists/calm.jpg', + sourceLink: 'https://unsplash.com/photos/NTyBbu66_SI', + sourceName: 'Jared Rice', + ), + const MyArtistImage( + image: 'assets/images/playlists/coffee.jpg', + sourceLink: 'https://unsplash.com/photos/XOhI_kW_TaM', + sourceName: 'Nathan Dumlao', + ), + const MyArtistImage( + image: 'assets/images/playlists/piano.jpg', + sourceLink: 'https://unsplash.com/photos/BhfE1IgcsA8', + sourceName: 'Jordan Whitfield', + ), + const MyArtistImage( + image: 'assets/images/playlists/studying.jpg', + sourceLink: 'https://unsplash.com/photos/-moT-Deiw1M', + sourceName: 'Humble Lamb', + ), + const MyArtistImage( + image: 'assets/images/playlists/jazz.jpg', + sourceLink: 'https://unsplash.com/photos/BY_KyTwTKq4', + sourceName: 'dimitri.photography', + ), + ]; + } + + Playlist? getPlaylist(String id) { + return playlists.firstWhereOrNull((playlist) => playlist.id == id); + } + + static Playlist randomPlaylist({int numSongs = 15}) { + return Playlist( + id: randomId(), + title: generateRandomString(max(2, Random().nextInt(4))), + description: generateRandomString(Random().nextInt(25)), + songs: List.generate(numSongs, (index) => randomSong()), + cover: images()[Random().nextInt(images().length - 1)], + ); + } + + static Playlist randomLengthPlaylist({int maxSongs = 15}) { + final int songCount = Random().nextInt(maxSongs) + 1; + + return PlaylistsProvider.randomPlaylist(numSongs: songCount); + } + + static Song randomSong() { + return Song( + generateRandomString(2), + ArtistsProvider.shared.randomArtist, + generateRandomSongLength(), + images()[Random().nextInt(images().length)], + ); + } + + static final List _randomPlaylists = List.generate( + 10, + (index) => randomLengthPlaylist(), + ); +} + +String randomId() { + return Random().nextInt(1000000).toString(); +} + +String generateRandomString(int wordCount) { + final randomWords = generateWordPairs().take((wordCount).floor()); + return randomWords.join(' '); +} + +Duration generateRandomSongLength() { + Random rand = Random(); + + int minute = rand.nextInt(5); + + int second = rand.nextInt(60); + + String secondStr = second.toString(); + + if (second < 10) { + secondStr = secondStr.padLeft(2, '0'); + } + + return '$minute : $secondStr'.toDuration(); +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/providers/providers.dart b/boring_to_beautiful/step_05_c/lib/src/shared/providers/providers.dart new file mode 100644 index 0000000000..876c16aac6 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/providers/providers.dart @@ -0,0 +1,8 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +export './artists.dart'; +export './playlists.dart'; +export './songs.dart'; +export './theme.dart'; diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/providers/songs.dart b/boring_to_beautiful/step_05_c/lib/src/shared/providers/songs.dart new file mode 100644 index 0000000000..f1205f2dcb --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/providers/songs.dart @@ -0,0 +1,137 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../classes/classes.dart'; +import '../extensions.dart'; +import './artists.dart'; + +class SongsProvider { + static SongsProvider get shared => SongsProvider(); + List get songs => _songs; +} + +// Separated out to avoid reinstantiating the list on every access. +final _songs = [ + RankedSong( + 1, + 'Before You', + ArtistsProvider.shared.getArtist('jmo')!, + '2:45'.toDuration(), + const MyArtistImage( + image: 'assets/images/albums/artist6-album1.jpg', + sourceLink: 'https://unsplash.com/photos/cTKGZJTMJQU', + sourceName: 'Drew Dizzy Graham', + ), + ), + RankedSong( + 2, + 'Hopeful Romantics', + ArtistsProvider.shared.getArtist('jmo')!, + '4:44'.toDuration(), + const MyArtistImage( + image: 'assets/images/albums/artist6-album2.jpg', + sourceLink: 'https://unsplash.com/photos/Vya8eGk5Y64', + sourceName: 'Saffu', + ), + ), + RankedSong( + 3, + 'I Still Believe', + ArtistsProvider.shared.getArtist('jmo')!, + '3:07'.toDuration(), + const MyArtistImage( + image: 'assets/images/albums/artist6-album3.jpg', + sourceLink: 'https://unsplash.com/photos/m82uh_vamhg', + sourceName: 'Vicko Mozara', + ), + ), + RankedSong( + 1, + 'Forever Dancing', + ArtistsProvider.shared.getArtist('jonjames')!, + '3:35'.toDuration(), + const MyArtistImage( + image: 'assets/images/albums/artist4-album2.jpg', + sourceLink: 'https://unsplash.com/photos/RQgKM1h2agA', + sourceName: 'Alexandru Acea', + ), + ), + RankedSong( + 2, + 'So In Love', + ArtistsProvider.shared.getArtist('jonjames')!, + '3:52'.toDuration(), + const MyArtistImage( + image: 'assets/images/albums/artist4-album1.jpg', + sourceLink: 'https://unsplash.com/photos/ZWDg7v2FPWE', + sourceName: 'Jr Korpa', + ), + ), + RankedSong( + 3, + 'Remembering Us', + ArtistsProvider.shared.getArtist('jonjames')!, + '3:39'.toDuration(), + const MyArtistImage( + image: 'assets/images/albums/artist4-album3.jpg', + sourceLink: 'https://unsplash.com/photos/rX12B5uX7QM', + sourceName: 'Stormseeker', + ), + ), + RankedSong( + 1, + 'That Song On The Radio', + ArtistsProvider.shared.getArtist('lb')!, + '3:46'.toDuration(), + const MyArtistImage( + image: 'assets/images/albums/artist1-album2.jpg', + sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', + sourceName: 'Keagan Henman', + ), + ), + RankedSong( + 2, + 'Those Country Hills', + ArtistsProvider.shared.getArtist('lb')!, + '3:48'.toDuration(), + const MyArtistImage( + image: 'assets/images/albums/artist1-album1.jpg', + sourceLink: 'https://unsplash.com/photos/f0WoQluZ8XI', + sourceName: 'Keagan Henman', + ), + ), + RankedSong( + 3, + 'Hard To Say Goodbye', + ArtistsProvider.shared.getArtist('lb')!, + '3:48'.toDuration(), + const MyArtistImage( + image: 'assets/images/albums/artist1-album1.jpg', + sourceLink: 'https://unsplash.com/photos/f0WoQluZ8XI', + sourceName: 'Keagan Henman', + ), + ), + RankedSong( + 4, + 'Being Your Man', + ArtistsProvider.shared.getArtist('lb')!, + '3:36'.toDuration(), + const MyArtistImage( + image: 'assets/images/albums/artist1-album2.jpg', + sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', + sourceName: 'Keagan Henman', + ), + ), + RankedSong( + 5, + 'Typical Friday Night', + ArtistsProvider.shared.getArtist('lb')!, + '3:41'.toDuration(), + const MyArtistImage( + image: 'assets/images/albums/artist1-album2.jpg', + sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', + sourceName: 'Keagan Henman', + ), + ), +]; diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/providers/theme.dart b/boring_to_beautiful/step_05_c/lib/src/shared/providers/theme.dart new file mode 100644 index 0000000000..a8c3c7c92f --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/providers/theme.dart @@ -0,0 +1,227 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:material_color_utilities/material_color_utilities.dart'; + +class NoAnimationPageTransitionsBuilder extends PageTransitionsBuilder { + const NoAnimationPageTransitionsBuilder(); + + @override + Widget buildTransitions( + PageRoute route, + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + return child; + } +} + +class ThemeSettingChange extends Notification { + ThemeSettingChange({required this.settings}); + final ThemeSettings settings; +} + +class ThemeProvider extends InheritedWidget { + const ThemeProvider({ + super.key, + required this.settings, + required this.lightDynamic, + required this.darkDynamic, + required super.child, + }); + + final ValueNotifier settings; + final ColorScheme? lightDynamic; + final ColorScheme? darkDynamic; + + final pageTransitionsTheme = const PageTransitionsTheme( + builders: { + TargetPlatform.android: FadeUpwardsPageTransitionsBuilder(), + TargetPlatform.iOS: CupertinoPageTransitionsBuilder(), + TargetPlatform.linux: NoAnimationPageTransitionsBuilder(), + TargetPlatform.macOS: NoAnimationPageTransitionsBuilder(), + TargetPlatform.windows: NoAnimationPageTransitionsBuilder(), + }, + ); + + Color custom(CustomColor custom) { + if (custom.blend) { + return blend(custom.color); + } else { + return custom.color; + } + } + + Color blend(Color targetColor) { + return Color( + Blend.harmonize( + targetColor.toARGB32(), + settings.value.sourceColor.toARGB32(), + ), + ); + } + + Color source(Color? target) { + Color source = settings.value.sourceColor; + if (target != null) { + source = blend(target); + } + return source; + } + + ColorScheme colors(Brightness brightness, Color? targetColor) { + final dynamicPrimary = brightness == Brightness.light + ? lightDynamic?.primary + : darkDynamic?.primary; + return ColorScheme.fromSeed( + seedColor: dynamicPrimary ?? source(targetColor), + brightness: brightness, + ); + } + + ShapeBorder get shapeMedium => + RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)); + + CardThemeData cardTheme() { + return CardThemeData( + elevation: 0, + shape: shapeMedium, + clipBehavior: Clip.antiAlias, + ); + } + + ListTileThemeData listTileTheme(ColorScheme colors) { + return ListTileThemeData( + shape: shapeMedium, + selectedColor: colors.secondary, + ); + } + + AppBarTheme appBarTheme(ColorScheme colors) { + return AppBarTheme( + elevation: 0, + backgroundColor: colors.surface, + foregroundColor: colors.onSurface, + ); + } + + TabBarThemeData tabBarTheme(ColorScheme colors) { + return TabBarThemeData( + labelColor: colors.secondary, + unselectedLabelColor: colors.onSurfaceVariant, + indicator: BoxDecoration( + border: Border(bottom: BorderSide(color: colors.secondary, width: 2)), + ), + ); + } + + BottomAppBarTheme bottomAppBarTheme(ColorScheme colors) { + return BottomAppBarTheme(color: colors.surface, elevation: 0); + } + + BottomNavigationBarThemeData bottomNavigationBarTheme(ColorScheme colors) { + return BottomNavigationBarThemeData( + type: BottomNavigationBarType.fixed, + backgroundColor: colors.surfaceContainerHighest, + selectedItemColor: colors.onSurface, + unselectedItemColor: colors.onSurfaceVariant, + elevation: 0, + landscapeLayout: BottomNavigationBarLandscapeLayout.centered, + ); + } + + NavigationRailThemeData navigationRailTheme(ColorScheme colors) { + return const NavigationRailThemeData(); + } + + DrawerThemeData drawerTheme(ColorScheme colors) { + return DrawerThemeData(backgroundColor: colors.surface); + } + + ThemeData light([Color? targetColor]) { + final colorScheme = colors(Brightness.light, targetColor); + return ThemeData.light().copyWith( + colorScheme: colorScheme, + appBarTheme: appBarTheme(colorScheme), + cardTheme: cardTheme(), + listTileTheme: listTileTheme(colorScheme), + bottomAppBarTheme: bottomAppBarTheme(colorScheme), + bottomNavigationBarTheme: bottomNavigationBarTheme(colorScheme), + navigationRailTheme: navigationRailTheme(colorScheme), + tabBarTheme: tabBarTheme(colorScheme), + drawerTheme: drawerTheme(colorScheme), + scaffoldBackgroundColor: colorScheme.surface, + ); + } + + ThemeData dark([Color? targetColor]) { + final colorScheme = colors(Brightness.dark, targetColor); + return ThemeData.dark().copyWith( + colorScheme: colorScheme, + appBarTheme: appBarTheme(colorScheme), + cardTheme: cardTheme(), + listTileTheme: listTileTheme(colorScheme), + bottomAppBarTheme: bottomAppBarTheme(colorScheme), + bottomNavigationBarTheme: bottomNavigationBarTheme(colorScheme), + navigationRailTheme: navigationRailTheme(colorScheme), + tabBarTheme: tabBarTheme(colorScheme), + drawerTheme: drawerTheme(colorScheme), + scaffoldBackgroundColor: colorScheme.surface, + ); + } + + ThemeMode themeMode() { + return settings.value.themeMode; + } + + ThemeData theme(BuildContext context, [Color? targetColor]) { + final brightness = MediaQuery.of(context).platformBrightness; + return brightness == Brightness.light + ? light(targetColor) + : dark(targetColor); + } + + static ThemeProvider of(BuildContext context) { + return context.dependOnInheritedWidgetOfExactType()!; + } + + @override + bool updateShouldNotify(covariant ThemeProvider oldWidget) { + return oldWidget.settings != settings; + } +} + +class ThemeSettings { + ThemeSettings({required this.sourceColor, required this.themeMode}); + + final Color sourceColor; + final ThemeMode themeMode; +} + +Color randomColor() { + return Color(Random().nextInt(0xFFFFFFFF)); +} + +const linkColor = CustomColor(name: 'Link Color', color: Color(0xFF00B0FF)); + +class CustomColor { + const CustomColor({ + required this.name, + required this.color, + this.blend = true, + }); + + final String name; + final Color color; + final bool blend; + + Color value(ThemeProvider provider) { + return provider.custom(this); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/router.dart b/boring_to_beautiful/step_05_c/lib/src/shared/router.dart new file mode 100644 index 0000000000..2ad95a99a8 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/router.dart @@ -0,0 +1,132 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../features/artists/artists.dart'; +import '../features/home/home.dart'; +import '../features/playlists/playlists.dart'; +import '../features/playlists/view/view.dart'; +import 'providers/artists.dart'; +import 'providers/playlists.dart'; +import 'views/views.dart'; + +const _pageKey = ValueKey('_pageKey'); +const _scaffoldKey = ValueKey('_scaffoldKey'); + +final artistsProvider = ArtistsProvider(); +final playlistsProvider = PlaylistsProvider(); + +const List destinations = [ + NavigationDestination(label: 'Home', icon: Icon(Icons.home), route: '/'), + NavigationDestination( + label: 'Playlists', + icon: Icon(Icons.playlist_add_check), + route: '/playlists', + ), + NavigationDestination( + label: 'Artists', + icon: Icon(Icons.people), + route: '/artists', + ), +]; + +class NavigationDestination { + const NavigationDestination({ + required this.route, + required this.label, + required this.icon, + this.child, + }); + + final String route; + final String label; + final Icon icon; + final Widget? child; +} + +final appRouter = GoRouter( + routes: [ + GoRoute( + path: '/', + pageBuilder: (context, state) => const MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 0, + child: HomeScreen(), + ), + ), + ), + GoRoute( + path: '/playlists', + pageBuilder: (context, state) => const MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 1, + child: PlaylistHomeScreen(), + ), + ), + routes: [ + GoRoute( + path: ':pid', + pageBuilder: (context, state) => MaterialPage( + key: state.pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 1, + child: PlaylistScreen( + playlist: playlistsProvider.getPlaylist( + state.pathParameters['pid']!, + )!, + ), + ), + ), + ), + ], + ), + GoRoute( + path: '/artists', + pageBuilder: (context, state) => const MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 2, + child: ArtistsScreen(), + ), + ), + routes: [ + GoRoute( + path: ':aid', + pageBuilder: (context, state) => MaterialPage( + key: state.pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 2, + child: ArtistScreen( + artist: artistsProvider.getArtist( + state.pathParameters['aid']!, + )!, + ), + ), + ), + ), + ], + ), + for (final route in destinations.skip(3)) + GoRoute( + path: route.route, + pageBuilder: (context, state) => MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: destinations.indexOf(route), + child: const SizedBox(), + ), + ), + ), + ], +); diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/views/adaptive_image_card.dart b/boring_to_beautiful/step_05_c/lib/src/shared/views/adaptive_image_card.dart new file mode 100644 index 0000000000..99f5be0837 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/views/adaptive_image_card.dart @@ -0,0 +1,67 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +import 'image_clipper.dart'; + +class AdaptiveImageCard extends StatelessWidget { + const AdaptiveImageCard({ + super.key, + required this.image, + required this.child, + required this.constraints, + this.axis = Axis.horizontal, + }); + + final String image; + final Widget child; + final BoxConstraints constraints; + final Axis axis; + + @override + Widget build(BuildContext context) { + if (axis == Axis.vertical) { + return Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: const EdgeInsets.all(20), + child: ClippedImage( + image, + height: constraints.biggest.height * 0.4, + ), + ), + Expanded( + child: Padding(padding: const EdgeInsets.all(20), child: child), + ), + ], + ); + } + return Padding( + padding: const EdgeInsets.only(left: 20, bottom: 20, top: 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + const SizedBox(width: 40), + Container( + constraints: const BoxConstraints(maxWidth: 200), + child: ClippedImage( + image, + width: constraints.biggest.height * 0.8, + height: constraints.biggest.height * 0.8, + fit: BoxFit.fitWidth, + ), + ), + Expanded( + child: Padding(padding: const EdgeInsets.all(20), child: child), + ), + ], + ), + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/views/adaptive_navigation.dart b/boring_to_beautiful/step_05_c/lib/src/shared/views/adaptive_navigation.dart new file mode 100644 index 0000000000..17fd8f0e8a --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/views/adaptive_navigation.dart @@ -0,0 +1,60 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +class AdaptiveNavigation extends StatelessWidget { + const AdaptiveNavigation({ + super.key, + required this.destinations, + required this.selectedIndex, + required this.onDestinationSelected, + required this.child, + }); + + final List destinations; + final int selectedIndex; + final void Function(int index) onDestinationSelected; + final Widget child; + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, dimens) { + if (dimens.maxWidth >= 600) { + return Scaffold( + body: Row( + children: [ + NavigationRail( + extended: dimens.maxWidth >= 800, + minExtendedWidth: 180, + destinations: destinations + .map( + (e) => NavigationRailDestination( + icon: e.icon, + label: Text(e.label), + ), + ) + .toList(), + selectedIndex: selectedIndex, + onDestinationSelected: onDestinationSelected, + ), + Expanded(child: child), + ], + ), + ); + } + // Mobile Layout + return Scaffold( + body: child, + bottomNavigationBar: NavigationBar( + destinations: destinations, + selectedIndex: selectedIndex, + onDestinationSelected: onDestinationSelected, + ), + ); + }, + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/views/adaptive_table.dart b/boring_to_beautiful/step_05_c/lib/src/shared/views/adaptive_table.dart new file mode 100644 index 0000000000..8f7e3a70a8 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/views/adaptive_table.dart @@ -0,0 +1,46 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +class AdaptiveTable extends StatelessWidget { + const AdaptiveTable({ + super.key, + required this.items, + required this.itemBuilder, + required this.rowBuilder, + required this.columns, + this.breakpoint = 600, + }); + + final List items; + final Widget Function(T item, int index) itemBuilder; + final DataRow Function(T item, int index) rowBuilder; + final List columns; + final double breakpoint; + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, dimens) { + if (dimens.maxWidth >= breakpoint) { + return DataTable( + columns: columns, + rows: [ + for (var i = 0; i < items.length; i++) rowBuilder(items[i], i), + ], + ); + } + return ListView.builder( + shrinkWrap: true, + itemCount: items.length, + itemBuilder: (context, index) { + final item = items[index]; + return itemBuilder(item, index); + }, + ); + }, + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/views/article_content.dart b/boring_to_beautiful/step_05_c/lib/src/shared/views/article_content.dart new file mode 100644 index 0000000000..c5a0b5e62a --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/views/article_content.dart @@ -0,0 +1,23 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +class ArticleContent extends StatelessWidget { + const ArticleContent({super.key, required this.child, this.maxWidth = 960}); + + final double maxWidth; + final Widget child; + + @override + Widget build(BuildContext context) { + return Container( + alignment: Alignment.topCenter, + child: ConstrainedBox( + constraints: BoxConstraints(maxWidth: maxWidth), + child: Padding(padding: const EdgeInsets.all(15), child: child), + ), + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/views/bottom_bar.dart b/boring_to_beautiful/step_05_c/lib/src/shared/views/bottom_bar.dart new file mode 100644 index 0000000000..fc974eea54 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/views/bottom_bar.dart @@ -0,0 +1,714 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../classes/classes.dart'; +import '../extensions.dart'; +import '../playback/bloc/bloc.dart'; +import '../providers/providers.dart'; +import 'image_clipper.dart'; + +/// Currently-playing informational bar that always spans the entire bottom +/// of the UI. +class BottomBar extends StatelessWidget implements PreferredSizeWidget { + const BottomBar({super.key}); + + @override + Size get preferredSize => const Size.fromHeight(90); + + @override + Widget build(BuildContext context) { + final bloc = BlocProvider.of(context); + return BlocBuilder( + bloc: bloc, + builder: (context, state) => _BottomBar( + artist: state.songWithProgress?.song.artist, + isMuted: state.isMuted, + isPlaying: state.isPlaying, + preferredSize: preferredSize, + progress: state.songWithProgress?.progress, + song: state.songWithProgress?.song, + togglePlayPause: () => bloc.add(const PlaybackEvent.togglePlayPause()), + volume: state.volume, + ), + ); + } +} + +class _BottomBar extends StatelessWidget { + const _BottomBar({ + required this.artist, + required this.isMuted, + required this.isPlaying, + required this.preferredSize, + required this.progress, + required this.song, + required this.togglePlayPause, + required this.volume, + }); + + final Artist? artist; + final bool isMuted; + final bool isPlaying; + final Size preferredSize; + final Duration? progress; + final Song? song; + final VoidCallback togglePlayPause; + final double volume; + + @override + Widget build(BuildContext context) => LayoutBuilder( + builder: (context, constraints) => constraints.isTablet + ? _buildDesktopBar(context, constraints) + : _buildMobileBar(context, constraints), + ); + + Widget _buildDesktopBar(BuildContext context, BoxConstraints constraints) { + return ColoredBox( + color: Theme.of(context).colorScheme.tertiaryContainer, + child: SizedBox.fromSize( + size: preferredSize, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Row( + children: [ + _AlbumArt(song: song), + _SongDetails(artist: artist, song: song), + ], + ), + Flexible( + flex: 1, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Spacer(), + _PlaybackControls( + isPlaying: isPlaying, + togglePlayPause: togglePlayPause, + ), + Center( + child: _ProgressBar(progress: progress, song: song), + ), + ], + ), + ), + if (constraints.isDesktop) ...[ + _VolumeBar(volume: volume, isMuted: isMuted), + ], + if (song != null) + IconButton( + icon: const Icon(Icons.fullscreen), + onPressed: () { + final overlay = Overlay.of(context); + OverlayEntry? entry; + entry = OverlayEntry( + builder: (context) => Stack( + children: [ + Positioned( + child: _FullScreenPlayer( + onClose: () { + entry?.remove(); + }, + ), + ), + ], + ), + ); + overlay.insert(entry); + }, + ), + ], + ), + ), + ); + } + + double get songProgress => switch ((progress, song)) { + (Duration progress, Song song) => + progress.inMilliseconds / song.length.inMilliseconds, + _ => 0, + }; + + Widget _buildMobileBar(BuildContext context, BoxConstraints constraints) { + return ColoredBox( + color: Theme.of(context).colorScheme.tertiaryContainer, + child: SizedBox( + height: kToolbarHeight, + child: InkWell( + mouseCursor: SystemMouseCursors.click, + onTap: () { + final overlay = Overlay.of(context); + OverlayEntry? entry; + entry = OverlayEntry( + builder: (context) => Stack( + children: [ + Positioned( + child: _MobilePlayer( + onClose: () { + entry?.remove(); + }, + ), + ), + ], + ), + ); + overlay.insert(entry); + }, + child: Stack( + children: [ + Positioned( + left: 0, + right: 4, + bottom: 0, + child: LinearProgressIndicator( + value: songProgress.clamp(0, 1), + backgroundColor: Theme.of(context).colorScheme.tertiary, + color: Theme.of(context).colorScheme.onTertiaryContainer, + ), + ), + Positioned( + left: 4, + bottom: 4, + top: 4, + right: 4, + child: Row( + children: [ + _AlbumArt(song: song), + Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(song?.title ?? '', style: context.labelMedium), + Text( + song?.artist.name ?? '', + style: context.labelSmall, + ), + ], + ), + const Spacer(), + IconButton( + onPressed: togglePlayPause, + icon: Icon( + isPlaying ? Icons.pause_circle : Icons.play_circle, + ), + ), + ], + ), + ), + ], + ), + ), + ), + ); + } +} + +class _ProgressBar extends StatelessWidget { + const _ProgressBar({required this.progress, required this.song}); + + /// Current playback depth into user is into [song]. + final Duration? progress; + + final Song? song; + + double get songProgress => switch ((progress, song)) { + (Duration progress, Song song) => + progress.inMilliseconds / song.length.inMilliseconds, + _ => 0, + }; + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + EdgeInsets padding = switch (constraints.maxWidth) { + > 500 => const EdgeInsets.symmetric(horizontal: 50), + > 350 => const EdgeInsets.symmetric(horizontal: 25), + _ => const EdgeInsets.symmetric(horizontal: 20), + }; + return Padding( + padding: padding, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const SizedBox(width: 10), + SizedBox( + child: progress != null + ? Text( + progress!.toHumanizedString(), + style: Theme.of(context).textTheme.bodySmall, + ) + : const Text('-'), + ), + Expanded( + child: Slider( + value: songProgress.clamp(0, 1), + divisions: 1000, + onChanged: (percent) { + BlocProvider.of( + context, + ).add(PlaybackEvent.moveToInSong(percent)); + }, + onChangeEnd: (percent) { + BlocProvider.of( + context, + ).add(PlaybackEvent.moveToInSong(percent)); + // Because dragging pauses auto playback, resume playing + // once the user finishes dragging. + BlocProvider.of( + context, + ).add(const PlaybackEvent.togglePlayPause()); + }, + activeColor: Theme.of( + context, + ).colorScheme.onTertiaryContainer, + inactiveColor: Theme.of(context).colorScheme.onSurface, + ), + ), + SizedBox( + child: song != null + ? Text( + song!.length.toHumanizedString(), + style: Theme.of(context).textTheme.bodySmall, + ) + : const Text('-'), + ), + const SizedBox(width: 10), + ], + ), + ); + }, + ); + } +} + +class _VolumeBar extends StatelessWidget { + const _VolumeBar({required this.volume, required this.isMuted}); + + /// The percentage, between 0 and 1, at which to render the volume slider. + final double volume; + + /// True if the user has explicitly pressed the mute button. The value for + /// [volume] can be zero without this also being `true`, but if this is `true`, + /// then the value for [volume] will always be zero. + final bool isMuted; + + @override + Widget build(BuildContext context) { + return ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 200), + child: Padding( + padding: const EdgeInsets.all(8), + child: Row( + children: [ + GestureDetector( + onTap: () => BlocProvider.of( + context, + ).add(const PlaybackEvent.toggleMute()), + child: Icon(!isMuted ? Icons.volume_mute : Icons.volume_off), + ), + Expanded( + child: Slider( + value: volume, + min: 0, + max: 1, + divisions: 100, + onChanged: (newValue) => BlocProvider.of( + context, + ).add(PlaybackEvent.setVolume(newValue)), + activeColor: Theme.of(context).colorScheme.onTertiaryContainer, + inactiveColor: Theme.of(context).colorScheme.onSurface, + ), + ), + ], + ), + ), + ); + } +} + +class _PlaybackControls extends StatelessWidget { + const _PlaybackControls({ + required this.isPlaying, + required this.togglePlayPause, + }); + + final bool isPlaying; + final VoidCallback togglePlayPause; + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + double iconSize = 24; + double playIconSize = 32; + double innerPadding = 16; + double playPadding = 20; + if (constraints.maxWidth < 500) { + iconSize = 21; + playIconSize = 28; + innerPadding = 14; + playPadding = 17; + } + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.fromLTRB(0, 0, innerPadding, 0), + child: Icon(Icons.shuffle, size: iconSize), + ), + Icon(Icons.skip_previous, size: iconSize), + Padding( + padding: EdgeInsets.fromLTRB(playPadding, 0, innerPadding, 0), + child: GestureDetector( + onTap: togglePlayPause, + child: Icon( + isPlaying ? Icons.pause_circle : Icons.play_circle, + size: playIconSize, + ), + ), + ), + Icon(Icons.skip_next, size: iconSize), + Padding( + padding: EdgeInsets.fromLTRB(innerPadding, 0, 0, 0), + child: Icon(Icons.repeat, size: iconSize), + ), + ], + ); + }, + ); + } +} + +class _AlbumArt extends StatelessWidget { + const _AlbumArt({required this.song}); + + final Song? song; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8), + child: SizedBox( + width: 70, + height: 70, + child: song != null + ? Image.asset(song!.image.image) + : Container(color: Colors.pink[100]), + ), + ); + } +} + +class _SongDetails extends StatelessWidget { + const _SongDetails({required this.artist, required this.song}); + + final Artist? artist; + final Song? song; + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + song != null ? song!.title : '-', + style: context.labelLarge!.copyWith(fontSize: 12), + overflow: TextOverflow.clip, + maxLines: 1, + ), + Text( + artist != null ? artist!.name : '-', + style: context.labelSmall!.copyWith(fontSize: 8), + overflow: TextOverflow.clip, + ), + ], + ); + }, + ); + } +} + +class _FullScreenPlayer extends StatefulWidget { + const _FullScreenPlayer({required this.onClose}); + + final VoidCallback onClose; + + @override + State<_FullScreenPlayer> createState() => _FullScreenPlayerState(); +} + +class _FullScreenPlayerState extends State<_FullScreenPlayer> { + bool _showControls = true; + Timer? _controlsTimer; + + void hideControls() { + _controlsTimer?.cancel(); + _controlsTimer = Timer(const Duration(seconds: 3), () { + setState(() { + _showControls = false; + }); + }); + } + + @override + void initState() { + super.initState(); + hideControls(); + } + + @override + Widget build(BuildContext context) { + final bloc = BlocProvider.of(context); + return BlocBuilder( + bloc: bloc, + builder: (context, state) => Theme( + data: ThemeProvider.of(context).dark(), + child: Scaffold( + body: LayoutBuilder( + builder: (context, dimens) { + return MouseRegion( + onHover: (_) { + setState(() { + _showControls = true; + }); + hideControls(); + }, + child: buildPlayer(context, state, dimens), + ); + }, + ), + ), + ), + ); + } + + Widget buildPlayer( + BuildContext context, + PlaybackState state, + BoxConstraints dimens, + ) { + final bloc = BlocProvider.of(context); + final current = state.songWithProgress; + final song = current?.song; + return Stack( + fit: StackFit.expand, + children: [ + Positioned.fill( + child: current == null + ? const Center(child: Text('No song selected')) + : Container( + color: context.colors.shadow, + child: Opacity( + opacity: 0.3, + child: Image.asset(song!.image.image, fit: BoxFit.cover), + ), + ), + ), + Positioned( + top: 20, + right: 20, + child: IconButton( + color: song != null + ? context.colors.onSurface + : context.colors.onSurface, + icon: const Icon(Icons.fullscreen_exit), + onPressed: widget.onClose, + ), + ), + if (song != null) ...[ + Positioned( + left: 60, + bottom: dimens.biggest.height * 0.28, + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + SizedBox( + width: dimens.biggest.height * 0.2, + child: ClippedImage(song.image.image), + ), + const SizedBox(width: 20), + Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + song.title, + style: context.labelLarge!.copyWith(fontSize: 42), + overflow: TextOverflow.clip, + maxLines: 1, + ), + Text( + song.artist.name, + style: context.labelSmall!.copyWith( + fontSize: 20, + color: context.colors.onSurface.withAlpha(204), + ), + overflow: TextOverflow.clip, + ), + ], + ), + ], + ), + ), + Positioned( + right: 20, + left: 20, + bottom: dimens.biggest.height * 0.2, + child: _ProgressBar(progress: current?.progress, song: song), + ), + Positioned( + right: 20, + left: 20, + bottom: dimens.biggest.height * 0.1, + child: AnimatedOpacity( + duration: kThemeAnimationDuration, + opacity: _showControls ? 1 : 0, + child: Transform.scale( + scale: 1.5, + child: _PlaybackControls( + isPlaying: state.isPlaying, + togglePlayPause: () => + bloc.add(const PlaybackEvent.togglePlayPause()), + ), + ), + ), + ), + ], + ], + ); + } +} + +class _MobilePlayer extends StatelessWidget { + const _MobilePlayer({required this.onClose}); + + final VoidCallback onClose; + + @override + Widget build(BuildContext context) { + final bloc = BlocProvider.of(context); + return BlocBuilder( + bloc: bloc, + builder: (context, state) => Theme( + data: ThemeProvider.of(context).dark(), + child: Scaffold( + body: LayoutBuilder( + builder: (context, dimens) { + return buildPlayer(context, state, dimens); + }, + ), + ), + ), + ); + } + + Widget buildPlayer( + BuildContext context, + PlaybackState state, + BoxConstraints dimens, + ) { + final bloc = BlocProvider.of(context); + final current = state.songWithProgress; + return Stack( + children: [ + Positioned.fill( + child: current == null + ? const Center(child: Text('No song selected')) + : Container( + color: context.colors.shadow, + child: Opacity( + opacity: 0.3, + child: Image.asset( + current.song.image.image, + fit: BoxFit.cover, + ), + ), + ), + ), + Positioned( + top: 20, + left: 20, + child: IconButton( + color: current?.song != null + ? context.colors.onSurface + : context.colors.onSurface, + icon: const RotatedBox( + quarterTurns: 1, + child: Icon(Icons.chevron_right), + ), + onPressed: onClose, + ), + ), + if (current != null) ...[ + if (dimens.biggest.height > 500) + Positioned( + top: kToolbarHeight, + left: 0, + right: 0, + height: dimens.biggest.height * 0.5, + child: Image.asset(current.song.image.image, fit: BoxFit.contain), + ), + Positioned( + left: 0, + right: 0, + bottom: dimens.biggest.height * 0.1, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + current.song.title, + style: context.labelLarge!.copyWith(fontSize: 22), + overflow: TextOverflow.clip, + maxLines: 1, + ), + Text( + current.song.artist.name, + style: context.labelSmall!.copyWith( + fontSize: 12, + color: context.colors.onSurface.withAlpha(204), + ), + overflow: TextOverflow.clip, + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.all(20), + child: Transform.scale( + scale: 1.5, + child: _PlaybackControls( + isPlaying: state.isPlaying, + togglePlayPause: () => + bloc.add(const PlaybackEvent.togglePlayPause()), + ), + ), + ), + _ProgressBar(progress: current.progress, song: current.song), + ], + ), + ), + ], + ], + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/views/brightness_toggle.dart b/boring_to_beautiful/step_05_c/lib/src/shared/views/brightness_toggle.dart new file mode 100644 index 0000000000..46dde4810f --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/views/brightness_toggle.dart @@ -0,0 +1,30 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +import '../providers/providers.dart'; + +class BrightnessToggle extends StatelessWidget { + const BrightnessToggle({super.key}); + + @override + Widget build(BuildContext context) { + final isDark = Theme.of(context).brightness == Brightness.dark; + return IconButton( + icon: Theme.of(context).brightness == Brightness.light + ? const Icon(Icons.brightness_3) + : const Icon(Icons.brightness_7), + onPressed: () { + final themeProvider = ThemeProvider.of(context); + final settings = themeProvider.settings.value; + final newSettings = ThemeSettings( + sourceColor: settings.sourceColor, + themeMode: isDark ? ThemeMode.light : ThemeMode.dark, + ); + ThemeSettingChange(settings: newSettings).dispatch(context); + }, + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/views/center_row.dart b/boring_to_beautiful/step_05_c/lib/src/shared/views/center_row.dart new file mode 100644 index 0000000000..aaa507feea --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/views/center_row.dart @@ -0,0 +1,18 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +class CenterRow extends StatelessWidget { + const CenterRow({super.key, required this.child}); + + final Widget child; + + @override + Widget build(BuildContext context) { + return Row( + children: [Expanded(child: Center(child: child))], + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/views/clickable.dart b/boring_to_beautiful/step_05_c/lib/src/shared/views/clickable.dart new file mode 100644 index 0000000000..f192f0b135 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/views/clickable.dart @@ -0,0 +1,20 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +class Clickable extends StatelessWidget { + const Clickable({required this.child, required this.onTap, super.key}); + + final Widget child; + final VoidCallback onTap; + + @override + Widget build(BuildContext context) { + return MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector(onTap: onTap, child: child), + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/views/events.dart b/boring_to_beautiful/step_05_c/lib/src/shared/views/events.dart new file mode 100644 index 0000000000..f7cf42cbaa --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/views/events.dart @@ -0,0 +1,112 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import '../classes/classes.dart'; +import '../providers/providers.dart'; +import 'views.dart'; + +class Events extends StatelessWidget { + const Events({super.key, required this.artist, required this.constraints}); + + final Artist artist; + final BoxConstraints constraints; + + @override + Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + if (constraints.maxWidth > 820) { + return ConstrainedBox( + constraints: BoxConstraints(minWidth: constraints.minWidth), + child: DataTable( + horizontalMargin: 5.0, + columns: const [ + DataColumn(label: Text('Date'), numeric: true), + DataColumn(label: Text('Event')), + DataColumn(label: Text('Location')), + DataColumn(label: Text('More info')), + ], + rows: [ + for (final event in artist.events) + DataRow( + cells: [ + DataCell(Text(event.date)), + DataCell(Row(children: [Expanded(child: Text(event.title))])), + DataCell(Text(event.location)), + DataCell( + Clickable( + child: Text( + event.link, + style: TextStyle( + color: linkColor.value(theme), + decoration: TextDecoration.underline, + ), + ), + onTap: () => + launchUrl(Uri.parse('https://docs.flutter.dev')), + ), + ), + ], + ), + ], + ), + ); + } + return ListView( + shrinkWrap: true, + children: artist.events.map((e) => buildTile(context, e)).toList(), + ); + } + + Widget buildTile(BuildContext context, Event event) { + final dateParts = event.date.split('/'); + final colors = Theme.of(context).colorScheme; + return ListTile( + leading: Container( + decoration: BoxDecoration( + color: colors.primaryContainer, + borderRadius: BorderRadius.circular(100), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text.rich( + TextSpan( + children: [ + TextSpan( + text: dateParts[0], + style: TextStyle( + fontSize: 18.0, + color: colors.onPrimaryContainer, + ), + ), + TextSpan( + text: '/', + style: TextStyle( + fontSize: 18.0, + color: colors.onPrimaryContainer, + ), + ), + TextSpan( + text: dateParts[1], + style: TextStyle( + fontSize: 14.0, + color: colors.onPrimaryContainer, + ), + ), + ], + ), + ), + ), + ), + title: Text(event.title), + subtitle: Text(event.location), + trailing: IconButton( + icon: const Icon(Icons.info_outline), + onPressed: () {}, + ), + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/views/hover_toggle.dart b/boring_to_beautiful/step_05_c/lib/src/shared/views/hover_toggle.dart new file mode 100644 index 0000000000..40d59731a1 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/views/hover_toggle.dart @@ -0,0 +1,52 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +class HoverToggle extends StatefulWidget { + const HoverToggle({ + super.key, + required this.child, + required this.hoverChild, + required this.size, + this.mode = HoverMode.replace, + }); + + final Widget child; + final Widget hoverChild; + final HoverMode mode; + final Size size; + + @override + State createState() => _HoverToggleState(); +} + +class _HoverToggleState extends State with MaterialStateMixin { + @override + Widget build(BuildContext context) { + return SizedBox.fromSize( + size: widget.size, + child: MouseRegion( + cursor: isHovered ? SystemMouseCursors.click : MouseCursor.defer, + onEnter: (_) => setMaterialState(WidgetState.hovered, true), + onExit: (_) => setMaterialState(WidgetState.hovered, false), + child: widget.mode == HoverMode.replace + ? _buildReplaceableChildren() + : _buildChildrenStack(), + ), + ); + } + + Widget _buildChildrenStack() { + Widget child = isHovered + ? Opacity(opacity: 0.2, child: widget.child) + : widget.child; + return Stack(children: [child, if (isHovered) widget.hoverChild]); + } + + Widget _buildReplaceableChildren() => + isHovered ? widget.hoverChild : widget.child; +} + +enum HoverMode { replace, overlay } diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/views/hoverable_song_play_button.dart b/boring_to_beautiful/step_05_c/lib/src/shared/views/hoverable_song_play_button.dart new file mode 100644 index 0000000000..fb640425a6 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/views/hoverable_song_play_button.dart @@ -0,0 +1,42 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import '../classes/classes.dart'; +import '../playback/bloc/bloc.dart'; +import '../views/views.dart'; + +/// Renders the child widget when not hovered and a Play button when hovered. +class HoverableSongPlayButton extends StatelessWidget { + const HoverableSongPlayButton({ + super.key, + required this.song, + required this.child, + this.size = const Size(50, 50), + this.hoverMode = HoverMode.replace, + }); + + final Widget child; + final Size size; + final Song song; + final HoverMode hoverMode; + + @override + Widget build(BuildContext context) { + return HoverToggle( + hoverChild: Center( + child: GestureDetector( + child: const Icon(Icons.play_arrow), + onTap: () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), + ), + ), + mode: hoverMode, + size: size, + child: child, + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/views/image_card.dart b/boring_to_beautiful/step_05_c/lib/src/shared/views/image_card.dart new file mode 100644 index 0000000000..6e7f6cd42d --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/views/image_card.dart @@ -0,0 +1,80 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import '../../shared/extensions.dart'; +import 'outlined_card.dart'; + +class ImageCard extends StatelessWidget { + const ImageCard({ + super.key, + required this.title, + required this.details, + required this.image, + this.subtitle, + this.clickable = false, + }); + + final String title; + final String? subtitle; + final String details; + final String image; + final bool clickable; + + @override + Widget build(BuildContext context) { + const padding = EdgeInsets.all(8.0); + return OutlinedCard( + clickable: clickable, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: LayoutBuilder( + builder: (context, constraints) { + return Row( + children: [ + if (constraints.maxWidth > 600) + SizedBox( + width: 170, + height: 170, + child: Image.asset(image, fit: BoxFit.cover), + ), + Expanded( + child: Padding( + padding: padding, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 5), + child: Text( + title, + style: context.titleLarge!.copyWith( + fontWeight: FontWeight.bold, + ), + ), + ), + if (subtitle != null) + Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Text(subtitle!, style: context.labelMedium), + ), + Text( + details, + style: context.labelMedium?.copyWith( + fontSize: 16, + height: 1.25, + ), + ), + ], + ), + ), + ), + ], + ); + }, + ), + ), + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/views/image_clipper.dart b/boring_to_beautiful/step_05_c/lib/src/shared/views/image_clipper.dart new file mode 100644 index 0000000000..594a24c784 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/views/image_clipper.dart @@ -0,0 +1,32 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +class ClippedImage extends StatelessWidget { + const ClippedImage( + this.image, { + this.fit, + this.height, + this.width, + super.key, + }); + + final String image; + final BoxFit? fit; + final double? width, height; + + @override + Widget build(BuildContext context) { + return ClipRRect( + borderRadius: BorderRadius.circular(8), + child: Image.asset( + image, + fit: fit ?? BoxFit.cover, + height: height, + width: width, + ), + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/views/image_tile.dart b/boring_to_beautiful/step_05_c/lib/src/shared/views/image_tile.dart new file mode 100644 index 0000000000..50629af5a3 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/views/image_tile.dart @@ -0,0 +1,65 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import '../extensions.dart'; +import 'outlined_card.dart'; + +class ImageTile extends StatelessWidget { + const ImageTile({ + super.key, + required this.image, + required this.title, + required this.subtitle, + }); + + final String image; + final String title; + final String subtitle; + + @override + Widget build(BuildContext context) { + return OutlinedCard( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [Expanded(child: Image.asset(image, fit: BoxFit.cover))], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), + child: Text( + title, + textAlign: TextAlign.center, + style: context.titleSmall!.copyWith( + fontWeight: FontWeight.bold, + ), + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 5, + horizontal: 10, + ), + child: Text( + subtitle, + overflow: TextOverflow.ellipsis, + style: context.labelSmall!.copyWith(fontSize: 10), + maxLines: 2, + textAlign: TextAlign.center, + ), + ), + ], + ), + ], + ), + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/views/outlined_card.dart b/boring_to_beautiful/step_05_c/lib/src/shared/views/outlined_card.dart new file mode 100644 index 0000000000..5225518d9f --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/views/outlined_card.dart @@ -0,0 +1,35 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +class OutlinedCard extends StatefulWidget { + const OutlinedCard({super.key, required this.child, this.clickable = true}); + + final Widget child; + final bool clickable; + + @override + State createState() => _OutlinedCardState(); +} + +class _OutlinedCardState extends State { + @override + Widget build(BuildContext context) { + return MouseRegion( + cursor: widget.clickable + ? SystemMouseCursors.click + : SystemMouseCursors.basic, + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: Theme.of(context).colorScheme.outline, + width: 1, + ), + ), + child: widget.child, + ), + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/views/play_pause_listener.dart b/boring_to_beautiful/step_05_c/lib/src/shared/views/play_pause_listener.dart new file mode 100644 index 0000000000..6b4fc66709 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/views/play_pause_listener.dart @@ -0,0 +1,56 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../playback/bloc/bloc.dart'; + +/// Widget which catches all incoming Spacebar presses and routes them to the +/// [PlaybackBloc]. +/// +/// This widget sits below the [MaterialApp], which internally creates a +/// [WidgetsApp], which registers several global listeners for common keyboard +/// shortcuts. By sitting below that machinery, this installs a global Spacebar +/// listener which toggles Playback, as is customary in music-playing apps. +class PlayPauseListener extends StatelessWidget { + const PlayPauseListener({super.key, required this.child}); + + final Widget child; + + @override + Widget build(BuildContext context) { + // Immediately catch any [_PlayPauseIntent] events released by the inner + // [Shortcuts] widget. + return Actions( + actions: >{_PlayPauseIntent: _PlayPauseAction()}, + child: Shortcuts( + // Register a shortcut for Spacebar presses that release a + // [_PlayPauseIntent] up the tree to the nearest [Actions] widget. + shortcuts: { + const SingleActivator(LogicalKeyboardKey.space): _PlayPauseIntent( + // Create a closure which sends a [TogglePlayPause] event to the + // [PlaybackBloc]. + () => BlocProvider.of( + context, + ).add(const PlaybackEvent.togglePlayPause()), + ), + }, + child: child, + ), + ); + } +} + +class _PlayPauseAction extends Action<_PlayPauseIntent> { + @override + void invoke(_PlayPauseIntent intent) => intent.handler(); +} + +class _PlayPauseIntent extends Intent { + const _PlayPauseIntent(this.handler); + + final VoidCallback handler; +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/views/root_layout.dart b/boring_to_beautiful/step_05_c/lib/src/shared/views/root_layout.dart new file mode 100644 index 0000000000..a9ec8e8e68 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/views/root_layout.dart @@ -0,0 +1,79 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:go_router/go_router.dart' as go; +import 'package:universal_platform/universal_platform.dart'; + +import '../playback/bloc/bloc.dart'; +import '../router.dart' as router; +import 'adaptive_navigation.dart'; +import 'views.dart'; + +class RootLayout extends StatelessWidget { + const RootLayout({ + super.key, + required this.child, + required this.currentIndex, + }); + + final Widget child; + final int currentIndex; + static const _switcherKey = ValueKey('switcherKey'); + static const _navigationRailKey = ValueKey('navigationRailKey'); + + @override + Widget build(BuildContext context) { + final bloc = BlocProvider.of(context); + return BlocBuilder( + bloc: bloc, + builder: (context, state) => LayoutBuilder( + builder: (context, dimens) { + void onSelected(int index) { + final destination = router.destinations[index]; + go.GoRouter.of(context).go(destination.route); + } + + final current = state.songWithProgress; + return AdaptiveNavigation( + key: _navigationRailKey, + destinations: router.destinations + .map((e) => NavigationDestination(icon: e.icon, label: e.label)) + .toList(), + selectedIndex: currentIndex, + onDestinationSelected: onSelected, + child: Column( + children: [ + Expanded( + child: _Switcher(key: _switcherKey, child: child), + ), + if (current != null) const BottomBar(), + ], + ), + ); + }, + ), + ); + } +} + +class _Switcher extends StatelessWidget { + final Widget child; + + const _Switcher({required this.child, super.key}); + + @override + Widget build(BuildContext context) { + return UniversalPlatform.isDesktop + ? child + : AnimatedSwitcher( + key: key, + duration: const Duration(milliseconds: 200), + switchInCurve: Curves.easeInOut, + switchOutCurve: Curves.easeInOut, + child: child, + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/views/sidebar.dart b/boring_to_beautiful/step_05_c/lib/src/shared/views/sidebar.dart new file mode 100644 index 0000000000..6b560bafc3 --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/views/sidebar.dart @@ -0,0 +1,136 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import '../classes/classes.dart'; +import '../extensions.dart'; +import '../providers/providers.dart'; +import 'image_clipper.dart'; + +final playlistProvider = PlaylistsProvider(); +final playlists = playlistProvider.playlists; + +class SideBar extends StatelessWidget { + const SideBar({super.key}); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 200, + child: ListView( + children: [ + ListTile( + leading: const Icon(Icons.home), + title: const Text('Home'), + onTap: () => GoRouter.of(context).go('/'), + ), + const ListTile(leading: Icon(Icons.search), title: Text('Search')), + ListTile( + leading: const Icon(Icons.person), + title: const Text('Artists'), + onTap: () => GoRouter.of(context).go('/artists'), + ), + ListTile( + leading: const Icon(Icons.menu), + title: const Text('Playlists'), + onTap: () => GoRouter.of(context).go('/playlists'), + ), + for (Playlist playlist in playlists) + ListTile( + title: Text(playlist.title), + onTap: () => GoRouter.of(context).go('/playlists/${playlist.id}'), + ), + ], + ), + ); + } +} + +class PlaylistNav extends StatelessWidget { + const PlaylistNav({super.key}); + + @override + Widget build(BuildContext context) { + final colors = context.theme.colorScheme; + return Container( + color: colors.surface, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(left: 16, top: 16), + child: Text('Playlists', style: context.titleMedium), + ), + Expanded( + child: ListView( + padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 0), + controller: ScrollController(), + children: [ + for (Playlist playlist in playlists) + Padding( + padding: const EdgeInsets.symmetric(vertical: 2), + child: _PlaylistNavItem( + image: playlist.cover.image, + playlistId: playlist.id, + title: playlist.title, + ), + ), + ], + ), + ), + ], + ), + ); + } +} + +class _PlaylistNavItem extends StatefulWidget { + const _PlaylistNavItem({ + required this.image, + required this.playlistId, + required this.title, + }); + + final String image; + final String playlistId; + final String title; + + @override + State<_PlaylistNavItem> createState() => _PlaylistNavItemState(); +} + +class _PlaylistNavItemState extends State<_PlaylistNavItem> { + bool _isSelected = false; + late final FocusNode _focusNode; + + @override + void initState() { + super.initState(); + _focusNode = FocusNode(debugLabel: widget.title) + ..addListener(() { + setState(() => _isSelected = _focusNode.hasPrimaryFocus); + }); + } + + @override + Widget build(BuildContext context) { + return ListTile( + leading: ClippedImage(widget.image), + title: Text( + widget.title, + maxLines: 1, + overflow: TextOverflow.clip, + style: context.labelSmall!.copyWith( + fontStyle: _isSelected ? FontStyle.italic : null, + decoration: _isSelected ? TextDecoration.underline : null, + ), + ), + onTap: () => GoRouter.of(context).go('/playlists/${widget.playlistId}'), + hoverColor: Theme.of(context).colorScheme.primary.withAlpha(10), + selected: _isSelected, + focusNode: _focusNode, + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/shared/views/views.dart b/boring_to_beautiful/step_05_c/lib/src/shared/views/views.dart new file mode 100644 index 0000000000..6d2a429adf --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/shared/views/views.dart @@ -0,0 +1,18 @@ +// Copyright 2022 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +export 'adaptive_table.dart'; +export 'article_content.dart'; +export 'bottom_bar.dart'; +export 'brightness_toggle.dart'; +export 'center_row.dart'; +export 'clickable.dart'; +export 'events.dart'; +export 'hover_toggle.dart'; +export 'hoverable_song_play_button.dart'; +export 'image_card.dart'; +export 'image_tile.dart'; +export 'play_pause_listener.dart'; +export 'root_layout.dart'; +export 'sidebar.dart'; diff --git a/boring_to_beautiful/step_05_c/lib/src/utils/adaptive_breakpoints.dart b/boring_to_beautiful/step_05_c/lib/src/utils/adaptive_breakpoints.dart new file mode 100644 index 0000000000..3b19ea96de --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/utils/adaptive_breakpoints.dart @@ -0,0 +1,281 @@ +// Copyright 2020, the Flutter project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +import 'package:flutter/material.dart'; + +/// Adaptive Window in Material has five different window sizes. Each window size +/// represents a range of devices. +/// +/// Extra small represents phones and small tablets in portrait view. +/// Small represents tablets in portrait view and phones in landscape view. +/// Medium represents large tablets in landscape view. +/// Large represents computer screens. +/// Extra large represents large computer screens. +/// +/// https://material.io/design/layout/responsive-layout-grid.html#breakpoints +class AdaptiveWindowType { + const AdaptiveWindowType._({ + required this.name, + required this.relativeSize, + required this.widthRangeValues, + required this.heightLandscapeRangeValues, + required this.heightPortraitRangeValues, + }); + + /// Name based on the [AdaptiveWindowType]. + /// + /// Can be: xsmall, small, medium, large or xlarge + final String name; + + /// Used to set custom comparison operators for the [AdaptiveWindowType] enum. + final int relativeSize; + + /// Valid range of width for this window type. + final RangeValues widthRangeValues; + + /// Valid range of height for this window type on landscape mode. + final RangeValues heightLandscapeRangeValues; + + /// Valid range of height for this window type on portrait mode. + final RangeValues heightPortraitRangeValues; + + static const AdaptiveWindowType xsmall = AdaptiveWindowType._( + name: 'xsmall', + relativeSize: 0, + widthRangeValues: RangeValues(0, 599), + heightLandscapeRangeValues: RangeValues(0, 359), + heightPortraitRangeValues: RangeValues(0, 959), + ); + + static const AdaptiveWindowType small = AdaptiveWindowType._( + name: 'small', + relativeSize: 1, + widthRangeValues: RangeValues(600, 1023), + heightLandscapeRangeValues: RangeValues(360, 719), + heightPortraitRangeValues: RangeValues(360, 1599), + ); + + static const AdaptiveWindowType medium = AdaptiveWindowType._( + name: 'medium', + relativeSize: 2, + widthRangeValues: RangeValues(1024, 1439), + heightLandscapeRangeValues: RangeValues(720, 959), + heightPortraitRangeValues: RangeValues(720, 1919), + ); + + static const AdaptiveWindowType large = AdaptiveWindowType._( + name: 'large', + relativeSize: 3, + widthRangeValues: RangeValues(1440, 1919), + heightLandscapeRangeValues: RangeValues(960, 1279), + heightPortraitRangeValues: RangeValues(1920, double.infinity), + ); + + static const AdaptiveWindowType xlarge = AdaptiveWindowType._( + name: 'xlarge', + relativeSize: 4, + widthRangeValues: RangeValues(1920, double.infinity), + heightLandscapeRangeValues: RangeValues(1280, double.infinity), + heightPortraitRangeValues: RangeValues(1920, double.infinity), + ); + + bool operator <=(AdaptiveWindowType other) => + relativeSize <= other.relativeSize; + + bool operator <(AdaptiveWindowType other) => + relativeSize < other.relativeSize; + + bool operator >=(AdaptiveWindowType other) => + relativeSize >= other.relativeSize; + + bool operator >(AdaptiveWindowType other) => + relativeSize > other.relativeSize; +} + +/// This class represents the Material breakpoint system entry. +/// https://material.io/design/layout/responsive-layout-grid.html#breakpoints +class BreakpointSystemEntry { + const BreakpointSystemEntry({ + required this.range, + this.portrait, + this.landscape, + required this.adaptiveWindowType, + required this.columns, + required this.margin, + required this.gutter, + }); + + /// The breakpoint range values represents a width range. + final RangeValues range; + + /// Type of device which uses this breakpoint range in portrait view. + final String? portrait; + + /// Type of device which uses this breakpoint range in landscape view. + final String? landscape; + + /// Material generalizes the device size into five different windows: extra + /// small, small, medium, large, and extra large. + /// + /// The adaptive window represents a set of similar devices. For example, if + /// you want to create an adaptive layout for phones and small tablets you + /// would check if your window width is within the range of xsmall and s. If your + /// user has a bigger window size than you would create a different layout for + /// larger screens. + final AdaptiveWindowType adaptiveWindowType; + + /// The number of columns in this breakpoint system entry. + /// https://material.io/design/layout/responsive-layout-grid.html#columns-gutters-and-margins + final int columns; + + /// The size of margins in pixels in this breakpoint system entry. + /// Typically the same as gutters. + /// https://material.io/design/layout/responsive-layout-grid.html#columns-gutters-and-margins + final double margin; + + /// The size of gutters in pixels in this breakpoint system entry. Typically + /// the same as margins. + /// + /// Gutters represents the space between the columns. + /// + /// https://material.io/design/layout/responsive-layout-grid.html#columns-gutters-and-margins + final double gutter; +} + +/// This list represents the material breakpoint system. +/// https://material.io/design/layout/responsive-layout-grid.html#breakpoints +/// +/// This list is in sequential order. +const List breakpointSystem = [ + BreakpointSystemEntry( + range: RangeValues(0, 359), + portrait: 'small handset', + adaptiveWindowType: AdaptiveWindowType.xsmall, + columns: 4, + margin: 16.0, + gutter: 16.0, + ), + BreakpointSystemEntry( + range: RangeValues(360, 399), + portrait: 'medium handset', + adaptiveWindowType: AdaptiveWindowType.xsmall, + columns: 4, + margin: 16.0, + gutter: 16.0, + ), + BreakpointSystemEntry( + range: RangeValues(400, 479), + portrait: 'large handset', + adaptiveWindowType: AdaptiveWindowType.xsmall, + columns: 4, + margin: 16.0, + gutter: 16.0, + ), + BreakpointSystemEntry( + range: RangeValues(480, 599), + portrait: 'large handset', + landscape: 'small handset', + adaptiveWindowType: AdaptiveWindowType.xsmall, + columns: 4, + margin: 16.0, + gutter: 16.0, + ), + BreakpointSystemEntry( + range: RangeValues(600, 719), + portrait: 'small tablet', + landscape: 'medium handset', + adaptiveWindowType: AdaptiveWindowType.small, + columns: 8, + margin: 16.0, + gutter: 16.0, + ), + BreakpointSystemEntry( + range: RangeValues(720, 839), + portrait: 'large tablet', + landscape: 'large handset', + adaptiveWindowType: AdaptiveWindowType.small, + columns: 8, + margin: 24.0, + gutter: 24.0, + ), + BreakpointSystemEntry( + range: RangeValues(840, 959), + portrait: 'large tablet', + landscape: 'large handset', + adaptiveWindowType: AdaptiveWindowType.small, + columns: 12, + margin: 24.0, + gutter: 24.0, + ), + BreakpointSystemEntry( + range: RangeValues(960, 1023), + landscape: 'small tablet', + adaptiveWindowType: AdaptiveWindowType.small, + columns: 12, + margin: 24.0, + gutter: 24.0, + ), + BreakpointSystemEntry( + range: RangeValues(1024, 1279), + landscape: 'large tablet', + adaptiveWindowType: AdaptiveWindowType.medium, + columns: 12, + margin: 24.0, + gutter: 24.0, + ), + BreakpointSystemEntry( + range: RangeValues(1280, 1439), + landscape: 'large tablet', + adaptiveWindowType: AdaptiveWindowType.medium, + columns: 12, + margin: 24.0, + gutter: 24.0, + ), + BreakpointSystemEntry( + range: RangeValues(1440, 1599), + portrait: 'small handset', + adaptiveWindowType: AdaptiveWindowType.large, + columns: 12, + margin: 24.0, + gutter: 24.0, + ), + BreakpointSystemEntry( + range: RangeValues(1600, 1919), + portrait: 'small handset', + adaptiveWindowType: AdaptiveWindowType.large, + columns: 12, + margin: 24.0, + gutter: 24.0, + ), + BreakpointSystemEntry( + range: RangeValues(1920, double.infinity), + portrait: 'small handset', + adaptiveWindowType: AdaptiveWindowType.xlarge, + columns: 12, + margin: 24.0, + gutter: 24.0, + ), +]; + +/// Returns the [AdaptiveWindowType] to the user. +/// +/// This is useful when the user wants to compare the MediaQuery to the current +/// window size. +AdaptiveWindowType getWindowType(BuildContext context) { + return getBreakpointEntry(context).adaptiveWindowType; +} + +/// Returns the [BreakpointSystemEntry] to the user. +/// +/// Typically the developer will use the getWindowType function. Using this +/// function gives the developer access to the specific breakpoint entry and +/// it's variables. +BreakpointSystemEntry getBreakpointEntry(BuildContext context) { + double width = MediaQuery.sizeOf(context).width; + for (BreakpointSystemEntry entry in breakpointSystem) { + if (entry.range.start <= width && width < entry.range.end + 1) { + return entry; + } + } + throw AssertionError('Something unexpected happened'); +} diff --git a/boring_to_beautiful/step_05_c/lib/src/utils/adaptive_column.dart b/boring_to_beautiful/step_05_c/lib/src/utils/adaptive_column.dart new file mode 100644 index 0000000000..3c8df2f48d --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/utils/adaptive_column.dart @@ -0,0 +1,151 @@ +// Copyright 2020, the Flutter project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:flutter/material.dart'; + +import 'adaptive_breakpoints.dart'; +import 'adaptive_container.dart'; + +/// The [AdaptiveColumn] follows the Material guideline for responsive grids. +/// +/// https://material.io/design/layout/responsive-layout-grid.html#columns-gutters-and-margins +/// +/// This widget intigrates with the [AdaptiveContainer] widget. +/// The [AdaptiveContainer] widget has a parameter called columns which represents +/// the amount of columns it should take according to the breakpoints package. +/// +/// So if the user has 6 adaptive container and each container represents two columns +/// then the 6 adaptive container would all fit within one Row on a extra large screen +/// because extra large screens have 12 columns per row. +/// +/// Learn more about the breakpoint system: +/// +/// https://material.io/design/layout/responsive-layout-grid.html#breakpoints +class AdaptiveColumn extends StatelessWidget { + /// Creates a vertical array of children. Going from left to right and then + /// top to bottom. + /// + /// This class has a responsive layout that is based of the adaptive breakpoints + /// package. The user puts in [AdaptiveContainer] widgets as children and each + /// child has a columm parameter. This represents the amount of columns it takes + /// up in its current row. So if the child has three [AdaptiveContainer] widgets + /// with each column set to 4 than on an extra-small screen each container would use up + /// the entire width of the device. On an extra-large screen the three containers + /// would fit across the row. This is because extra large devices allow up to + /// 12 columns to fit within the space. + /// + /// To see an example visit: + /// https://adaptive-components.web.app/#/ + const AdaptiveColumn({ + this.gutter, + this.margin, + required this.children, + super.key, + }) : assert(margin == null || margin >= 0), + assert(gutter == null || gutter >= 0); + + /// Empty space at the left and right of this widget. + /// + /// By default the margins will be set differently on different devices. This + /// double value will be dependent of the breakpoint entry of the current screen. + /// + /// Learn more at https://material.io/design/layout/responsive-layout-grid.html#breakpoints + final double? margin; + + /// Represents the space between children. + /// + /// By default the gutter will be set differently on different devices. This + /// double value will be dependent of the breakpoint entry of the current screen. + /// + /// Learn more at https://material.io/design/layout/responsive-layout-grid.html#breakpoints + final double? gutter; + + /// The List of [AdaptiveContainer]. Adaptive container neeeds to be used + /// because the widget has a columnSpan parameter. This parameter represents the + /// amount of columns this widget should incompass. + /// + /// By default it is set to 1. + final List children; + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + BreakpointSystemEntry entry = getBreakpointEntry(context); + final double effectiveMargin = margin ?? entry.margin; + final double effectiveGutter = gutter ?? entry.gutter; + + return Container( + margin: EdgeInsets.symmetric(horizontal: effectiveMargin), + constraints: BoxConstraints( + minWidth: entry.adaptiveWindowType.widthRangeValues.start, + maxWidth: entry.adaptiveWindowType.widthRangeValues.end, + ), + child: Wrap( + runSpacing: 8.0, + children: () { + int currentColumns = 0; + int totalGutters = 0; + List children = []; + final List row = []; + + for (AdaptiveContainer child in this.children) { + // The if statement checks if the adaptiveContainer child fits + // within the adaptive constraints. + if (child.constraints.withinAdaptiveConstraint(context)) { + row.add(child); + currentColumns += child.columnSpan; + + if (currentColumns < entry.columns) { + totalGutters++; + } else { + if (currentColumns > entry.columns) { + totalGutters--; + } + int rowGutters = 0; + for (AdaptiveContainer rowItem in row) { + // Periodic width is the width of 1 column + 1 gutter. + double periodicWidth = + (MediaQuery.sizeOf(context).width - + effectiveMargin * 2 + + effectiveGutter) / + entry.columns; + + // For a row item with a column span of k, its width is + // k * column + (k - 1) * gutter, which equals + // k * (column + gutter) - gutter, which is + // k * periodicWidth - gutter. + double maxWidth = + periodicWidth * rowItem.columnSpan - effectiveGutter; + children.add( + ConstrainedBox( + constraints: BoxConstraints( + minWidth: maxWidth, + maxWidth: maxWidth, + ), + child: rowItem, + ), + ); + + if (rowGutters < totalGutters && 1 < row.length) { + children.add( + SizedBox(width: effectiveGutter, child: Container()), + ); + rowGutters++; + } + } + totalGutters = 0; + currentColumns = 0; + row.clear(); + } + } + } + return children; + }(), + ), + ); + }, + ); + } +} diff --git a/boring_to_beautiful/step_05_c/lib/src/utils/adaptive_components.dart b/boring_to_beautiful/step_05_c/lib/src/utils/adaptive_components.dart new file mode 100644 index 0000000000..de398a446c --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/utils/adaptive_components.dart @@ -0,0 +1,6 @@ +// Copyright 2020, the Flutter project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +export 'adaptive_column.dart'; +export 'adaptive_container.dart'; diff --git a/boring_to_beautiful/step_05_c/lib/src/utils/adaptive_container.dart b/boring_to_beautiful/step_05_c/lib/src/utils/adaptive_container.dart new file mode 100644 index 0000000000..b3a30c48ed --- /dev/null +++ b/boring_to_beautiful/step_05_c/lib/src/utils/adaptive_container.dart @@ -0,0 +1,244 @@ +// Copyright 2020, the Flutter project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:flutter/material.dart'; + +import 'adaptive_breakpoints.dart'; + +/// [AdaptiveContainer] lets you create a [Container] with adaptive constraints. +/// +/// The AdaptiveContainer does everything a normal container does but with +/// adaptive constraints. For more information go to one of the links below. +/// +/// https://api.flutter.dev/flutter/widgets/Container-class.html +/// https://material.io/design/layout/responsive-layout-grid.html#breakpoints +/// +/// This class is useful whenever you want a container to only be active in +/// certain [AdaptiveWindowType]. +class AdaptiveContainer extends StatelessWidget { + /// Creates a widget that combines common painting, positioning, and sizing widgets. + /// + /// The `color` and `decoration` arguments cannot both be supplied, since + /// it would potentially result in the decoration drawing over the background + /// color. To supply a decoration with a color, use `decoration: + /// BoxDecoration(color: color)`. + AdaptiveContainer({ + super.key, + this.alignment, + this.padding, + this.color, + this.decoration, + this.foregroundDecoration, + this.margin, + this.transform, + this.height, + this.child, + this.clipBehavior = Clip.none, + constraints, + this.columnSpan = 1, + }) : assert(margin == null || margin.isNonNegative), + assert(padding == null || padding.isNonNegative), + assert(decoration == null || decoration.debugAssertIsValid()), + assert( + color == null || decoration == null, + 'Cannot provide both a color and a decoration\n' + 'To provide both, use "decoration: BoxDecoration(color: color)".', + ) { + this.constraints = constraints ?? const AdaptiveConstraints(); + } + + /// The [child] contained by the container. + /// + /// If null, and if the [constraints] are unbounded or also null, the + /// container will expand to fill all available space in its parent, unless + /// the parent provides unbounded constraints, in which case the container + /// will attempt to be as small as possible. + final Widget? child; + + /// Represents how height the container should be. + final double? height; + + /// Creates constraints for adaptive windows. + /// + /// This is used by the builder to see what type of screen the user wants this + /// [AdaptiveContainer] to fit within. + late final AdaptiveConstraints constraints; + + /// columnSpan is used with [AdaptiveColumn] to represent + /// the amount of columns that this widget will fill up within a certain [Flex] + /// range. + /// + /// By default the columns will only represent one column space. If you want + /// this content of this widget to be shown increase it. There can be at most + /// 12 columns per flex range. + /// + /// Learn more by visiting the Material website: + /// https://material.io/design/layout/responsive-layout-grid.html#breakpoints + final int columnSpan; + + /// Align the [child] within the container. + /// + /// If non-null, the container will expand to fill its parent and position its + /// child within itself according to the given value. If the incoming + /// constraints are unbounded, then the child will be shrink-wrapped instead. + /// + /// Ignored if [child] is null. + /// + /// See also: + /// + /// * [Alignment], a class with convenient constants typically used to + /// specify an [AlignmentGeometry]. + /// * [AlignmentDirectional], like [Alignment] for specifying alignments + /// relative to text direction. + final AlignmentGeometry? alignment; + + /// Empty space to inscribe inside the [decoration]. The [child], if any, is + /// placed inside this padding. + /// + /// This padding is in addition to any padding inherent in the [decoration]; + /// see [Decoration.padding]. + final EdgeInsetsGeometry? padding; + + /// The color to paint behind the [child]. + /// + /// This property should be preferred when the background is a simple color. + /// For other cases, such as gradients or images, use the [decoration] + /// property. + /// + /// If the [decoration] is used, this property must be null. A background + /// color may still be painted by the [decoration] even if this property is + /// null. + final Color? color; + + /// The decoration to paint behind the [child]. + /// + /// Use the [color] property to specify a simple solid color. + /// + /// The [child] is not clipped to the decoration. To clip a child to the shape + /// of a particular [ShapeDecoration], consider using a [ClipPath] widget. + final Decoration? decoration; + + /// The decoration to paint in front of the [child]. + final Decoration? foregroundDecoration; + + /// Empty space to surround the [decoration] and [child]. + final EdgeInsetsGeometry? margin; + + /// The transformation matrix to apply before painting the container. + final Matrix4? transform; + + /// The clip behavior when [Container.decoration] has a clipPath. + /// + /// Defaults to [Clip.none]. + final Clip clipBehavior; + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, boxConstraints) { + if (constraints.withinAdaptiveConstraint(context)) { + return Container( + alignment: alignment, + padding: padding, + color: color, + decoration: decoration, + foregroundDecoration: foregroundDecoration, + transform: transform, + clipBehavior: clipBehavior, + height: height, + margin: margin, + child: child, + ); + } else { + /// Since this container is not within the adaptive constraints. + /// No widget must be returned but since you can't return no widget we + /// are returning a [LimitedBox] which is a very efficent widget. + return LimitedBox( + maxWidth: 0.0, + maxHeight: 0.0, + child: ConstrainedBox(constraints: const BoxConstraints.expand()), + ); + } + }, + ); + } +} + +/// Used to see if a range of [AdaptiveWindowType] should be shown in the window. +/// If the user sets one of the variables below to true than that window type +/// should be shown within the [AdaptiveContainer]. +class AdaptiveConstraints { + const AdaptiveConstraints({ + this.xsmall = true, + this.small = true, + this.medium = true, + this.large = true, + this.xlarge = true, + }); + + const AdaptiveConstraints.xsmall({ + this.xsmall = true, + this.small = false, + this.medium = false, + this.large = false, + this.xlarge = false, + }); + + const AdaptiveConstraints.small({ + this.xsmall = false, + this.small = true, + this.medium = false, + this.large = false, + this.xlarge = false, + }); + + const AdaptiveConstraints.medium({ + this.xsmall = false, + this.small = false, + this.medium = true, + this.large = false, + this.xlarge = false, + }); + + const AdaptiveConstraints.large({ + this.xsmall = false, + this.small = false, + this.medium = false, + this.large = true, + this.xlarge = false, + }); + + const AdaptiveConstraints.xlarge({ + this.xsmall = false, + this.small = false, + this.medium = false, + this.large = false, + this.xlarge = true, + }); + + final bool xsmall; + final bool small; + final bool medium; + final bool large; + final bool xlarge; + + bool withinAdaptiveConstraint(BuildContext context) { + AdaptiveWindowType currentEntry = getWindowType(context); + + switch (currentEntry) { + case AdaptiveWindowType.xsmall: + return xsmall; + case AdaptiveWindowType.small: + return small; + case AdaptiveWindowType.medium: + return medium; + case AdaptiveWindowType.large: + return large; + case AdaptiveWindowType.xlarge: + return xlarge; + default: + throw AssertionError('Unsupported AdaptiveWindowType'); + } + } +} diff --git a/boring_to_beautiful/step_05_c/linux/.gitignore b/boring_to_beautiful/step_05_c/linux/.gitignore new file mode 100644 index 0000000000..d3896c9844 --- /dev/null +++ b/boring_to_beautiful/step_05_c/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/boring_to_beautiful/step_05_c/linux/CMakeLists.txt b/boring_to_beautiful/step_05_c/linux/CMakeLists.txt new file mode 100644 index 0000000000..0565f6a409 --- /dev/null +++ b/boring_to_beautiful/step_05_c/linux/CMakeLists.txt @@ -0,0 +1,128 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "myartist") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.myartist") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/boring_to_beautiful/step_05_c/linux/flutter/CMakeLists.txt b/boring_to_beautiful/step_05_c/linux/flutter/CMakeLists.txt new file mode 100644 index 0000000000..d5bd01648a --- /dev/null +++ b/boring_to_beautiful/step_05_c/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/boring_to_beautiful/step_05_c/linux/flutter/generated_plugin_registrant.cc b/boring_to_beautiful/step_05_c/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000000..ac1180233d --- /dev/null +++ b/boring_to_beautiful/step_05_c/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,23 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include + +void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) desktop_window_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopWindowPlugin"); + desktop_window_plugin_register_with_registrar(desktop_window_registrar); + g_autoptr(FlPluginRegistrar) dynamic_color_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin"); + dynamic_color_plugin_register_with_registrar(dynamic_color_registrar); + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); +} diff --git a/boring_to_beautiful/step_05_c/linux/flutter/generated_plugin_registrant.h b/boring_to_beautiful/step_05_c/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000000..e0f0a47bc0 --- /dev/null +++ b/boring_to_beautiful/step_05_c/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/boring_to_beautiful/step_05_c/linux/flutter/generated_plugins.cmake b/boring_to_beautiful/step_05_c/linux/flutter/generated_plugins.cmake new file mode 100644 index 0000000000..ec1b760714 --- /dev/null +++ b/boring_to_beautiful/step_05_c/linux/flutter/generated_plugins.cmake @@ -0,0 +1,26 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + desktop_window + dynamic_color + url_launcher_linux +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/boring_to_beautiful/step_05_c/linux/runner/CMakeLists.txt b/boring_to_beautiful/step_05_c/linux/runner/CMakeLists.txt new file mode 100644 index 0000000000..e97dabc702 --- /dev/null +++ b/boring_to_beautiful/step_05_c/linux/runner/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the application ID. +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") diff --git a/boring_to_beautiful/step_05_c/linux/runner/main.cc b/boring_to_beautiful/step_05_c/linux/runner/main.cc new file mode 100644 index 0000000000..e7c5c54370 --- /dev/null +++ b/boring_to_beautiful/step_05_c/linux/runner/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/boring_to_beautiful/step_05_c/linux/runner/my_application.cc b/boring_to_beautiful/step_05_c/linux/runner/my_application.cc new file mode 100644 index 0000000000..f93ba9f71c --- /dev/null +++ b/boring_to_beautiful/step_05_c/linux/runner/my_application.cc @@ -0,0 +1,130 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "myartist"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "myartist"); + } + + gtk_window_set_default_size(window, 1280, 720); + gtk_widget_show(GTK_WIDGET(window)); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + // Set the program name to the application ID, which helps various systems + // like GTK and desktop environments map this running application to its + // corresponding .desktop file. This ensures better integration by allowing + // the application to be recognized beyond its binary name. + g_set_prgname(APPLICATION_ID); + + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/boring_to_beautiful/step_05_c/linux/runner/my_application.h b/boring_to_beautiful/step_05_c/linux/runner/my_application.h new file mode 100644 index 0000000000..72271d5e41 --- /dev/null +++ b/boring_to_beautiful/step_05_c/linux/runner/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/boring_to_beautiful/step_05_c/macos/.gitignore b/boring_to_beautiful/step_05_c/macos/.gitignore new file mode 100644 index 0000000000..746adbb6b9 --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/boring_to_beautiful/step_05_c/macos/Flutter/Flutter-Debug.xcconfig b/boring_to_beautiful/step_05_c/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 0000000000..4b81f9b2d2 --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/boring_to_beautiful/step_05_c/macos/Flutter/Flutter-Release.xcconfig b/boring_to_beautiful/step_05_c/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 0000000000..5caa9d1579 --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/boring_to_beautiful/step_05_c/macos/Flutter/GeneratedPluginRegistrant.swift b/boring_to_beautiful/step_05_c/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000000..b79b17e327 --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,18 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import desktop_window +import dynamic_color +import path_provider_foundation +import url_launcher_macos + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + DesktopWindowPlugin.register(with: registry.registrar(forPlugin: "DesktopWindowPlugin")) + DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) +} diff --git a/boring_to_beautiful/step_05_c/macos/Podfile b/boring_to_beautiful/step_05_c/macos/Podfile new file mode 100644 index 0000000000..29c8eb3294 --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/Podfile @@ -0,0 +1,42 @@ +platform :osx, '10.14' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/boring_to_beautiful/step_05_c/macos/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_05_c/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..79fced16c3 --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,801 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 120C1A7E7D320A31C1211A4A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */; }; + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + E344FE031826102CEDE46647 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 2BCC07C46EB4E01CE044DBB6 /* 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 = ""; }; + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 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 /* myartist.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = myartist.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 = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 3E5DC3FB470EEF77149E71DD /* 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 = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 93864140E5DDD8350C71D815 /* 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 = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + 9B293DEC88BD59786AD94EBD /* 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 = ""; }; + AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EEFA0ABEA58A1E38E7AD7041 /* 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 = ""; }; + FDBDA46A6FE6381EE95E5A7A /* 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 = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 120C1A7E7D320A31C1211A4A /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E344FE031826102CEDE46647 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C80D6294CF71000263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 331C80D6294CF71000263BE5 /* RunnerTests */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + 6CDFAAD29A585E1E7DFB128C /* Pods */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* myartist.app */, + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + 6CDFAAD29A585E1E7DFB128C /* Pods */ = { + isa = PBXGroup; + children = ( + 3E5DC3FB470EEF77149E71DD /* Pods-Runner.debug.xcconfig */, + 2BCC07C46EB4E01CE044DBB6 /* Pods-Runner.release.xcconfig */, + 9B293DEC88BD59786AD94EBD /* Pods-Runner.profile.xcconfig */, + 93864140E5DDD8350C71D815 /* Pods-RunnerTests.debug.xcconfig */, + FDBDA46A6FE6381EE95E5A7A /* Pods-RunnerTests.release.xcconfig */, + EEFA0ABEA58A1E38E7AD7041 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */, + AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 36CFF57A21336FA90DED8C50 /* [CP] Check Pods Manifest.lock */, + 331C80D1294CF70F00263BE5 /* Sources */, + 331C80D2294CF70F00263BE5 /* Frameworks */, + 331C80D3294CF70F00263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 41EDDA96C09EE65F003D69E0 /* [CP] Check Pods Manifest.lock */, + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + 0F169C1C0F5EE8E3D274E72F /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* myartist.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C80D4294CF70F00263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 33CC10EC2044A3C60003C045; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 331C80D4294CF70F00263BE5 /* RunnerTests */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C80D3294CF70F00263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 0F169C1C0F5EE8E3D274E72F /* [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; + }; + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; + 36CFF57A21336FA90DED8C50 /* [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; + }; + 41EDDA96C09EE65F003D69E0 /* [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; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C80D1294CF70F00263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 331C80DB294CF71000263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 93864140E5DDD8350C71D815 /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.myartist.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/myartist.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/myartist"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FDBDA46A6FE6381EE95E5A7A /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.myartist.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/myartist.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/myartist"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EEFA0ABEA58A1E38E7AD7041 /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.myartist.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/myartist.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/myartist"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C80DB294CF71000263BE5 /* Debug */, + 331C80DC294CF71000263BE5 /* Release */, + 331C80DD294CF71000263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/boring_to_beautiful/step_05_c/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/boring_to_beautiful/step_05_c/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000..18d981003d --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/boring_to_beautiful/step_05_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/step_05_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000000..888bfbb4c7 --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boring_to_beautiful/step_05_c/macos/Runner.xcworkspace/contents.xcworkspacedata b/boring_to_beautiful/step_05_c/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..21a3cc14c7 --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/boring_to_beautiful/step_05_c/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/boring_to_beautiful/step_05_c/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000..18d981003d --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/boring_to_beautiful/step_05_c/macos/Runner/AppDelegate.swift b/boring_to_beautiful/step_05_c/macos/Runner/AppDelegate.swift new file mode 100644 index 0000000000..b3c1761412 --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Cocoa +import FlutterMacOS + +@main +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } +} diff --git a/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..a2ec33f19f --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000..82b6f9d9a3 Binary files /dev/null and b/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ diff --git a/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000..13b35eba55 Binary files /dev/null and b/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ diff --git a/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000000..0a3f5fa40f Binary files /dev/null and b/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 0000000000..bdb57226d5 Binary files /dev/null and b/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png new file mode 100644 index 0000000000..f083318e09 Binary files /dev/null and b/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 0000000000..326c0e72c9 Binary files /dev/null and b/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ diff --git a/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000000..2f1632cfdd Binary files /dev/null and b/boring_to_beautiful/step_05_c/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/boring_to_beautiful/step_05_c/macos/Runner/Base.lproj/MainMenu.xib b/boring_to_beautiful/step_05_c/macos/Runner/Base.lproj/MainMenu.xib new file mode 100644 index 0000000000..80e867a4e0 --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/Runner/Base.lproj/MainMenu.xib @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boring_to_beautiful/step_05_c/macos/Runner/Configs/AppInfo.xcconfig b/boring_to_beautiful/step_05_c/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 0000000000..e31e407170 --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = myartist + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.myartist + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/boring_to_beautiful/step_05_c/macos/Runner/Configs/Debug.xcconfig b/boring_to_beautiful/step_05_c/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 0000000000..36b0fd9464 --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/boring_to_beautiful/step_05_c/macos/Runner/Configs/Release.xcconfig b/boring_to_beautiful/step_05_c/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 0000000000..dff4f49561 --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/boring_to_beautiful/step_05_c/macos/Runner/Configs/Warnings.xcconfig b/boring_to_beautiful/step_05_c/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 0000000000..42bcbf4780 --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/boring_to_beautiful/final/macos/Runner/Release.entitlements b/boring_to_beautiful/step_05_c/macos/Runner/DebugProfile.entitlements similarity index 86% rename from boring_to_beautiful/final/macos/Runner/Release.entitlements rename to boring_to_beautiful/step_05_c/macos/Runner/DebugProfile.entitlements index 7a2230dc33..08c3ab17cc 100644 --- a/boring_to_beautiful/final/macos/Runner/Release.entitlements +++ b/boring_to_beautiful/step_05_c/macos/Runner/DebugProfile.entitlements @@ -4,9 +4,11 @@ com.apple.security.app-sandbox - com.apple.security.network.client + com.apple.security.cs.allow-jit com.apple.security.network.server + com.apple.security.network.client + diff --git a/boring_to_beautiful/step_05_c/macos/Runner/Info.plist b/boring_to_beautiful/step_05_c/macos/Runner/Info.plist new file mode 100644 index 0000000000..4789daa6a4 --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/boring_to_beautiful/step_05_c/macos/Runner/MainFlutterWindow.swift b/boring_to_beautiful/step_05_c/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 0000000000..3cc05eb234 --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/boring_to_beautiful/step_05_c/macos/Runner/Release.entitlements b/boring_to_beautiful/step_05_c/macos/Runner/Release.entitlements new file mode 100644 index 0000000000..ee95ab7e58 --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/Runner/Release.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.network.client + + + diff --git a/boring_to_beautiful/step_05_c/macos/RunnerTests/RunnerTests.swift b/boring_to_beautiful/step_05_c/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000000..61f3bd1fc5 --- /dev/null +++ b/boring_to_beautiful/step_05_c/macos/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Cocoa +import FlutterMacOS +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/boring_to_beautiful/step_05_c/pubspec.yaml b/boring_to_beautiful/step_05_c/pubspec.yaml new file mode 100644 index 0000000000..817f7d00c0 --- /dev/null +++ b/boring_to_beautiful/step_05_c/pubspec.yaml @@ -0,0 +1,40 @@ +name: myartist +description: "A new Flutter project." +publish_to: 'none' +version: 0.1.0 + +environment: + sdk: ^3.8.1 + +dependencies: + flutter: + sdk: flutter + animations: ^2.0.11 + collection: ^1.19.1 + cupertino_icons: ^1.0.8 + desktop_window: ^0.4.2 + dynamic_color: ^1.7.0 + english_words: ^4.0.0 + flutter_bloc: ^9.1.1 + freezed_annotation: ^3.0.0 + go_router: ^15.1.3 + material_color_utilities: any + universal_platform: ^1.1.0 + url_launcher: ^6.3.1 + google_fonts: ^6.2.1 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^6.0.0 + build_runner: ^2.4.15 + freezed: ^3.0.6 + +flutter: + uses-material-design: true + assets: + - assets/images/ + - assets/images/playlists/ + - assets/images/albums/ + - assets/images/artists/ + - assets/images/news/ diff --git a/boring_to_beautiful/step_05_c/web/favicon.png b/boring_to_beautiful/step_05_c/web/favicon.png new file mode 100644 index 0000000000..8aaa46ac1a Binary files /dev/null and b/boring_to_beautiful/step_05_c/web/favicon.png differ diff --git a/boring_to_beautiful/step_05_c/web/icons/Icon-192.png b/boring_to_beautiful/step_05_c/web/icons/Icon-192.png new file mode 100644 index 0000000000..b749bfef07 Binary files /dev/null and b/boring_to_beautiful/step_05_c/web/icons/Icon-192.png differ diff --git a/boring_to_beautiful/step_05_c/web/icons/Icon-512.png b/boring_to_beautiful/step_05_c/web/icons/Icon-512.png new file mode 100644 index 0000000000..88cfd48dff Binary files /dev/null and b/boring_to_beautiful/step_05_c/web/icons/Icon-512.png differ diff --git a/boring_to_beautiful/step_05_c/web/icons/Icon-maskable-192.png b/boring_to_beautiful/step_05_c/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000..eb9b4d76e5 Binary files /dev/null and b/boring_to_beautiful/step_05_c/web/icons/Icon-maskable-192.png differ diff --git a/boring_to_beautiful/step_05_c/web/icons/Icon-maskable-512.png b/boring_to_beautiful/step_05_c/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000..d69c56691f Binary files /dev/null and b/boring_to_beautiful/step_05_c/web/icons/Icon-maskable-512.png differ diff --git a/boring_to_beautiful/step_05_c/web/index.html b/boring_to_beautiful/step_05_c/web/index.html new file mode 100644 index 0000000000..e0a0abbbbf --- /dev/null +++ b/boring_to_beautiful/step_05_c/web/index.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + myartist + + + + + + diff --git a/boring_to_beautiful/step_05_c/web/manifest.json b/boring_to_beautiful/step_05_c/web/manifest.json new file mode 100644 index 0000000000..9ba6ea354a --- /dev/null +++ b/boring_to_beautiful/step_05_c/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "myartist", + "short_name": "myartist", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/boring_to_beautiful/step_05_c/windows/.gitignore b/boring_to_beautiful/step_05_c/windows/.gitignore new file mode 100644 index 0000000000..d492d0d98c --- /dev/null +++ b/boring_to_beautiful/step_05_c/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/boring_to_beautiful/step_05_c/windows/CMakeLists.txt b/boring_to_beautiful/step_05_c/windows/CMakeLists.txt new file mode 100644 index 0000000000..42d6eeb58f --- /dev/null +++ b/boring_to_beautiful/step_05_c/windows/CMakeLists.txt @@ -0,0 +1,108 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(myartist LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "myartist") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(VERSION 3.14...3.25) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/boring_to_beautiful/step_05_c/windows/flutter/CMakeLists.txt b/boring_to_beautiful/step_05_c/windows/flutter/CMakeLists.txt new file mode 100644 index 0000000000..903f4899d6 --- /dev/null +++ b/boring_to_beautiful/step_05_c/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/boring_to_beautiful/step_05_c/windows/flutter/generated_plugin_registrant.cc b/boring_to_beautiful/step_05_c/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000000..a3c18e7ad3 --- /dev/null +++ b/boring_to_beautiful/step_05_c/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,20 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + DesktopWindowPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("DesktopWindowPlugin")); + DynamicColorPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("DynamicColorPluginCApi")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); +} diff --git a/boring_to_beautiful/step_05_c/windows/flutter/generated_plugin_registrant.h b/boring_to_beautiful/step_05_c/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000000..dc139d85a9 --- /dev/null +++ b/boring_to_beautiful/step_05_c/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/boring_to_beautiful/step_05_c/windows/flutter/generated_plugins.cmake b/boring_to_beautiful/step_05_c/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000000..5c49a81c50 --- /dev/null +++ b/boring_to_beautiful/step_05_c/windows/flutter/generated_plugins.cmake @@ -0,0 +1,26 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + desktop_window + dynamic_color + url_launcher_windows +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/boring_to_beautiful/step_05_c/windows/runner/CMakeLists.txt b/boring_to_beautiful/step_05_c/windows/runner/CMakeLists.txt new file mode 100644 index 0000000000..394917c053 --- /dev/null +++ b/boring_to_beautiful/step_05_c/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/boring_to_beautiful/step_05_c/windows/runner/Runner.rc b/boring_to_beautiful/step_05_c/windows/runner/Runner.rc new file mode 100644 index 0000000000..e652dd348f --- /dev/null +++ b/boring_to_beautiful/step_05_c/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.example" "\0" + VALUE "FileDescription", "myartist" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "myartist" "\0" + VALUE "LegalCopyright", "Copyright (C) 2025 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "myartist.exe" "\0" + VALUE "ProductName", "myartist" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/boring_to_beautiful/step_05_c/windows/runner/flutter_window.cpp b/boring_to_beautiful/step_05_c/windows/runner/flutter_window.cpp new file mode 100644 index 0000000000..955ee3038f --- /dev/null +++ b/boring_to_beautiful/step_05_c/windows/runner/flutter_window.cpp @@ -0,0 +1,71 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/boring_to_beautiful/step_05_c/windows/runner/flutter_window.h b/boring_to_beautiful/step_05_c/windows/runner/flutter_window.h new file mode 100644 index 0000000000..6da0652f05 --- /dev/null +++ b/boring_to_beautiful/step_05_c/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/boring_to_beautiful/step_05_c/windows/runner/main.cpp b/boring_to_beautiful/step_05_c/windows/runner/main.cpp new file mode 100644 index 0000000000..e3fbae04d1 --- /dev/null +++ b/boring_to_beautiful/step_05_c/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"myartist", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/boring_to_beautiful/step_05_c/windows/runner/resource.h b/boring_to_beautiful/step_05_c/windows/runner/resource.h new file mode 100644 index 0000000000..66a65d1e4a --- /dev/null +++ b/boring_to_beautiful/step_05_c/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/boring_to_beautiful/step_05_c/windows/runner/resources/app_icon.ico b/boring_to_beautiful/step_05_c/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000..c04e20caf6 Binary files /dev/null and b/boring_to_beautiful/step_05_c/windows/runner/resources/app_icon.ico differ diff --git a/boring_to_beautiful/step_05_c/windows/runner/runner.exe.manifest b/boring_to_beautiful/step_05_c/windows/runner/runner.exe.manifest new file mode 100644 index 0000000000..153653e8d6 --- /dev/null +++ b/boring_to_beautiful/step_05_c/windows/runner/runner.exe.manifest @@ -0,0 +1,14 @@ + + + + + PerMonitorV2 + + + + + + + + + diff --git a/boring_to_beautiful/step_05_c/windows/runner/utils.cpp b/boring_to_beautiful/step_05_c/windows/runner/utils.cpp new file mode 100644 index 0000000000..3a0b46511a --- /dev/null +++ b/boring_to_beautiful/step_05_c/windows/runner/utils.cpp @@ -0,0 +1,65 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + unsigned int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + input_length, utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/boring_to_beautiful/step_05_c/windows/runner/utils.h b/boring_to_beautiful/step_05_c/windows/runner/utils.h new file mode 100644 index 0000000000..3879d54755 --- /dev/null +++ b/boring_to_beautiful/step_05_c/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/boring_to_beautiful/step_05_c/windows/runner/win32_window.cpp b/boring_to_beautiful/step_05_c/windows/runner/win32_window.cpp new file mode 100644 index 0000000000..60608d0fe5 --- /dev/null +++ b/boring_to_beautiful/step_05_c/windows/runner/win32_window.cpp @@ -0,0 +1,288 @@ +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/boring_to_beautiful/step_05_c/windows/runner/win32_window.h b/boring_to_beautiful/step_05_c/windows/runner/win32_window.h new file mode 100644 index 0000000000..e901dde684 --- /dev/null +++ b/boring_to_beautiful/step_05_c/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/boring_to_beautiful/step_06/ios/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_06/ios/Runner.xcodeproj/project.pbxproj index ebb1244e8b..c30322fdf6 100644 --- a/boring_to_beautiful/step_06/ios/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_06/ios/Runner.xcodeproj/project.pbxproj @@ -7,15 +7,15 @@ objects = { /* Begin PBXBuildFile section */ - 0BA3C72CFF7FB3D58116BBE0 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 28D4EB9BC109C11A38856D7C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */; }; + 31AC9F1F861163CE474DC0DF /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BA15459E839D3553B26934 /* Pods_Runner.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 */; }; + C4EE9B5B592653F634344186 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,20 +42,18 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 018597106C8E38C2A20B56DC /* 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 = ""; }; - 1454C98E0DB9BDD277830752 /* 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 = ""; }; + 06C27BF5D7B993BB5DCB8D21 /* 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 = ""; }; 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 = ""; }; - 164233455F6E52D976E7619C /* 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 = ""; }; - 203DA535161F6F2E1631CA2F /* 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 = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3421F167A26D263533D9C0F8 /* 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 = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4ABA081B421BEA588642248C /* 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 = ""; }; 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 = ""; }; - 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8367A59A9CDAA6556FC2822B /* 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 = ""; }; 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; }; @@ -63,8 +61,10 @@ 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 = ""; }; - E367CC7226100F29F71405B1 /* 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 = ""; }; - FAB89AD13AACCB9650BBE6EA /* 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 = ""; }; + 9BB58392A543FF4660B2490F /* 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 = ""; }; + D0BA15459E839D3553B26934 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F7B65A9BC4B475ABEC573986 /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,15 +72,15 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 28D4EB9BC109C11A38856D7C /* Pods_Runner.framework in Frameworks */, + 31AC9F1F861163CE474DC0DF /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - BFB82CA3C890A718124E1EDE /* Frameworks */ = { + F9E0A4607079935C37BF168F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0BA3C72CFF7FB3D58116BBE0 /* Pods_RunnerTests.framework in Frameworks */, + C4EE9B5B592653F634344186 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 7A1ACBFB4AEFAC5081D802E1 /* Pods */ = { + 44BD8D06CB822F8C423FCD72 /* Pods */ = { isa = PBXGroup; children = ( - E367CC7226100F29F71405B1 /* Pods-Runner.debug.xcconfig */, - 1454C98E0DB9BDD277830752 /* Pods-Runner.release.xcconfig */, - 203DA535161F6F2E1631CA2F /* Pods-Runner.profile.xcconfig */, - FAB89AD13AACCB9650BBE6EA /* Pods-RunnerTests.debug.xcconfig */, - 018597106C8E38C2A20B56DC /* Pods-RunnerTests.release.xcconfig */, - 164233455F6E52D976E7619C /* Pods-RunnerTests.profile.xcconfig */, + 3421F167A26D263533D9C0F8 /* Pods-Runner.debug.xcconfig */, + 8367A59A9CDAA6556FC2822B /* Pods-Runner.release.xcconfig */, + 06C27BF5D7B993BB5DCB8D21 /* Pods-Runner.profile.xcconfig */, + F7B65A9BC4B475ABEC573986 /* Pods-RunnerTests.debug.xcconfig */, + 4ABA081B421BEA588642248C /* Pods-RunnerTests.release.xcconfig */, + 9BB58392A543FF4660B2490F /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 7A1ACBFB4AEFAC5081D802E1 /* Pods */, - AD091A7825928A7EC8BC6AD6 /* Frameworks */, + 44BD8D06CB822F8C423FCD72 /* Pods */, + D054066A4956E2C378EF4A32 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - AD091A7825928A7EC8BC6AD6 /* Frameworks */ = { + D054066A4956E2C378EF4A32 /* Frameworks */ = { isa = PBXGroup; children = ( - 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */, - 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */, + D0BA15459E839D3553B26934 /* Pods_Runner.framework */, + E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D8787C4471D00A25C41EA2CB /* [CP] Check Pods Manifest.lock */, + 001D1E85333DF9609D34BC08 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - BFB82CA3C890A718124E1EDE /* Frameworks */, + F9E0A4607079935C37BF168F /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 62E6FB6D8F5E3A7C56D8737D /* [CP] Check Pods Manifest.lock */, + 1975AD24A5DD7DE3F4DE1B61 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 72DCD364ECC5EFBE76A41B99 /* [CP] Embed Pods Frameworks */, + 26E7569DC25C33E17720D218 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,23 +270,29 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 001D1E85333DF9609D34BC08 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + 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; }; - 62E6FB6D8F5E3A7C56D8737D /* [CP] Check Pods Manifest.lock */ = { + 1975AD24A5DD7DE3F4DE1B61 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -308,7 +314,7 @@ 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; }; - 72DCD364ECC5EFBE76A41B99 /* [CP] Embed Pods Frameworks */ = { + 26E7569DC25C33E17720D218 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -325,42 +331,36 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); - name = "Run Script"; + name = "Thin Binary"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - D8787C4471D00A25C41EA2CB /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; 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; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FAB89AD13AACCB9650BBE6EA /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = F7B65A9BC4B475ABEC573986 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 018597106C8E38C2A20B56DC /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 4ABA081B421BEA588642248C /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 164233455F6E52D976E7619C /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 9BB58392A543FF4660B2490F /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/boring_to_beautiful/step_06/lib/src/features/home/view/home_highlight.dart b/boring_to_beautiful/step_06/lib/src/features/home/view/home_highlight.dart index a4016761a6..191dac0284 100644 --- a/boring_to_beautiful/step_06/lib/src/features/home/view/home_highlight.dart +++ b/boring_to_beautiful/step_06/lib/src/features/home/view/home_highlight.dart @@ -16,7 +16,7 @@ class HomeHighlight extends StatelessWidget { children: [ Expanded( child: Padding( - padding: const EdgeInsets.all(15), + padding: const EdgeInsets.symmetric(horizontal: 35, vertical: 5), child: Clickable( child: SizedBox( height: 275, diff --git a/boring_to_beautiful/step_06/lib/src/shared/providers/theme.dart b/boring_to_beautiful/step_06/lib/src/shared/providers/theme.dart index a8c3c7c92f..66480919af 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/providers/theme.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/providers/theme.dart @@ -147,6 +147,7 @@ class ThemeProvider extends InheritedWidget { ThemeData light([Color? targetColor]) { final colorScheme = colors(Brightness.light, targetColor); return ThemeData.light().copyWith( + pageTransitionsTheme: pageTransitionsTheme, colorScheme: colorScheme, appBarTheme: appBarTheme(colorScheme), cardTheme: cardTheme(), @@ -163,6 +164,7 @@ class ThemeProvider extends InheritedWidget { ThemeData dark([Color? targetColor]) { final colorScheme = colors(Brightness.dark, targetColor); return ThemeData.dark().copyWith( + pageTransitionsTheme: pageTransitionsTheme, colorScheme: colorScheme, appBarTheme: appBarTheme(colorScheme), cardTheme: cardTheme(), diff --git a/boring_to_beautiful/step_06/macos/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_06/macos/Runner.xcodeproj/project.pbxproj index 6ae862c37d..79fced16c3 100644 --- a/boring_to_beautiful/step_06/macos/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_06/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 120C1A7E7D320A31C1211A4A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 6A705DC52900C471DF6E1EC6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */; }; - 9AEA2C669381F3905C501B66 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */; }; + E344FE031826102CEDE46647 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,7 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 049E4603B0A09E05087E56FA /* 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 = ""; }; + 2BCC07C46EB4E01CE044DBB6 /* 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 = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -79,15 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 54CECCDD830654297CBE27CA /* 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 = ""; }; + 3E5DC3FB470EEF77149E71DD /* 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 = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 93864140E5DDD8350C71D815 /* 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 = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 9FFE8F2CDA409CA0E1B27D98 /* 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 = ""; }; - A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CE866162E3EE650EB52F3385 /* 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 = ""; }; - DF7AD973C56F21946082FE37 /* 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 = ""; }; - E9D755A13E508067E98F3444 /* 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 = ""; }; + 9B293DEC88BD59786AD94EBD /* 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 = ""; }; + AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EEFA0ABEA58A1E38E7AD7041 /* 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 = ""; }; + FDBDA46A6FE6381EE95E5A7A /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9AEA2C669381F3905C501B66 /* Pods_RunnerTests.framework in Frameworks */, + 120C1A7E7D320A31C1211A4A /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6A705DC52900C471DF6E1EC6 /* Pods_Runner.framework in Frameworks */, + E344FE031826102CEDE46647 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - D3381829CD41C2D96B6F2B3E /* Pods */, + 6CDFAAD29A585E1E7DFB128C /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - D3381829CD41C2D96B6F2B3E /* Pods */ = { + 6CDFAAD29A585E1E7DFB128C /* Pods */ = { isa = PBXGroup; children = ( - E9D755A13E508067E98F3444 /* Pods-Runner.debug.xcconfig */, - CE866162E3EE650EB52F3385 /* Pods-Runner.release.xcconfig */, - DF7AD973C56F21946082FE37 /* Pods-Runner.profile.xcconfig */, - 9FFE8F2CDA409CA0E1B27D98 /* Pods-RunnerTests.debug.xcconfig */, - 049E4603B0A09E05087E56FA /* Pods-RunnerTests.release.xcconfig */, - 54CECCDD830654297CBE27CA /* Pods-RunnerTests.profile.xcconfig */, + 3E5DC3FB470EEF77149E71DD /* Pods-Runner.debug.xcconfig */, + 2BCC07C46EB4E01CE044DBB6 /* Pods-Runner.release.xcconfig */, + 9B293DEC88BD59786AD94EBD /* Pods-Runner.profile.xcconfig */, + 93864140E5DDD8350C71D815 /* Pods-RunnerTests.debug.xcconfig */, + FDBDA46A6FE6381EE95E5A7A /* Pods-RunnerTests.release.xcconfig */, + EEFA0ABEA58A1E38E7AD7041 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */, - A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */, + E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */, + AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - C59A11FAACC96E6D468156D2 /* [CP] Check Pods Manifest.lock */, + 36CFF57A21336FA90DED8C50 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 33528B7408CACCE07D6DAD0F /* [CP] Check Pods Manifest.lock */, + 41EDDA96C09EE65F003D69E0 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - C6A4842BF1A9A85A617B12E2 /* [CP] Embed Pods Frameworks */, + 0F169C1C0F5EE8E3D274E72F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,26 +323,21 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 33528B7408CACCE07D6DAD0F /* [CP] Check Pods Manifest.lock */ = { + 0F169C1C0F5EE8E3D274E72F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); 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"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 3399D490228B24CF009A79C7 /* ShellScript */ = { @@ -383,7 +378,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - C59A11FAACC96E6D468156D2 /* [CP] Check Pods Manifest.lock */ = { + 36CFF57A21336FA90DED8C50 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -405,21 +400,26 @@ 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; }; - C6A4842BF1A9A85A617B12E2 /* [CP] Embed Pods Frameworks */ = { + 41EDDA96C09EE65F003D69E0 /* [CP] Check Pods Manifest.lock */ = { 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"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + 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; }; /* End PBXShellScriptBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9FFE8F2CDA409CA0E1B27D98 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 93864140E5DDD8350C71D815 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 049E4603B0A09E05087E56FA /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = FDBDA46A6FE6381EE95E5A7A /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 54CECCDD830654297CBE27CA /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = EEFA0ABEA58A1E38E7AD7041 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/boring_to_beautiful/step_06/macos/Runner/DebugProfile.entitlements b/boring_to_beautiful/step_06/macos/Runner/DebugProfile.entitlements index 3ba6c1266f..08c3ab17cc 100644 --- a/boring_to_beautiful/step_06/macos/Runner/DebugProfile.entitlements +++ b/boring_to_beautiful/step_06/macos/Runner/DebugProfile.entitlements @@ -6,9 +6,9 @@ com.apple.security.cs.allow-jit - com.apple.security.network.client - com.apple.security.network.server + com.apple.security.network.client + diff --git a/boring_to_beautiful/step_06/macos/Runner/Release.entitlements b/boring_to_beautiful/step_06/macos/Runner/Release.entitlements index 7a2230dc33..ee95ab7e58 100644 --- a/boring_to_beautiful/step_06/macos/Runner/Release.entitlements +++ b/boring_to_beautiful/step_06/macos/Runner/Release.entitlements @@ -6,7 +6,5 @@ com.apple.security.network.client - com.apple.security.network.server - diff --git a/boring_to_beautiful/step_06/pubspec.yaml b/boring_to_beautiful/step_06/pubspec.yaml index e6cd6dfab6..817f7d00c0 100644 --- a/boring_to_beautiful/step_06/pubspec.yaml +++ b/boring_to_beautiful/step_06/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: english_words: ^4.0.0 flutter_bloc: ^9.1.1 freezed_annotation: ^3.0.0 - go_router: ^15.1.2 + go_router: ^15.1.3 material_color_utilities: any universal_platform: ^1.1.0 url_launcher: ^6.3.1 diff --git a/boring_to_beautiful/step_07/ios/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_07/ios/Runner.xcodeproj/project.pbxproj index ebb1244e8b..c30322fdf6 100644 --- a/boring_to_beautiful/step_07/ios/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_07/ios/Runner.xcodeproj/project.pbxproj @@ -7,15 +7,15 @@ objects = { /* Begin PBXBuildFile section */ - 0BA3C72CFF7FB3D58116BBE0 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 28D4EB9BC109C11A38856D7C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */; }; + 31AC9F1F861163CE474DC0DF /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BA15459E839D3553B26934 /* Pods_Runner.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 */; }; + C4EE9B5B592653F634344186 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,20 +42,18 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 018597106C8E38C2A20B56DC /* 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 = ""; }; - 1454C98E0DB9BDD277830752 /* 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 = ""; }; + 06C27BF5D7B993BB5DCB8D21 /* 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 = ""; }; 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 = ""; }; - 164233455F6E52D976E7619C /* 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 = ""; }; - 203DA535161F6F2E1631CA2F /* 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 = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3421F167A26D263533D9C0F8 /* 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 = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4ABA081B421BEA588642248C /* 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 = ""; }; 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 = ""; }; - 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8367A59A9CDAA6556FC2822B /* 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 = ""; }; 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; }; @@ -63,8 +61,10 @@ 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 = ""; }; - E367CC7226100F29F71405B1 /* 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 = ""; }; - FAB89AD13AACCB9650BBE6EA /* 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 = ""; }; + 9BB58392A543FF4660B2490F /* 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 = ""; }; + D0BA15459E839D3553B26934 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F7B65A9BC4B475ABEC573986 /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,15 +72,15 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 28D4EB9BC109C11A38856D7C /* Pods_Runner.framework in Frameworks */, + 31AC9F1F861163CE474DC0DF /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - BFB82CA3C890A718124E1EDE /* Frameworks */ = { + F9E0A4607079935C37BF168F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0BA3C72CFF7FB3D58116BBE0 /* Pods_RunnerTests.framework in Frameworks */, + C4EE9B5B592653F634344186 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 7A1ACBFB4AEFAC5081D802E1 /* Pods */ = { + 44BD8D06CB822F8C423FCD72 /* Pods */ = { isa = PBXGroup; children = ( - E367CC7226100F29F71405B1 /* Pods-Runner.debug.xcconfig */, - 1454C98E0DB9BDD277830752 /* Pods-Runner.release.xcconfig */, - 203DA535161F6F2E1631CA2F /* Pods-Runner.profile.xcconfig */, - FAB89AD13AACCB9650BBE6EA /* Pods-RunnerTests.debug.xcconfig */, - 018597106C8E38C2A20B56DC /* Pods-RunnerTests.release.xcconfig */, - 164233455F6E52D976E7619C /* Pods-RunnerTests.profile.xcconfig */, + 3421F167A26D263533D9C0F8 /* Pods-Runner.debug.xcconfig */, + 8367A59A9CDAA6556FC2822B /* Pods-Runner.release.xcconfig */, + 06C27BF5D7B993BB5DCB8D21 /* Pods-Runner.profile.xcconfig */, + F7B65A9BC4B475ABEC573986 /* Pods-RunnerTests.debug.xcconfig */, + 4ABA081B421BEA588642248C /* Pods-RunnerTests.release.xcconfig */, + 9BB58392A543FF4660B2490F /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 7A1ACBFB4AEFAC5081D802E1 /* Pods */, - AD091A7825928A7EC8BC6AD6 /* Frameworks */, + 44BD8D06CB822F8C423FCD72 /* Pods */, + D054066A4956E2C378EF4A32 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - AD091A7825928A7EC8BC6AD6 /* Frameworks */ = { + D054066A4956E2C378EF4A32 /* Frameworks */ = { isa = PBXGroup; children = ( - 94F9D966F17CC87BA26C213A /* Pods_Runner.framework */, - 6DC3026E0A86AC8F0F5BE9D2 /* Pods_RunnerTests.framework */, + D0BA15459E839D3553B26934 /* Pods_Runner.framework */, + E2086F275166C6948CE70FC0 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D8787C4471D00A25C41EA2CB /* [CP] Check Pods Manifest.lock */, + 001D1E85333DF9609D34BC08 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - BFB82CA3C890A718124E1EDE /* Frameworks */, + F9E0A4607079935C37BF168F /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 62E6FB6D8F5E3A7C56D8737D /* [CP] Check Pods Manifest.lock */, + 1975AD24A5DD7DE3F4DE1B61 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 72DCD364ECC5EFBE76A41B99 /* [CP] Embed Pods Frameworks */, + 26E7569DC25C33E17720D218 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,23 +270,29 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 001D1E85333DF9609D34BC08 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + 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; }; - 62E6FB6D8F5E3A7C56D8737D /* [CP] Check Pods Manifest.lock */ = { + 1975AD24A5DD7DE3F4DE1B61 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -308,7 +314,7 @@ 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; }; - 72DCD364ECC5EFBE76A41B99 /* [CP] Embed Pods Frameworks */ = { + 26E7569DC25C33E17720D218 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -325,42 +331,36 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); - name = "Run Script"; + name = "Thin Binary"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - D8787C4471D00A25C41EA2CB /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; 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; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FAB89AD13AACCB9650BBE6EA /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = F7B65A9BC4B475ABEC573986 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 018597106C8E38C2A20B56DC /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 4ABA081B421BEA588642248C /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 164233455F6E52D976E7619C /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 9BB58392A543FF4660B2490F /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/boring_to_beautiful/step_07/lib/src/features/home/view/home_highlight.dart b/boring_to_beautiful/step_07/lib/src/features/home/view/home_highlight.dart index a4016761a6..191dac0284 100644 --- a/boring_to_beautiful/step_07/lib/src/features/home/view/home_highlight.dart +++ b/boring_to_beautiful/step_07/lib/src/features/home/view/home_highlight.dart @@ -16,7 +16,7 @@ class HomeHighlight extends StatelessWidget { children: [ Expanded( child: Padding( - padding: const EdgeInsets.all(15), + padding: const EdgeInsets.symmetric(horizontal: 35, vertical: 5), child: Clickable( child: SizedBox( height: 275, diff --git a/boring_to_beautiful/step_07/lib/src/features/playlists/view/playlist_songs.dart b/boring_to_beautiful/step_07/lib/src/features/playlists/view/playlist_songs.dart index e9c951b7a9..17daf2e6eb 100644 --- a/boring_to_beautiful/step_07/lib/src/features/playlists/view/playlist_songs.dart +++ b/boring_to_beautiful/step_07/lib/src/features/playlists/view/playlist_songs.dart @@ -42,8 +42,15 @@ class PlaylistSongs extends StatelessWidget { index: index, cells: [ DataCell( - Center( - child: Text((index + 1).toString(), textAlign: TextAlign.center), + HoverableSongPlayButton( + hoverMode: HoverMode.overlay, + song: playlist.songs[index], + child: Center( + child: Text( + (index + 1).toString(), + textAlign: TextAlign.center, + ), + ), ), ), DataCell( diff --git a/boring_to_beautiful/step_07/lib/src/shared/views/outlined_card.dart b/boring_to_beautiful/step_07/lib/src/shared/views/outlined_card.dart index 5225518d9f..1523f99587 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/views/outlined_card.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/views/outlined_card.dart @@ -15,20 +15,55 @@ class OutlinedCard extends StatefulWidget { } class _OutlinedCardState extends State { + bool _hovered = false; + @override Widget build(BuildContext context) { + final borderRadius = BorderRadius.circular(_hovered ? 20 : 8); + const animationCurve = Curves.easeInOut; return MouseRegion( + onEnter: (_) { + if (!widget.clickable) return; + setState(() { + _hovered = true; + }); + }, + onExit: (_) { + if (!widget.clickable) return; + setState(() { + _hovered = false; + }); + }, cursor: widget.clickable ? SystemMouseCursors.click : SystemMouseCursors.basic, - child: Container( + child: AnimatedContainer( + duration: kThemeAnimationDuration, + curve: animationCurve, decoration: BoxDecoration( border: Border.all( color: Theme.of(context).colorScheme.outline, width: 1, ), + borderRadius: borderRadius, + ), + foregroundDecoration: BoxDecoration( + color: Theme.of( + context, + ).colorScheme.onSurface.withAlpha(_hovered ? 30 : 0), + borderRadius: borderRadius, + ), + child: TweenAnimationBuilder( + duration: kThemeAnimationDuration, + curve: animationCurve, + tween: Tween(begin: BorderRadius.zero, end: borderRadius), + builder: (context, borderRadius, child) => ClipRRect( + clipBehavior: Clip.antiAlias, + borderRadius: borderRadius, + child: child, + ), + child: widget.child, ), - child: widget.child, ), ); } diff --git a/boring_to_beautiful/step_07/macos/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_07/macos/Runner.xcodeproj/project.pbxproj index 6ae862c37d..79fced16c3 100644 --- a/boring_to_beautiful/step_07/macos/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_07/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 120C1A7E7D320A31C1211A4A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 6A705DC52900C471DF6E1EC6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */; }; - 9AEA2C669381F3905C501B66 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */; }; + E344FE031826102CEDE46647 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,7 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 049E4603B0A09E05087E56FA /* 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 = ""; }; + 2BCC07C46EB4E01CE044DBB6 /* 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 = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -79,15 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 54CECCDD830654297CBE27CA /* 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 = ""; }; + 3E5DC3FB470EEF77149E71DD /* 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 = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 93864140E5DDD8350C71D815 /* 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 = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 9FFE8F2CDA409CA0E1B27D98 /* 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 = ""; }; - A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CE866162E3EE650EB52F3385 /* 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 = ""; }; - DF7AD973C56F21946082FE37 /* 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 = ""; }; - E9D755A13E508067E98F3444 /* 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 = ""; }; + 9B293DEC88BD59786AD94EBD /* 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 = ""; }; + AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EEFA0ABEA58A1E38E7AD7041 /* 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 = ""; }; + FDBDA46A6FE6381EE95E5A7A /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9AEA2C669381F3905C501B66 /* Pods_RunnerTests.framework in Frameworks */, + 120C1A7E7D320A31C1211A4A /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6A705DC52900C471DF6E1EC6 /* Pods_Runner.framework in Frameworks */, + E344FE031826102CEDE46647 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - D3381829CD41C2D96B6F2B3E /* Pods */, + 6CDFAAD29A585E1E7DFB128C /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - D3381829CD41C2D96B6F2B3E /* Pods */ = { + 6CDFAAD29A585E1E7DFB128C /* Pods */ = { isa = PBXGroup; children = ( - E9D755A13E508067E98F3444 /* Pods-Runner.debug.xcconfig */, - CE866162E3EE650EB52F3385 /* Pods-Runner.release.xcconfig */, - DF7AD973C56F21946082FE37 /* Pods-Runner.profile.xcconfig */, - 9FFE8F2CDA409CA0E1B27D98 /* Pods-RunnerTests.debug.xcconfig */, - 049E4603B0A09E05087E56FA /* Pods-RunnerTests.release.xcconfig */, - 54CECCDD830654297CBE27CA /* Pods-RunnerTests.profile.xcconfig */, + 3E5DC3FB470EEF77149E71DD /* Pods-Runner.debug.xcconfig */, + 2BCC07C46EB4E01CE044DBB6 /* Pods-Runner.release.xcconfig */, + 9B293DEC88BD59786AD94EBD /* Pods-Runner.profile.xcconfig */, + 93864140E5DDD8350C71D815 /* Pods-RunnerTests.debug.xcconfig */, + FDBDA46A6FE6381EE95E5A7A /* Pods-RunnerTests.release.xcconfig */, + EEFA0ABEA58A1E38E7AD7041 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - C4369DFC5152AD3CC9336DE1 /* Pods_Runner.framework */, - A2ED1AFEDE3E0824294F5C6C /* Pods_RunnerTests.framework */, + E265E576032EFCCB6AB10F89 /* Pods_Runner.framework */, + AA208D76E7C609C5BAC5DE1C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - C59A11FAACC96E6D468156D2 /* [CP] Check Pods Manifest.lock */, + 36CFF57A21336FA90DED8C50 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 33528B7408CACCE07D6DAD0F /* [CP] Check Pods Manifest.lock */, + 41EDDA96C09EE65F003D69E0 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - C6A4842BF1A9A85A617B12E2 /* [CP] Embed Pods Frameworks */, + 0F169C1C0F5EE8E3D274E72F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,26 +323,21 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 33528B7408CACCE07D6DAD0F /* [CP] Check Pods Manifest.lock */ = { + 0F169C1C0F5EE8E3D274E72F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); 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"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 3399D490228B24CF009A79C7 /* ShellScript */ = { @@ -383,7 +378,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - C59A11FAACC96E6D468156D2 /* [CP] Check Pods Manifest.lock */ = { + 36CFF57A21336FA90DED8C50 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -405,21 +400,26 @@ 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; }; - C6A4842BF1A9A85A617B12E2 /* [CP] Embed Pods Frameworks */ = { + 41EDDA96C09EE65F003D69E0 /* [CP] Check Pods Manifest.lock */ = { 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"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + 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; }; /* End PBXShellScriptBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9FFE8F2CDA409CA0E1B27D98 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 93864140E5DDD8350C71D815 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 049E4603B0A09E05087E56FA /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = FDBDA46A6FE6381EE95E5A7A /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 54CECCDD830654297CBE27CA /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = EEFA0ABEA58A1E38E7AD7041 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/boring_to_beautiful/step_07/macos/Runner/DebugProfile.entitlements b/boring_to_beautiful/step_07/macos/Runner/DebugProfile.entitlements index 3ba6c1266f..08c3ab17cc 100644 --- a/boring_to_beautiful/step_07/macos/Runner/DebugProfile.entitlements +++ b/boring_to_beautiful/step_07/macos/Runner/DebugProfile.entitlements @@ -6,9 +6,9 @@ com.apple.security.cs.allow-jit - com.apple.security.network.client - com.apple.security.network.server + com.apple.security.network.client + diff --git a/boring_to_beautiful/step_07/macos/Runner/Release.entitlements b/boring_to_beautiful/step_07/macos/Runner/Release.entitlements index 7a2230dc33..ee95ab7e58 100644 --- a/boring_to_beautiful/step_07/macos/Runner/Release.entitlements +++ b/boring_to_beautiful/step_07/macos/Runner/Release.entitlements @@ -6,7 +6,5 @@ com.apple.security.network.client - com.apple.security.network.server - diff --git a/boring_to_beautiful/step_07/pubspec.yaml b/boring_to_beautiful/step_07/pubspec.yaml index e6cd6dfab6..817f7d00c0 100644 --- a/boring_to_beautiful/step_07/pubspec.yaml +++ b/boring_to_beautiful/step_07/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: english_words: ^4.0.0 flutter_bloc: ^9.1.1 freezed_annotation: ^3.0.0 - go_router: ^15.1.2 + go_router: ^15.1.3 material_color_utilities: any universal_platform: ^1.1.0 url_launcher: ^6.3.1