diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dace64e4..85ee686c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -87,8 +87,8 @@ jobs: - run: flutter gen-l10n - run: flutter pub get - - run: flutter build ios --verbose --release --no-codesign - - run: flutter build ipa --verbose --release --no-codesign + - run: flutter build ios --verbose --no-codesign + - run: flutter build ipa --verbose --no-codesign # App should be published with TestFlight # - name: Release @@ -112,6 +112,34 @@ jobs: # .exe # token: ${{ secrets.GITHUB_TOKEN }} + build_macOS: + name: Bluecherry Client macOS + runs-on: macos-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + submodules: recursive + - uses: subosito/flutter-action@v2.8.0 + with: + channel: "master" + architecture: x64 + # cache: true + + - run: flutter gen-l10n + - run: flutter pub get + - run: flutter build macos --verbose + - run: 7z a bluecherry-macos.7z build/macos/Build/Products/Release/unity.app + - name: Release + # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#example-using-contexts + if: startsWith(github.ref, 'refs/tags/') + uses: softprops/action-gh-release@v1 + with: + files: | + bluecherry-macos.7z + token: ${{ secrets.GITHUB_TOKEN }} + build_windows: name: Bluecherry Client Windows runs-on: windows-latest diff --git a/.github/workflows/flutter_analysis.yml b/.github/workflows/flutter_analysis.yml index 37fec4ac..f27cda34 100644 --- a/.github/workflows/flutter_analysis.yml +++ b/.github/workflows/flutter_analysis.yml @@ -11,7 +11,6 @@ on: jobs: package-analysis: runs-on: ubuntu-latest - steps: - uses: actions/checkout@v3 with: @@ -30,4 +29,21 @@ jobs: run: dart format --set-exit-if-changed . - name: Run analysis - run: flutter analyze \ No newline at end of file + run: flutter analyze + + tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + submodules: recursive + - name: Install Flutter + uses: subosito/flutter-action@v2.8.0 + with: + channel: master + + - run: flutter upgrade + - run: flutter pub get + - run: flutter gen-l10n + - run: flutter test diff --git a/.metadata b/.metadata index dd590699..4dbbfa65 100644 --- a/.metadata +++ b/.metadata @@ -1,11 +1,11 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled. +# This file should be version controlled and should not be manually edited. version: - revision: ce8efb439e7405a9c5e99d81252ba721229b8465 - channel: master + revision: "9e1c857886f07d342cf106f2cd588bcd5e031bb2" + channel: "stable" project_type: app @@ -13,26 +13,11 @@ project_type: app migration: platforms: - platform: root - create_revision: ce8efb439e7405a9c5e99d81252ba721229b8465 - base_revision: ce8efb439e7405a9c5e99d81252ba721229b8465 - - platform: android - create_revision: ce8efb439e7405a9c5e99d81252ba721229b8465 - base_revision: ce8efb439e7405a9c5e99d81252ba721229b8465 - - platform: ios - create_revision: ce8efb439e7405a9c5e99d81252ba721229b8465 - base_revision: ce8efb439e7405a9c5e99d81252ba721229b8465 - - platform: linux - create_revision: ce8efb439e7405a9c5e99d81252ba721229b8465 - base_revision: ce8efb439e7405a9c5e99d81252ba721229b8465 + create_revision: 9e1c857886f07d342cf106f2cd588bcd5e031bb2 + base_revision: 9e1c857886f07d342cf106f2cd588bcd5e031bb2 - platform: macos - create_revision: ce8efb439e7405a9c5e99d81252ba721229b8465 - base_revision: ce8efb439e7405a9c5e99d81252ba721229b8465 - - platform: web - create_revision: ce8efb439e7405a9c5e99d81252ba721229b8465 - base_revision: ce8efb439e7405a9c5e99d81252ba721229b8465 - - platform: windows - create_revision: ce8efb439e7405a9c5e99d81252ba721229b8465 - base_revision: ce8efb439e7405a9c5e99d81252ba721229b8465 + create_revision: 9e1c857886f07d342cf106f2cd588bcd5e031bb2 + base_revision: 9e1c857886f07d342cf106f2cd588bcd5e031bb2 # User provided section diff --git a/README.md b/README.md index 95243b7a..007a9771 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ This project & work under this repository is licensed under [GNU General Public | Android | iOS | Windows | GNU/Linux | MacOS | | ------- | --- | ------- | ----- | ----- | | [arm64 `.apk`](https://github.com/bluecherrydvr/unity/releases/download/bleeding_edge/bluecherry-android-arm64-v8a-release.apk) | [App Store](https://apps.apple.com/us/app/bluecherry-mobile/id1555805139) | [Windows Setup](https://github.com/bluecherrydvr/unity/releases/download/bleeding_edge/bluecherry-windows-setup.exe) | [AppImage](https://github.com/bluecherrydvr/unity/releases/download/bleeding_edge/Bluecherry-latest.AppImage) | 🚧 **SOON** ~~[App Store](https://github.com/bluecherrydvr/unity/issues/112)~~ | -| [armabi `.apk`](https://github.com/bluecherrydvr/unity/releases/download/bleeding_edge/bluecherry-android-armeabi-v7a-release.apk) | | 🚧 **SOON** ~~`winget install bluecherry`~~ | [Ubuntu/Debian `.deb`](https://github.com/bluecherrydvr/unity/releases/download/bleeding_edge/bluecherry-linux-x86_64.deb) | | +| [armabi `.apk`](https://github.com/bluecherrydvr/unity/releases/download/bleeding_edge/bluecherry-android-armeabi-v7a-release.apk) | | 🚧 **SOON** ~~`winget install bluecherry`~~ | [Ubuntu/Debian `.deb`](https://github.com/bluecherrydvr/unity/releases/download/bleeding_edge/bluecherry-linux-x86_64.deb) | [Executable `.app`](https://github.com/bluecherrydvr/unity/releases/download/bleeding_edge/bluecherry-macos.7z) | | [x86_64 `.apk`](https://github.com/bluecherrydvr/unity/releases/download/bleeding_edge/bluecherry-android-x86_64-release.apk) | | 🚧 **SOON** ~~Microsoft Store~~ | [Raw Executable `.tar.gz`](https://github.com/bluecherrydvr/unity/releases/download/bleeding_edge/bluecherry-linux-x86_64.tar.gz) | | | 🚧 **SOON** ~~Play Store~~ | | | [Fedora/Red Hat Linux `.rpm`](https://github.com/bluecherrydvr/unity/releases/download/bleeding_edge/bluecherry-linux-x86_64.rpm) | | @@ -152,7 +152,7 @@ git clone https://github.com/bluecherrydvr/unity cd unity flutter pub get flutter gen-l10n -flutter build [linux|windows|android|ios] +flutter build [linux|windows|macos|android|ios] ``` The automated build process is done using GitHub Actions. You may find the workflow [here](.github/workflows/main.yml). The workflow builds the app for all supported platforms & uploads the artifacts to the release page. diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index b2b872cc..c6d51bda 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -112,7 +112,8 @@ "directCamera": "Direct Camera", "addServer": "Add Server", "settings": "Settings", - "noServersAdded": "No servers added", + "noServersAdded": "You haven't added any servers yet :/", + "howToAddServer": "Go to the \"Add Server\" screen to add a server.", "editServerInfo": "Edit server info", "editServer": "Edit server {serverName}", "@editServer": { diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index b6de2b3f..ad6c5482 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -109,6 +109,7 @@ "addServer": "Ajouter serveur", "settings": "Paramètres", "noServersAdded": "Aucun serveur ajouté", + "howToAddServer": "Go to the \"Add Server\" screen to add a server.", "editServerInfo": "Modifier les info serveur", "editServer": "Modifier le serveur {serverName}", "@editServer": { diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index e677494f..0ab558d1 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -113,6 +113,7 @@ "addServer": "Dodaj serwer", "settings": "Ustawienia", "noServersAdded": "Nie dodano serwerów", + "howToAddServer": "Go to the \"Add Server\" screen to add a server.", "editServerInfo": "Modyfikuj informację serwera", "editServer": "Modyfikuj serwer {serverName}", "@editServer": { diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 8cc10c84..423c6554 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -112,7 +112,8 @@ "directCamera": "Câmera específica", "addServer": "Adicionar servidor", "settings": "Configurações", - "noServersAdded": "Nenhum servidor adicionado", + "noServersAdded": "Você ainda não adicionou nenhum servidor :/", + "howToAddServer": "Vá à \"Adicionar Servidor\" para adicionar um servidor.", "editServerInfo": "Editar informações do servidor", "editServer": "Editar servidor {serverName}", "@editServer": { diff --git a/lib/providers/downloads_provider.dart b/lib/providers/downloads_provider.dart index 571ff05b..3a44b9b2 100644 --- a/lib/providers/downloads_provider.dart +++ b/lib/providers/downloads_provider.dart @@ -213,6 +213,7 @@ class DownloadsManager extends ChangeNotifier { headers: {HttpHeaders.acceptEncodingHeader: '*'}, // disable gzip ), onReceiveProgress: (received, total) { + // TODO(bdlukaa): update window progress bar if (total != -1) { downloading[event] = received / total; notifyListeners(); diff --git a/lib/utils/widgets/tree_view.dart b/lib/utils/widgets/tree_view.dart index 25267b8f..d30965ee 100644 --- a/lib/utils/widgets/tree_view.dart +++ b/lib/utils/widgets/tree_view.dart @@ -18,55 +18,75 @@ Widget buildCheckbox({ double checkboxScale = 0.8, FlexFit textFit = FlexFit.loose, }) { - final checkbox = Transform.scale( - scale: checkboxScale, - child: Checkbox( - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - visualDensity: const VisualDensity(horizontal: -4, vertical: -4), - splashRadius: 0.0, - tristate: true, - value: value, - isError: isError, - onChanged: onChanged, - ), - ); - return Builder(builder: (context) { final theme = Theme.of(context); - return Row(children: [ - checkbox, - Expanded( - child: MouseRegion( - cursor: SystemMouseCursors.click, - child: GestureDetector( - onTap: () { - onChanged(value == null ? true : !value); - }, - child: Row(children: [ - SizedBox(width: gapCheckboxText), - Flexible( - fit: textFit, - child: Text( - text, - overflow: TextOverflow.ellipsis, - maxLines: 1, - softWrap: false, - style: TextStyle( - decoration: isError ? TextDecoration.lineThrough : null, - ), - ), + final loc = AppLocalizations.of(context); + final checkbox = SizedBox.fromSize( + size: const Size(24.0, 24.0), + child: isError + ? Tooltip( + message: loc.offline, + child: Icon( + Icons.videocam_off_outlined, + size: 16.0, + color: theme.colorScheme.error, + ), + ) + : Transform.scale( + scale: checkboxScale, + child: Checkbox.adaptive( + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + visualDensity: + const VisualDensity(horizontal: -4, vertical: -4), + splashRadius: 0.0, + tristate: true, + value: value, + isError: isError, + onChanged: onChanged, + side: + isError ? BorderSide(color: theme.colorScheme.error) : null, ), - if (secondaryText != null) - Text( - secondaryText, - style: theme.textTheme.labelSmall, + ), + ); + + return SizedBox( + height: isError ? 18.0 : 24.0, + child: Row(children: [ + checkbox, + Expanded( + child: MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: () { + onChanged(value == null ? true : !value); + }, + child: Row(children: [ + SizedBox(width: gapCheckboxText), + Flexible( + fit: textFit, + child: Text( + text, + overflow: TextOverflow.ellipsis, + maxLines: 1, + softWrap: false, + style: TextStyle( + color: isError ? theme.colorScheme.error : null, + // decoration: isError ? TextDecoration.lineThrough : null, + ), + ), ), - const SizedBox(width: 10.0), - ]), + if (secondaryText != null) + Text( + secondaryText, + style: theme.textTheme.labelSmall, + ), + const SizedBox(width: 10.0), + ]), + ), ), - ), - ) - ]); + ) + ]), + ); }); } @@ -228,12 +248,12 @@ class _NodeWidgetState extends State { Row(children: [ if (!_isLeaf && _isEnabled) Padding( - padding: const EdgeInsetsDirectional.only(start: 8.0), + padding: const EdgeInsetsDirectional.only(start: 8.0, end: 4.0), child: Tooltip( message: _isExpanded ? loc.collapse : loc.expand, child: InkWell( onTap: onIconPressed, - borderRadius: BorderRadius.circular(100), + borderRadius: BorderRadius.circular(6.0), child: Padding( padding: const EdgeInsetsDirectional.all(4.5), child: Icon(icon, size: widget.iconSize), @@ -243,7 +263,7 @@ class _NodeWidgetState extends State { ) // If it is not leaf nor enabled, mimic the space of the icon button else if (!_isLeaf && !_isEnabled) - const SizedBox(width: 35.0), + const SizedBox(width: 39.0), Expanded(child: widget.treeNode.content), ]), if (_isExpanded && !_isLeaf) diff --git a/lib/utils/window.dart b/lib/utils/window.dart index 064d8027..fb5aa3df 100644 --- a/lib/utils/window.dart +++ b/lib/utils/window.dart @@ -35,21 +35,17 @@ const kInitialWindowSize = Size(1066, 645); /// Configures the current window Future configureWindow() async { await WindowManager.instance.ensureInitialized(); - windowManager.waitUntilReadyToShow().then((_) async { - await windowManager.setTitleBarStyle( - TitleBarStyle.hidden, - windowButtonVisibility: false, - ); - // await windowManager.setMinimumSize(kInitialWindowSize); - if (kDebugMode) { - await windowManager.setMinimumSize(const Size(100, 100)); - } else { - await windowManager.setSize(kInitialWindowSize); - } - // await windowManager.center(); - await windowManager.setSkipTaskbar(false); - await windowManager.show(); - }); + windowManager.waitUntilReadyToShow( + const WindowOptions( + minimumSize: kDebugMode ? Size(100, 100) : kInitialWindowSize, + skipTaskbar: false, + titleBarStyle: TitleBarStyle.hidden, + windowButtonVisibility: true, + ), + () async { + await windowManager.show(); + }, + ); } /// Configures the camera sub window diff --git a/lib/widgets/desktop_buttons.dart b/lib/widgets/desktop_buttons.dart index 6eb83e97..42f43be6 100644 --- a/lib/widgets/desktop_buttons.dart +++ b/lib/widgets/desktop_buttons.dart @@ -29,6 +29,7 @@ import 'package:bluecherry_client/utils/widgets/squared_icon_button.dart'; import 'package:bluecherry_client/widgets/events/events_screen.dart'; import 'package:bluecherry_client/widgets/events_timeline/events_playback.dart'; import 'package:bluecherry_client/widgets/home.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:provider/provider.dart'; @@ -136,6 +137,9 @@ class _WindowButtonsState extends State with WindowListener { final navData = NavigatorData.of(context); + final isMacOSPlatform = + !kIsWeb && defaultTargetPlatform == TargetPlatform.macOS; + return StreamBuilder( stream: navigationStream.stream, builder: (context, arguments) { @@ -145,25 +149,30 @@ class _WindowButtonsState extends State with WindowListener { child: Stack(children: [ DragToMoveArea( child: Row(children: [ + if (isMacOSPlatform) const SizedBox(width: 70.0, height: 40.0), if (canPop) - InkWell( - onTap: () async { - await widget.onBack?.call(); - await navigatorKey.currentState?.maybePop(); - if (mounted) setState(() {}); - }, - child: Container( - height: 40.0, - width: 40.0, - alignment: AlignmentDirectional.center, - child: Icon( - Icons.arrow_back, - size: 20.0, - color: theme.hintColor, + Padding( + padding: const EdgeInsetsDirectional.only(start: 8.0), + child: SquaredIconButton( + onPressed: () async { + await widget.onBack?.call(); + await navigatorKey.currentState?.maybePop(); + if (mounted) setState(() {}); + }, + icon: Container( + padding: const EdgeInsetsDirectional.all(4.0), + // height: 40.0, + // width: 40.0, + alignment: AlignmentDirectional.center, + child: Icon( + Icons.adaptive.arrow_back, + size: 20.0, + color: theme.hintColor, + ), ), ), ) - else + else if (!isMacOSPlatform) Padding( padding: const EdgeInsetsDirectional.only(start: 8.0), child: Image.asset( @@ -196,7 +205,11 @@ class _WindowButtonsState extends State with WindowListener { return widget.title ?? 'Bluecherry'; } - return navData.firstWhere((d) => d.tab == tab).text; + if (!isMacOSPlatform) { + return navData.firstWhere((d) => d.tab == tab).text; + } + + return ''; }(), style: TextStyle( color: theme.brightness == Brightness.light @@ -224,14 +237,16 @@ class _WindowButtonsState extends State with WindowListener { icon: const Icon(Icons.refresh, size: 20.0), tooltip: loc.refresh, ), - SizedBox( - width: 138, - height: 40, - child: WindowCaption( - brightness: theme.brightness, - backgroundColor: Colors.transparent, + // Do not render the Window Buttons on web nor macOS. macOS render the buttons natively. + if (!kIsWeb && !isMacOSPlatform) + SizedBox( + width: 138, + height: 40, + child: WindowCaption( + brightness: theme.brightness, + backgroundColor: Colors.transparent, + ), ), - ), ]), ), if (!canPop && widget.showNavigator) @@ -307,6 +322,7 @@ class _UnityLoadingIndicatorState extends State { return LayoutBuilder(builder: (context, constraints) { final willFitY = constraints.maxHeight - (pos.dy + box.size.height) > CurrentTasks.width; + const margin = 12.0; return Stack(children: [ Positioned( @@ -314,8 +330,8 @@ class _UnityLoadingIndicatorState extends State { bottom: willFitY ? null : constraints.maxHeight - pos.dy + 1.0, left: clampDouble( pos.dx - (CurrentTasks.width / 2), - 0, - constraints.maxWidth, + margin, + constraints.maxWidth - CurrentTasks.width - margin, ), child: const CurrentTasks(), ), diff --git a/lib/widgets/device_grid/desktop/desktop_sidebar.dart b/lib/widgets/device_grid/desktop/desktop_sidebar.dart index 117cfa20..f0783dee 100644 --- a/lib/widgets/device_grid/desktop/desktop_sidebar.dart +++ b/lib/widgets/device_grid/desktop/desktop_sidebar.dart @@ -43,154 +43,192 @@ class _DesktopSidebarState extends State { final servers = context.watch(); final view = context.watch(); - return Material( - color: theme.canvasColor, - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - LayoutManager(collapseButton: widget.collapseButton), - Expanded( - child: MouseRegion( - onEnter: (e) => setState(() => isSidebarHovering = true), - onExit: (e) => setState(() => isSidebarHovering = false), - // Add another material here because its descendants must be clipped. - child: Material( - type: MaterialType.transparency, - child: CustomScrollView(slivers: [ - for (final server in servers.servers) - () { - final devices = server.devices.sorted(); - final isLoading = servers.isServerLoading(server); - - /// Whether all the online devices are in the current view. - final isAllInView = devices - .where((d) => d.status) - .every((d) => view.currentLayout.devices.contains(d)); - - return MultiSliver(pushPinnedChildren: true, children: [ - SliverPinnedHeader( - child: SubHeader( - server.name, - materialType: MaterialType.canvas, - subtext: server.online - ? loc.nDevices(devices.length) - : loc.offline, - subtextStyle: TextStyle( - color: - !server.online ? theme.colorScheme.error : null, + return SafeArea( + top: false, + right: false, + child: Material( + color: theme.canvasColor, + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + LayoutManager(collapseButton: widget.collapseButton), + if (servers.servers.isEmpty) + const Expanded(child: NoServers()) + else + Expanded( + child: MouseRegion( + onEnter: (e) => setState(() => isSidebarHovering = true), + onExit: (e) => setState(() => isSidebarHovering = false), + // Add another material here because its descendants must be clipped. + child: Material( + type: MaterialType.transparency, + child: CustomScrollView(slivers: [ + for (final server in servers.servers) + () { + final devices = server.devices.sorted(); + final isLoading = servers.isServerLoading(server); + + /// Whether all the online devices are in the current view. + final isAllInView = devices + .where((d) => d.status) + .every( + (d) => view.currentLayout.devices.contains(d)); + + return MultiSliver(pushPinnedChildren: true, children: [ + SliverPinnedHeader( + child: SubHeader( + server.name, + materialType: MaterialType.canvas, + subtext: server.online + ? loc.nDevices(devices.length) + : loc.offline, + subtextStyle: TextStyle( + color: !server.online + ? theme.colorScheme.error + : null, + ), + trailing: Builder(builder: (context) { + if (isLoading) { + // wrap in an icon button to ensure ui consistency + return const SquaredIconButton( + onPressed: null, + icon: SizedBox( + height: 16.0, + width: 16.0, + child: CircularProgressIndicator.adaptive( + strokeWidth: 1.5, + ), + ), + ); + } else if (!server.online && + isSidebarHovering) { + return SquaredIconButton( + icon: const Icon(Icons.refresh), + tooltip: loc.refreshServer, + onPressed: () => servers + .refreshDevices(ids: [server.id]), + ); + } else if (isSidebarHovering && + devices.isNotEmpty) { + return SquaredIconButton( + icon: Icon( + isAllInView + ? Icons.playlist_remove + : Icons.playlist_add, + ), + tooltip: isAllInView + ? loc.removeAllFromView + : loc.addAllToView, + onPressed: () { + if (isAllInView) { + view.removeDevicesFromCurrentLayout( + devices); + } else { + for (final device in devices) { + if (device.status && + !view.currentLayout.devices + .contains(device)) { + view.add(device); + } + } + } + }, + ); + } else { + return const SizedBox.shrink(); + } + }), + ), ), - trailing: Builder(builder: (context) { - if (isLoading) { - // wrap in an icon button to ensure ui consistency - return const SquaredIconButton( - onPressed: null, - icon: SizedBox( - height: 16.0, - width: 16.0, - child: CircularProgressIndicator.adaptive( - strokeWidth: 1.5, + if (server.online && !isLoading) + SliverList.builder( + itemCount: devices.length, + itemBuilder: (context, index) { + final device = devices[index]; + final selected = + view.currentLayout.devices.contains(device); + + final tile = DesktopDeviceSelectorTile( + device: device, + selected: selected, + ); + + if (selected || !device.status) return tile; + + final isBlocked = view.currentLayout.type == + DesktopLayoutType.singleView && + view.currentLayout.devices.isNotEmpty; + + return Draggable( + data: device, + feedback: Card( + child: SizedBox( + height: kDeviceSelectorTileHeight, + width: kSidebarConstraints.maxWidth, + child: Row(children: [ + Expanded(child: tile), + if (isBlocked) + Icon( + Icons.block, + color: theme.colorScheme.error, + size: 18.0, + ), + const SizedBox(width: 16.0), + ]), + ), ), - ), - ); - } else if (!server.online && isSidebarHovering) { - return SquaredIconButton( - icon: const Icon(Icons.refresh), - tooltip: loc.refreshServer, - onPressed: () => - servers.refreshDevices(ids: [server.id]), - ); - } else if (isSidebarHovering && - devices.isNotEmpty) { - return SquaredIconButton( - icon: Icon( - isAllInView - ? Icons.playlist_remove - : Icons.playlist_add, - ), - tooltip: isAllInView - ? loc.removeAllFromView - : loc.addAllToView, - onPressed: () { - if (isAllInView) { - view.removeDevicesFromCurrentLayout( - devices); - } else { - for (final device in devices) { - if (device.status && - !view.currentLayout.devices - .contains(device)) { - view.add(device); - } - } - } - }, - ); - } else { - return const SizedBox.shrink(); - } - }), - ), - ), - if (server.online && !isLoading) - SliverList.builder( - itemCount: devices.length, - itemBuilder: (context, index) { - final device = devices[index]; - final selected = - view.currentLayout.devices.contains(device); - - final tile = DesktopDeviceSelectorTile( - device: device, - selected: selected, - ); - - if (selected || !device.status) return tile; - - final isBlocked = view.currentLayout.type == - DesktopLayoutType.singleView && - view.currentLayout.devices.isNotEmpty; - - return Draggable( - data: device, - feedback: Card( - child: SizedBox( - height: kDeviceSelectorTileHeight, - width: kSidebarConstraints.maxWidth, - child: Row(children: [ - Expanded(child: tile), - if (isBlocked) - Icon( - Icons.block, - color: theme.colorScheme.error, - size: 18.0, - ), - const SizedBox(width: 16.0), - ]), - ), - ), - child: tile, - ); - }, - ), - ]); - }(), - const SliverToBoxAdapter(child: Divider()), - SliverToBoxAdapter( - child: ListTile( - dense: true, - trailing: const Icon(Icons.camera_outdoor, size: 20.0), - title: Text(loc.addExternalStream), - onTap: () => AddExternalStreamDialog.show(context), - ), - ), - SliverPadding( - padding: EdgeInsetsDirectional.only( - bottom: MediaQuery.viewPaddingOf(context).bottom, - ), + child: tile, + ); + }, + ), + ]); + }(), + ]), ), - ]), + ), ), + const Divider(), + ListTile( + dense: true, + trailing: const Icon(Icons.camera_outdoor, size: 20.0), + title: Text(loc.addExternalStream), + onTap: () => AddExternalStreamDialog.show(context), ), - ), - ]), + ]), + ), + ); + } +} + +class NoServers extends StatelessWidget { + const NoServers({super.key}); + + @override + Widget build(BuildContext context) { + final loc = AppLocalizations.of(context); + final home = context.watch(); + return Padding( + padding: const EdgeInsetsDirectional.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon( + Icons.dns, + size: 48.0, + ), + const SizedBox(height: 6.0), + Text(loc.noServersAdded, textAlign: TextAlign.center), + Text.rich( + TextSpan( + text: loc.howToAddServer, + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + ), + recognizer: TapGestureRecognizer() + ..onTap = () => home.setTab(UnityTab.addServer, context), + ), + textAlign: TextAlign.center, + ), + ], + ), ); } } diff --git a/lib/widgets/device_grid/desktop/stream_data.dart b/lib/widgets/device_grid/desktop/stream_data.dart index 2bf30605..cbb7fec6 100644 --- a/lib/widgets/device_grid/desktop/stream_data.dart +++ b/lib/widgets/device_grid/desktop/stream_data.dart @@ -160,7 +160,7 @@ class _StreamDataState extends State { ), style: theme.textTheme.headlineSmall, ), - Slider( + Slider.adaptive( value: widget.video.player.volume, onChanged: (v) { widget.video.player.setVolume(v); diff --git a/lib/widgets/device_grid/device_grid.dart b/lib/widgets/device_grid/device_grid.dart index 38a1882b..6d4435f0 100644 --- a/lib/widgets/device_grid/device_grid.dart +++ b/lib/widgets/device_grid/device_grid.dart @@ -25,6 +25,7 @@ import 'package:auto_size_text/auto_size_text.dart'; import 'package:bluecherry_client/models/device.dart'; import 'package:bluecherry_client/models/layout.dart'; import 'package:bluecherry_client/providers/desktop_view_provider.dart'; +import 'package:bluecherry_client/providers/home_provider.dart'; import 'package:bluecherry_client/providers/mobile_view_provider.dart'; import 'package:bluecherry_client/providers/server_provider.dart'; import 'package:bluecherry_client/providers/settings_provider.dart'; diff --git a/lib/widgets/downloads_manager.dart b/lib/widgets/downloads_manager.dart index fc831a18..9b126904 100644 --- a/lib/widgets/downloads_manager.dart +++ b/lib/widgets/downloads_manager.dart @@ -29,6 +29,7 @@ import 'package:bluecherry_client/utils/theme.dart'; import 'package:bluecherry_client/utils/widgets/squared_icon_button.dart'; import 'package:bluecherry_client/utils/window.dart'; import 'package:bluecherry_client/widgets/misc.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -359,6 +360,12 @@ class DownloadProgressIndicator extends StatelessWidget { Widget build(BuildContext context) { final theme = Theme.of(context); + if (isCupertino) { + return CupertinoActivityIndicator.partiallyRevealed( + progress: progress, + ); + } + return Stack(children: [ Padding( padding: const EdgeInsetsDirectional.all(8.0), diff --git a/lib/widgets/events/event_player_desktop.dart b/lib/widgets/events/event_player_desktop.dart index fc1f9c74..00b6d918 100644 --- a/lib/widgets/events/event_player_desktop.dart +++ b/lib/widgets/events/event_player_desktop.dart @@ -227,13 +227,14 @@ class _EventPlayerDesktopState extends State { ), padd, Expanded( - child: Slider( + child: Slider.adaptive( value: (_position ?? pos.inMilliseconds) .clamp(0.0, duration.inMilliseconds) .toDouble(), max: duration.inMilliseconds.toDouble(), secondaryTrackValue: videoController .currentBuffer.inMilliseconds + .clamp(0.0, duration.inMilliseconds) .toDouble(), onChangeStart: (v) { shouldAutoplay = videoController.isPlaying; @@ -298,7 +299,7 @@ class _EventPlayerDesktopState extends State { const SizedBox(width: 6.0), SizedBox( width: kSliderControlerWidth, - child: Slider( + child: Slider.adaptive( value: volume, onChanged: (v) { setState(() => volume = v); @@ -315,7 +316,7 @@ class _EventPlayerDesktopState extends State { Text(loc.speed(speed.toStringAsFixed(2))), SizedBox( width: kSliderControlerWidth, - child: Slider( + child: Slider.adaptive( value: speed, min: 0.25, max: 2, diff --git a/lib/widgets/events/event_player_mobile.dart b/lib/widgets/events/event_player_mobile.dart index fe859190..24d5af98 100644 --- a/lib/widgets/events/event_player_mobile.dart +++ b/lib/widgets/events/event_player_mobile.dart @@ -229,7 +229,21 @@ class _VideoViewportState extends State { top: MediaQuery.paddingOf(context).top, child: SafeArea( child: Row(children: [ - const BackButton(), + // const BackButton(), + Padding( + padding: const EdgeInsetsDirectional.only(start: 8.0), + child: SquaredIconButton( + onPressed: Navigator.of(context).pop, + icon: Container( + padding: const EdgeInsetsDirectional.all(4.0), + child: Icon( + Icons.adaptive.arrow_back, + size: 20.0, + color: theme.hintColor, + ), + ), + ), + ), Expanded( child: Text( '${widget.event.deviceName} (${widget.event.server.name})', @@ -300,7 +314,7 @@ class _VideoViewportState extends State { enabledThumbRadius: 6.0, ), ), - child: Slider( + child: Slider.adaptive( label: player.position.humanReadableCompact(context), value: player.position.inMilliseconds.toDouble(), max: player.duration.inMilliseconds.toDouble(), @@ -382,7 +396,7 @@ class __DesktopVideoViewportState extends State<_DesktopVideoViewport> { style: theme.textTheme.bodyMedium!.copyWith(color: Colors.white), ), Expanded( - child: Slider( + child: Slider.adaptive( value: widget.player.currentPos.inMilliseconds.toDouble(), max: widget.player.duration.inMilliseconds.toDouble(), secondaryTrackValue: diff --git a/lib/widgets/events_timeline/desktop/timeline.dart b/lib/widgets/events_timeline/desktop/timeline.dart index 34f7dc98..3ee7d146 100644 --- a/lib/widgets/events_timeline/desktop/timeline.dart +++ b/lib/widgets/events_timeline/desktop/timeline.dart @@ -547,7 +547,7 @@ class _TimelineEventsViewState extends State { ), ConstrainedBox( constraints: const BoxConstraints(maxWidth: 120.0), - child: Slider( + child: Slider.adaptive( value: _speed ?? timeline.speed, min: 0.5, max: 2.0, @@ -580,7 +580,7 @@ class _TimelineEventsViewState extends State { child: Row(children: [ ConstrainedBox( constraints: const BoxConstraints(maxWidth: 120.0), - child: Slider( + child: Slider.adaptive( value: _volume ?? (timeline.isMuted ? 0.0 : timeline.volume), onChanged: (v) => setState(() => _volume = v), diff --git a/lib/widgets/servers/add_server.dart b/lib/widgets/servers/add_server.dart index d5bb8ed2..8e552f46 100644 --- a/lib/widgets/servers/add_server.dart +++ b/lib/widgets/servers/add_server.dart @@ -42,6 +42,7 @@ Widget _buildCardAppBar({ }) { return Builder(builder: (context) { final theme = Theme.of(context); + return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -60,17 +61,13 @@ Widget _buildCardAppBar({ ), Text( title, - style: const TextStyle( - fontWeight: FontWeight.w500, - color: Colors.white, - ), + style: theme.textTheme.displayMedium, ), ]), const SizedBox(height: 12.0), Text( description, - style: theme.textTheme.headlineMedium - ?.copyWith(color: Colors.white.withOpacity(0.87)), + style: theme.textTheme.headlineMedium, ), const SizedBox(height: 20.0), ], @@ -1034,8 +1031,7 @@ class LetsGoScreen extends StatelessWidget { children: [ Text( loc.letsGoDescription, - style: theme.textTheme.headlineMedium - ?.copyWith(color: Colors.white.withOpacity(0.87)), + style: theme.textTheme.headlineMedium, ), ...[loc.tip0, loc.tip1, loc.tip2, loc.tip3].map((tip) { return Padding( diff --git a/lib/widgets/settings/desktop/updates.dart b/lib/widgets/settings/desktop/updates.dart index 2997a7d7..9758dc62 100644 --- a/lib/widgets/settings/desktop/updates.dart +++ b/lib/widgets/settings/desktop/updates.dart @@ -82,7 +82,7 @@ class BetaFeatures extends StatelessWidget { final settings = context.watch(); return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - CheckboxListTile( + CheckboxListTile.adaptive( secondary: CircleAvatar( backgroundColor: Colors.transparent, foregroundColor: theme.iconTheme.color, diff --git a/lib/widgets/settings/mobile/settings.dart b/lib/widgets/settings/mobile/settings.dart index eaab5c7e..1ef5b73f 100644 --- a/lib/widgets/settings/mobile/settings.dart +++ b/lib/widgets/settings/mobile/settings.dart @@ -110,7 +110,7 @@ class _MobileSettingsState extends State { ), ), children: UnityVideoFit.values.map((e) { - return RadioListTile( + return RadioListTile.adaptive( contentPadding: const EdgeInsetsDirectional.only( start: 68.0, end: 16.0, diff --git a/lib/widgets/settings/shared/date_language.dart b/lib/widgets/settings/shared/date_language.dart index 645f5ab1..778dc6a3 100644 --- a/lib/widgets/settings/shared/date_language.dart +++ b/lib/widgets/settings/shared/date_language.dart @@ -165,7 +165,7 @@ class DateFormatSection extends StatelessWidget { children: formats.map((format) { return SizedBox( width: consts.maxWidth / crossAxisCount, - child: RadioListTile( + child: RadioListTile.adaptive( value: format.pattern, groupValue: settings.dateFormat.pattern, onChanged: (value) { @@ -185,7 +185,7 @@ class DateFormatSection extends StatelessWidget { } else { return Column( children: formats.map((format) { - return RadioListTile( + return RadioListTile.adaptive( value: format.pattern, groupValue: settings.dateFormat.pattern, onChanged: (value) { diff --git a/lib/widgets/settings/shared/tiles.dart b/lib/widgets/settings/shared/tiles.dart index 9a9ffb0b..e782fb4a 100644 --- a/lib/widgets/settings/shared/tiles.dart +++ b/lib/widgets/settings/shared/tiles.dart @@ -30,7 +30,7 @@ class ThemeTile extends StatelessWidget { }), ), onTap: () => settings.themeMode = themeMode, - trailing: Radio( + trailing: Radio.adaptive( value: themeMode, groupValue: settings.themeMode, onChanged: (value) { @@ -152,7 +152,7 @@ class NavigationClickBehaviorTile extends StatelessWidget { ), ), children: NotificationClickBehavior.values.map((behavior) { - return RadioListTile( + return RadioListTile.adaptive( contentPadding: const EdgeInsetsDirectional.only( start: 68.0, end: 16.0, @@ -199,7 +199,7 @@ class CyclePeriodTile extends StatelessWidget { ), children: [5, 10, 30, 60, 60 * 5].map((e) { final dur = Duration(seconds: e); - return RadioListTile( + return RadioListTile.adaptive( value: dur, groupValue: settings.layoutCyclingTogglePeriod, onChanged: (value) { diff --git a/lib/widgets/settings/shared/update.dart b/lib/widgets/settings/shared/update.dart index ea05ff9a..06a958cb 100644 --- a/lib/widgets/settings/shared/update.dart +++ b/lib/widgets/settings/shared/update.dart @@ -19,7 +19,9 @@ import 'package:bluecherry_client/providers/settings_provider.dart'; import 'package:bluecherry_client/providers/update_provider.dart'; +import 'package:bluecherry_client/utils/methods.dart'; import 'package:bluecherry_client/widgets/settings/desktop/settings.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -82,10 +84,14 @@ class AppUpdateCard extends StatelessWidget { SizedBox( height: 32.0, width: 32.0, - child: CircularProgressIndicator( - value: update.downloadProgress, - strokeWidth: 2.0, - ), + child: isCupertino + ? CupertinoActivityIndicator.partiallyRevealed( + progress: update.downloadProgress, + ) + : CircularProgressIndicator( + value: update.downloadProgress, + strokeWidth: 2.0, + ), ) else if (executable != null) FilledButton( @@ -229,7 +235,7 @@ class AppUpdateOptions extends StatelessWidget { final theme = Theme.of(context); final update = context.watch(); return Column(children: [ - CheckboxListTile( + CheckboxListTile.adaptive( onChanged: (v) { if (v != null) { update.automaticDownloads = v; diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index e080f0cd..c4ad27ae 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -7,6 +7,7 @@ #include "generated_plugin_registrant.h" #include +#include #include #include #include @@ -18,6 +19,9 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) awesome_notifications_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "AwesomeNotificationsPlugin"); awesome_notifications_plugin_register_with_registrar(awesome_notifications_registrar); + g_autoptr(FlPluginRegistrar) gtk_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "GtkPlugin"); + gtk_plugin_register_with_registrar(gtk_registrar); g_autoptr(FlPluginRegistrar) media_kit_libs_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "MediaKitLibsLinuxPlugin"); media_kit_libs_linux_plugin_register_with_registrar(media_kit_libs_linux_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 3c14f18d..3b009456 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -4,6 +4,7 @@ list(APPEND FLUTTER_PLUGIN_LIST awesome_notifications + gtk media_kit_libs_linux media_kit_video screen_retriever diff --git a/macos/.gitignore b/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..4b81f9b2 --- /dev/null +++ b/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/macos/Flutter/Flutter-Release.xcconfig b/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..5caa9d15 --- /dev/null +++ b/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/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/macos/Flutter/ephemeral/Flutter-Generated.xcconfig index fd218d8d..cc04fa88 100644 --- a/macos/Flutter/ephemeral/Flutter-Generated.xcconfig +++ b/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -1,11 +1,12 @@ // This is a generated file; do not edit or check into version control. -FLUTTER_ROOT=C:\Users\bruno\Documents\flutter\flutter -FLUTTER_APPLICATION_PATH=C:\Users\bruno\Documents\flutter\projects\unity +FLUTTER_ROOT=/Users/user249455/Documents/flutter +FLUTTER_APPLICATION_PATH=/Users/user249455/Documents/GitHub/unity COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_TARGET=lib/main.dart FLUTTER_BUILD_DIR=build -FLUTTER_BUILD_NAME=3.0.013 -FLUTTER_BUILD_NUMBER=3.0.013 +FLUTTER_BUILD_NAME=3.0.014 +FLUTTER_BUILD_NUMBER=3.0.014 DART_OBFUSCATION=false TRACK_WIDGET_CREATION=true -TREE_SHAKE_ICONS=false -PACKAGE_CONFIG=.dart_tool/package_config.json +TREE_SHAKE_ICONS=true +PACKAGE_CONFIG=/Users/user249455/Documents/GitHub/unity/.dart_tool/package_config.json diff --git a/macos/Flutter/ephemeral/flutter_export_environment.sh b/macos/Flutter/ephemeral/flutter_export_environment.sh old mode 100644 new mode 100755 index da939398..6c9b169f --- a/macos/Flutter/ephemeral/flutter_export_environment.sh +++ b/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -1,12 +1,13 @@ #!/bin/sh # This is a generated file; do not edit or check into version control. -export "FLUTTER_ROOT=C:\Users\bruno\Documents\flutter\flutter" -export "FLUTTER_APPLICATION_PATH=C:\Users\bruno\Documents\flutter\projects\unity" +export "FLUTTER_ROOT=/Users/user249455/Documents/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/user249455/Documents/GitHub/unity" export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_TARGET=lib/main.dart" export "FLUTTER_BUILD_DIR=build" -export "FLUTTER_BUILD_NAME=3.0.013" -export "FLUTTER_BUILD_NUMBER=3.0.013" +export "FLUTTER_BUILD_NAME=3.0.014" +export "FLUTTER_BUILD_NUMBER=3.0.014" export "DART_OBFUSCATION=false" export "TRACK_WIDGET_CREATION=true" -export "TREE_SHAKE_ICONS=false" -export "PACKAGE_CONFIG=.dart_tool/package_config.json" +export "TREE_SHAKE_ICONS=true" +export "PACKAGE_CONFIG=/Users/user249455/Documents/GitHub/unity/.dart_tool/package_config.json" diff --git a/macos/Podfile b/macos/Podfile new file mode 100644 index 00000000..c795730d --- /dev/null +++ b/macos/Podfile @@ -0,0 +1,43 @@ +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! + use_modular_headers! + + 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/macos/Podfile.lock b/macos/Podfile.lock new file mode 100644 index 00000000..f5aad14f --- /dev/null +++ b/macos/Podfile.lock @@ -0,0 +1,200 @@ +PODS: + - app_links (1.0.0): + - FlutterMacOS + - awesome_notifications (0.0.1): + - FlutterMacOS + - connectivity_plus (0.0.1): + - FlutterMacOS + - ReachabilitySwift + - device_info_plus (0.0.1): + - FlutterMacOS + - Firebase/CoreOnly (10.7.0): + - FirebaseCore (= 10.7.0) + - Firebase/Messaging (10.7.0): + - Firebase/CoreOnly + - FirebaseMessaging (~> 10.7.0) + - firebase_core (2.10.0): + - Firebase/CoreOnly (~> 10.7.0) + - FlutterMacOS + - firebase_messaging (14.4.1): + - Firebase/CoreOnly (~> 10.7.0) + - Firebase/Messaging (~> 10.7.0) + - firebase_core + - FlutterMacOS + - FirebaseCore (10.7.0): + - FirebaseCoreInternal (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/Logger (~> 7.8) + - FirebaseCoreInternal (10.19.0): + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - FirebaseInstallations (10.19.0): + - FirebaseCore (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) + - PromisesObjC (~> 2.1) + - FirebaseMessaging (10.7.0): + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleDataTransport (~> 9.2) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/Reachability (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) + - nanopb (< 2.30910.0, >= 2.30908.0) + - FlutterMacOS (1.0.0) + - GoogleDataTransport (9.3.0): + - GoogleUtilities/Environment (~> 7.7) + - nanopb (< 2.30910.0, >= 2.30908.0) + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/AppDelegateSwizzler (7.12.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Environment (7.12.0): + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/Logger (7.12.0): + - GoogleUtilities/Environment + - GoogleUtilities/Network (7.12.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (7.12.0)" + - GoogleUtilities/Reachability (7.12.0): + - GoogleUtilities/Logger + - GoogleUtilities/UserDefaults (7.12.0): + - GoogleUtilities/Logger + - media_kit_libs_macos_video (1.0.4): + - FlutterMacOS + - media_kit_native_event_loop (1.0.0): + - FlutterMacOS + - media_kit_video (0.0.1): + - FlutterMacOS + - nanopb (2.30909.1): + - nanopb/decode (= 2.30909.1) + - nanopb/encode (= 2.30909.1) + - nanopb/decode (2.30909.1) + - nanopb/encode (2.30909.1) + - package_info_plus (0.0.1): + - FlutterMacOS + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - PromisesObjC (2.3.1) + - ReachabilitySwift (5.0.0) + - screen_brightness_macos (0.1.0): + - FlutterMacOS + - screen_retriever (0.0.1): + - FlutterMacOS + - system_date_time_format (0.0.1): + - FlutterMacOS + - url_launcher_macos (0.0.1): + - FlutterMacOS + - wakelock_plus (0.0.1): + - FlutterMacOS + - window_manager (0.2.0): + - FlutterMacOS + +DEPENDENCIES: + - app_links (from `Flutter/ephemeral/.symlinks/plugins/app_links/macos`) + - awesome_notifications (from `Flutter/ephemeral/.symlinks/plugins/awesome_notifications/macos`) + - connectivity_plus (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos`) + - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) + - firebase_core (from `Flutter/ephemeral/.symlinks/plugins/firebase_core/macos`) + - firebase_messaging (from `Flutter/ephemeral/.symlinks/plugins/firebase_messaging/macos`) + - FlutterMacOS (from `Flutter/ephemeral`) + - media_kit_libs_macos_video (from `Flutter/ephemeral/.symlinks/plugins/media_kit_libs_macos_video/macos`) + - media_kit_native_event_loop (from `Flutter/ephemeral/.symlinks/plugins/media_kit_native_event_loop/macos`) + - media_kit_video (from `Flutter/ephemeral/.symlinks/plugins/media_kit_video/macos`) + - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) + - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) + - screen_brightness_macos (from `Flutter/ephemeral/.symlinks/plugins/screen_brightness_macos/macos`) + - screen_retriever (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos`) + - system_date_time_format (from `Flutter/ephemeral/.symlinks/plugins/system_date_time_format/macos`) + - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) + - wakelock_plus (from `Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos`) + - window_manager (from `Flutter/ephemeral/.symlinks/plugins/window_manager/macos`) + +SPEC REPOS: + trunk: + - Firebase + - FirebaseCore + - FirebaseCoreInternal + - FirebaseInstallations + - FirebaseMessaging + - GoogleDataTransport + - GoogleUtilities + - nanopb + - PromisesObjC + - ReachabilitySwift + +EXTERNAL SOURCES: + app_links: + :path: Flutter/ephemeral/.symlinks/plugins/app_links/macos + awesome_notifications: + :path: Flutter/ephemeral/.symlinks/plugins/awesome_notifications/macos + connectivity_plus: + :path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos + device_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos + firebase_core: + :path: Flutter/ephemeral/.symlinks/plugins/firebase_core/macos + firebase_messaging: + :path: Flutter/ephemeral/.symlinks/plugins/firebase_messaging/macos + FlutterMacOS: + :path: Flutter/ephemeral + media_kit_libs_macos_video: + :path: Flutter/ephemeral/.symlinks/plugins/media_kit_libs_macos_video/macos + media_kit_native_event_loop: + :path: Flutter/ephemeral/.symlinks/plugins/media_kit_native_event_loop/macos + media_kit_video: + :path: Flutter/ephemeral/.symlinks/plugins/media_kit_video/macos + package_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos + path_provider_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin + screen_brightness_macos: + :path: Flutter/ephemeral/.symlinks/plugins/screen_brightness_macos/macos + screen_retriever: + :path: Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos + system_date_time_format: + :path: Flutter/ephemeral/.symlinks/plugins/system_date_time_format/macos + url_launcher_macos: + :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos + wakelock_plus: + :path: Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos + window_manager: + :path: Flutter/ephemeral/.symlinks/plugins/window_manager/macos + +SPEC CHECKSUMS: + app_links: 4481ed4d71f384b0c3ae5016f4633aa73d32ff67 + awesome_notifications: 428f5c15a700b117418aed09e29c21c5806fcf69 + connectivity_plus: 18d3c32514c886e046de60e9c13895109866c747 + device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f + Firebase: 0219acf760880eeec8ce479895bd7767466d9f81 + firebase_core: 104c957652eab7d9d9c779102f509714a56ad382 + firebase_messaging: fbe4ca035331b288ae5475e7106060fe06e245df + FirebaseCore: e317665b9d744727a97e623edbbed009320afdd7 + FirebaseCoreInternal: b444828ea7cfd594fca83046b95db98a2be4f290 + FirebaseInstallations: 033d199474164db20c8350736842a94fe717b960 + FirebaseMessaging: ac9062bcc35ed56e15a0241d8fd317022499baf8 + FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 + GoogleDataTransport: 57c22343ab29bc686febbf7cbb13bad167c2d8fe + GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34 + media_kit_libs_macos_video: b3e2bbec2eef97c285f2b1baa7963c67c753fb82 + media_kit_native_event_loop: 81fd5b45192b72f8b5b69eaf5b540f45777eb8d5 + media_kit_video: c75b07f14d59706c775778e4dd47dd027de8d1e5 + nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5 + package_info_plus: 02d7a575e80f194102bef286361c6c326e4c29ce + path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 + ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 + screen_brightness_macos: 2d6d3af2165592d9a55ffcd95b7550970e41ebda + screen_retriever: 59634572a57080243dd1bf715e55b6c54f241a38 + system_date_time_format: 4f3982edee40a537cf15c817d1e939b9dbfa457d + url_launcher_macos: d2691c7dd33ed713bf3544850a623080ec693d95 + wakelock_plus: 4783562c9a43d209c458cb9b30692134af456269 + window_manager: 3a1844359a6295ab1e47659b1a777e36773cd6e8 + +PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367 + +COCOAPODS: 1.13.0 diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..7e013f27 --- /dev/null +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,791 @@ +// !$*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 */ + 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 */; }; + 9F2A2779561CDD210B8FDDC4 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3C73F4D54CB4E4C128FE859 /* Pods_RunnerTests.framework */; }; + EEA0A0E33B5FF8F7B4DFDF65 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48DB6CB74657C50F4DED4850 /* 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 */ + 0AA34E3DE28C8794A4F7056B /* 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 = ""; }; + 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 /* unity.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = unity.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 = ""; }; + 48DB6CB74657C50F4DED4850 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 822235F2B8EDC05E28BED41B /* 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 = ""; }; + AF79A3E0FA8E812BA54B64A1 /* 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 = ""; }; + B3C73F4D54CB4E4C128FE859 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B5649F5B6F9607C4F94B7135 /* 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 = ""; }; + CAB5E95B312372F03BE8750E /* 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 = ""; }; + EB09AE04D3C642F6107B35AA /* 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 = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9F2A2779561CDD210B8FDDC4 /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + EEA0A0E33B5FF8F7B4DFDF65 /* 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 */, + B71A8500A2AD7F9A64F49450 /* Pods */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* unity.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 = ""; + }; + B71A8500A2AD7F9A64F49450 /* Pods */ = { + isa = PBXGroup; + children = ( + B5649F5B6F9607C4F94B7135 /* Pods-Runner.debug.xcconfig */, + CAB5E95B312372F03BE8750E /* Pods-Runner.release.xcconfig */, + EB09AE04D3C642F6107B35AA /* Pods-Runner.profile.xcconfig */, + 822235F2B8EDC05E28BED41B /* Pods-RunnerTests.debug.xcconfig */, + 0AA34E3DE28C8794A4F7056B /* Pods-RunnerTests.release.xcconfig */, + AF79A3E0FA8E812BA54B64A1 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 48DB6CB74657C50F4DED4850 /* Pods_Runner.framework */, + B3C73F4D54CB4E4C128FE859 /* 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 = ( + A883A24FA7810B1B4547D881 /* [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 = ( + 905C34C3891AF14CDBF88B40 /* [CP] Check Pods Manifest.lock */, + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + C5B77E392B09AFC5C3DB17EA /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* unity.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1430; + 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 */ + 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"; + }; + 905C34C3891AF14CDBF88B40 /* [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; + }; + A883A24FA7810B1B4547D881 /* [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; + }; + C5B77E392B09AFC5C3DB17EA /* [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; + }; +/* 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 = 822235F2B8EDC05E28BED41B /* 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.unity.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/unity.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/unity"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0AA34E3DE28C8794A4F7056B /* 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.unity.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/unity.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/unity"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AF79A3E0FA8E812BA54B64A1 /* 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.unity.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/unity.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/unity"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + 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; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + 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; + 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; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + 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; + 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; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + 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/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..834086d8 --- /dev/null +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Runner.xcworkspace/contents.xcworkspacedata b/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..21a3cc14 --- /dev/null +++ b/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..40ad212f --- /dev/null +++ b/macos/Runner/AppDelegate.swift @@ -0,0 +1,10 @@ +import Cocoa +import FlutterMacOS + +@NSApplicationMain +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + // https://pub.dev/packages/window_manager#macos + return false + } +} diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..96d3fee1 --- /dev/null +++ b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "info": { + "version": 1, + "author": "xcode" + }, + "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" + } + ] +} \ No newline at end of file diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 00000000..b2089525 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 00000000..88b6d225 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 00000000..da015be7 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 00000000..62add783 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png new file mode 100644 index 00000000..3c6679b5 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 00000000..b6f76c01 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 00000000..eabe66be Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/macos/Runner/Base.lproj/MainMenu.xib b/macos/Runner/Base.lproj/MainMenu.xib new file mode 100644 index 00000000..80e867a4 --- /dev/null +++ b/macos/Runner/Base.lproj/MainMenu.xib @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..c42804d1 --- /dev/null +++ b/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 = unity + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.unity + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2023 com. All rights reserved. diff --git a/macos/Runner/Configs/Debug.xcconfig b/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/macos/Runner/Configs/Release.xcconfig b/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/macos/Runner/Configs/Warnings.xcconfig b/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/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/macos/Runner/DebugProfile.entitlements b/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..c672c047 --- /dev/null +++ b/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,14 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + com.apple.security.network.client + + + diff --git a/macos/Runner/Info.plist b/macos/Runner/Info.plist new file mode 100644 index 00000000..5b3e11a8 --- /dev/null +++ b/macos/Runner/Info.plist @@ -0,0 +1,45 @@ + + + + + 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 + CFBundleURLTypes + + + + CFBundleURLName + bluecherry_schemes + CFBundleURLSchemes + + rtsp + bluecherry + + + + + diff --git a/macos/Runner/MainFlutterWindow.swift b/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..3cc05eb2 --- /dev/null +++ b/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/macos/Runner/Release.entitlements b/macos/Runner/Release.entitlements new file mode 100644 index 00000000..f7eba17e --- /dev/null +++ b/macos/Runner/Release.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.network.client + + + diff --git a/macos/RunnerTests/RunnerTests.swift b/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 00000000..5418c9f5 --- /dev/null +++ b/macos/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import FlutterMacOS +import Cocoa +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/pubspec.lock b/pubspec.lock index d4e4cd5b..2dbbbec8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -21,10 +21,10 @@ packages: dependency: "direct main" description: name: app_links - sha256: eb83c2b15b78a66db04e95132678e910fcdb8dc3a9b0aed0c138f50b2bef0dae + sha256: "6604788ccddaa18502aa1adffe44c253a5f30ac51e5fce7f41d58da22f0ac535" url: "https://pub.dev" source: hosted - version: "3.4.5" + version: "3.5.0-beta.2" archive: dependency: transitive description: @@ -341,6 +341,14 @@ packages: url: "https://pub.dev" source: hosted version: "7.6.4" + gtk: + dependency: transitive + description: + name: gtk + sha256: e8ce9ca4b1df106e4d72dad201d345ea1a036cc12c360f1a7d5a758f78ffa42c + url: "https://pub.dev" + source: hosted + version: "2.1.0" hive: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index baef3d0f..8603ae20 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -36,7 +36,7 @@ dependencies: firebase_messaging: ^14.4.1 awesome_notifications: ^0.8.2 wakelock_plus: ^1.1.3 - app_links: ^3.4.5 + app_links: ^3.5.0-beta.2 win32_registry: ^1.1.2 system_date_time_format: ^0.7.0 @@ -93,9 +93,9 @@ flutter_icons: generate: true image_path: "assets/images/icon.png" icon_size: 48 # min:48, max:256, default: 48 - # macos: - # generate: true - # image_path: "path/to/image.png" + macos: + generate: true + image_path: "assets/images/icon.png" msix_config: display_name: Bluecherry Client diff --git a/test/configuration_file.dart b/test/configuration_file_test.dart similarity index 100% rename from test/configuration_file.dart rename to test/configuration_file_test.dart