Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
720 commits
Select commit Hold shift + click to select a range
e8858e0
fix macOS new version check
jonasbark Oct 26, 2025
75eef49
initial support for gamepads
jonasbark Oct 26, 2025
dd73c32
refactoring #1
jonasbark Oct 26, 2025
1ff2a20
refactoring #3
jonasbark Oct 26, 2025
6bd41d9
refactoring #4
jonasbark Oct 26, 2025
ec2ed4e
refactoring #5
jonasbark Oct 26, 2025
fa4add6
store background image during touch editing, don't show auto rotation…
jonasbark Oct 26, 2025
a4d937c
resolve issue #135
jonasbark Oct 26, 2025
ca5d4ae
resolve issue #134
jonasbark Oct 26, 2025
823e04d
resolve issue #133 partially
jonasbark Oct 26, 2025
7eb2888
Merge branch 'main' into gamepads
jonasbark Oct 26, 2025
d10da94
adjust changelog and supported devices
jonasbark Oct 26, 2025
1a322dc
resolve issue #111
jonasbark Oct 26, 2025
bb5d149
Merge pull request #136 from jonasbark/gamepads
jonasbark Oct 26, 2025
4263375
fix scanning issue on web https://github.com/jonasbark/swiftcontrol/i…
jonasbark Oct 26, 2025
929409d
implement rssi
michidk Oct 26, 2025
90591cb
Merge pull request #137 from michidk/rssi
jonasbark Oct 26, 2025
2e95fb5
don't reset in debug mode
jonasbark Oct 26, 2025
7380bb5
Merge branch 'main' of github.com:jonasbark/swiftcontrol
jonasbark Oct 26, 2025
916b1ec
cleanup
jonasbark Oct 26, 2025
d5260d8
fix issues in #135
jonasbark Oct 26, 2025
e8ca3fc
use clipboard again when sharing
jonasbark Oct 27, 2025
fec13d0
show custom keymap hint for gamepads
jonasbark Oct 27, 2025
80ef81c
allow disconnection of bluetooth device
jonasbark Oct 27, 2025
4021f31
refactor connection with remote and controllers
jonasbark Oct 27, 2025
828aa70
implement MyWhoosh link in the editor
jonasbark Oct 27, 2025
bb1ae4e
cleanup, fixes
jonasbark Oct 27, 2025
2a09d55
Click V2 adjustments
jonasbark Oct 27, 2025
ed4f928
Click V2 adjustments
jonasbark Oct 27, 2025
ba60062
Bluetooth HID tests
jonasbark Oct 27, 2025
846dd07
fix UI, fix first button click not handled
jonasbark Oct 27, 2025
3718a12
fix keymap explanation not noticing when MyWhoosh Link is connected
jonasbark Oct 27, 2025
23aafcd
improve UI for MyWhoosh Link
jonasbark Oct 27, 2025
f0ec276
improve UI for buttons clicked without a keypair
jonasbark Oct 27, 2025
080409b
add trainer app selection during app start
jonasbark Oct 27, 2025
8c09b17
some bugfixes, UI adjustments
jonasbark Oct 28, 2025
1368d7d
zwift click emulation #1
jonasbark Oct 28, 2025
14aa6f7
zwift click emulation #2 (connection works)
jonasbark Oct 28, 2025
e1309d4
zwift click emulation #3 (connection works)
jonasbark Oct 28, 2025
74280ed
zwift click emulation #4 (command works)
jonasbark Oct 28, 2025
7e18a16
cleanup
jonasbark Oct 28, 2025
56d9e62
integration #1
jonasbark Oct 28, 2025
af2267c
allow action unassignment
jonasbark Oct 28, 2025
7c6335c
implement remaining Zwift actions
jonasbark Oct 29, 2025
796c973
clarify Zwift usage, make controller emulation optional
jonasbark Oct 30, 2025
fb3fe5f
add rouvy keymap and enable zwift controller emulation
jonasbark Oct 31, 2025
0b18d74
fix already paired gamepad detection
jonasbark Oct 31, 2025
d5c1b67
clarify bluetooth buttons
jonasbark Oct 31, 2025
41f4dd1
update changelog
jonasbark Oct 31, 2025
af6ae34
Update lib/bluetooth/devices/zwift/zwift_emulator.dart
jonasbark Oct 31, 2025
0320974
ux adjustments
jonasbark Oct 31, 2025
a7d5624
update mywhoosh profile
jonasbark Oct 31, 2025
926651e
zwift emulation rouvy support
jonasbark Oct 31, 2025
c3e8c46
Merge pull request #145 from jonasbark/zwift
jonasbark Oct 31, 2025
807d868
Initial plan
Copilot Oct 31, 2025
b7b6b98
Add MIUI device detection and warning for accessibility service
Copilot Oct 31, 2025
f94252e
Address code review feedback - improve comments and efficiency
Copilot Oct 31, 2025
f7e2a89
Move MIUI warning from requirements to DevicePage widget
Copilot Oct 31, 2025
246a1bd
Add dismiss button to MIUI warning with persistent state
Copilot Nov 1, 2025
7cbab39
Use AndroidActions type check instead of negated RemoteActions
Copilot Nov 1, 2025
8ea73bc
Update Windows Store version to 3.3.0
jonasbark Nov 1, 2025
6a2cf1a
Merge pull request #147 from jonasbark/copilot/fix-miui-service-issue
jonasbark Nov 1, 2025
302fc15
don't reset after a minute
jonasbark Nov 1, 2025
b0caf7c
UI adjustments
jonasbark Nov 1, 2025
1ec9b55
Initial plan
Copilot Nov 2, 2025
e46969c
Add CYCPLUS BC2 virtual shifter support
Copilot Nov 2, 2025
890f393
Merge pull request #151 from jonasbark/copilot/add-cycplus-bc2-support
jonasbark Nov 2, 2025
c815163
initial support for Shimano Di2 D-Fly channel buttons
jonasbark Nov 2, 2025
49e45fa
fix SwiftControl Web
jonasbark Nov 2, 2025
68f416d
fix SwiftControl Web, more generic battery and firmware version reads
jonasbark Nov 2, 2025
1f8f776
fix SwiftControl Web, more generic battery and firmware version reads
jonasbark Nov 2, 2025
010d0ed
UI adjustments
jonasbark Nov 2, 2025
eb85844
Merge branch 'main' of github.com:jonasbark/swiftcontrol
jonasbark Nov 2, 2025
8ac47cb
make Link / emulation UI clearer
jonasbark Nov 2, 2025
fa7d5e7
clarify pairing vs controller vs MyWhoosh Link
jonasbark Nov 2, 2025
c65369a
clarify pairing vs controller vs MyWhoosh Link
jonasbark Nov 2, 2025
2b25ba9
Merge remote-tracking branch 'origin/main'
jonasbark Nov 2, 2025
d95d0cf
exit app on Android to apply patch
jonasbark Nov 2, 2025
239630f
Fix formatting and grammar issues in README.md
jonasbark Nov 2, 2025
da62fc4
fix resetting keymap, show all touches by default
jonasbark Nov 3, 2025
ea17b2e
Merge remote-tracking branch 'origin/main'
jonasbark Nov 3, 2025
69dd5c8
detect media keys on macOS / iOS #1
jonasbark Nov 3, 2025
b72cc80
Clarify iOS, macOS, and Windows requirements
jonasbark Nov 3, 2025
8a3d644
version++
jonasbark Nov 3, 2025
ee48ce0
Merge remote-tracking branch 'origin/main'
jonasbark Nov 3, 2025
c511ac3
fix 'Exit' behavior on Android notification tap
jonasbark Nov 3, 2025
ac550fa
do not offer MyWhoosh Link when not compatible
jonasbark Nov 3, 2025
4498729
initial support for BLE HID device
jonasbark Nov 3, 2025
8668957
fix name
jonasbark Nov 3, 2025
a968723
update gitignore
jonasbark Nov 4, 2025
2bbc09b
Merge branch 'main' into feature/ble_hid
jonasbark Nov 4, 2025
c18ac16
support HID key events on Android #110
jonasbark Nov 4, 2025
820d0b3
allow to ignore HID device input
jonasbark Nov 4, 2025
baec8d2
fix detection of Sterzo devices https://github.com/jonasbark/swiftcon…
jonasbark Nov 4, 2025
1675d7f
bump version
jonasbark Nov 4, 2025
57961ae
bump version
jonasbark Nov 4, 2025
284d2ca
resolve yet another Sterzo issue https://github.com/jonasbark/swiftco…
jonasbark Nov 4, 2025
3188002
fix a few bugs and use some more clearer texts
jonasbark Nov 5, 2025
7bbdc6a
Initial plan
Copilot Nov 6, 2025
a27ae07
Fix DI2 button trigger on startup and add tests
Copilot Nov 6, 2025
ce94aea
Merge pull request #165 from jonasbark/copilot/fix-di-fly-button-trig…
jonasbark Nov 6, 2025
5f03c07
fix di2 initialization
jonasbark Nov 6, 2025
f15d975
Initial plan
Copilot Nov 7, 2025
c3afb23
Initial plan
Copilot Nov 7, 2025
35a995e
Add support for modifier keys in keyboard mapping
Copilot Nov 7, 2025
0b42f7e
Fix Elite Square button detection logic and add tests
Copilot Nov 7, 2025
66c548f
Refactor tests to reduce code duplication
Copilot Nov 7, 2025
6a3cc0f
Refactor: Extract helper methods to reduce code duplication
Copilot Nov 7, 2025
723f741
Improve test code quality and fix edge cases
Copilot Nov 7, 2025
cafb740
Refactor: Consolidate modifier key detection logic
Copilot Nov 7, 2025
7d7b1e8
Final implementation of modifier key support
Copilot Nov 7, 2025
807c0ea
Merge pull request #167 from jonasbark/copilot/support-elite-square-c…
jonasbark Nov 7, 2025
6c2fc54
Merge pull request #166 from jonasbark/copilot/add-keyboard-combinati…
jonasbark Nov 7, 2025
c66badf
Merge branch 'main' of github.com:jonasbark/swiftcontrol
jonasbark Nov 7, 2025
a9a13be
fix modifier detection
jonasbark Nov 7, 2025
0f4d190
prefill mail text when support is used
jonasbark Nov 7, 2025
8ad2906
Merge branch 'feature/ble_hid'
jonasbark Nov 7, 2025
7c74d61
Merge branch 'feature/mediabutton'
jonasbark Nov 7, 2025
d4881fa
code fix, update changelog and readme
jonasbark Nov 7, 2025
ab80d67
update Rouvy keymap
jonasbark Nov 7, 2025
d824cb6
integrate media_key_detector package, add iOS implementation #1
jonasbark Nov 7, 2025
80998c9
media key detection on iOS and macOS
jonasbark Nov 8, 2025
d7e7352
Merge branch 'feature/bluetoothmedia'
jonasbark Nov 8, 2025
efac0af
update changelog to include Rouvy keymap
jonasbark Nov 8, 2025
d36e031
Set release date for version 3.4.0
jonasbark Nov 8, 2025
8fc8f2d
increase version
jonasbark Nov 8, 2025
6f5c6bf
Merge remote-tracking branch 'origin/main'
jonasbark Nov 8, 2025
66486ec
make Di2 custom keymap requirement clearer #170
jonasbark Nov 8, 2025
c36a025
Aktualisieren von WINDOWS_STORE_VERSION.txt
jonasbark Nov 8, 2025
c529fee
fix execution on Web
jonasbark Nov 8, 2025
a806a62
Merge remote-tracking branch 'origin/main'
jonasbark Nov 8, 2025
231aadb
detect media key source - don't handle it when coming from phone #110
jonasbark Nov 8, 2025
01744c2
attempt to improve UX
jonasbark Nov 8, 2025
dde3f38
Initial plan
Copilot Nov 9, 2025
859424b
Initial plan
Copilot Nov 9, 2025
df2496e
Add changelog to GitHub release body
Copilot Nov 9, 2025
647dac9
Add interactive landing page with compatibility checker
Copilot Nov 9, 2025
ee64b18
Refactor: reuse get_latest_changelog.sh output
Copilot Nov 9, 2025
2334a88
Merge pull request #174 from jonasbark/copilot/add-changelog-to-releases
jonasbark Nov 9, 2025
dd85e99
Update landing page per feedback: blue background, black headings, re…
Copilot Nov 9, 2025
4183ede
Updated .gitignore
jonasbark Nov 9, 2025
4e646ab
add dark mode, logs to the support entry, link to new landing page
jonasbark Nov 9, 2025
d30485b
add a clarifying selection to help users choose where SwiftControl sh…
jonasbark Nov 9, 2025
f7ed426
cleanup
jonasbark Nov 9, 2025
e7ea01c
Merge branch 'copilot/create-landing-page-for-apps'
jonasbark Nov 9, 2025
d15f1dd
Merge branch 'main' of github.com:jonasbark/swiftcontrol
jonasbark Nov 9, 2025
33ccdbd
a few fixes
jonasbark Nov 9, 2025
1784e00
a few fixes
jonasbark Nov 9, 2025
2b106fd
change mail address
jonasbark Nov 9, 2025
b06e9ad
Initial plan
Copilot Nov 11, 2025
1a9a265
Add screenshot packaging and release attachment to build workflow
Copilot Nov 11, 2025
aeae148
Implement dynamic screenshot generation during build pipeline
Copilot Nov 11, 2025
4daf553
Add documentation for screenshot generation process
Copilot Nov 11, 2025
69f47fa
bluetooth naming
jonasbark Nov 11, 2025
513b2ba
screenshot creation #1
jonasbark Nov 11, 2025
308f461
show to user when MyWhoosh Link can't be started, cleanup
jonasbark Nov 12, 2025
8192d3a
show to user when MyWhoosh Link can't be started, cleanup
jonasbark Nov 12, 2025
a57f465
possible fix for https://github.com/jonasbark/swiftcontrol/issues/180…
jonasbark Nov 12, 2025
a4949ad
error handling
jonasbark Nov 12, 2025
7c1cee6
Initial plan
Copilot Nov 13, 2025
1f89859
Implement persistent ignored devices feature
Copilot Nov 13, 2025
a53fb57
Fix disconnect logic and improve UI flow
Copilot Nov 13, 2025
50d9f47
potential fix for https://github.com/jonasbark/swiftcontrol/issues/183
jonasbark Nov 14, 2025
c16a593
potential fix for https://github.com/jonasbark/swiftcontrol/issues/183
jonasbark Nov 14, 2025
aaeaec3
Initial plan
Copilot Nov 14, 2025
e10e22d
Add support for 0xfe button codes in CYCPLUS BC2 device
Copilot Nov 14, 2025
5cc9ac8
attempt to handle https://github.com/jonasbark/swiftcontrol/issues/179
jonasbark Nov 14, 2025
910f23a
Merge branch 'copilot/fix-cycplus-bc2-button-logic'
jonasbark Nov 14, 2025
b395254
Fix grammar and formatting in README.md
jonasbark Nov 14, 2025
aee8dc2
Make getIgnoredDeviceIds and getIgnoredDeviceNames private
Copilot Nov 15, 2025
3bde90a
Merge pull request #182 from jonasbark/copilot/fix-ble-device-reconne…
jonasbark Nov 15, 2025
de740f6
Initial plan
Copilot Nov 15, 2025
8e760ef
more error checking
jonasbark Nov 15, 2025
124e005
Merge branch 'main' of github.com:jonasbark/swiftcontrol
jonasbark Nov 15, 2025
80061fd
Update Cycplus BC2 implementation to match reference
Copilot Nov 15, 2025
bb7484f
Merge pull request #185 from jonasbark/copilot/update-cycplus-bc2-imp…
jonasbark Nov 15, 2025
ab3ef7b
resolve #186
jonasbark Nov 15, 2025
f240615
Merge branch 'copilot/update-cycplus-bc2-implementation'
jonasbark Nov 15, 2025
020b91f
Merge branch 'main' of github.com:jonasbark/swiftcontrol
jonasbark Nov 15, 2025
d0ec785
remove settings file when corrupted #180
jonasbark Nov 16, 2025
79613bc
resolve issue #179
jonasbark Nov 16, 2025
1e8bd61
update changelog
jonasbark Nov 16, 2025
0339089
version++
jonasbark Nov 16, 2025
e5dae22
Merge branch 'main' into copilot/add-screenshots-to-release
jonasbark Nov 16, 2025
74e098e
adjust integration tests
jonasbark Nov 16, 2025
1d4947b
windows build fix
jonasbark Nov 16, 2025
b9ac193
windows build fix
jonasbark Nov 16, 2025
a9b43bd
windows build fix
jonasbark Nov 16, 2025
9ea4f71
some possible fixes
jonasbark Nov 16, 2025
fb1ffec
version++
jonasbark Nov 16, 2025
b3ffe86
version++
jonasbark Nov 16, 2025
748a21f
small refactoring
jonasbark Nov 17, 2025
cb10ad6
Merge branch 'main' into copilot/add-screenshots-to-release
jonasbark Nov 17, 2025
99ee63c
more work on screenshots
jonasbark Nov 17, 2025
46d3770
more work on screenshots
jonasbark Nov 17, 2025
a9ee0dc
fix unit tests
jonasbark Nov 17, 2025
bbd95be
add bluetooth device detection unit test
jonasbark Nov 17, 2025
4db985e
screenshot adjustments
jonasbark Nov 17, 2025
55a2e4d
Clarify device troubleshooting headings
jonasbark Nov 17, 2025
98d683a
Merge remote-tracking branch 'origin/main'
jonasbark Nov 18, 2025
aa6782d
Merge branch 'copilot/add-screenshots-to-release'
jonasbark Nov 18, 2025
5d99601
update rouvy keymap to support their latest version
jonasbark Nov 18, 2025
9894271
Update Windows Store version to 3.5.0
jonasbark Nov 18, 2025
ab53d23
add keyboard controls to Rouvys virtual shifting
jonasbark Nov 18, 2025
7ca9c87
Merge remote-tracking branch 'origin/main'
jonasbark Nov 18, 2025
4adfe08
fix compatibility checks on this device on iOS devices
jonasbark Nov 20, 2025
17d7953
Initial plan
Copilot Nov 20, 2025
4595e50
Add predefined action selector for custom keymaps
Copilot Nov 20, 2025
8be2108
Address code review feedback - improve type checking and readability
Copilot Nov 20, 2025
0490956
Apply performance optimizations with const widgets
Copilot Nov 20, 2025
7199f5b
Use current trainer app's keymap instead of showing dialog
Copilot Nov 20, 2025
cf66845
Address code review feedback - improve list copying and clarify key f…
Copilot Nov 20, 2025
daec33f
Handle empty actions list and simplify key label logic
Copilot Nov 20, 2025
a1fad50
Optimize to avoid redundant settings.getTrainerApp() calls
Copilot Nov 20, 2025
f7c57b1
Merge pull request #192 from jonasbark/copilot/add-predefined-actions…
jonasbark Nov 20, 2025
e233932
Merge branch 'main' of github.com:jonasbark/swiftcontrol
jonasbark Nov 20, 2025
e63e647
better formatting
jonasbark Nov 20, 2025
faff8ab
adjust changelog
jonasbark Nov 21, 2025
2cc705c
Initial plan
Copilot Nov 21, 2025
2adf302
Rename app from SwiftControl to BikeControl and update GitHub repo re…
Copilot Nov 21, 2025
4252ed0
Complete remaining SwiftControl to BikeControl renames in code
Copilot Nov 21, 2025
36c5df7
Merge remote-tracking branch 'origin/copilot/rename-app-to-bikecontrol'
jonasbark Nov 22, 2025
3a0ef51
more name change work
jonasbark Nov 23, 2025
02f2589
show action results in the UI
jonasbark Nov 23, 2025
e97a76e
better error handling
jonasbark Nov 23, 2025
98fd5c5
status widget
jonasbark Nov 23, 2025
fefcb1d
status widget for accessibility service
jonasbark Nov 23, 2025
8f68636
some UI changes
jonasbark Nov 23, 2025
4724f55
some UI adjustments
jonasbark Nov 23, 2025
9749a90
missing BikeControl renaming
jonasbark Nov 23, 2025
570f5ca
missing BikeControl renaming
jonasbark Nov 23, 2025
076e729
screenshot adjustments
jonasbark Nov 23, 2025
bfc1271
screenshot adjustments
jonasbark Nov 23, 2025
28663f5
Update Windows Store version to 3.6.0
jonasbark Nov 24, 2025
d941135
remove media key detection due to Apple restrictions
jonasbark Nov 25, 2025
9812548
Update README.md
jonasbark Nov 26, 2025
464c520
error logging
jonasbark Nov 26, 2025
04920e7
Merge remote-tracking branch 'origin/main'
jonasbark Nov 26, 2025
6da13f1
UI fix
jonasbark Nov 27, 2025
354179d
potential fixes for #196
jonasbark Nov 28, 2025
fc13d71
version++
jonasbark Nov 28, 2025
22a3940
fix wrong check
jonasbark Nov 29, 2025
3c9a505
Merge branch 'main' of github.com:jonasbark/swiftcontrol
jonasbark Nov 29, 2025
978325c
attempt to support Wahoo Kickr Bike Pro #195
jonasbark Nov 29, 2025
ca5648f
attempt to support Wahoo Kickr Bike Pro #195
jonasbark Nov 29, 2025
bdd7c75
attempt to support Wahoo Kickr Bike Pro #195
jonasbark Nov 29, 2025
eadcd17
less noise
jonasbark Nov 30, 2025
3760b84
only use direct connection method if they are connected
jonasbark Nov 30, 2025
531e53e
Update WINDOWS_STORE_VERSION.txt
jonasbark Nov 30, 2025
a3f3d81
Add accessories section to README
ReneHezser Dec 1, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
github: [jonasbark]
custom: ["https://paypal.me/boni", "https://donate.stripe.com/9B6aEX0muajY8bZ1Kl6J200"]
380 changes: 380 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,380 @@
name: "Build"

on:
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: false
type: boolean

env:
SHOREBIRD_TOKEN: ${{ secrets.SHOREBIRD_TOKEN }}
FLUTTER_VERSION: 3.35.5

jobs:
build:
name: Build & Release
runs-on: macos-latest

permissions:
id-token: write
pages: write
contents: write

steps:
#1 Checkout Repository
- name: Checkout Repository
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
# 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: 🐦 Setup Shorebird
if: inputs.build_mac || inputs.build_android || inputs.build_ios || inputs.build_web
uses: shorebirdtech/setup-shorebird@v1
with:
cache: true

- name: 🚀 Shorebird Release macOS
if: inputs.build_mac
uses: shorebirdtech/shorebird-release@v1
with:
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;

- 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: 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: Generate release body
if: inputs.build_github
run: |
chmod +x scripts/generate_release_body.sh
./scripts/generate_release_body.sh > /tmp/release_body.md

- name: Set Up Flutter for Screenshots
if: inputs.build_github
uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: ${{ env.FLUTTER_VERSION }}

- name: Generate screenshots for App Stores
if: inputs.build_github
run: |
flutter test test/screenshot_test.dart
zip -r BikeControl.storeassets.zip screenshots
echo "Screenshots generated successfully"

- 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/BikeControl.app" /Applications "BikeControl.pkg" --sign "3rd Party Mac Developer Installer: JONAS TASSILO BARK (UZRHKPVWN9)";
xcrun altool --upload-app -f BikeControl.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/BikeControl.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 BikeControl.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 BikeControl.macos.zip BikeControl.app/

- 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/BikeControl.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/BikeControl.macos.zip

- name: Upload Screenshots Artifacts
if: inputs.build_github
uses: actions/upload-artifact@v4
with:
overwrite: true
name: Releases
path: |
screenshots/device-GitHub-600x900.png
build/BikeControl.screenshots.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')
echo "VERSION=$version" >> $GITHUB_ENV

#13 Create Release
- name: Create Release
if: inputs.build_github
uses: ncipollo/release-action@v1
with:
artifacts: "build/app/outputs/flutter-apk/BikeControl.android.apk,build/macos/Build/Products/Release/BikeControl.macos.zip,build/BikeControl.screenshots.zip,screenshots/device-GitHub-600x900.png"
allowUpdates: true
prerelease: true
bodyFile: /tmp/release_body.md
tag: v${{ env.VERSION }}
token: ${{ secrets.TOKEN }}

windows:
if: inputs.build_windows
name: Build & Release on Windows
runs-on: windows-2025

steps:
#1 Checkout Repository
- name: Checkout Repository
uses: actions/checkout@v3


- name: Extract version from pubspec.yaml (Windows)
shell: pwsh
run: |
$version = Select-String '^version: ' pubspec.yaml | ForEach-Object {
($_ -split ' ')[1].Trim()
}
echo "VERSION=$version" >> $env:GITHUB_ENV

- name: 🐦 Setup Shorebird
uses: shorebirdtech/setup-shorebird@v1
with:
cache: true

- 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/BikeControl.windows.zip"

- uses: microsoft/setup-msstore-cli@v1
if: false

- name: Configure the Microsoft Store CLI
if: false
run: msstore reconfigure --tenantId $ --clientId $ --clientSecret $ --sellerId $

- name: Set Up Flutter
uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: ${{ env.FLUTTER_VERSION }}

- name: Create MSIX package
run: dart run msix:create

- name: Publish MSIX to the Microsoft Store
if: false
run: msstore publish -v "build/windows/x64/runner/Release/"

- name: Rename swift_control.msix to BikeControl.windows.msix
shell: pwsh
run: |
Rename-Item -Path "build/windows/x64/runner/Release/swift_control.msix" -NewName "BikeControl.windows.msix"

- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
overwrite: true
name: Releases
path: |
build/windows/x64/runner/Release/BikeControl.windows.zip
build/windows/x64/runner/Release/BikeControl.windows.msix

- name: Update Release
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: "build/windows/x64/runner/Release/BikeControl.windows.zip,build/windows/x64/runner/Release/BikeControl.windows.msix"
prerelease: true
tag: v${{ env.VERSION }}
token: ${{ secrets.TOKEN }}
Loading