[ARCHIVE — DO NOT MERGE] Snapshot of main before force-reset to 2.2.4 - #103
Draft
JakubMrozek wants to merge 46 commits into
Draft
[ARCHIVE — DO NOT MERGE] Snapshot of main before force-reset to 2.2.4#103JakubMrozek wants to merge 46 commits into
JakubMrozek wants to merge 46 commits into
Conversation
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Duc Phi Viet <duc.phiviet01@gmail.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…to fix Swift compile error
…ING.md Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
docs: update CLAUDE.md
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
chore: add Dependabot for monthly pub dependency updates
Bumps [flutter_lints](https://github.com/flutter/packages/tree/main/packages) from 5.0.0 to 6.0.0. - [Commits](https://github.com/flutter/packages/commits/flutter_lints-v6.0.0/packages) --- updated-dependencies: - dependency-name: flutter_lints dependency-version: 6.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
test: add tests for utils — extensions, helper_methods, types
Bump flutter_lints from 5.0.0 to 6.0.0
…et iOS 13) Co-authored-by: Duc Phi Viet <duc.phiviet01@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
docs: restore DEVELOPMENT.md
Prepare release v2.2.2
…sing docs: add safety review step before release
- GitHub Actions workflow for @claude PR review comments - PostToolUse hook to auto-format .dart files after edits - /create-pr skill for branch + commit + draft PR workflow
chore: add Claude Code setup
…-format docs: update RELEASING.md changelog format guidelines
chore: remove GitHub release step from releasing process
chore: normalize CHANGELOG.md style
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…rompt EXT-229 Defer ATT request until app becomes active
AdEvent: enum ↔ string round-trip for every known event, unknown fallback, payload parsing (top-level code + nested payload for clicked/viewed/error), null/missing payload handling, malformed payload swallowed into .unknown, copyWith override semantics, and the skip-code constants that make up the server contract. Character: toJson required fields, optional omission, full field serialisation, additionalProperties merge (including the key-collision rule where additionalProperties wins). Message: isUser/isAssistant, toJson uses role.name + ISO-8601 UTC (converts local DateTime), equality uses (id, role, content) not createdAt, inequality on each field, identity, non-Message check. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Covers every class under lib/src/device_app_info/ using TestDefaultBinaryMessengerBinding.setMockMethodCallHandler to stub platform channels: - DeviceAudio: empty(), full response decode (volume rounding + outputType list), every AudioOutputType mapped, unknown types fall back to .other, PlatformException → empty, toJson omits nulls. - DevicePower: empty(), full response, every BatteryState, unknown state → .unknown, integer level widens to double, exception → empty, toJson uses enum name. - DeviceNetwork: empty(), full decode, every NetworkType, unknown → null, exception → empty, toJson emits enum name + omits nulls. - DeviceScreen: empty() zeros + portrait default, init() returns non-negative dimensions under the test binding, toJson shape. - DeviceHardware: empty(), toJson type pass-through, init() does not throw under the test binding (DeviceType varies by host platform, so assert isA<DeviceType> rather than a specific case). - OperationSystem: empty(), init() returns well-formed OS info under the test binding, exception fallback to empty. - AppInfo: empty() + safe defaults, init() does not throw under the test binding, storeUrl remains null on non-iOS/Android hosts. - DeviceAppInfo: empty() aggregates sub-empties, toJson shape, toJsonFresh invokes screen/audio init, init() is memoised (identity-equal across repeated calls). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
TransparencyConsentFrameworkService: full channel mocking — valid shape, gdpr=0, non-0/1 gdprApplies → null, non-int or empty/non-string tcString → null, null-response handling, exception fallback. SKOverlayService: uses the injectable `isIOS` hook for full coverage — non-iOS short-circuit, empty-itunesItem short-circuit, forwards skan/ position/dismissible, false-result passthrough, UNSUPPORTED_IOS swallowed, any PlatformException swallowed, dismiss happy path + non-iOS short-circuit + error path. SKStoreProductService: non-iOS short-circuit, channel forwarding, native false/throw cases, dismiss paths. TrackingAuthorizationService: notSupported on non-iOS, enum index mapping for each TrackingStatus, value-list coverage. SKAdNetwork and AdAttributionKit: non-iOS short-circuit for every public method (initImpression/startImpression/endImpression/dispose, and initImpression/setAttributionFrame/handleTap/beginView/endView/ dispose respectively). The iOS code path is guarded by Platform.isIOS which cannot be flipped from a Dart test; that coverage lives in the respective native tests. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
selectBid: placement-not-enabled, code-not-matched, happy path, relevantAssistantMessageId precedence over lastAssistantMessageId, not-ready → null, mismatched messageId → null, afterUser branch (ready/not-ready/mismatch), first-bid-wins when duplicate codes. useLastMessages hook: empty list resets every setter; assistant-last emits ids and readyForStreaming=true; user-last sets readyForStreaming=false; relevantAssistantMessageId resets on a new user message id; no reset when the id is unchanged. AdsProviderData: .of returns the nearest ancestor or null; updateShouldNotify returns false on equal values and true on any of the tracked field changes (adServerUrl, isDisabled, the two readyForStreaming flags, each messageId, messages/bids/placements list, and otherParams map); deep-equal messages list and deep-equal otherParams do not retrigger. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Drives the full Api → HttpClient → http.Client pipeline end-to-end with only the outermost http.Client mocked. This proves the wire contract that publishers rely on. - happy path: POSTs to /preload, publisher-token and is-disabled headers, body fields (publisherToken, conversationId, userId, enabledPlacementCodes, messages), bids decoded - isDisabled=true sends Kontextso-Is-Disabled: 1 - skip:true response propagates to PreloadResponse.skip/skipCode - network throw falls back to an empty PreloadResponse - 5xx surfaces statusCode in the response - TCF platform-channel data is merged into regulatory (gdpr + gdprConsent) without clobbering publisher-provided fields (coppa) - character/variantId/userEmail passthrough - sessionId persists across consecutive preloads when passed in Widget-level integration (AdsProvider + messages → triggered preload) was attempted but ended up flaky because AdsProvider is a HookWidget that resets HttpClient on mount; reliable simulation of the hook-driven rebuild + async preload timing in flutter_test is fragile. The API-layer integration above covers the same HTTP contract with no timing sensitivity. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- integration_test.dart: drop unused bid.dart import - message_test.dart: ignore unrelated_type_equality_checks on the "Message != non-Message" assertion (the whole point of the test) - select_bid_test.dart: flip makeData defaults to false/[] so every test explicitly opts in to the flag it exercises — removes 7 avoid_redundant_argument_values warnings Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Expand Dart test coverage 167 → 292 tests
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
6 tasks
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.
This PR exists only to preserve and document the state of
main(0f46b6a) before we force-resetmainto the minimal, v2.2.1-based 2.2.4 line (see #102). It keeps this work visible and reachable so nothing is lost.v2.2.4-base(pinned atv2.2.1) — so the diff below is exactly whatmainaccumulated on top of production.archive/main-pre-2.2.4= currentmain.Why we're doing this
The 2.2.4 release is being rebuilt from the known-good
v2.2.1tag with only the necessary SKAN code, to minimize regression risk on Chai's WebView setup.mainwill later be force-reset to that line. This archive guarantees the currentmainwork survives and can be cherry-picked back afterward.Worth cherry-picking back onto the new main (later)
#97SuppressERR_BLOCKED_BY_ORBnoise from ad creativesEXT-229Defer ATT request until app becomes active9814286evaluateJavascriptreturns null (WebView fix)8ebcce1privacy manifest synced to Swift SDKCLAUDE.md,DEVELOPMENT.md,RELEASING.mdNot to carry over
EXT-175Flutter 3.38 / iOS 13 requirements bump — intentionally dropped for 2.2.4.Related: #102 (the 2.2.4 release PR).