Compare commits

...

288 Commits

Author SHA1 Message Date
Jonas Bark
66b7e74f84 CI change 2025-10-17 13:13:49 +02:00
Jonas Bark
29ef0dfaf4 CI change 2025-10-17 11:21:50 +02:00
Jonas Bark
90144948f4 CI change 2025-10-17 10:35:36 +02:00
Jonas Bark
bda384953e CI change 2025-10-17 10:12:39 +02:00
Jonas Bark
b0fd2a8413 fix logo 2025-10-17 10:10:13 +02:00
Jonas Bark
2403971063 update CI to exclude github build until App Store versions are available - avoid confusion 2025-10-17 10:09:34 +02:00
Jonas Bark
22a0379202 revise restart mechanism, fix Android 'Exit' notification button issue 2025-10-17 09:41:33 +02:00
Jonas Bark
c06a426490 allow macOS and Windows to act as remote 2025-10-17 09:26:31 +02:00
Jonas Bark
908e144e1b macos + ios icon changes 2025-10-17 09:19:21 +02:00
Jonas Bark
0189019e54 Merge branch 'icon_new' 2025-10-17 09:01:48 +02:00
Jonas Bark
5995835d03 more cleanup, refactoring 2025-10-17 08:59:01 +02:00
Jonas Bark
16e637b256 more cleanup, refactoring 2025-10-17 08:52:15 +02:00
Jonas Bark
ac2522e860 remove encryption as it's no longer used, cleanup 2025-10-17 08:15:49 +02:00
Jonas Bark
fdb3ad0efc missing files 2025-10-16 23:56:04 +02:00
Jonas Bark
f7a01f3c32 new icon, cleanup 2025-10-16 23:46:32 +02:00
Jonas Bark
94fd2c7eff Merge remote-tracking branch 'origin/main' 2025-10-16 20:52:46 +02:00
Jonas Bark
f917dfbbb2 elite square: more logging 2025-10-16 20:52:31 +02:00
jonasbark
40bfad6810 Add troubleshooting section for SwiftControl crashes
Added troubleshooting tip for SwiftControl crashes on Windows.
2025-10-16 12:31:09 +02:00
Jonas Bark
fefde66b7b Merge remote-tracking branch 'origin/main' 2025-10-16 12:19:57 +02:00
Jonas Bark
6869adcc09 fix macOS code signing 2025-10-16 12:19:50 +02:00
jonasbark
f5abaec551 Update compatibility matrix in README.md 2025-10-16 12:10:34 +02:00
Jonas Bark
52fbf693b5 fix restart behavior 2025-10-16 11:13:40 +02:00
Jonas Bark
bf3995496e CI 2025-10-15 19:20:51 +02:00
Jonas Bark
f7470a032a CI 2025-10-15 18:56:46 +02:00
Jonas Bark
64c9fe5f03 CI 2025-10-15 18:56:33 +02:00
Jonas Bark
febfbc3cc8 - improve iOS reactivity by delaying button events for a few milliseconds
- use correct icon for shift down buttons
- add more troubleshooting for iOS devices
2025-10-15 16:32:13 +02:00
Jonas Bark
5ea848b62e work on #104 2025-10-15 09:25:52 +02:00
Jonas Bark
96118a98b1 conditional builds, throw error for failed in app updates 2025-10-14 13:25:58 +02:00
Jonas Bark
d25f3a2d4e more work on #42 2025-10-14 09:18:11 +02:00
Jonas Bark
c0600746b6 fix issue #101 2025-10-14 09:15:37 +02:00
Jonas Bark
24cb34408b fix CI 2025-10-13 16:34:23 +02:00
Jonas Bark
f90ae87017 fix CI 2025-10-13 16:33:49 +02:00
Jonas Bark
273a71e759 fix CI 2025-10-13 15:51:13 +02:00
Jonas Bark
d5c6a8f7f1 fix CI 2025-10-13 15:32:08 +02:00
Jonas Bark
b6bb2c37a1 adjust touch placements on Android and macOS 2025-10-13 15:26:59 +02:00
Jonas Bark
3ea1184bab prevent wrong changelog dialog 2025-10-13 14:51:08 +02:00
Jonas Bark
a45e5c4874 Merge branch 'main' of github.com:jonasbark/swiftcontrol 2025-10-13 14:48:33 +02:00
jonasbark
d5926f1d5c Merge pull request #98 from jmoro/main
Fix drag-and-drop in keymap editor
2025-10-13 14:48:15 +02:00
Javier Moro Sotelo
c08ac5468a Fix drag-and-drop in keymap editor
Replaced velocity-based drag detection with distance-based threshold to ensure button positions update correctly even when dragging over other buttons, which can cause velocity to drop to zero.

Fixes #97

Signed-off-by: Javier Moro Sotelo <810976+jmoro@users.noreply.github.com>
2025-10-13 14:42:12 +02:00
Jonas Bark
32ad152079 update supported devices 2025-10-13 13:26:10 +02:00
jonasbark
94372918ac Merge pull request #96 from bin101/patch-1
fix: change key mappings from 'A' and 'D' to arrow keys
2025-10-13 12:24:11 +02:00
jonasbark
3ce364a5be Merge branch 'main' into patch-1 2025-10-13 12:23:57 +02:00
Jonas Bark
e4105ea248 Merge branch 'wahoo_kickr_bike_shift' 2025-10-13 12:22:46 +02:00
Jonas Bark
604a8b6bd6 CI changes 2025-10-13 12:22:35 +02:00
Jonas Bark
fc82a62af3 initial support for wahoo kickr bike shifting 2025-10-13 12:13:45 +02:00
Jens van Almsick
67aeb3e257 fix: change key mappings from 'A' and 'D' to arrow keys
see https://mywhooshinfo.com/blog/mywhoosh-keyboard-shortcuts
2025-10-13 12:04:41 +02:00
Jonas Bark
d371ec6d6e add initial support for Elite Square 2025-10-13 11:42:38 +02:00
Jonas Bark
01509eaae9 refactor device handling to support more devices #2 2025-10-13 11:09:18 +02:00
Jonas Bark
b0df25241a refactor device handling to support more devices #1 2025-10-13 10:59:12 +02:00
Jonas Bark
56447743b2 revise update mechanism 2025-10-13 10:09:58 +02:00
Jonas Bark
301dc39648 Merge branch 'main' of github.com:jonasbark/swiftcontrol 2025-10-13 09:11:30 +02:00
jonasbark
3195568399 Clean up Windows section in README
Removed redundant text from the Windows section.
2025-10-13 09:08:54 +02:00
jonasbark
200b13c97f Add download links to README
Added download links for Google Play and App Store.
2025-10-13 09:02:29 +02:00
jonasbark
47173f6dbd Enhance README with compatibility matrix and links
Added compatibility matrix and download links for platforms.
2025-10-13 09:02:16 +02:00
Jonas Bark
83bf1fe047 cleanup 2025-10-13 00:14:51 +02:00
jonasbark
aa8310905d Update README with app support and web demo details 2025-10-13 00:12:44 +02:00
Jonas Bark
a67a82d638 Merge branch 'main' of github.com:jonasbark/swiftcontrol 2025-10-13 00:10:28 +02:00
jonasbark
65b0807903 Revise README with app and platform updates
Updated supported apps and platforms, added details for iOS and Android usage, and improved troubleshooting section.
2025-10-13 00:10:01 +02:00
Jonas Bark
ca4702a684 github actions patch pipeline 2025-10-12 13:08:55 +02:00
Jonas Bark
a89ffc7ffd integrate shorebird 2025-10-12 12:12:46 +02:00
Jonas Bark
4e75270e49 Merge branch 'ios' 2025-10-12 11:33:57 +02:00
Jonas Bark
e08a1dc183 version++ 2025-10-12 11:33:51 +02:00
Jonas Bark
8fa31968c0 integrate shorebird 2025-10-12 11:13:54 +02:00
Jonas Bark
27e25978f2 integrate shorebird 2025-10-12 11:06:24 +02:00
Jonas Bark
5a0761ef1a integrate shorebird 2025-10-12 11:05:13 +02:00
Jonas Bark
52c40e6f5c fix a few issues in button customization screen 2025-10-12 10:16:36 +02:00
Jonas Bark
be7a18384c fix desktop actions when device pixel ratio is not 1 2025-10-11 10:44:35 +02:00
Jonas Bark
b4693229d2 github actions change 2025-10-10 21:28:13 +02:00
Jonas Bark
dc28be0657 screenshot mode 2025-10-10 15:20:58 +02:00
Jonas Bark
ce6f33522f version++ 2025-10-10 15:03:37 +02:00
Jonas Bark
200ac9d81e Merge branch 'copilot/fix-2d2954be-782f-43b7-b654-d4aa8263083d' into ios 2025-10-10 15:02:40 +02:00
Jonas Bark
078398daba make the UI look nicer 2025-10-10 14:58:30 +02:00
Jonas Bark
9ac73ec6fc make the UI look nicer 2025-10-10 14:23:14 +02:00
Jonas Bark
a469134d2f UI changes and fixes 2025-10-10 12:26:20 +02:00
Jonas Bark
57690808dd UI changes and fixes 2025-10-10 11:10:12 +02:00
Jonas Bark
4edc8ef10c UI changes and fixes 2025-10-10 11:06:16 +02:00
Jonas Bark
576e66c60c fix merge 2025-10-10 09:42:15 +02:00
Jonas Bark
0e53f225d0 Merge branch 'ios' into copilot/fix-2d2954be-782f-43b7-b654-d4aa8263083d
# Conflicts:
#	lib/pages/touch_area.dart
2025-10-10 09:41:16 +02:00
Jonas Bark
5d656913a8 fix when setting full screen takes long time 2025-10-09 23:14:23 +02:00
Jonas Bark
49cea5f45d fix UI 2025-10-09 23:08:54 +02:00
Jonas Bark
255435e419 fix coordinates 2025-10-09 22:48:09 +02:00
Jonas Bark
1657338640 Merge branch 'ios' into copilot/fix-2d2954be-782f-43b7-b654-d4aa8263083d 2025-10-09 22:41:33 +02:00
Jonas Bark
eb66731784 dev fix 2025-10-09 22:41:26 +02:00
Jonas Bark
07c9abc87b fix simulate button 2025-10-09 22:41:15 +02:00
Jonas Bark
f5e8bad1ae initial fixes 2025-10-09 22:37:07 +02:00
Jonas Bark
38e9533bfa Merge branch 'ios' into copilot/fix-2d2954be-782f-43b7-b654-d4aa8263083d 2025-10-09 22:17:28 +02:00
copilot-swe-agent[bot]
2cd0273382 Remove screenSize parameter from encode/decode methods
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-10-09 20:06:11 +00:00
copilot-swe-agent[bot]
d62d572387 Implement full migration to percentage-based keymap coordinates
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-10-09 19:46:16 +00:00
copilot-swe-agent[bot]
b65fe57c68 Add comprehensive tests for import/export and percentage-based keymaps
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-10-09 19:33:56 +00:00
copilot-swe-agent[bot]
0e5f6ef2dd Add import/export functionality for keymap profiles
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-10-09 19:32:46 +00:00
copilot-swe-agent[bot]
45112ccfcf Implement percentage-based keymap storage for better device compatibility
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-10-09 19:30:34 +00:00
copilot-swe-agent[bot]
d26e937066 Remove documentation file and refactor to use Settings methods instead of exposing prefs
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-10-09 19:26:22 +00:00
Jonas Bark
bb1bb42214 build Android for Play Store 2025-10-09 21:21:51 +02:00
Jonas Bark
07c16dcbe2 build Android for Play Store 2025-10-09 20:46:18 +02:00
Jonas Bark
1b4f5613ac build Android for Play Store 2025-10-09 20:43:07 +02:00
jonasbark
3315bcd73e Revise download section in README.md
iOS + Mac App Store links
2025-10-09 16:05:55 +02:00
Jonas Bark
87f33b9a15 rebuild 2025-10-09 15:55:15 +02:00
Jonas Bark
c06d364344 rebuild 2025-10-09 15:28:01 +02:00
Jonas Bark
cbab56c17b rebuild 2025-10-09 15:10:57 +02:00
Jonas Bark
585c78c232 rebuild 2025-10-09 15:06:38 +02:00
Jonas Bark
e569b20b9f zommable customize keymap screen 2025-10-09 14:53:54 +02:00
Jonas Bark
590e18ee43 rebuild 2025-10-09 14:20:06 +02:00
Jonas Bark
a8edd09eae rebuild 2025-10-09 14:10:40 +02:00
Jonas Bark
f3dae6fb48 rebuild 2025-10-09 13:52:18 +02:00
Jonas Bark
b4672c7f39 rebuild 2025-10-09 13:39:28 +02:00
Jonas Bark
e60a7b61a8 rebuild 2025-10-09 13:39:05 +02:00
Jonas Bark
e443e5ab0d rebuild 2025-10-09 13:34:58 +02:00
Jonas Bark
29f773d212 rebuild 2025-10-09 13:30:25 +02:00
Jonas Bark
86d09450b0 rebuild 2025-10-09 13:25:28 +02:00
jonasbark
c081da9545 Merge pull request #91 from jmoro/main
feature: add analog paddle support for Zwift Ride
2025-10-09 12:53:20 +02:00
Jonas Bark
4d0f447b25 rebuild 2025-10-09 12:52:28 +02:00
Jonas Bark
9cc7c1b123 rebuild 2025-10-09 12:46:33 +02:00
Jonas Bark
354742a545 rebuild 2025-10-09 12:44:42 +02:00
Jonas Bark
b64fbfb6e4 rebuild 2025-10-09 12:40:12 +02:00
Jonas Bark
3a2ff5c8d2 rebuild 2025-10-09 12:31:57 +02:00
Jonas Bark
a5a4d9e0c2 rebuild 2025-10-09 12:19:35 +02:00
Jonas Bark
cfeef1621a rebuild 2025-10-09 12:18:48 +02:00
Jonas Bark
2e25b09bdf rebuild 2025-10-09 12:15:22 +02:00
Jonas Bark
5ba70376e6 rebuild 2025-10-09 12:05:26 +02:00
Jonas Bark
7c07d6ecf8 rebuild 2025-10-09 12:02:42 +02:00
Jonas Bark
2788ecc32e rebuild 2025-10-09 11:56:18 +02:00
Jonas Bark
26dc9e93b3 rebuild 2025-10-09 11:52:58 +02:00
Jonas Bark
14bf6c9ac3 rebuild 2025-10-09 11:25:39 +02:00
Jonas Bark
1db9669ed2 rebuild 2025-10-09 10:53:37 +02:00
Jonas Bark
c466e6dfa3 rebuild 2025-10-09 10:51:59 +02:00
Jonas Bark
1c00921ee1 - keep iOS app alive when in background
- keep app active on iOS to keep the remote control happy
- reconnect when this was ignored
2025-10-09 10:45:02 +02:00
Jonas Bark
df432542b5 - keep iOS app alive when in background
- keep app active on iOS to keep the remote control happy
- reconnect when this was ignored
2025-10-09 09:51:47 +02:00
Jonas Bark
fe989750e7 app store compliance 2025-10-08 20:56:40 +02:00
Jonas Bark
e008dea61e fix BT connection issues 2025-10-08 13:08:40 +02:00
Jonas Bark
7a8c7c963b add troubleshooting guide 2025-10-08 12:04:57 +02:00
Jonas Bark
0ecf285a95 adjust readme, changelog 2025-10-08 11:26:17 +02:00
Jonas Bark
b14500351f android works okish 2025-10-08 11:10:26 +02:00
Jonas Bark
97693e25b8 zwift ride does not need encryption 2025-10-08 11:02:02 +02:00
Jonas Bark
12d573bc55 refactoring to allow remote handling on non iOS devices 2025-10-08 10:34:53 +02:00
Javier Moro Sotelo
68562aaec9 fixup! fixup! feature: add analog paddle support for Zwift Ride 2025-10-08 09:56:49 +02:00
Javier Moro Sotelo
2c7e714856 fixup! feature: add analog paddle support for Zwift Ride 2025-10-08 09:34:40 +02:00
Jonas Bark
a7183cc519 remove donate button from iOS 2025-10-08 09:24:43 +02:00
Jonas Bark
bfffb2856d try it on Android #1 2025-10-08 09:18:53 +02:00
Javier Moro Sotelo
d2be747fc1 feature: add analog paddle support for Zwift Ride
Implement analog paddle detection for Zwift Ride with Protocol Buffer parsing.
Paddles (Location 0=left, 1=right) trigger when pressure exceeds threshold and
are user-configurable via keymap settings.

Includes comprehensive test suite and reusable Protocol Buffer parser utilities
for handling non-standard embedded analog data.

Fixes #21

Signed-off-by: Javier Moro Sotelo <810976+jmoro@users.noreply.github.com>
2025-10-08 08:13:40 +02:00
Jonas Bark
7fb44d2782 use relative coordinates on iOS touch targets 2025-10-07 21:52:41 +02:00
Jonas Bark
d7b46205fa make macOS work #7 2025-10-07 20:42:12 +02:00
Jonas Bark
0e0835c2f7 make macOS work #7 2025-10-07 20:08:46 +02:00
Jonas Bark
e81d6cb86f make it work #7 2025-10-07 19:22:38 +02:00
Jonas Bark
8eef01437c make it work #6 2025-10-07 18:33:00 +02:00
Jonas Bark
0d446ee293 make it work #5 2025-10-07 17:47:05 +02:00
Jonas Bark
c0afe1792e make it work #4 2025-10-07 16:53:19 +02:00
Jonas Bark
11fdcad57d make it work #3 2025-10-07 16:41:53 +02:00
Jonas Bark
2ac94907e8 make it work #2 2025-10-06 22:43:36 +02:00
Jonas Bark
f7669b2bbc make it work 2025-10-06 21:41:37 +02:00
Jonas Bark
89d200243b Revert "try flutter_ble_peripheral"
This reverts commit 013b078a44.
2025-10-06 19:28:43 +02:00
Jonas Bark
013b078a44 try flutter_ble_peripheral 2025-10-06 19:27:52 +02:00
Jonas Bark
06aefdedc2 try bluetooth_low_energy 2025-10-06 18:46:46 +02:00
copilot-swe-agent[bot]
4071a12c11 Add documentation for custom profiles feature
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-10-05 10:28:38 +00:00
copilot-swe-agent[bot]
83cdb6efd7 Add comprehensive tests for custom profile functionality
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-10-05 10:26:52 +00:00
copilot-swe-agent[bot]
040c0d3027 Implement multiple custom mapping profiles feature
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-10-05 10:26:20 +00:00
copilot-swe-agent[bot]
a44d4d62d0 Initial plan 2025-10-05 10:19:54 +00:00
Jonas Bark
f51d588510 improve UI when handling custom keymaps around the edges of the screen 2025-10-02 21:38:56 +02:00
Jonas Bark
54b2f73384 fix delayed clicks in some apps 2025-10-02 21:05:15 +02:00
Jonas Bark
dc63f693f0 fix double clicks in some apps 2025-10-02 18:10:12 +02:00
Jonas Bark
455db754d8 fix #82 2025-10-01 20:33:56 +02:00
Jonas Bark
cbef8fc044 fix #82 2025-10-01 20:23:02 +02:00
Jonas Bark
d8e45f849a ui fixes, increase repeating timer 2025-10-01 20:11:01 +02:00
Jonas Bark
f83defb37b introduce workaround for Zwift Click V2 (reset every minute) 2025-10-01 16:17:20 +02:00
Jonas Bark
5c8db11536 Merge branch 'web' 2025-10-01 15:42:43 +02:00
Jonas Bark
30aa5b33a3 fix issue #81 2025-10-01 15:42:20 +02:00
Jonas Bark
ca41e69a17 fix issue #81 2025-10-01 15:41:19 +02:00
Jonas Bark
af4d8ab183 Merge branch 'main' into web 2025-09-30 17:59:18 +02:00
Jonas Bark
c1a24cfbd1 some more experiments 2025-09-30 17:59:12 +02:00
Jonas Bark
86b406e2a4 adjust changelog 2025-09-30 15:19:35 +02:00
Jonas Bark
1ec93330b0 Merge branch 'web' 2025-09-30 15:18:54 +02:00
Jonas Bark
4ed3c5fefe adjust changelog 2025-09-30 15:18:38 +02:00
Jonas Bark
54d106ff4e some more experiments - make it clear how to properly use Zwift Click v2 2025-09-30 15:17:51 +02:00
Jonas Bark
996669ec44 implement updated protocol for Zwift Ride and Zwift Click V2 2025-09-30 11:33:54 +02:00
Jonas Bark
1d38ff521a misc changes 2025-09-30 10:01:01 +02:00
Jonas Bark
f0c1409da4 misc changes 2025-09-30 09:12:50 +02:00
Jonas Bark
9617198db7 adjust changelog 2025-09-30 09:01:54 +02:00
Jonas Bark
e4863b1ebd Merge branch 'web' of github.com:jonasbark/swiftcontrol into web 2025-09-30 09:00:45 +02:00
Jonas Bark
d51a4cc29d cleanup 2025-09-30 09:00:41 +02:00
Jonas Bark
dcbb225355 cleanup 2025-09-30 09:00:30 +02:00
jonasbark
cba449b493 Merge pull request #80 from jonasbark/copilot/fix-3ddab2b9-517e-451f-827c-78dff444def4
[WIP] Create a setting, visible only when connected to a Zwift Ride device, to enable or disable the vibration message. Default is on.
2025-09-30 09:00:07 +02:00
copilot-swe-agent[bot]
559fe1232b Add test for vibration setting functionality
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-09-30 06:59:18 +00:00
copilot-swe-agent[bot]
a7f9ca489e Add vibration toggle setting for Zwift Ride devices
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-09-30 06:57:43 +00:00
copilot-swe-agent[bot]
74bf75a82e Initial plan 2025-09-30 06:54:32 +00:00
Jonas Bark
747629cebf Merge branch 'web' of github.com:jonasbark/swiftcontrol into web 2025-09-30 08:53:40 +02:00
jonasbark
aca6e9272b Merge pull request #79 from jonasbark/copilot/fix-b3d14829-b03a-4383-a558-c58fb62f2f16
Integrate changelog: Add in-app changelog screen, update dialog, and Play Store automation
2025-09-30 08:53:34 +02:00
copilot-swe-agent[bot]
18e6f9a1b5 Update build.yml to use changelog script for Play Store uploads
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-09-30 06:51:21 +00:00
copilot-swe-agent[bot]
c3532d5c35 Add quick reference guide for changelog integration
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-09-30 06:46:31 +00:00
copilot-swe-agent[bot]
1a88f45c93 Add implementation summary for changelog integration
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-09-30 06:45:12 +00:00
copilot-swe-agent[bot]
b49eda7fc7 Add comprehensive documentation for changelog integration
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-09-30 06:44:18 +00:00
Jonas Bark
f0b3bc70b2 Android: stop foreground service when disconnecting, update dependencies 2025-09-30 08:42:27 +02:00
copilot-swe-agent[bot]
08700edc22 Implement changelog integration features
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-09-30 06:41:46 +00:00
copilot-swe-agent[bot]
d698c9bbea Initial plan 2025-09-30 06:35:36 +00:00
jonasbark
eea1b8eb40 Merge pull request #78 from jonasbark/copilot/fix-d9ff38c6-4028-48c0-83e5-8755ed4d98b0
Fix keymap editing orientation to prevent misplaced touch positions
2025-09-29 17:48:56 +02:00
copilot-swe-agent[bot]
0118c5a87c Update keymap editing instructions to clarify landscape orientation
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-09-29 15:31:50 +00:00
copilot-swe-agent[bot]
65a3374d9c Force landscape orientation during keymap editing
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-09-29 15:29:32 +00:00
copilot-swe-agent[bot]
536225bf12 Initial plan 2025-09-29 15:25:09 +00:00
Jonas Bark
e858d35617 web fixes 2025-09-29 13:07:11 +02:00
Jonas Bark
6d87e85353 web only pipeline 2025-09-29 12:57:11 +02:00
Jonas Bark
d1fed35c3e some experiments for Click V2 2025-09-29 12:56:04 +02:00
Jonas Bark
d9297bd40e make connection work on iOS 2025-09-29 10:14:19 +02:00
Jonas Bark
a1926dfc00 Revert "remove iOS folder as Apple does not support the core functionality"
This reverts commit d0291c68d7.
2025-09-29 09:54:43 +02:00
Jonas Bark
d55ba039af version++ 2025-09-28 15:45:20 +02:00
Jonas Bark
c9ebc5a9f6 don't show actual touches on screen for Android 2025-09-28 15:39:01 +02:00
Jonas Bark
be0c2d97ba show firmware version of connected device 2025-09-27 15:11:24 +02:00
Jonas Bark
a03cc76eaa show firmware version of connected device 2025-09-27 15:03:02 +02:00
Jonas Bark
504c71d5c4 refactor touch placements: show touches on screen, fix misplaced coordinates - should fix #64 2025-09-27 14:48:23 +02:00
Jonas Bark
d0291c68d7 remove iOS folder as Apple does not support the core functionality 2025-09-27 14:02:10 +02:00
Jonas Bark
33e5e41eff disconnect devices when still connected from previous session, don't show update app dialog during debugging 2025-09-27 12:34:40 +02:00
Jonas Bark
221d5a0b8d fix crashes on some Android devices 2025-09-27 12:18:50 +02:00
Jonas Bark
b899487ee9 Merge branch 'main' of github.com:jonasbark/swiftcontrol 2025-09-26 15:06:38 +02:00
jonasbark
ff0b724a73 Update README.md 2025-09-26 11:12:34 +02:00
jonasbark
647c20a6a3 Make Google Play badge clickable in README
Updated Google Play badge to be a clickable link.
2025-09-26 11:02:27 +02:00
jonasbark
c36e63aa8d Fix Google Play badge and update download info
Updated Google Play badge link and added image.
2025-09-26 11:01:54 +02:00
jonasbark
cb523ea656 Update README to specify Zwift Click v2 support
Clarify support status for Zwift Click v2.
2025-09-26 10:57:40 +02:00
Jonas Bark
22b99f4f6d Merge branch 'main' of github.com:jonasbark/swiftcontrol 2025-09-25 14:21:03 +02:00
Jonas Bark
05e681b59a use prerelease attribute in github actions 2025-09-25 14:19:42 +02:00
jonasbark
07ee91c17a Clarify download link for latest version
Updated the download link description for clarity.
2025-09-25 13:46:34 +02:00
Jonas Bark
323a344c3a actions test 2025-09-25 13:42:08 +02:00
Jonas Bark
0172b1cf90 actions test 2025-09-25 13:26:24 +02:00
Jonas Bark
5a5e4066f6 Merge remote-tracking branch 'origin/main' 2025-09-25 12:56:10 +02:00
Jonas Bark
3256f5aa15 actions test 2025-09-25 12:56:02 +02:00
Jonas Bark
476a9a337f actions test 2025-09-25 12:54:22 +02:00
jonasbark
1f1ce58bd9 Update CHANGELOG for version 2.5.0
Added note about voucher for donors
2025-09-25 11:34:40 +02:00
Jonas Bark
bbb3dd3397 increase version 2025-09-25 11:16:49 +02:00
Jonas Bark
d7cee77c8b improve usability 2025-09-25 11:03:33 +02:00
Jonas Bark
e2ac975c75 rename Android package name, revert Zwift Click V2 encryption support, add play store assets 2025-09-24 09:12:21 +02:00
Jonas Bark
5e9352316c offer to get app from Play Store 2025-09-24 08:51:19 +02:00
Jonas Bark
c73adb7c0d version++ 2025-09-24 08:47:44 +02:00
Jonas Bark
c3b41f56d4 Merge remote-tracking branch 'origin/copilot/fix-74' 2025-09-24 08:42:39 +02:00
copilot-swe-agent[bot]
6fe841af58 Enhance disclosure dialog with navigation prevention and Play Store description
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-09-24 06:28:31 +00:00
copilot-swe-agent[bot]
d97307de6f Add accessibility disclosure dialog with proper consent options
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-09-24 06:26:05 +00:00
copilot-swe-agent[bot]
826dc2327f Initial plan 2025-09-24 06:20:32 +00:00
Jonas Bark
3466e504e3 implement in app update for Android 2025-09-22 13:41:50 +02:00
Jonas Bark
ebd7f80947 upload app bundle to play store 2025-09-22 13:27:30 +02:00
Jonas Bark
43e827d8f5 build app bundle for play store 2025-09-22 10:11:25 +02:00
Jonas Bark
5d5dc2e152 build app bundle for play store 2025-09-22 09:53:25 +02:00
Jonas Bark
c0d2eaa897 adjust readme to ensure Windows users to not pair their Zwift device with Windows 2025-09-22 09:35:55 +02:00
Jonas Bark
13c70fc445 enable encryption for Zwift Click v2 to potentially fix #68 2025-09-22 09:28:35 +02:00
jonasbark
1e11d28765 Merge pull request #71 from jonasbark/copilot/fix-64
Fix Windows mouse clicks at wrong location due to display scaling
2025-09-17 08:49:53 +02:00
copilot-swe-agent[bot]
7ee9bc43a0 Fix changelog date to 2025-09-17
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-09-17 06:49:09 +00:00
copilot-swe-agent[bot]
372085ec0e Update version to 2.4.0+1 and add changelog entry
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-09-17 06:46:52 +00:00
copilot-swe-agent[bot]
e758b35837 Fix Windows mouse click scaling for high DPI displays
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-09-17 06:32:42 +00:00
copilot-swe-agent[bot]
dee7b86120 Initial plan 2025-09-17 06:28:06 +00:00
Jonas Bark
b3ec7e7a3a funding 2025-09-16 20:08:51 +02:00
Jonas Bark
bbd01d023a - Show an overview of the keymap bindings
- Allow customizing an existing keymap
2025-09-16 10:32:09 +02:00
Jonas Bark
36282c9fa9 better donate options 2025-09-16 08:59:50 +02:00
jonasbark
daea07c409 Clarify iOS not being supported 2025-09-15 08:08:07 +02:00
jonasbark
49d7445d0e Aktualisieren von README.md 2025-09-11 21:14:32 +02:00
jonasbark
9bb0e5616a Aktualisieren von pubspec.yaml 2025-09-11 19:27:47 +02:00
jonasbark
7e98f595ee Aktualisieren von CHANGELOG.md 2025-09-11 19:27:18 +02:00
Jonas Bark
a9fdc4b16e attempt to add support for Zwift Click v2 2025-09-10 17:40:14 +02:00
Jonas Bark
c06819b502 attempt to add support for Zwift Click v2 2025-09-10 08:42:55 +02:00
Jonas Bark
969faca658 attempt to add support for Zwift Click v2 2025-09-09 09:19:52 +02:00
Jonas Bark
61fbb099e2 actions fix 2025-09-08 16:55:28 +02:00
Jonas Bark
fbd6356be0 donate button change 2025-09-08 16:54:23 +02:00
Jonas Bark
1c40455bf3 update readme 2025-09-08 16:42:30 +02:00
Jonas Bark
15129634a6 update some libraries to ensure compatibility with latest Flutter 2025-09-08 16:23:20 +02:00
Jonas Bark
89d35d7734 update some libraries to ensure compatibility with latest Flutter 2025-09-08 15:49:31 +02:00
Jonas Bark
d959bfb4c9 Windows: adjust key sending method to improve compatibility with more apps (fixes #62) 2025-09-08 15:33:28 +02:00
Jonas Bark
9bc25514ae add launch.json for easier entry when using Visual Studio Code 2025-09-08 14:46:07 +02:00
Jonas Bark
25210b57ba try to add dlls to ZIP to potentially fix #54 2025-09-08 14:21:27 +02:00
jonasbark
c9317e369c Merge pull request #62 from jonasbark/copilot/fix-61
Add long press mode option for custom keymaps
2025-09-08 14:02:04 +02:00
Jonas Bark
2195c19ed9 allow long touches / keyboard presses (fixes #61) 2025-09-08 14:01:28 +02:00
Jonas Bark
d13a9d72c9 mark versions not ending with +0 as beta versions 2025-09-08 13:43:14 +02:00
Jonas Bark
55d230e41c Merge branch 'main' into copilot/fix-61 2025-09-08 12:59:14 +02:00
Jonas Bark
ffa604f921 fix logging messages 2025-09-08 12:59:04 +02:00
copilot-swe-agent[bot]
93bdfeeaa7 Refactor action method parameters from isPressed/isRepeated to isKeyDown/isKeyUp
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-09-07 10:18:20 +00:00
copilot-swe-agent[bot]
336c64e5a9 Update version to 2.2.0 in pubspec.yaml and CHANGELOG.md
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-09-06 07:03:19 +00:00
copilot-swe-agent[bot]
20a706d93d Address feedback: remove documentation file, revert README changes, bump version and update changelog
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-09-06 06:58:55 +00:00
copilot-swe-agent[bot]
21cb8844fc Complete long press feature implementation with cleanup, tests and documentation
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-09-06 06:48:13 +00:00
copilot-swe-agent[bot]
4bc1a3b1d0 Add long press functionality to KeyPair and update UI
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-09-06 06:46:23 +00:00
copilot-swe-agent[bot]
9df1f7cfa6 Initial plan 2025-09-06 06:39:18 +00:00
jonasbark
72cdf86802 Update README.md 2025-08-18 10:06:22 +02:00
jonasbark
9a53d5fdab Merge pull request #32 from jonasbark/copilot/fix-31
Fix Windows compilation error: FindTargetWindow identifier not found
2025-07-04 09:25:26 +02:00
copilot-swe-agent[bot]
458e6333a0 Fix C++ forward declaration error for FindTargetWindow
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-07-04 07:22:34 +00:00
copilot-swe-agent[bot]
f42e483260 Initial plan 2025-07-04 07:19:09 +00:00
jonasbark
dda2135129 Merge pull request #30 from jonasbark/copilot/fix-26
Implement window-focused key simulation for Windows applications
2025-07-04 08:51:42 +02:00
copilot-swe-agent[bot]
bc2831c17e Update version to 2.1.0 and add changelog entry for automatic window focusing feature
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-07-03 15:00:12 +00:00
copilot-swe-agent[bot]
310313c3b2 Add check to avoid focusing window if already in foreground
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-07-03 14:56:11 +00:00
copilot-swe-agent[bot]
2122568461 Remove documentation and utility files as requested, keep automatic window focusing in Windows C++ plugin
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-07-03 14:23:43 +00:00
copilot-swe-agent[bot]
144fd5b740 Remove Dart API changes and implement automatic window focusing in Windows SimulateKeyPress method
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-07-03 14:13:14 +00:00
copilot-swe-agent[bot]
5f7a1a8203 Complete window-focused key simulation implementation with utilities and README update
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-07-03 14:02:59 +00:00
copilot-swe-agent[bot]
258b396444 Add documentation and testing tools for window-focused key simulation feature
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-07-03 14:01:10 +00:00
copilot-swe-agent[bot]
5861533793 Improve window-focused key simulation with better error handling and SendInput fallback
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-07-03 13:59:47 +00:00
copilot-swe-agent[bot]
3106bd09e8 Implement window-focused key simulation for Windows applications
Co-authored-by: jonasbark <1151304+jonasbark@users.noreply.github.com>
2025-07-03 13:53:30 +00:00
copilot-swe-agent[bot]
a3475a02d2 Initial plan 2025-07-03 13:42:04 +00:00
Jonas Bark
fb1a1f35ad you can now assign Escape and arrow down key to your custom keymap (fixes #18) 2025-05-04 10:46:00 +02:00
Jonas Bark
71aadde901 more troubleshooting, always use light theme 2025-05-02 19:10:56 +02:00
220 changed files with 16636 additions and 2244 deletions

3
.github/FUNDING.yml vendored
View File

@@ -1,3 +1,2 @@
github: [jonasbark]
open_collective: jonas-bark1
custom: ["https://paypal.me/boni"]
custom: ["https://paypal.me/boni", "https://donate.stripe.com/9B6aEX0muajY8bZ1Kl6J200"]

View File

@@ -1,15 +1,42 @@
name: "Build"
on:
push:
branches:
- main
paths:
- '.github/workflows/**'
- 'lib/**'
- 'accessibility/**'
- 'keypress_simulator/**'
- 'pubspec.yaml'
workflow_dispatch:
inputs:
build_mac:
description: 'Build for macOS'
required: false
default: true
type: boolean
build_github:
description: 'Build for GitHub'
required: false
default: true
type: boolean
build_windows:
description: 'Build for Windows'
required: false
default: true
type: boolean
build_android:
description: 'Build for Android'
required: false
default: true
type: boolean
build_ios:
description: 'Build for iOS'
required: false
default: true
type: boolean
build_web:
description: 'Build for Web'
required: false
default: true
type: boolean
env:
SHOREBIRD_TOKEN: ${{ secrets.SHOREBIRD_TOKEN }}
FLUTTER_VERSION: 3.35.5
jobs:
build:
@@ -27,17 +54,30 @@ jobs:
uses: actions/checkout@v3
- name: Install certificates
if: inputs.build_mac || inputs.build_ios
env:
DEVELOPER_ID_APPLICATION_P12_BASE64_MAC: ${{ secrets.DEVELOPER_ID_APPLICATION_P12_BASE64_MAC }}
DEVELOPER_ID_INSTALLER_P12_BASE64_MAC: ${{ secrets.DEVELOPER_ID_INSTALLER_P12_BASE64_MAC }}
P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
APPSTORE_PROFILE_IOS_BASE64: ${{ secrets.APPSTORE_PROFILE_IOS_BASE64 }}
APPSTORE_PROFILE_MACOS_BASE64: ${{ secrets.APPSTORE_PROFILE_MACOS_BASE64 }}
APPSTORE_PROFILE_DEV_IOS_BASE64: ${{ secrets.APPSTORE_PROFILE_DEV_IOS_BASE64 }}
run: |
# create variables
DEVELOPER_ID_APPLICATION_CERTIFICATE_PATH=$RUNNER_TEMP/build_developerID_application_certificate.p12
DEVELOPER_ID_INSTALLER_CERTIFICATE_PATH=$RUNNER_TEMP/build_developerID_installer_certificate.p12
PP_PATH_IOS=$RUNNER_TEMP/build_pp_ios.mobileprovision
PP_PATH_IOS_DEV=$RUNNER_TEMP/build_pp_ios_dev.mobileprovision
PP_PATH_MACOS=$RUNNER_TEMP/build_pp_macos.provisionprofile
KEYCHAIN_PATH=$RUNNER_TEMP/pg-signing.keychain-db
# import certificate and provisioning profile from secrets
echo -n "$DEVELOPER_ID_APPLICATION_P12_BASE64_MAC" | base64 --decode --output $DEVELOPER_ID_APPLICATION_CERTIFICATE_PATH
echo -n "$DEVELOPER_ID_INSTALLER_P12_BASE64_MAC" | base64 --decode --output $DEVELOPER_ID_INSTALLER_CERTIFICATE_PATH
echo -n "$APPSTORE_PROFILE_IOS_BASE64" | base64 --decode -o $PP_PATH_IOS
echo -n "$APPSTORE_PROFILE_DEV_IOS_BASE64" | base64 --decode -o $PP_PATH_IOS_DEV
echo -n "$APPSTORE_PROFILE_MACOS_BASE64" | base64 --decode -o $PP_PATH_MACOS
# create temporary keychain
security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
@@ -47,65 +87,153 @@ jobs:
# import certificate to keychain
security import $DEVELOPER_ID_APPLICATION_CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security import $DEVELOPER_ID_INSTALLER_CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security list-keychain -d user -s $KEYCHAIN_PATH
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp $PP_PATH_IOS ~/Library/MobileDevice/Provisioning\ Profiles
cp $PP_PATH_IOS_DEV ~/Library/MobileDevice/Provisioning\ Profiles
cp $PP_PATH_MACOS ~/Library/MobileDevice/Provisioning\ Profiles
#2 Setup Java
- name: Set Up Java
uses: actions/setup-java@v3.12.0
- name: 🐦 Setup Shorebird
uses: shorebirdtech/setup-shorebird@v1
with:
distribution: 'oracle'
java-version: '17'
cache: true
#3 Setup Flutter
- name: Set Up Flutter
uses: subosito/flutter-action@v2
- name: 🚀 Shorebird Release macOS
if: inputs.build_mac
uses: shorebirdtech/shorebird-release@v1
with:
channel: 'stable'
#4 Install Dependencies
- name: Install Dependencies
run: flutter pub get
#8 Build app ( macos Build )
- name: Build App
run: flutter build macos --release
- name: Code Signing
run: /usr/bin/codesign --deep --force -s "$DEVELOPER_ID_APPLICATION_SIGNING_IDENTITY" --options runtime SwiftControl.app -v
working-directory: build/macos/Build/Products/Release
env:
DEVELOPER_ID_APPLICATION_SIGNING_IDENTITY: ${{ secrets.DEVELOPER_ID_APPLICATION_SIGNING_IDENTITY }}
flutter-version: ${{ env.FLUTTER_VERSION }}
platform: macos
- name: Decode Keystore
if: inputs.build_android
run: |
echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 --decode > android/android.keystore;
echo "${{ secrets.KEYSTORE_PROPERTIES }}" > android/keystore.properties;
#6 Building APK
- name: Build APK
run: flutter build apk --release
- name: 🚀 Shorebird Release Android
if: inputs.build_android
uses: shorebirdtech/shorebird-release@v1
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
platform: android
args: "--artifact=apk"
- name: Set Up Flutter
if: inputs.build_web
uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: ${{ env.FLUTTER_VERSION }}
- name: Build Web
if: inputs.build_web
run: flutter build web --release --base-href "/swiftcontrol/"
- name: Handle archives
- name: Upload static files as artifact
if: inputs.build_web
id: deployment
uses: actions/upload-pages-artifact@v3
with:
path: build/web
- name: Web Deploy
if: inputs.build_web
uses: actions/deploy-pages@v4
- name: Extract latest changelog
id: changelog
run: |
chmod +x scripts/get_latest_changelog.sh
mkdir -p whatsnew
./scripts/get_latest_changelog.sh | head -c 500 > whatsnew/whatsnew-en-US
- name: 🚀 Shorebird Release iOS
if: inputs.build_ios
uses: shorebirdtech/shorebird-release@v1
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
platform: ios
args: "--export-options-plist ios/ExportOptions.plist"
- name: Prepare App Store authentication key
if: inputs.build_ios || inputs.build_mac
env:
API_KEY_BASE64: ${{ secrets.APPSTORE_API_KEY_FILE_BASE64 }}
APPSTORE_API_KEY: ${{ secrets.APPSTORE_API_KEY }}
run: |
mkdir -p ./private_keys;
printf %s "$API_KEY_BASE64" | base64 -D > "./private_keys/AuthKey_${APPSTORE_API_KEY}.p8";
- name: Upload to Play Store
if: inputs.build_android
uses: r0adkll/upload-google-play@v1
with:
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
packageName: de.jonasbark.swiftcontrol
releaseFiles: build/app/outputs/bundle/release/app-release.aab
track: production
whatsNewDirectory: whatsnew
- name: Upload to macOS App Store
if: inputs.build_mac
env:
APPSTORE_API_KEY: ${{ secrets.APPSTORE_API_KEY }}
APPSTORE_API_ISSUER_ID: ${{ secrets.APPSTORE_API_ISSUER_ID }}
run: |
productbuild --component "build/macos/Build/Products/Release/SwiftControl.app" /Applications "SwiftControl.pkg" --sign "3rd Party Mac Developer Installer: JONAS TASSILO BARK (UZRHKPVWN9)";
xcrun altool --upload-app -f SwiftControl.pkg -t osx --apiKey "$APPSTORE_API_KEY" --apiIssuer "$APPSTORE_API_ISSUER_ID";
- name: Upload to iOS App Store
if: inputs.build_ios
env:
APPSTORE_API_KEY: ${{ secrets.APPSTORE_API_KEY }}
APPSTORE_API_ISSUER_ID: ${{ secrets.APPSTORE_API_ISSUER_ID }}
run: |
xcrun altool --upload-app -f build/ios/ipa/swift_play.ipa -t ios --apiKey "$APPSTORE_API_KEY" --apiIssuer "$APPSTORE_API_ISSUER_ID";
- name: Handle Android archives
if: inputs.build_android && inputs.build_github
run: |
cp build/app/outputs/flutter-apk/app-release.apk build/app/outputs/flutter-apk/SwiftControl.android.apk
- name: Code Signing of macOS app
if: inputs.build_mac && inputs.build_github
run: /usr/bin/codesign --deep --force -s "$DEVELOPER_ID_APPLICATION_SIGNING_IDENTITY" --entitlements ../../../../../macos/Runner/Release.entitlements --options runtime SwiftControl.app -v
working-directory: build/macos/Build/Products/Release
env:
DEVELOPER_ID_APPLICATION_SIGNING_IDENTITY: ${{ secrets.DEVELOPER_ID_APPLICATION_SIGNING_IDENTITY }}
- name: Handle macOS archives
if: inputs.build_mac && inputs.build_github
run: |
cd build/macos/Build/Products/Release/
zip -r SwiftControl.macos.zip SwiftControl.app/
#9 Upload Artifacts
- name: Upload Artifacts
- name: Upload Android Artifacts
if: inputs.build_android && inputs.build_github
uses: actions/upload-artifact@v4
with:
overwrite: true
name: Releases
path: |
build/app/outputs/flutter-apk/SwiftControl.android.apk
- name: Upload macOS Artifacts
if: inputs.build_mac && inputs.build_github
uses: actions/upload-artifact@v4
with:
overwrite: true
name: Releases
path: |
build/macos/Build/Products/Release/SwiftControl.macos.zip
#10 Extract Version
- name: Extract version from pubspec.yaml
if: inputs.build_github
id: extract_version
run: |
version=$(grep '^version: ' pubspec.yaml | cut -d ' ' -f 2 | tr -d '\r')
@@ -113,6 +241,7 @@ jobs:
#11 Check if Tag Exists
- name: Check if Tag Exists
if: inputs.build_github
id: check_tag
run: |
if git rev-parse "v${{ env.VERSION }}" >/dev/null 2>&1; then
@@ -123,7 +252,7 @@ jobs:
#12 Modify Tag if it Exists
- name: Modify Tag
if: env.TAG_EXISTS == 'true'
if: env.TAG_EXISTS && inputs.build_github
id: modify_tag
run: |
new_version="${{ env.VERSION }}-build-${{ github.run_number }}"
@@ -131,23 +260,19 @@ jobs:
#13 Create Release
- name: Create Release
if: inputs.build_github
uses: ncipollo/release-action@v1
with:
artifacts: "build/app/outputs/flutter-apk/SwiftControl.android.apk,build/macos/Build/Products/Release/SwiftControl.macos.zip"
allowUpdates: true
prerelease: true
bodyFile: scripts/RELEASE_NOTES.md
tag: v${{ env.VERSION }}
token: ${{ secrets.TOKEN }}
- name: Upload static files as artifact
id: deployment
uses: actions/upload-pages-artifact@v3
with:
path: build/web
- name: Web Deploy
uses: actions/deploy-pages@v4
windows:
needs: build
if: inputs.build_windows && inputs.build_github
name: Build & Release on Windows
runs-on: windows-latest
@@ -163,22 +288,39 @@ jobs:
distribution: 'oracle'
java-version: '17'
#3 Setup Flutter
- name: Set Up Flutter
uses: subosito/flutter-action@v2
- name: 🐦 Setup Shorebird
uses: shorebirdtech/setup-shorebird@v1
with:
channel: 'stable'
cache: true
#4 Install Dependencies
- name: Install Dependencies
run: flutter pub get
- name: Build App
run: flutter build windows
- name: 🚀 Shorebird Release Windows
uses: shorebirdtech/shorebird-release@v1
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
platform: windows
- name: Zip directory (Windows)
shell: pwsh
run: |
$source = "C:\Windows\System32"
$destination = "build\windows\x64\runner\Release"
# List of required DLLs
$dlls = @("msvcp140.dll", "vcruntime140.dll", "vcruntime140_1.dll")
# Copy each file
foreach ($dll in $dlls) {
$srcPath = Join-Path $source $dll
$destPath = Join-Path $destination $dll
if (Test-Path $srcPath) {
Copy-Item -Path $srcPath -Destination $destPath -Force
Write-Output "Copied $dll to $destination"
} else {
Write-Warning "$dll not found in $source"
}
}
Compress-Archive -Path "build/windows/x64/runner/Release/*" -DestinationPath "build/windows/x64/runner/Release/SwiftControl.windows.zip"
#9 Upload Artifacts
@@ -206,5 +348,7 @@ jobs:
with:
allowUpdates: true
artifacts: "build/windows/x64/runner/Release/SwiftControl.windows.zip"
bodyFile: scripts/RELEASE_NOTES.md
prerelease: true
tag: v${{ env.VERSION }}
token: ${{ secrets.TOKEN }}

169
.github/workflows/patch.yml vendored Normal file
View File

@@ -0,0 +1,169 @@
name: "Patch"
on:
workflow_dispatch:
env:
SHOREBIRD_TOKEN: ${{ secrets.SHOREBIRD_TOKEN }}
FLUTTER_VERSION: 3.35.5
jobs:
build:
name: Patch iOS, Android & macOS
runs-on: macos-latest
permissions:
id-token: write
pages: write
contents: write
steps:
#1 Checkout Repository
- name: Checkout Repository
uses: actions/checkout@v3
- name: 🐦 Setup Shorebird
if: false
uses: shorebirdtech/setup-shorebird@v1
with:
cache: true
- name: Install certificates
env:
DEVELOPER_ID_APPLICATION_P12_BASE64_MAC: ${{ secrets.DEVELOPER_ID_APPLICATION_P12_BASE64_MAC }}
DEVELOPER_ID_INSTALLER_P12_BASE64_MAC: ${{ secrets.DEVELOPER_ID_INSTALLER_P12_BASE64_MAC }}
P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
APPSTORE_PROFILE_IOS_BASE64: ${{ secrets.APPSTORE_PROFILE_IOS_BASE64 }}
APPSTORE_PROFILE_MACOS_BASE64: ${{ secrets.APPSTORE_PROFILE_MACOS_BASE64 }}
APPSTORE_PROFILE_DEV_IOS_BASE64: ${{ secrets.APPSTORE_PROFILE_DEV_IOS_BASE64 }}
run: |
# create variables
DEVELOPER_ID_APPLICATION_CERTIFICATE_PATH=$RUNNER_TEMP/build_developerID_application_certificate.p12
DEVELOPER_ID_INSTALLER_CERTIFICATE_PATH=$RUNNER_TEMP/build_developerID_installer_certificate.p12
PP_PATH_IOS=$RUNNER_TEMP/build_pp_ios.mobileprovision
PP_PATH_IOS_DEV=$RUNNER_TEMP/build_pp_ios_dev.mobileprovision
PP_PATH_MACOS=$RUNNER_TEMP/build_pp_macos.provisionprofile
KEYCHAIN_PATH=$RUNNER_TEMP/pg-signing.keychain-db
# import certificate and provisioning profile from secrets
echo -n "$DEVELOPER_ID_APPLICATION_P12_BASE64_MAC" | base64 --decode --output $DEVELOPER_ID_APPLICATION_CERTIFICATE_PATH
echo -n "$DEVELOPER_ID_INSTALLER_P12_BASE64_MAC" | base64 --decode --output $DEVELOPER_ID_INSTALLER_CERTIFICATE_PATH
echo -n "$APPSTORE_PROFILE_IOS_BASE64" | base64 --decode -o $PP_PATH_IOS
echo -n "$APPSTORE_PROFILE_DEV_IOS_BASE64" | base64 --decode -o $PP_PATH_IOS_DEV
echo -n "$APPSTORE_PROFILE_MACOS_BASE64" | base64 --decode -o $PP_PATH_MACOS
# create temporary keychain
security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
# security default-keychain -s $KEYCHAIN_PATH
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
# import certificate to keychain
security import $DEVELOPER_ID_APPLICATION_CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security import $DEVELOPER_ID_INSTALLER_CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security list-keychain -d user -s $KEYCHAIN_PATH
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp $PP_PATH_IOS ~/Library/MobileDevice/Provisioning\ Profiles
cp $PP_PATH_IOS_DEV ~/Library/MobileDevice/Provisioning\ Profiles
cp $PP_PATH_MACOS ~/Library/MobileDevice/Provisioning\ Profiles
- name: Decode Keystore
if: false
run: |
echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 --decode > android/android.keystore;
echo "${{ secrets.KEYSTORE_PROPERTIES }}" > android/keystore.properties;
- name: 🚀 Shorebird Patch macOS
if: false
uses: shorebirdtech/shorebird-patch@v1
with:
platform: macos
release-version: latest
args: '--allow-asset-diffs'
- name: 🚀 Shorebird Patch Android
if: false
uses: shorebirdtech/shorebird-patch@v1
with:
platform: android
release-version: latest
args: '--allow-asset-diffs'
- name: 🚀 Shorebird Patch iOS
if: false
uses: shorebirdtech/shorebird-patch@v1
with:
platform: ios
release-version: latest
args: '--allow-asset-diffs'
- name: Set Up Flutter
uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: ${{ env.FLUTTER_VERSION }}
# shorebird struggles with the app from GitHub
- name: Build macOS
run: flutter build macos --release;
- name: Sign macOS build
env:
DEVELOPER_ID_APPLICATION_SIGNING_IDENTITY: ${{ secrets.DEVELOPER_ID_APPLICATION_SIGNING_IDENTITY }}
run: |
version=$(grep '^version: ' pubspec.yaml | cut -d ' ' -f 2 | tr -d '\r');
echo "VERSION=$version" >> $GITHUB_ENV;
cd build/macos/Build/Products/Release/;
/usr/bin/codesign --deep --force -s "$DEVELOPER_ID_APPLICATION_SIGNING_IDENTITY" --entitlements ../../../../../macos/Runner/Release.entitlements --options runtime SwiftControl.app -v;
zip -r SwiftControl.macos.zip SwiftControl.app/;
#9 Upload Artifacts
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
overwrite: true
name: Releases
path: |
build/macos/Build/Products/Release/SwiftControl.macos.zip
# add artifact to release
- name: Create Release
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: "build/macos/Build/Products/Release/SwiftControl.macos.zip"
bodyFile: scripts/RELEASE_NOTES.md
tag: v${{ env.VERSION }}
token: ${{ secrets.TOKEN }}
windows:
name: Patch Windows
if: false
runs-on: windows-latest
steps:
#1 Checkout Repository
- name: Checkout Repository
uses: actions/checkout@v3
#2 Setup Java
- name: Set Up Java
uses: actions/setup-java@v3.12.0
with:
distribution: 'oracle'
java-version: '17'
- name: 🐦 Setup Shorebird
uses: shorebirdtech/setup-shorebird@v1
with:
cache: true
- name: 🚀 Shorebird Patch Windows
uses: shorebirdtech/shorebird-patch@v1
with:
platform: windows
release-version: latest
args: '--allow-asset-diffs'

51
.github/workflows/web.yml vendored Normal file
View File

@@ -0,0 +1,51 @@
name: "Build Web"
on:
push:
branches:
- web
- wahoo_kickr_bike_shift
- main
paths:
- '.github/workflows/web.yml'
- 'lib/**'
- 'accessibility/**'
- 'keypress_simulator/**'
- 'pubspec.yaml'
jobs:
build:
name: Build Web
runs-on: macos-latest
permissions:
id-token: write
pages: write
contents: write
steps:
#1 Checkout Repository
- name: Checkout Repository
uses: actions/checkout@v3
#3 Setup Flutter
- name: Set Up Flutter
uses: subosito/flutter-action@v2
with:
channel: 'stable'
#4 Install Dependencies
- name: Install Dependencies
run: flutter pub get
- name: Build Web
run: flutter build web --release --base-href "/swiftcontrol/"
- name: Upload static files as artifact
id: deployment
uses: actions/upload-pages-artifact@v3
with:
path: build/web
- name: Web Deploy
uses: actions/deploy-pages@v4

2
.gitignore vendored
View File

@@ -45,3 +45,5 @@ app.*.map.json
/android/app/debug
/android/app/profile
/android/app/release
service-account.json

23
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,23 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "swiftcontrol",
"request": "launch",
"type": "dart"
},
{
"name": "swiftcontrol (profile mode)",
"request": "launch",
"type": "dart",
"flutterMode": "profile"
},
{
"name": "swiftcontrol (release mode)",
"request": "launch",
"type": "dart",
"flutterMode": "release"
}
]
}

View File

@@ -1,3 +1,64 @@
### 3.1.0 (2025-10-17)
- new app icon
- adjusted MyWhoosh keyboard navigation mapping (thanks @bin101)
- support for Wahook Kickr Bike Shift (thanks @MattW2)
- initial support for Elite Square Smart Frame
### 3.0.3 (2025-10-12)
- SwiftControl now supports iOS!
- Note that you can't run SwiftControl and your trainer app on the same iPhone due to iOS limitations but...:
- You can now use SwiftControl as "remote control" for other devices, such as an iPad. Example scenario:
- your phone (Android/iOS) runs SwiftControl and connects to your Click devices
- your iPad or other tablet runs e.g. MyWhoosh (does not need to have SwiftControl installed)
- after pairing SwiftControl to your iPad / tablet via Bluetooth your phone will send the button presses to your iPad / tablet
- Ride: analog paddles are now supported thanks to contributor @jmoro
- you can now zoom in and out in the Keymap customization screen
### 2.6.3 (2025-10-01)
- fix a few issues with the new touch placement feature
- add a workaround for Zwift Click V2 which resets the device when button events are no longer sent
- fix issue on Android and Desktop where only a "touch down" was sent, but no "touch up"
- improve UI when handling custom keymaps around the edges of the screen
### 2.6.0 (2025-09-30)
- refactor touch placements: show touches on screen, fix misplaced coordinates - should fix #64
- show firmware version of connected device
- Fix crashes on some Android devices
- warn the user how to make Zwift Click V2 work properly
- many UI improvements
- add setting to enable or disable vibration on button press for Zwift Ride and Zwift Play controllers
### 2.5.0 (2025-09-25)
- Improve usability
- SwiftControl is now available via the Play Store: https://play.google.com/store/apps/details?id=de.jonasbark.swiftcontrol
- SwiftControl will continue to be available to download for free on GitHub
- contact me if you already donated and I'll get a voucher for you :)
### 2.4.0+1 (2025-09-17)
- Windows: fix mouse clicks at wrong location due to display scaling (fixes #64)
### 2.4.0 (2025-09-16)
- Show an overview of the keymap bindings
- Allow customizing an existing keymap
- Add more donation options
### 2.3.0 (2025-09-11)
- Add support for latest Zwift Click v2
### 2.2.0 (2025-09-08)
- Add Long Press Mode option for custom keymaps - buttons can now send sustained key presses instead of repeated taps, perfect for movement controls in games (fixes #61)
- Windows: adjust key sending method to improve compatibility with more apps (fixes #62)
### 2.1.0 (2025-07-03)
- Windows: automatically focus compatible training apps (MyWhoosh, IndieVelo, Biketerra) when sending keystrokes, enabling seamless multi-window usage
### 2.0.9 (2025-05-04)
- you can now assign Escape and arrow down key to your custom keymap (#18)
### 2.0.8 (2025-05-02)
- only use the light theme for the app
- more troubleshooting information
### 2.0.7 (2025-04-18)
- add Biketerra.com keymap
- some UX improvements

View File

@@ -1,10 +1,10 @@
# SwiftControl
<img src="logo.jpg" alt="SwiftControl Logo"/>
<img src="logo.png" alt="SwiftControl Logo"/>
## Description
With SwiftControl you can control your favorite trainer app using your Zwift Click, Zwift Ride or Zwift Play devices. Here's what you can do with it, depending on your configuration:
With SwiftControl you can **control your favorite trainer app** using your Zwift Click, Zwift Ride or Zwift Play devices. Here's what you can do with it, depending on your configuration:
- Virtual Gear shifting
- Steering / turning
- adjust workout intensity
@@ -18,43 +18,69 @@ https://github.com/user-attachments/assets/1f81b674-1628-4763-ad66-5f3ed7a3f159
## Downloads
Get the latest version here: https://github.com/jonasbark/swiftcontrol/releases
Check the compatibility matrix below!
<a href="https://play.google.com/store/apps/details?id=de.jonasbark.swiftcontrol"><img width="270" height="80" alt="GetItOnGooglePlay_Badge_Web_color_English" src="https://github.com/user-attachments/assets/a059d5a1-2efb-4f65-8117-ef6a99823b21" /></a>
<a href="https://apps.apple.com/us/app/swiftcontrol/id6753721284?platform=iphone"><img width="270" height="80" alt="App Store" src="https://github.com/user-attachments/assets/c23f977a-48f6-4951-811e-ae530dbfa014" /></a>
<a href="https://apps.apple.com/us/app/swiftcontrol/id6753721284?platform=mac"><img width="270" height="80" alt="Mac App Store" src="https://github.com/user-attachments/assets/b3552436-409c-43b0-ba7d-b6a72ae30ff1" /></a>
Get the latest version for Windows here: https://github.com/jonasbark/swiftcontrol/releases
## Supported Apps
- MyWhoosh
- indieVelo / Training Peaks
- Biketerra.com
- any other:
- Android: you can customize simulated touch points of all your buttons in the app
- Desktop: you can customize keyboard shortcuts and mouse clicks in the app
- TrainingPeaks Virtual / indieVelo
- Biketerra.com (they do offer native integration already - check it out)
- Rouvy (most Zwift devices are already supported by Rouvy)
- any other! You can add custom mapping and adjust touch points or keyboard shortcuts to your liking
## Supported Devices
- Zwift Click
- Zwift Click v2 (mostly, see issue #68)
- Zwift Ride
- Zwift Play
- Elite Square Smart Frame (beta)
- Wahoo Kickr Bike Shift (beta)
## Supported Platforms
- Android
- macOS
- Windows
- make sure you have installed the "[Microsoft Visual C++ Runtime libraries](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170)"
- Windows may flag the app as virus. I think it does so because the app does control the mouse and keyboard.
- [Web](https://jonasbark.github.io/swiftcontrol/) (you won't be able to do much)
Follow this compatibility matrix. It all depends on where you want to run your trainer app (e.g. MyWhoosh on):
| Run Trainer app (MyWhoosh, ...) on: | Possible | Link | Information |
|-------------------------------------------------------------|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Android | ✅ | <a href="https://play.google.com/store/apps/details?id=de.jonasbark.swiftcontrol"><img width="270" height="80" alt="GetItOnGooglePlay_Badge_Web_color_English" src="https://github.com/user-attachments/assets/a059d5a1-2efb-4f65-8117-ef6a99823b21" /></a> | |
| iPad | ✅ | <a href="https://apps.apple.com/us/app/swiftcontrol/id6753721284?platform=iphone"><img width="270" height="80" alt="App Store" src="https://github.com/user-attachments/assets/c23f977a-48f6-4951-811e-ae530dbfa014" /></a> | You will need to use SwiftControl as a "remote" to control the trainer app on your iPad. Typically you would use an iPhone or an Android phone for that. |
| Windows | ✅ | [Get it here](https://github.com/jonasbark/swiftcontrol/releases) | - Windows may flag the app as virus. It likely does so because the app controls the mouse and keyboard.<br>- Bluetooth connection unstable? You may need to use an [external Bluetooth adapter](https://github.com/jonasbark/swiftcontrol/issues/14#issuecomment-3193839509).<br>- Make sure your Zwift device is not paired with Windows Bluetooth settings: [more information](https://github.com/jonasbark/swiftcontrol/issues/70). |
| macOS | ✅ | <a href="https://apps.apple.com/us/app/swiftcontrol/id6753721284?platform=mac"><img width="270" height="80" alt="Mac App Store" src="https://github.com/user-attachments/assets/b3552436-409c-43b0-ba7d-b6a72ae30ff1" /></a> | |
| iPhone | ❌ | <a href="https://apps.apple.com/us/app/swiftcontrol/id6753721284?platform=iphone"><img width="270" height="80" alt="App Store" src="https://github.com/user-attachments/assets/c23f977a-48f6-4951-811e-ae530dbfa014" /></a> | Note that you can't run SwiftControl and your trainer app on the same iPhone due to iOS limitations, but you can use it to remotely control MyWhoosh and similar on e.g. an iPad. |
| Apple TV | ❌ | | Apple TV does not support touch inputs. Instead you can use e.g. SwiftControl with MyWhoosh Link to control your session |
For testing purposes you can also run it on [Web](https://jonasbark.github.io/swiftcontrol/) but this is just a tech demo - you won't be able to control other apps.
## Troubleshooting
Your Zwift device is found but connection does not work properly? You may need to update the firmware in Zwift Companion app.
Check the troubleshooting guide [here](TROUBLESHOOTING.md).
## How does it work?
The app connects to your Zwift device automatically.
The app connects to your Zwift devices automatically. It does not connect to your trainer itself.
- When using Android a "click" on a certain part of the screen is simulated to trigger the action.
- When using macOS or Windows a keyboard or mouse click is used to trigger the action.
- there are predefined Keymaps for MyWhoosh and indieVelo / Training Peaks
- **Android**: SwiftControl uses the AccessibilityService API to simulate touch gestures on specific parts of your screen to trigger actions in training apps. The service monitors which training app window is currently active to ensure gestures are sent to the correct app.
- **iOS**: use SwiftControl as "remote control" for other devices, such as an iPad. Example scenario:
- your phone (Android/iOS) runs SwiftControl and connects to your Zwift devices
- your iPad or other tablet runs e.g. MyWhoosh (does not need to have SwiftControl installed)
- after pairing SwiftControl to your iPad / tablet via Bluetooth your phone will send the button presses to your iPad / tablet
- **macOS** / **Windows** a keyboard or mouse click is used to trigger the action.
- there are predefined Keymaps for MyWhoosh, indieVelo / Training Peaks, and others
- you can also create your own Keymaps for any other app
- you can also use the mouse to click on a certain part of the screen, or use keyboard shortcuts
</details>
## Alternatives
- [qdomyos-zwift](https://www.qzfitness.com/) directly controls the trainer (as opposed to controlling the trainer app). This can be useful if your trainer app does not support virtual shifting.
## Donate
Please consider donating to support the development of this app :)
[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/boni)
- [via PayPal](https://paypal.me/boni)
- [via Credit Card, Google Pay, Apple Pay, etc (USD)](https://donate.stripe.com/8x24gzc5c4ZE3VJdt36J201)
- [via Credit Card, Google Pay, Apple Pay, etc (EUR)](https://donate.stripe.com/9B6aEX0muajY8bZ1Kl6J200)

31
TROUBLESHOOTING.md Normal file
View File

@@ -0,0 +1,31 @@
## Click device cannot be found
You may need to update the firmware in Zwift Companion app.
## Click device does not send any data
You may need to update the firmware in Zwift Companion app.
## My Click v2 disconnects after a minute
Check [this](https://github.com/jonasbark/swiftcontrol/issues/68) discussion.
To make your Click V2 work best you should connect it in the Zwift app once each day.
If you don't do that SwiftControl will need to reconnect every minute.
1. Open Zwift app (not the Companion)
2. Log in (subscription not required) and open the device connection screen
3. Connect your Trainer, then connect the Click V2
4. Close the Zwift app again and connect again in SwiftControl
## Remote control is not working - nothing happens
- Try to unpair it from your phone / computer Bluetooth settings, then re-pair it.
- Try restarting the pairing process in SwiftControl
- try restarting Bluetooth on your phone and on the device you want to control
- If your other device is an iOS device, go to Settings > Accessibility > Touch > AssistiveTouch > Pointer Devices > Devices and pair your device. Make sure AssistiveTouch is enabled.
- it is very important that both devices (e.g. iPhone and iPad) receive the "pairing dialog" after initial connection. If you miss it, unpair and try again. It may take a few seconds for the dialog to appear. Afterwards you may need to click on "Reconnect" in SwiftControl / restart SwiftControl.
## Remote control only clicks on a single coordinate on my iPad
iOS seems to be buggy here - try this in the iOS settings:
AssistiveTouch settings > Pointer Devices > Devices > Connected Devices > iPhone (or SwiftControl iOS) > Button 1
switch the setting to None, then back to Single-Tap and it should work again
## SwiftControl crashes on Windows when searching for the device
You're probably running into [this](https://github.com/jonasbark/swiftcontrol/issues/70) issue. Disconnect your controller device (e.g. Zwift Play) from Windows Bluetooth settings.

View File

@@ -4,7 +4,12 @@
import android.util.Log
import io.flutter.plugin.common.*
import io.flutter.plugin.common.BasicMessageChannel
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.EventChannel
import io.flutter.plugin.common.MessageCodec
import io.flutter.plugin.common.StandardMethodCodec
import io.flutter.plugin.common.StandardMessageCodec
import java.io.ByteArrayOutputStream
import java.nio.ByteBuffer
@@ -134,7 +139,7 @@ val AccessibilityApiPigeonMethodCodec = StandardMethodCodec(AccessibilityApiPige
interface Accessibility {
fun hasPermission(): Boolean
fun openPermissions()
fun performTouch(x: Double, y: Double)
fun performTouch(x: Double, y: Double, isKeyDown: Boolean, isKeyUp: Boolean)
fun controlMedia(action: MediaAction)
companion object {
@@ -184,8 +189,10 @@ interface Accessibility {
val args = message as List<Any?>
val xArg = args[0] as Double
val yArg = args[1] as Double
val isKeyDownArg = args[2] as Boolean
val isKeyUpArg = args[3] as Boolean
val wrapped: List<Any?> = try {
api.performTouch(xArg, yArg)
api.performTouch(xArg, yArg, isKeyDownArg, isKeyUpArg)
listOf(null)
} catch (exception: Throwable) {
wrapError(exception)
@@ -235,9 +242,9 @@ private class AccessibilityApiPigeonStreamHandler<T>(
}
interface AccessibilityApiPigeonEventChannelWrapper<T> {
fun onListen(p0: Any?, sink: PigeonEventSink<T>) {}
open fun onListen(p0: Any?, sink: PigeonEventSink<T>) {}
fun onCancel(p0: Any?) {}
open fun onCancel(p0: Any?) {}
}
class PigeonEventSink<T>(private val sink: EventChannel.EventSink) {
@@ -253,7 +260,7 @@ class PigeonEventSink<T>(private val sink: EventChannel.EventSink) {
sink.endOfStream()
}
}
abstract class StreamEventsStreamHandler : AccessibilityApiPigeonEventChannelWrapper<WindowEvent> {
companion object {
fun register(messenger: BinaryMessenger, streamHandler: StreamEventsStreamHandler, instanceName: String = "") {
@@ -266,4 +273,4 @@ abstract class StreamEventsStreamHandler : AccessibilityApiPigeonEventChannelWra
}
}
}

View File

@@ -51,23 +51,27 @@ class AccessibilityPlugin: FlutterPlugin, Accessibility {
}, Bundle.EMPTY)
}
override fun performTouch(x: Double, y: Double) {
Observable.toService?.performTouch(x = x, y = y) ?: error("Service not running")
override fun performTouch(x: Double, y: Double, isKeyDown: Boolean, isKeyUp: Boolean) {
Observable.toService?.performTouch(x = x, y = y, isKeyUp = isKeyUp, isKeyDown = isKeyDown) ?: error("Service not running")
}
override fun controlMedia(action: MediaAction) {
val audioService = context.getSystemService(Context.AUDIO_SERVICE) as android.media.AudioManager
when (action) {
MediaAction.PLAY_PAUSE -> {
audioService.dispatchMediaKeyEvent(android.view.KeyEvent(android.view.KeyEvent.ACTION_DOWN, android.view.KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE))
audioService.dispatchMediaKeyEvent(android.view.KeyEvent(android.view.KeyEvent.ACTION_UP, android.view.KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE))
audioService.dispatchMediaKeyEvent(android.view.KeyEvent(android.view.KeyEvent.ACTION_DOWN, android.view.KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE))
audioService.dispatchMediaKeyEvent(android.view.KeyEvent(android.view.KeyEvent.ACTION_UP, android.view.KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE))
}
MediaAction.NEXT -> {
audioService.dispatchMediaKeyEvent(android.view.KeyEvent(android.view.KeyEvent.ACTION_DOWN, android.view.KeyEvent.KEYCODE_MEDIA_NEXT))
audioService.dispatchMediaKeyEvent(android.view.KeyEvent(android.view.KeyEvent.ACTION_UP, android.view.KeyEvent.KEYCODE_MEDIA_NEXT))
audioService.dispatchMediaKeyEvent(android.view.KeyEvent(android.view.KeyEvent.ACTION_DOWN, android.view.KeyEvent.KEYCODE_MEDIA_NEXT))
audioService.dispatchMediaKeyEvent(android.view.KeyEvent(android.view.KeyEvent.ACTION_UP, android.view.KeyEvent.KEYCODE_MEDIA_NEXT))
}
MediaAction.VOLUME_DOWN -> {
audioService.adjustVolume(android.media.AudioManager.ADJUST_LOWER, android.media.AudioManager.FLAG_SHOW_UI)
}
MediaAction.VOLUME_UP -> {
audioService.adjustVolume(android.media.AudioManager.ADJUST_RAISE, android.media.AudioManager.FLAG_SHOW_UI)
}
MediaAction.VOLUME_DOWN -> audioService.adjustVolume(android.media.AudioManager.ADJUST_LOWER, android.media.AudioManager.FLAG_SHOW_UI)
MediaAction.VOLUME_UP -> audioService.adjustVolume(android.media.AudioManager.ADJUST_RAISE, android.media.AudioManager.FLAG_SHOW_UI)
}
}

View File

@@ -41,27 +41,24 @@ class AccessibilityService : AccessibilityService(), Listener {
private fun getWindowSize(): Rect {
val outBounds = Rect()
rootInActiveWindow.getBoundsInScreen(outBounds)
rootInActiveWindow?.getBoundsInScreen(outBounds)
return outBounds
}
private fun simulateTap(x: Double, y: Double) {
val gestureBuilder = GestureDescription.Builder()
val path = Path()
path.moveTo(x.toFloat(), y.toFloat())
path.lineTo(x.toFloat()+1, y.toFloat())
val stroke = StrokeDescription(path, 0, ViewConfiguration.getTapTimeout().toLong())
gestureBuilder.addStroke(stroke)
dispatchGesture(gestureBuilder.build(), null, null)
}
override fun onInterrupt() {
Log.d("AccessibilityService", "Service Interrupted")
}
override fun performTouch(x: Double, y: Double) {
simulateTap(x, y)
override fun performTouch(x: Double, y: Double, isKeyDown: Boolean, isKeyUp: Boolean) {
val gestureBuilder = GestureDescription.Builder()
val path = Path()
path.moveTo(x.toFloat(), y.toFloat())
path.lineTo(x.toFloat()+1, y.toFloat())
val stroke = StrokeDescription(path, 0, ViewConfiguration.getTapTimeout().toLong(), isKeyDown && !isKeyUp)
gestureBuilder.addStroke(stroke)
dispatchGesture(gestureBuilder.build(), null, null)
}
}

View File

@@ -8,9 +8,9 @@ object Observable {
}
interface Listener {
fun performTouch(x: Double, y: Double)
fun performTouch(x: Double, y: Double, isKeyDown: Boolean, isKeyUp: Boolean)
}
interface Receiver {
fun onChange(packageName: String, window: Rect)
}
}

View File

@@ -6,7 +6,7 @@ abstract class Accessibility {
void openPermissions();
void performTouch(double x, double y);
void performTouch(double x, double y, {bool isKeyDown = true, bool isKeyUp = false});
void controlMedia(MediaAction action);
}

View File

@@ -187,14 +187,14 @@ class Accessibility {
}
}
Future<void> performTouch(double x, double y) async {
Future<void> performTouch(double x, double y, {bool isKeyDown = true, bool isKeyUp = false, }) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.accessibility.Accessibility.performTouch$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[x, y]);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[x, y, isKeyDown, isKeyUp]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {

View File

@@ -23,6 +23,10 @@ linter:
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
- require_trailing_commas
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options
formatter:
page_width: 120
trailing_commas: preserve

View File

@@ -14,7 +14,7 @@ val keystoreProperties = Properties()
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
android {
namespace = "de.jonasbark.swift_play"
namespace = "de.jonasbark.swiftcontrol"
compileSdk = flutter.compileSdkVersion
ndkVersion = "27.0.12077973"
@@ -32,7 +32,7 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "de.jonasbark.swift_play"
applicationId = "de.jonasbark.swiftcontrol"
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = 24

View File

@@ -1,7 +1,9 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
<!-- Allow Bluetooth -->
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE"/>
<!-- New Bluetooth permissions in Android 12
https://developer.android.com/about/versions/12/features/bluetooth-permissions -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
@@ -16,7 +18,7 @@
<!-- legacy for Android 9 or lower -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="28" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="28" tools:replace="android:maxSdkVersion" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<!-- to check if you have the latest version -->

View File

@@ -1,4 +1,4 @@
package de.jonasbark.swift_play
package de.jonasbark.swiftcontrol
import io.flutter.embedding.android.FlutterActivity

View File

@@ -4,9 +4,9 @@
<item android:drawable="?android:colorBackground" />
<!-- You can insert your own image assets here -->
<!-- <item>
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
android:src="@mipmap/ic_launcher" />
</item>
</layer-list>

View File

@@ -4,9 +4,9 @@
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
android:src="@mipmap/ic_launcher" />
</item>
</layer-list>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
<monochrome android:drawable="@mipmap/ic_launcher_monochrome"/>
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

View File

@@ -18,8 +18,8 @@ pluginManagement {
plugins {
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
id("com.android.application") version "8.7.0" apply false
id("org.jetbrains.kotlin.android") version "1.8.22" apply false
id("com.android.application") version "8.7.3" apply false
id("org.jetbrains.kotlin.android") version "2.2.20" apply false
}
include(":app")

View File

@@ -1,32 +0,0 @@
# flutter pub run flutter_launcher_icons
flutter_launcher_icons:
image_path: "icon.png"
android: "ic_launcher"
# image_path_android: "assets/icon/icon.png"
min_sdk_android: 24 # android min sdk min:16, default 21
# adaptive_icon_background: "assets/icon/background.png"
# adaptive_icon_foreground: "assets/icon/foreground.png"
# adaptive_icon_monochrome: "assets/icon/monochrome.png"
ios: false
# image_path_ios: "assets/icon/icon.png"
remove_alpha_channel_ios: true
# image_path_ios_dark_transparent: "assets/icon/icon_dark.png"
# image_path_ios_tinted_grayscale: "assets/icon/icon_tinted.png"
# desaturate_tinted_to_grayscale_ios: true
web:
generate: true
image_path: "icon.png"
background_color: "#ffffff"
theme_color: "#ffffff"
windows:
generate: true
image_path: "icon.png"
icon_size: 48 # min:48, max:256, default: 48
macos:
generate: true
image_path: "icon.png"

BIN
icon.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 555 KiB

29
ios/ExportOptions.plist Normal file
View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>destination</key>
<string>export</string>
<key>generateAppStoreInformation</key>
<false/>
<key>manageAppVersionAndBuildNumber</key>
<true/>
<key>method</key>
<string>app-store-connect</string>
<key>signingStyle</key>
<string>manual</string>
<key>provisioningProfiles</key>
<dict>
<key>de.jonasbark.swiftcontrol.darwin</key>
<string>ios app store</string>
</dict>
<key>stripSwiftSymbols</key>
<true/>
<key>teamID</key>
<string>UZRHKPVWN9</string>
<key>testFlightInternalTestingOnly</key>
<false/>
<key>uploadSymbols</key>
<true/>
</dict>
</plist>

View File

@@ -21,6 +21,6 @@
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>12.0</string>
<string>13.0</string>
</dict>
</plist>

View File

@@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project
# platform :ios, '12.0'
# platform :ios, '13.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'

85
ios/Podfile.lock Normal file
View File

@@ -0,0 +1,85 @@
PODS:
- bluetooth_low_energy_darwin (0.0.1):
- Flutter
- FlutterMacOS
- device_info_plus (0.0.1):
- Flutter
- Flutter (1.0.0)
- flutter_local_notifications (0.0.1):
- Flutter
- image_picker_ios (0.0.1):
- Flutter
- package_info_plus (0.4.5):
- Flutter
- permission_handler_apple (9.3.0):
- Flutter
- restart_app (0.0.1):
- Flutter
- shared_preferences_foundation (0.0.1):
- Flutter
- FlutterMacOS
- universal_ble (0.0.1):
- Flutter
- FlutterMacOS
- url_launcher_ios (0.0.1):
- Flutter
- wakelock_plus (0.0.1):
- Flutter
DEPENDENCIES:
- bluetooth_low_energy_darwin (from `.symlinks/plugins/bluetooth_low_energy_darwin/darwin`)
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
- Flutter (from `Flutter`)
- flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
- restart_app (from `.symlinks/plugins/restart_app/ios`)
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
- universal_ble (from `.symlinks/plugins/universal_ble/darwin`)
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
- wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`)
EXTERNAL SOURCES:
bluetooth_low_energy_darwin:
:path: ".symlinks/plugins/bluetooth_low_energy_darwin/darwin"
device_info_plus:
:path: ".symlinks/plugins/device_info_plus/ios"
Flutter:
:path: Flutter
flutter_local_notifications:
:path: ".symlinks/plugins/flutter_local_notifications/ios"
image_picker_ios:
:path: ".symlinks/plugins/image_picker_ios/ios"
package_info_plus:
:path: ".symlinks/plugins/package_info_plus/ios"
permission_handler_apple:
:path: ".symlinks/plugins/permission_handler_apple/ios"
restart_app:
:path: ".symlinks/plugins/restart_app/ios"
shared_preferences_foundation:
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
universal_ble:
:path: ".symlinks/plugins/universal_ble/darwin"
url_launcher_ios:
:path: ".symlinks/plugins/url_launcher_ios/ios"
wakelock_plus:
:path: ".symlinks/plugins/wakelock_plus/ios"
SPEC CHECKSUMS:
bluetooth_low_energy_darwin: 764d8d1ae5abefbcdb839e812b4b25c0061fcf8b
device_info_plus: bf2e3232933866d73fe290f2942f2156cdd10342
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
flutter_local_notifications: ff50f8405aaa0ccdc7dcfb9022ca192e8ad9688f
image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1
package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
restart_app: 806659942bf932f6ce51c5372f91ce5e81c8c14a
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
universal_ble: cf52a7b3fd2e7c14d6d7262e9fdadb72ab6b88a6
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
wakelock_plus: 76957ab028e12bfa4e66813c99e46637f367fc7e
PODFILE CHECKSUM: 3c63482e143d1b91d2d2560aee9fb04ecc74ac7e
COCOAPODS: 1.16.2

View File

@@ -10,10 +10,12 @@
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
3E50CA021EFA25CF89FE46AB /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2C0E42A04700D6B661C7EE82 /* Pods_RunnerTests.framework */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
9DEFD285994D09CFCE400F36 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CE7ADD07A99710C0FB974A8 /* Pods_Runner.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -40,14 +42,20 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
0CF32F9ECDBEA4B014717FF8 /* 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 = "<group>"; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
2C0E42A04700D6B661C7EE82 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
5CE7ADD07A99710C0FB974A8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
7D133E5D5548E2EF2879734F /* 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 = "<group>"; };
86D436F6DAF367742EF27F51 /* 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 = "<group>"; };
8AA6D129479129F106E2298A /* 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 = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -55,19 +63,43 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
DFFDC4B9C4D6EF6A3BDE2E73 /* 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 = "<group>"; };
EFDECED99A47773C293F8819 /* 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 = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
5046C8DCA17DB268ED17F005 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
3E50CA021EFA25CF89FE46AB /* Pods_RunnerTests.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EB1CF9000F007C117D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
9DEFD285994D09CFCE400F36 /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
31E2F9ED567016937E8AEA3B /* Pods */ = {
isa = PBXGroup;
children = (
86D436F6DAF367742EF27F51 /* Pods-Runner.debug.xcconfig */,
0CF32F9ECDBEA4B014717FF8 /* Pods-Runner.release.xcconfig */,
7D133E5D5548E2EF2879734F /* Pods-Runner.profile.xcconfig */,
DFFDC4B9C4D6EF6A3BDE2E73 /* Pods-RunnerTests.debug.xcconfig */,
8AA6D129479129F106E2298A /* Pods-RunnerTests.release.xcconfig */,
EFDECED99A47773C293F8819 /* Pods-RunnerTests.profile.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
};
331C8082294A63A400263BE5 /* RunnerTests */ = {
isa = PBXGroup;
children = (
@@ -76,6 +108,15 @@
path = RunnerTests;
sourceTree = "<group>";
};
6A38311855DC1CB8C0E2FD04 /* Frameworks */ = {
isa = PBXGroup;
children = (
5CE7ADD07A99710C0FB974A8 /* Pods_Runner.framework */,
2C0E42A04700D6B661C7EE82 /* Pods_RunnerTests.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
@@ -94,6 +135,8 @@
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
331C8082294A63A400263BE5 /* RunnerTests */,
31E2F9ED567016937E8AEA3B /* Pods */,
6A38311855DC1CB8C0E2FD04 /* Frameworks */,
);
sourceTree = "<group>";
};
@@ -128,8 +171,10 @@
isa = PBXNativeTarget;
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
buildPhases = (
5E1D2B1ED00966C758CA2289 /* [CP] Check Pods Manifest.lock */,
331C807D294A63A400263BE5 /* Sources */,
331C807F294A63A400263BE5 /* Resources */,
5046C8DCA17DB268ED17F005 /* Frameworks */,
);
buildRules = (
);
@@ -145,12 +190,15 @@
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
AF2FDC69578083D4D16AB4D6 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
EEF1FBDEE98BA93C4FBDB3AE /* [CP] Embed Pods Frameworks */,
1F0C44A79AE73641A1C3FF47 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@@ -222,6 +270,23 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
1F0C44A79AE73641A1C3FF47 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
showEnvVarsInLog = 0;
};
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
@@ -238,6 +303,28 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
5E1D2B1ED00966C758CA2289 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
@@ -253,6 +340,45 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
AF2FDC69578083D4D16AB4D6 /* [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;
};
EEF1FBDEE98BA93C4FBDB3AE /* [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 */
@@ -346,7 +472,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@@ -361,16 +487,19 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 7BL8RUV2K6;
DEVELOPMENT_TEAM = UZRHKPVWN9;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = de.jonasbark.swiftPlay;
PRODUCT_BUNDLE_IDENTIFIER = de.jonasbark.swiftcontrol.darwin;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
@@ -379,6 +508,7 @@
};
331C8088294A63A400263BE5 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = DFFDC4B9C4D6EF6A3BDE2E73 /* Pods-RunnerTests.debug.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
@@ -396,6 +526,7 @@
};
331C8089294A63A400263BE5 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 8AA6D129479129F106E2298A /* Pods-RunnerTests.release.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
@@ -411,6 +542,7 @@
};
331C808A294A63A400263BE5 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = EFDECED99A47773C293F8819 /* Pods-RunnerTests.profile.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
@@ -428,7 +560,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -473,7 +605,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -485,7 +617,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -524,7 +656,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@@ -541,16 +673,19 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 7BL8RUV2K6;
DEVELOPMENT_TEAM = UZRHKPVWN9;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = de.jonasbark.swiftPlay;
PRODUCT_BUNDLE_IDENTIFIER = de.jonasbark.swiftcontrol.darwin;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
@@ -564,16 +699,19 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 7BL8RUV2K6;
DEVELOPMENT_TEAM = UZRHKPVWN9;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = de.jonasbark.swiftPlay;
PRODUCT_BUNDLE_IDENTIFIER = de.jonasbark.swiftcontrol.darwin;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";

View File

@@ -26,6 +26,7 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
@@ -54,6 +55,7 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"

View File

@@ -4,4 +4,7 @@
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 866 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@@ -1,122 +1,134 @@
{
"images" : [
"images": [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
"filename": "AppIcon@2x.png",
"idiom": "iphone",
"scale": "2x",
"size": "60x60"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
"filename": "AppIcon@3x.png",
"idiom": "iphone",
"scale": "3x",
"size": "60x60"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
"filename": "AppIcon~ipad.png",
"idiom": "ipad",
"scale": "1x",
"size": "76x76"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
"filename": "AppIcon@2x~ipad.png",
"idiom": "ipad",
"scale": "2x",
"size": "76x76"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
"filename": "AppIcon-83.5@2x~ipad.png",
"idiom": "ipad",
"scale": "2x",
"size": "83.5x83.5"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
"filename": "AppIcon-40@2x.png",
"idiom": "iphone",
"scale": "2x",
"size": "40x40"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
"filename": "AppIcon-40@3x.png",
"idiom": "iphone",
"scale": "3x",
"size": "40x40"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
"filename": "AppIcon-40~ipad.png",
"idiom": "ipad",
"scale": "1x",
"size": "40x40"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
"filename": "AppIcon-40@2x~ipad.png",
"idiom": "ipad",
"scale": "2x",
"size": "40x40"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
"scale" : "1x"
"filename": "AppIcon-20@2x.png",
"idiom": "iphone",
"scale": "2x",
"size": "20x20"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
"filename": "AppIcon-20@3x.png",
"idiom": "iphone",
"scale": "3x",
"size": "20x20"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
"filename": "AppIcon-20~ipad.png",
"idiom": "ipad",
"scale": "1x",
"size": "20x20"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
"filename": "AppIcon-20@2x~ipad.png",
"idiom": "ipad",
"scale": "2x",
"size": "20x20"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
"scale" : "1x"
"filename": "AppIcon-29.png",
"idiom": "iphone",
"scale": "1x",
"size": "29x29"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
"filename": "AppIcon-29@2x.png",
"idiom": "iphone",
"scale": "2x",
"size": "29x29"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
"scale" : "1x"
"filename": "AppIcon-29@3x.png",
"idiom": "iphone",
"scale": "3x",
"size": "29x29"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
"filename": "AppIcon-29~ipad.png",
"idiom": "ipad",
"scale": "1x",
"size": "29x29"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
"filename": "AppIcon-29@2x~ipad.png",
"idiom": "ipad",
"scale": "2x",
"size": "29x29"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
"filename": "AppIcon-60@2x~car.png",
"idiom": "car",
"scale": "2x",
"size": "60x60"
},
{
"filename": "AppIcon-60@3x~car.png",
"idiom": "car",
"scale": "3x",
"size": "60x60"
},
{
"filename": "AppIcon~ios-marketing.png",
"idiom": "ios-marketing",
"scale": "1x",
"size": "1024x1024"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"info": {
"author": "iconkitchen",
"version": 1
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 462 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 704 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 862 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 862 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 762 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

View File

@@ -1,23 +1,23 @@
{
"images" : [
{
"filename" : "AppIcon-min 2.png",
"idiom" : "universal",
"filename" : "LaunchImage.png",
"scale" : "1x"
},
{
"filename" : "AppIcon-min 1.png",
"idiom" : "universal",
"filename" : "LaunchImage@2x.png",
"scale" : "2x"
},
{
"filename" : "AppIcon-min.png",
"idiom" : "universal",
"filename" : "LaunchImage@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 B

View File

@@ -1,5 +0,0 @@
# Launch Screen Assets
You can customize the launch screen with your own desired assets by replacing the image files in this directory.
You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.

View File

@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="23504" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<device id="retina6_12" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
@@ -14,9 +16,11 @@
<viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
<rect key="frame" x="111.33333333333333" y="340.66666666666669" width="170.66666666666669" height="170.66666666666669"/>
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@@ -28,10 +32,10 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
<point key="canvasLocation" x="80.916030534351137" y="264.08450704225356"/>
</scene>
</scenes>
<resources>
<image name="LaunchImage" width="168" height="185"/>
<image name="LaunchImage" width="170.66667175292969" height="170.66667175292969"/>
</resources>
</document>

View File

@@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
@@ -24,6 +26,17 @@
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>SwiftControl uses Bluetooth to connect to accessories.</string>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UIBackgroundModes</key>
<array>
<string>bluetooth-peripheral</string>
<string>bluetooth-central</string>
</array>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
@@ -41,9 +54,5 @@
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
</dict>
</plist>

Some files were not shown because too many files have changed in this diff Show More