Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
107 commits
Select commit Hold shift + click to select a range
acb85a8
android version issue on apk, working on release-on-tag github action
Panosfunk Oct 13, 2025
7646b5d
Merge branch 'test' into conf-hot-fixes
Panosfunk Oct 17, 2025
a2a4404
fixing missing status top bar in ios, minor visual details
Panosfunk Oct 20, 2025
a068946
fixing persistent messages through different studies
Panosfunk Oct 20, 2025
0b6bc95
fix of ! operator
bardram Oct 24, 2025
c1ea94e
announcements page fix, message details page ui changes, removing unu…
Panosfunk Oct 24, 2025
694a652
Fix of "day in study" in #523
bardram Oct 24, 2025
62c8ee8
Small update to translations
bardram Oct 24, 2025
84efaed
Fix of cached data across studies - #523
bardram Oct 24, 2025
f2f1b76
Update view_model.dart
bardram Oct 24, 2025
be54971
adding new images for health connection page
Panosfunk Oct 26, 2025
979ef99
fixing status bar color appearing darker than page, removing unnecess…
Panosfunk Oct 29, 2025
8dc2dfd
informed consent from backend instead of locally, reverting notificat…
Panosfunk Nov 7, 2025
b45ca92
moving to carp_themes_package instead of research package theme
Panosfunk Nov 11, 2025
3764147
Merge remote-tracking branch 'origin' into carp_themes_package_integr…
Panosfunk Nov 11, 2025
d9d0fd2
fixing changelog
Panosfunk Nov 11, 2025
ced8d79
formatting
Panosfunk Nov 11, 2025
93e0f01
Merge pull request #535 from carp-dk/bardram-#523
Panosfunk Nov 11, 2025
f791654
formating
Panosfunk Nov 11, 2025
e81e05f
Merge branch 'conf-hot-fixes' into carp_themes_package_integration
Panosfunk Nov 12, 2025
0849d3b
Merge pull request #543 from carp-dk/carp_themes_package_integration
Panosfunk Nov 12, 2025
dd1db96
Merge pull request #544 from carp-dk/develop
Panosfunk Nov 13, 2025
8a4da15
removing unused package for android
Panosfunk Nov 13, 2025
17bdf6b
Merge pull request #546 from carp-dk/develop
Panosfunk Nov 13, 2025
4a949e0
partial transition to spm from pods
Panosfunk Nov 14, 2025
0d46f55
bumping version code and changelog
Panosfunk Nov 14, 2025
57e8907
Merge remote-tracking branch 'origin' into test
Panosfunk Nov 14, 2025
ba8b96b
Simplify informed consent flow and re-seed cached study on init
May 13, 2026
88d9eb0
chore: apply dart format and refresh pubspec.lock
Zeroupper May 18, 2026
6f06634
feat(onboarding): consent gate, pull-to-refresh, faster study entry
Zeroupper May 27, 2026
49725cb
fix(ci): drop local CAMS overrides and bump version code
Zeroupper May 27, 2026
808cb05
style: dart format home_page.dart
Zeroupper May 27, 2026
ac9b825
fix(ci): regen Package.resolved on Xcode Cloud + scope GH Actions
Zeroupper May 27, 2026
3c2406d
feat(ios): adopt UIScene lifecycle
Zeroupper May 27, 2026
c0acb2d
fix(ci): gitignore iOS Package.resolved, revert resolve step
Zeroupper May 28, 2026
c9a8f9c
fix(ci): pin Flutter to 3.41.9 across all CI environments
Zeroupper May 28, 2026
1bb5047
fix(ci): re-track Package.resolved now that Flutter is pinned
Zeroupper May 28, 2026
5b555eb
fix: resolve small issues
Zeroupper May 28, 2026
decfed7
Merge pull request #583 from carp-dk/hotfixes
Zeroupper May 28, 2026
79a263b
chore(ci): pin Flutter, fix Podfile + Package.resolved drift
Zeroupper May 28, 2026
3745456
chore(android): bump fastlane and bundled gems
Zeroupper Jun 1, 2026
7fc3c34
chore(release): bump build number to 92 for internal track
Zeroupper Jun 1, 2026
361685f
ci: scope CI to PRs, gate Android prod on tags, iOS auto build number
Zeroupper Jun 2, 2026
0b2cae5
ci: use commit subject for Play release notes (500-char cap)
Zeroupper Jun 2, 2026
0d84562
chore(fvm): pin Flutter to 3.44.0
Zeroupper Jun 3, 2026
9b19189
fix(icons): replace app icons with crisp opaque set for iOS/Android
Zeroupper Jun 3, 2026
e97caed
fix: resolve Appicon for ios
Zeroupper Jun 4, 2026
4696371
chore(release): bump build number to 94 for internal track
Zeroupper Jun 4, 2026
5ba7447
ci(android): auto-increment Play versionCode from live track state
Zeroupper Jun 4, 2026
203510e
fix: resolve small bugs
Zeroupper Jun 8, 2026
c1f5f10
fix: resolve gradle errors
Zeroupper Jun 8, 2026
3a59852
fix: simplify flutter release flow
Zeroupper Jun 8, 2026
599b470
fix: review fixes, changelog keyed to build number, 4.3.0 bump
Zeroupper Jun 8, 2026
696d56e
fix: dart format
Zeroupper Jun 8, 2026
4d990e0
fix: dart format set to line length of 120
Zeroupper Jun 11, 2026
3746a2e
feat: migrate to CAMS 2.x (API level 2.0)
Zeroupper Jun 11, 2026
509b8b3
fix: remove debugprints + small fix
Zeroupper Jun 12, 2026
fbae264
Merge pull request #602 from carp-dk/chore/cams-2.x-upgrade
Zeroupper Jun 12, 2026
e47a1e4
refactor(bloc): split StudyAppBLoC into coordinator and services
Zeroupper Jun 12, 2026
24f996c
fix(study): wait for executor initialization before starting sensing
Zeroupper Jun 12, 2026
34d491f
test: add join-study-flow integration test and bloc state tests
Zeroupper Jun 12, 2026
f5f6e02
fix(sensing): register old-namespace device types for CAWS data
Zeroupper Jun 12, 2026
b5a4afe
refactor(ui): bloc-owned setup flow and login view-model
Zeroupper Jun 12, 2026
809fa92
refactor(ui): invitations flow through InvitationsViewModel
Zeroupper Jun 12, 2026
9d0a9d5
refactor(ui): move StudyPage refresh and state into its view-model
Zeroupper Jun 12, 2026
4f72837
refactor(ui): task-list and data-viz pages driven by their view-models
Zeroupper Jun 12, 2026
2173fb5
refactor(ui): route remaining one-shot actions through view-models
Zeroupper Jun 12, 2026
ba2eb77
fix(ui): store and cancel the BLE statusEvents subscription
Zeroupper Jun 12, 2026
0686f0d
feat(invitations): land on the single invitation's detail after sign-in
Zeroupper Jun 15, 2026
113a20b
test(integration): make join-study flow self-terminating
Zeroupper Jun 15, 2026
9d5c02d
fix: ensure WidgetsFlutterBinding before package initialization
Zeroupper Jun 15, 2026
430d733
test: heart-rate trim, sign-out coverage; drop key-bearing fixtures
Zeroupper Jun 15, 2026
d44966d
test(integration): force local+debug so the join-flow test never skips
Zeroupper Jun 15, 2026
e3a3b1d
chore(test): scrub leaked API keys from deployment fixtures
Zeroupper Jun 15, 2026
0dad842
test: add key-free 1.x/2.x protocol fixtures; enable migration tests
Zeroupper Jun 15, 2026
25019be
test: assert concrete devices/services in 1.x and 2.x protocols
Zeroupper Jun 15, 2026
5fb2637
test: verify declared data-collection types are registered (1.x/2.x)
Zeroupper Jun 15, 2026
c19da45
fix: dart format
Zeroupper Jun 15, 2026
4924b91
refactor: make AppConfig a static config holder
Zeroupper Jun 15, 2026
ddc5bc7
refactor(consent): pass the study into ConsentService instead of inje…
Zeroupper Jun 15, 2026
8bfb454
refactor(auth): expose isAnonymous via AuthService, not LocalSettings
Zeroupper Jun 15, 2026
c53b3e9
refactor(sensing): drop redundant old-namespace device aliases
Zeroupper Jun 15, 2026
ad38afa
refactor(sensing): reduce Sensing to the sensing infrastructure layer
Zeroupper Jun 19, 2026
5903f22
fix: small refactor to invitation details
Zeroupper Jun 22, 2026
3821315
fix:
Zeroupper Jun 22, 2026
60b8104
fix> update launch.json
Zeroupper Jun 22, 2026
1ef0573
fix: moving sensing initialize to init
Zeroupper Jun 23, 2026
0df09b6
fix: dart format
Zeroupper Jun 23, 2026
855315f
refactor(bloc): drop StudyApp prefix from bloc, state, view-model
Zeroupper Jun 24, 2026
f46cdc8
fix(android): minimize Health Connect read permissions
Zeroupper Jul 8, 2026
f7a15e5
Merge pull request #648 from carp-dk/refactor/app-bloc-decomposition
Zeroupper Jul 9, 2026
97a30d6
build(android): add Flutter migrator Gradle flags
Zeroupper Jul 9, 2026
207df75
fix: add translation files
Zeroupper Jul 17, 2026
6dbe351
fix: add dialog for health connect
Zeroupper Jul 17, 2026
58cbb51
Merge branch 'test' into fix/health-connect-permission-fix
Zeroupper Jul 17, 2026
fd3dedf
fix: dart format
Zeroupper Jul 17, 2026
5ae14e3
fix(android): declare Health Connect read permissions for study data …
Zeroupper Jul 20, 2026
df471ef
fix: add icon for cams
Zeroupper Jul 20, 2026
8772911
fix: small fix
Zeroupper Jul 20, 2026
cece4b1
feat(devices): health connect permission guidance and pull-to-refresh
Zeroupper Jul 21, 2026
36bc1d1
fix: dart format
Zeroupper Jul 21, 2026
1cfbe79
chore: bump up version
Zeroupper Jul 22, 2026
a3d1599
fix: pub get
Zeroupper Jul 22, 2026
80984f4
Merge pull request #651 from carp-dk/fix/health-connect-permission-fix
Zeroupper Jul 22, 2026
fe5b97c
fix(hotfix): bump up versions
Zeroupper Jul 24, 2026
2a659bf
fix: try draft release
Zeroupper Jul 24, 2026
34405c5
fix: remove draft release
Zeroupper Jul 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .fvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"flutter": "3.44.0"
}
12 changes: 10 additions & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,12 @@

name: Flutter build and test

on: push
# CI validation runs only on pull requests into the integration branches.
# Feature-branch pushes don't trigger anything; nothing runs on push to a
# branch, so there are no duplicate runs.
on:
pull_request:
branches: [develop, test, master]

env:
FLUTTER_FOLDER: '$HOME/flutter'
Expand All @@ -30,7 +35,10 @@ jobs:
uses: flutter-actions/setup-flutter@v4
with:
channel: stable
version: 3.32.1
version: 3.44.0

- name: Clean
run: flutter clean

- name: Install dependencies
run: flutter pub get
Expand Down
63 changes: 36 additions & 27 deletions .github/workflows/create_release_on_tag.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
on:
push:
tags:
- 'v*'
- "v*"

name: Create Release

Expand All @@ -10,34 +10,28 @@ jobs:
name: Create Release and Upload APK
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@master
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: "adopt" # See 'Supported distributions' for available options
java-version: "17"

- name: Set up JDK 1.8
uses: actions/setup-java@v4
- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
distribution: 'adopt' # See 'Supported distributions' for available options
java-version: '17'
flutter-version: "3.44.0"
channel: stable
cache: true
pub-cache: true

- name: Cache Flutter
id: cache-flutter
uses: actions/cache@v3
- name: Cache Gradle
id: cache-gradle
uses: actions/cache@v4
with:
path: |
flutter
~/.pub-cache
key: flutter-${{ hashFiles('**/pubspec.lock') }}

- if: ${{ steps.cache-flutter.outputs.cache-hit != 'true' }}
name: Install Flutter
run: git clone https://github.com/flutter/flutter.git --depth 1 -b stable $FOLDER

- name: Add Flutter to PATH
run: echo "$GITHUB_WORKSPACE/flutter/bin" >> $GITHUB_PATH

- if: ${{ steps.cache-flutter.outputs.cache-hit != 'true' }}
name: Install dependencies
run: flutter pub get
~/.gradle/caches
~/.gradle/wrapper/
key: gradle-ubuntu-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}

- name: Configure Keystore
run: |
Expand All @@ -59,20 +53,35 @@ jobs:
run: |
flutter --version
pwd

- name: Build APK
run: |
flutter clean
flutter pub get
flutter pub upgrade
flutter build apk --release --no-tree-shake-icons

- name: Create Release and upload apk
uses: underwindfall/create-release-with-debugapk@v2.0.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
with:
tag_name: ${{ github.ref }}
asset_path: build/app/outputs/flutter-apk/app-release.apk
asset_name: carp-studies-app-${{ github.ref_name }}.apk
asset_content_type: application/vnd.android.package-archive

# Setup Ruby/Bundler so fastlane is available
- name: Setup Fastlane
uses: ruby/setup-ruby@v1
with:
ruby-version: "3.3"
bundler-cache: false
working-directory: android

# Production release to Google Play runs only on tags (like the iOS
# App Store workflow on Xcode Cloud).
- if: startsWith(github.ref, 'refs/tags/')
run: fastlane release
env:
PLAY_STORE_JSON_KEY: PLAY_STORE_CONFIG.json
working-directory: android
166 changes: 58 additions & 108 deletions .github/workflows/deploy_to_google_play_store_fastlane_release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,112 +2,62 @@ name: Upload to Google Store
run-name: ${{github.actor}} is pushing to branch and deploying to Google Store

on:
push:
branches:
- master
- test
push:
branches:
- test
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: 'adopt' # See 'Supported distributions' for available options
java-version: '17'

- name: Cache Flutter
id: cache-flutter
uses: actions/cache@v3
with:
path: |
flutter
~/.pub-cache
key: flutter-${{ hashFiles('**/pubspec.lock') }}

- name: Cache Gradle
id: cache-gradle
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper/
key: gradle-ubuntu-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}

- if: ${{ steps.cache-flutter.outputs.cache-hit != 'true' }}
name: Install Flutter
run: git clone https://github.com/flutter/flutter.git --depth 1 -b stable $FOLDER

- name: Add Flutter to PATH
run: echo "$GITHUB_WORKSPACE/flutter/bin" >> $GITHUB_PATH

- if: ${{ steps.cache-flutter.outputs.cache-hit != 'true' }}
name: Install dependencies
run: flutter pub get

# Setup Ruby, Bundler, and Gemfile dependencies
- name: Setup Fastlane
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.3'
bundler-cache: false
working-directory: android

- name: Extract last commit message
id: extract-commit-message
run: |
COMMIT_MESSAGE=$(git log -1 --pretty=%B | tr -d '\n')
COMMIT_MESSAGE="${COMMIT_MESSAGE}"
echo "Commit Message: $COMMIT_MESSAGE"
echo "commit_message=$COMMIT_MESSAGE" >> $GITHUB_ENV

- name: Extract version code and version name from pubspec.yaml
id: extract-version
run: |
# Navigate to the root directory (if not already there)
pwd
cd $GITHUB_WORKSPACE

# Extract version name and version code from pubspec.yaml
VERSION_NAME=$(grep 'version:' pubspec.yaml | awk '{print $2}' | cut -d'+' -f1)
VERSION_CODE=$(grep 'version:' pubspec.yaml | awk '{print $2}' | cut -d'+' -f2)

echo "Version Name: $VERSION_NAME"
echo "Version Code: $VERSION_CODE"

echo "version_name=$VERSION_NAME" >> $GITHUB_ENV
echo "version_code=$VERSION_CODE" >> $GITHUB_ENV

- name: Create or update changelog file
run: |
pwd
mkdir -p ./android/fastlane/metadata/android/en-GB/changelogs
echo "${{ env.commit_message }}" > "./android/fastlane/metadata/android/en-GB/changelogs/${{ env.version_code }}.txt"

- name: Configure Keystore
run: |
echo "$PLAY_STORE_UPLOAD_KEY" | base64 --decode > app/upload-keystore.jks
echo "$PLAY_STORE_CONFIG_JSON" > PLAY_STORE_CONFIG.json
echo "keyPassword=$KEYSTORE_KEY_PASSWORD" >> key.properties
echo "storePassword=$KEYSTORE_STORE_PASSWORD" >> key.properties
echo "keyAlias=$KEYSTORE_KEY_ALIAS" >> key.properties
echo "storeFile=upload-keystore.jks" >> key.properties
env:
PLAY_STORE_UPLOAD_KEY: ${{ secrets.PLAY_STORE_UPLOAD_KEY }}
KEYSTORE_KEY_ALIAS: ${{ secrets.KEYSTORE_KEY_ALIAS }}
KEYSTORE_KEY_PASSWORD: ${{ secrets.KEYSTORE_KEY_PASSWORD }}
KEYSTORE_STORE_PASSWORD: ${{ secrets.KEYSTORE_STORE_PASSWORD }}
PLAY_STORE_CONFIG_JSON: ${{secrets.PLAY_STORE_CONFIG_JSON}}
working-directory: android

- if: github.ref == 'refs/heads/master'
run: fastlane release
env:
PLAY_STORE_JSON_KEY: PLAY_STORE_CONFIG.json
working-directory: android

- if: github.ref == 'refs/heads/test'
run: fastlane test
env:
PLAY_STORE_JSON_KEY: PLAY_STORE_CONFIG.json
working-directory: android
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: "adopt" # See 'Supported distributions' for available options
java-version: "17"

- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: "3.44.0"
channel: stable
cache: true
pub-cache: true

- name: Cache Gradle
id: cache-gradle
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper/
key: gradle-ubuntu-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}

# Setup Ruby, Bundler, and Gemfile dependencies
- name: Setup Fastlane
uses: ruby/setup-ruby@v1
with:
ruby-version: "3.3"
bundler-cache: false
working-directory: android

- name: Configure Keystore
run: |
echo "$PLAY_STORE_UPLOAD_KEY" | base64 --decode > app/upload-keystore.jks
echo "$PLAY_STORE_CONFIG_JSON" > PLAY_STORE_CONFIG.json
echo "keyPassword=$KEYSTORE_KEY_PASSWORD" >> key.properties
echo "storePassword=$KEYSTORE_STORE_PASSWORD" >> key.properties
echo "keyAlias=$KEYSTORE_KEY_ALIAS" >> key.properties
echo "storeFile=upload-keystore.jks" >> key.properties
env:
PLAY_STORE_UPLOAD_KEY: ${{ secrets.PLAY_STORE_UPLOAD_KEY }}
KEYSTORE_KEY_ALIAS: ${{ secrets.KEYSTORE_KEY_ALIAS }}
KEYSTORE_KEY_PASSWORD: ${{ secrets.KEYSTORE_KEY_PASSWORD }}
KEYSTORE_STORE_PASSWORD: ${{ secrets.KEYSTORE_STORE_PASSWORD }}
PLAY_STORE_CONFIG_JSON: ${{secrets.PLAY_STORE_CONFIG_JSON}}
working-directory: android

- if: github.ref == 'refs/heads/test'
run: fastlane test
env:
PLAY_STORE_JSON_KEY: PLAY_STORE_CONFIG.json
working-directory: android
15 changes: 12 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,15 @@ android/fastlane/report.xml

# CARP related
carp/carpspec.yaml
assets/carp/
assets/carp/lang/_da.json
assets/carp/lang/_en.json
# Ignore local study config but keep the asset dirs (via .gitkeep) so release
# builds don't fail on missing/empty asset directories.
assets/carp/*
!assets/carp/lang/
assets/carp/lang/*
!assets/carp/lang/.gitkeep
!assets/carp/resources/
assets/carp/resources/*
!assets/carp/resources/.gitkeep

# FVM Version Cache
.fvm/
48 changes: 45 additions & 3 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,18 +27,44 @@
],
"flutterMode": "debug"
},
{
// profile mode using the DEV CAWS instance - for measuring jank/perf
"name": "DEV (profile) - carp-studies-app",
"request": "launch",
"type": "dart",
"toolArgs": [
"--dart-define",
"deployment-mode=dev",
"--dart-define",
"debug-level=info"
],
"flutterMode": "profile"
},
{
// release mode using the DEV CAWS instance - production-speed sanity check
"name": "DEV (release) - carp-studies-app",
"request": "launch",
"type": "dart",
"toolArgs": [
"--dart-define",
"deployment-mode=dev",
"--dart-define",
"debug-level=info"
],
"flutterMode": "release"
},
{
// debug mode using the TEST CAWS instance
"name": "TEST - carp-studies-app",
"name": "TEST - carp-studies-app (release)",
"request": "launch",
"type": "dart",
"toolArgs": [
"--dart-define",
"deployment-mode=test",
"--dart-define",
"debug-level=debug"
"debug-level=none"
],
"flutterMode": "debug"
"flutterMode": "release"
},
{
// debug mode using COMPUTEROME CAWS instance
Expand All @@ -52,6 +78,22 @@
"debug-level=debug"
],
"flutterMode": "debug"
},
{
// end-to-end join-study flow on a device/simulator (local deployment).
// The test also forces local + debug internally, so it runs correctly
// even without these defines.
"name": "Integration - join study flow (LOCAL)",
"request": "launch",
"type": "dart",
"program": "integration_test/join_study_flow_test.dart",
"toolArgs": [
"--dart-define",
"deployment-mode=local",
"--dart-define",
"debug-level=debug"
],
"flutterMode": "debug"
}
]
}
Loading
Loading