Conversation
…sed code, ui changes to bluetoth device list, status card ui improvements, improvement of notifications not going to task, heart rate tool tip ui fix
…ary health connect page, changing UI to use icons instead of words for announcement cards
Carp themes package integration
removing unused package for android
Beyond device resolution, assert the protocol declares all expected sensor/service/app-task Measure types and that each is provided by a registered sampling package (SamplingPackageRegistry().dataTypes) - so the app can actually collect every declared type. Tolerant of the dynamic per-task 'completedapptask.<name>' lifecycle measures. Runs for both the 1.x (alias) and native 2.x namespaces, so a data-type registration regression in any package fails the test. Refs #604
AppConfig is just compile-time-derived config read globally (bloc, Sensing, CarpBackend), so there is no reason to instantiate it. Convert it to an abstract class with static fields and drop the singleton factory. Services no longer take an AppConfig 'config' parameter and the bloc no longer holds a 'config' instance - everything reads AppConfig.deploymentMode / .debugLevel / .localization directly. (Keeps the explicit const on String.fromEnvironment so --dart-define still applies.) No behavior change: the static fields hold the same global mutable state the singleton did. Verified by the full unit suite and the join-study integration test.
…cting StudyService ConsentService only needed StudyService to read the current study in the backend consent check, and that check is reached only via refreshStatus, which is called only by the bloc (the coordinator that owns StudyService). Drop the service-to-service dependency: hasBeenAccepted/refreshStatus now take the study as a parameter and the bloc supplies it. ConsentService is now a focused leaf (consent manager + backend), independently testable, with no inter-service edge - and no study plumbing through the view models.
isAnonymous is an authentication fact (set by CarpBackend's authenticate vs authenticateWithMagicLink), so it belongs behind AuthService. Add the getter and route the StudyPage/ProfilePage view-models and profile page through it, removing the direct LocalSettings().isAnonymous reads from the UI/VM layer.
The manual loop registering device types under the pre-2.x namespace
('dk.cachet.carp.common.application.devices.*') is no longer needed: the
current CAMS packages already register that backward-compat alias
themselves -
carp_mobile_sensing 2.1.2 -> Smartphone
carp_context_package 2.0.1 -> Location/Weather/AirQuality services
carp_health_package 4.0.1 -> HealthService
carp_polar_package 2.0.1 -> PolarDevice
carp_movesense_package 2.0.1 -> MovesenseDevice
all under DeviceConfiguration.DEVICE_NAMESPACE. The original dev failure
was on earlier package versions that lacked this; the workaround is now
dead code. The 1.x/2.x protocol parse tests still pass, so they now
guard the packages' backward-compat instead of our alias.
Sensing had grown into a god class owning the study lifecycle (deployment, status), protocol translation, and study removal on top of its actual job. This duplicated StudyService, which claimed to be the single owner of the active study yet delegated everything back. Move deployment orchestration (addStudy/tryDeployment/removeStudy), deployment-status fetching, the deployment-service selection, the runtime controller, and protocol translation into StudyService, the genuine study owner. Sensing now only registers sampling packages, data managers, and task factories and configures the client manager with a deployment service passed in by StudyService. StudyController equality is value-based (deployment id + role), so the persisted study resolves the same controller the client manager holds.
Remove the Health Connect READ_* permissions flagged by Google Play as excessive, keeping only steps, heart rate and exercise. Data types are driven by the server-side study protocol, so no source changes needed. Refs #392
refactor(bloc): split StudyAppBLoC into coordinator and services
- Show a generic health-data disclosure on the connect screen, and an instructions dialog - with an app-settings shortcut and a screenshot - when Health Connect access is not granted, including when it was permanently denied and the system sheet no longer appears. - Add pull-to-refresh on the devices page to re-check service permission state after granting access in settings. - Bump app to 4.4.0+1 and carp_mobile_sensing / carp_health_package to the released fix versions.
fix: Health Connect permission handling and device page UX
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Release branch carrying months of
testwork intomaster. Major themes:research_packagetheme withcarp_themes_package; refreshes app styling end-to-end (Carp themes package integration #543).test).android/Gemfile.lockvia a singlebundle update(fastlane 2.235.0): picks up the faraday 1.10.5CVE-2026-25765backport, aws-sdk-s3 1.224.0, and refreshed Google Play API clients. These are CI/build-only gems (not shipped in the app) and this supersedes the per-gem dependabot PRs Bump aws-sdk-s3 from 1.124.0 to 1.208.0 in /android #554 and Bump faraday from 1.10.3 to 1.10.5 in /android #555.Test plan
/invitationsbundle exec fastlane) runs cleanly with the updated gems