Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
fc35ba8
docs: add CLAUDE.md (#73)
JakubMrozek Mar 1, 2026
f745f30
Sync develop into main (#74)
JakubMrozek Mar 1, 2026
8c4ef86
docs: add DEVELOPMENT.md (#76)
JakubMrozek Mar 2, 2026
ccd3efa
docs: add RELEASING.md (#75)
JakubMrozek Mar 2, 2026
f4f51f6
Annotate SKOverlayManager.applyImpression() with iOS 16 availability …
phiviet01 Mar 2, 2026
b2e5e37
EXT-185 Update PrivacyInfo data
JakubMrozek Mar 2, 2026
96ea9d6
docs: update CLAUDE.md — fix public API formatting and link to RELEAS…
JakubMrozek Mar 2, 2026
b33897c
Merge pull request #79 from kontextso/docs/update-claude-md
JakubMrozek Mar 2, 2026
2a12c20
chore: add Dependabot for monthly pub dependency updates
JakubMrozek Mar 2, 2026
28424f5
Merge pull request #80 from kontextso/chore/add-dependabot
JakubMrozek Mar 2, 2026
fe50e7b
Bump flutter_lints from 5.0.0 to 6.0.0
dependabot[bot] Mar 2, 2026
159a0b9
test: add tests for extensions, helper_methods and types utils
JakubMrozek Mar 2, 2026
0e02455
fix: remove redundant default argument in extensions_test
JakubMrozek Mar 2, 2026
b6cc88d
Merge pull request #84 from kontextso/test/utils-coverage
JakubMrozek Mar 2, 2026
9cbf82a
Merge pull request #81 from kontextso/dependabot/pub/flutter_lints-6.0.0
JakubMrozek Mar 2, 2026
25cbf1f
EXT-175 Update requirements for SDK (Flutter 3.38 and deployment targ…
JakubMrozek Mar 2, 2026
9814286
fix: return null from evaluateJavascript to avoid unsupported type error
JakubMrozek Mar 2, 2026
8ebcce1
fix: update privacy manifest to match Swift SDK
JakubMrozek Mar 2, 2026
1116384
docs: restore DEVELOPMENT.md
JakubMrozek Mar 2, 2026
8520ffb
Merge pull request #85 from kontextso/docs/restore-development-md-2
JakubMrozek Mar 2, 2026
f72a0a8
Prepare release v2.2.2
phiviet01 Mar 2, 2026
72ca819
Merge pull request #86 from kontextso/release/2.2.2
JakubMrozek Mar 2, 2026
d6b7063
docs: add safety review step before release
JakubMrozek Mar 3, 2026
bbefe8b
Merge pull request #88 from kontextso/docs/add-safety-review-to-relea…
JakubMrozek Mar 3, 2026
910d5c2
chore: add Claude Code setup
JakubMrozek Mar 3, 2026
ca3efb6
fix: replace unavailable MCP tool with gh CLI for PR comments
JakubMrozek Mar 3, 2026
b85d0bd
Merge pull request #89 from kontextso/chore/claude-code-setup
JakubMrozek Mar 3, 2026
c828552
fix: add checkout step and use correct claude-code-action v1 params
JakubMrozek Mar 3, 2026
8d3cad6
docs: update RELEASING.md changelog format guidelines
JakubMrozek Mar 5, 2026
1cdd68e
Merge pull request #90 from kontextso/docs/update-releasing-changelog…
JakubMrozek Mar 5, 2026
49520c1
chore: remove GitHub release step from releasing process
JakubMrozek Mar 5, 2026
0af9258
Merge pull request #91 from kontextso/chore/remove-github-release-step
JakubMrozek Mar 5, 2026
426225b
chore: normalize CHANGELOG.md style
JakubMrozek Mar 5, 2026
37f7783
Merge pull request #92 from kontextso/chore/consistency-fixes
JakubMrozek Mar 5, 2026
dc79123
Extract magic constants into named constants
JakubMrozek Mar 8, 2026
db9fa3c
Defer ATT request until app becomes active
phiviet01 Mar 8, 2026
7a42f46
Add comment explaining concurrent call assumption in addObserver
JakubMrozek Mar 31, 2026
ad02cb8
Merge pull request #93 from kontextso/duc/EXT-229-add-delay-for-att-p…
JakubMrozek Mar 31, 2026
ce26672
Add AdEvent, Character, Message model tests
JakubMrozek Apr 15, 2026
5990cd2
Add device_app_info tests (7 files, 38 tests)
JakubMrozek Apr 15, 2026
fb65ab2
Cover platform-channel services (6 files)
JakubMrozek Apr 15, 2026
15a87cf
Cover widget helper utilities (3 files, 25 tests)
JakubMrozek Apr 15, 2026
c237f2a
Add API-layer integration tests (8 tests)
JakubMrozek Apr 15, 2026
e8e21aa
Fix analyzer lints blocking CI
JakubMrozek Apr 15, 2026
c004430
Merge pull request #100 from kontextso/test/dart-coverage
JakubMrozek Apr 15, 2026
0f46b6a
Suppress ERR_BLOCKED_BY_ORB noise from third-party ad creatives (#97)
JakubMrozek Apr 16, 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
15 changes: 15 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "file=$(jq -r '.tool_input.file_path'); case \"$file\" in *.dart) dart format \"$file\" ;; esac"
}
]
}
]
}
}
144 changes: 144 additions & 0 deletions .claude/skills/create-pr/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
---
name: create-pr
description: Create a PR. Creates a branch, commits changes, pushes, and opens a draft PR via GitHub CLI. Use when the user wants to commit and open a pull request for their current changes. NEVER commits on main.
---

# Create PR

Create a branch, commit all changes, push, and optionally open a draft PR via GitHub CLI.

## Usage

```
/create-pr <brief description of the changes>
```

Examples:
- `/create-pr add SKAN fidelity-1 UUID validation`
- `/create-pr fix SKAdNetwork impression lifecycle`
- `/create-pr update Bid model to support new server fields`

---

## Instructions

You are creating a pull request for the user's current changes. Follow these steps exactly.

### Step 0: Safety Check — Protected Branches

**CRITICAL: You must NEVER commit on `main`.**

Run `git branch --show-current` to determine the current branch.

- If the current branch is `main`, you **MUST create a new branch** before committing.
- If the current branch is already a feature/fix branch, you may commit on it directly.

### Step 1: Determine Branch Name

If you need to create a new branch, derive a short, descriptive kebab-case name from the user's description. Prefix with a conventional type:

- `feat/` — new features
- `fix/` — bug fixes
- `refactor/` — code restructuring
- `chore/` — maintenance, config, CI
- `docs/` — documentation only

Example: `/create-pr add SKAN fidelity-1 UUID validation` → `feat/skan-fidelity1-uuid-validation`

Create and switch to the branch:
```bash
git checkout -b <branch-name>
```

### Step 2: Review Changes

Run these commands to understand what will be committed:
```bash
git status
git diff
git diff --staged
```

Review the output. If there are no changes at all, inform the user there is nothing to commit and stop.

Do NOT commit files that likely contain secrets (`.env`, `*.pem`, `*.key`). Warn the user if such files are present.

### Step 3: Stage and Commit

Stage the relevant files. Prefer staging specific files rather than `git add -A`:
```bash
git add <files>
```

Write a concise commit message based on the actual changes. Follow conventional commit style:

```
<type>: <short summary>

<optional body explaining why>
```

Commit:
```bash
git commit -m "<message>"
```

### Step 4: Push

Push the branch to origin:
```bash
git push -u origin <branch-name>
```

If the push fails due to diverged history, **do NOT force push**. Instead, inform the user and ask how they want to proceed.

### Step 5: Create Draft PR (if GitHub CLI available)

Check if `gh` is available:
```bash
which gh
```

If `gh` is available, create a **draft** pull request targeting `main`:

```bash
gh pr create --draft --title "<PR title>" --body "$(cat <<'EOF'
## Summary
<1-3 bullet points describing the changes>

## Test plan
- [ ] flutter analyze passes
- [ ] flutter test ./test passes
- [ ] <any manual testing steps>

🤖 Generated with [Claude Code](https://claude.com/claude-code)
EOF
)"
```

The PR title should be concise (under 70 characters). Use the body for details.

If `gh` is NOT available, print the URL the user can visit to create the PR manually:
```
https://github.com/<org>/<repo>/compare/<branch-name>?expand=1
```

You can get the org/repo from `git remote get-url origin`.

### Step 6: Report

Print a summary:
- Branch name
- Files committed
- Commit hash (short)
- PR URL (if created) or manual link

---

## Error Handling

- **On `main`**: Always create a new branch. Never commit directly.
- **No changes**: Inform the user and stop.
- **Push rejected**: Do not force push. Ask the user.
- **gh auth issues**: Fall back to printing a manual PR URL.
- **Pre-commit hook failure**: Fix the issue, re-stage, and create a NEW commit (never amend).
6 changes: 6 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
version: 2
updates:
- package-ecosystem: "pub"
directory: "/"
schedule:
interval: "monthly"
31 changes: 31 additions & 0 deletions .github/workflows/claude.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: Claude Code

on:
pull_request_review_comment:
types: [created]
pull_request_review:
types: [submitted]
issue_comment:
types: [created]

jobs:
claude:
if: |
contains(github.event.comment.body, '@claude') ||
contains(github.event.review.body, '@claude')
runs-on: ubuntu-latest
continue-on-error: true
permissions:
contents: write
pull-requests: write
id-token: write
actions: read
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 1
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
trigger_phrase: "@claude"
claude_args: "--max-turns 20"
4 changes: 1 addition & 3 deletions .github/workflows/flutter-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,9 @@ name: Flutter CI
on:
push:
branches:
- develop
- main
pull_request:
branches:
- develop
- main

jobs:
Expand All @@ -22,7 +20,7 @@ jobs:
- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.24.0'
flutter-version: '3.38.0'

- name: Cache Flutter dependencies
uses: actions/cache@v4
Expand Down
9 changes: 7 additions & 2 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ jobs:
- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: "3.24.0"
flutter-version: "3.38.0"
channel: stable

- name: Install dependencies
Expand Down Expand Up @@ -93,11 +93,16 @@ jobs:
- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: "3.24.0"
flutter-version: "3.38.0"
channel: stable

- name: Install dependencies
run: flutter pub get

- name: Set up Dart (pub.dev OIDC)
uses: dart-lang/setup-dart@v1
with:
sdk: stable

- name: Publish to pub.dev
run: dart pub publish --force
57 changes: 14 additions & 43 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## 2.2.2
### Breaking
Update minimum requirements to Flutter `>=3.38.0` and iOS deployment target `13.0`.

* Set NSPrivacyTracking to false and clear tracking domains.

## 2.2.1
* Add `revenue` to `AdEvent.adViewed` events.

Expand Down Expand Up @@ -32,38 +38,12 @@

## 2.0.0
### Breaking
`AdEvent` structure changed. The event now exposes normalized typed fields instead of loose payload maps. If you previously accessed dynamic payload values, you must update your code.

> `onEvent(AdEvent event)` callback stays the same - only the event model changed.

### Migration
Use the new typed fields + switch on `event.type`.

```dart
AdsProvider(
...
onEvent: (AdEvent event) {
switch (event.type) {
case AdEventType.adClicked:
break;
case AdEventType.videoCompleted:
break;
// Handle other event types...
}
},
...
);
```

### Additional note
When `AdEventType.adNoFill` is returned, check `event.skipCode`.
`skipCode` explains why the ad could not be rendered (reason of no-fill).

### Other changes
* Clicking on an ad now opens an in-app browser instead of external browser
* Added optional `userEmail` property to `AdsProvider`
* Added more tests
* Minor optimizations and internal clean-up
`AdEvent` structure changed. The event now exposes normalized typed fields instead of loose payload maps. If you previously accessed dynamic payload values, you must update your code. Use the new typed fields and switch on `event.type`. When `AdEventType.adNoFill` is returned, check `event.skipCode` for the reason.

* Clicking on an ad now opens an in-app browser instead of external browser.
* Added optional `userEmail` property to `AdsProvider`.
* Added more tests.
* Minor optimizations and internal clean-up.

## 1.1.2
* Updated README.
Expand All @@ -75,47 +55,38 @@ When `AdEventType.adNoFill` is returned, check `event.skipCode`.
* Send keyboard height to the server to determine whether an ad is visible.

## 1.1.0

* BREAKING CHANGE: Removed `onAdView`, `onAdClick` and `onAdDone` callbacks from `AdsProvider` widget. Use `onEvent` callback instead.
* BREAKING CHANGE: Removed `PublicAd` class. Use `AdEvent` class instead.
### Breaking
Removed `onAdView`, `onAdClick` and `onAdDone` callbacks from `AdsProvider` widget. Use `onEvent` callback instead. Removed `PublicAd` class. Use `AdEvent` class instead.

## 1.0.7

* Fixed `setState() called after dispose()` issue in `InlineAd` widget.
* Periodically report ad dimensions to the server.

## 1.0.6

* Enhanced InlineAd and AdFormat to manage active state and keep-alive behavior.
* Refactored ad preloading logic to prevent multiple concurrent requests.
* Updated README.

## 1.0.5

* Added support for interstitial ads.
* Added `Regulatory` object to `AdsProvider`.
* Added new parameters to preload API request body.
* Updated README.

## 1.0.4

* Removed assertions for `gdpr` and `coppa` parameters.

## 1.0.3

* Refactored `gppSid` parameter to use `List<int>` instead of `String` in `AdsProvider`.

## 1.0.2

* Added optional regulatory-related parameters to `AdsProvider`.
* Updated URLs and description in `pubspec.yaml`.

## 1.0.1

* Removed unnecessary comments.
* Added platform support for Android and iOS in pubspec.yaml.

## 1.0.0

* Initial public release of `kontext_flutter_sdk`.
* Full documentation available at [https://docs.kontext.so/sdk/flutter](https://docs.kontext.so/sdk/flutter).
Loading
Loading