Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
c3df770
Build on sdk 37
rahul-lohra Jul 27, 2026
5f51cf4
ci: Use java 21 on CI
rahul-lohra Aug 5, 2026
f1c07ca
ci: point to android ci action with compile sdk 37 support
rahul-lohra Aug 5, 2026
48daee0
build: Migrate to AGP 9.1.1 / Gradle 9.3.1 and compileSdk/targetSdk 37
rahul-lohra Aug 5, 2026
b898334
Merge branch 'develop' into feature/rahullohra/build-on-sdk-37
rahul-lohra Aug 5, 2026
574a73a
1. record paparazzi goldens on ci
rahul-lohra Aug 5, 2026
e7dcdb9
minor fix in sample app versioner
rahul-lohra Aug 5, 2026
c3ac3a0
[record-paparazzi]
rahul-lohra Aug 5, 2026
7ecf8e1
use java 21
rahul-lohra Aug 5, 2026
db85ab4
[record-paparazzi]
rahul-lohra Aug 5, 2026
17f789f
fix baselineProfileOutputDir
rahul-lohra Aug 5, 2026
dc80a1e
Fix AGP 9 ART-profile parse and androidx.collection (IntFloatMap) re…
rahul-lohra Aug 5, 2026
98800e7
[record-paparazzi]
rahul-lohra Aug 5, 2026
256438e
Merge branch 'develop' into feature/rahullohra/build-on-sdk-37
rahul-lohra Aug 5, 2026
7dc54cf
[record-paparazzi]
rahul-lohra Aug 5, 2026
e840248
fix baselineprofile
rahul-lohra Aug 5, 2026
5eb3e60
[record-paparazzi]
rahul-lohra Aug 5, 2026
33ca5df
test: Render Paparazzi at API 36 to dodge alpha05 layoutlib crashes
rahul-lohra Aug 5, 2026
1188433
paparazzi changes
rahul-lohra Aug 5, 2026
8a59e91
fix for running unit-test
rahul-lohra Aug 5, 2026
a747510
build: Add JUnit Platform launcher to core for Gradle 9
rahul-lohra Aug 6, 2026
9e387f2
fix: Fix Paparazi crashes
rahul-lohra Aug 6, 2026
beda413
[record-paparazzi]
rahul-lohra Aug 6, 2026
04d7c97
Paparazzi new goldens
rahul-lohra Aug 6, 2026
8f9b979
Add fixed for Shot library. Align the androidx.test family across eve…
rahul-lohra Aug 6, 2026
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/workflows/apk-s3-distribute.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ jobs:
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- uses: GetStream/android-ci-actions/actions/setup-java@cb46e4f44d105a68738bfd2a1cfd156bb768665b
with:
java-version: '21'
- name: Prepare environment
env:
PASSPHRASE: ${{ secrets.PASSPHRASE }}
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/app-distribute-v7.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ jobs:
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- uses: GetStream/android-ci-actions/actions/setup-java@cb46e4f44d105a68738bfd2a1cfd156bb768665b
with:
java-version: '21'
- name: Prepare environment
env:
PASSPHRASE: ${{ secrets.PASSPHRASE }}
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/app-distribute.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ jobs:
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- uses: GetStream/android-ci-actions/actions/setup-java@cb46e4f44d105a68738bfd2a1cfd156bb768665b
with:
java-version: '21'
- name: Prepare environment
env:
PASSPHRASE: ${{ secrets.PASSPHRASE }}
Expand Down Expand Up @@ -50,6 +52,8 @@ jobs:
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- uses: GetStream/android-ci-actions/actions/setup-java@cb46e4f44d105a68738bfd2a1cfd156bb768665b
with:
java-version: '21'
- name: Prepare environment
env:
PASSPHRASE: ${{ secrets.PASSPHRASE }}
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/attach-release-apk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ jobs:
ref: ${{ github.event.release.tag_name }}
fetch-depth: 0
persist-credentials: false
- uses: GetStream/android-ci-actions/actions/setup-java@main
- uses: GetStream/stream-build-conventions-android/.github/workflows/android-ci.yml@feature/rahullohra/build-on-sdk-37

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wouldn't use temporary branch names. We can publish a release with a version suffix (e.g. 0.14.0-sdk37, 1.0.0-beta, or something along those lines) and point to that. Adding support in GetStream/stream-build-conventions-android#73

Aside from that, this seems incorrect. The step was using an action but now points to a workflow 🤔

with:
java-version: '21'
Comment on lines +24 to +26

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🔴 Critical | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Changed file:"
git ls-files .github/workflows/attach-release-apk.yml || true

echo
echo "Workflow excerpt:"
if [ -f .github/workflows/attach-release-apk.yml ]; then
  sed -n '1,120p' .github/workflows/attach-release-apk.yml | cat -n
fi

echo
echo "Relevant references in workflows:"
rg -n "uses: GetStream/stream-build-conventions-android/.github/workflows/android-ci.yml|android-ci.yml|setup-java|getstream|GetStream" .github/workflows || true

echo
echo "Check repository context for workflow files on referenced repo unavailable?"
python3 - <<'PY'
# Deterministic check: parse YAML-like uses entries and identify /workflows/ paths under steps.
import pathlib,re
p=pathlib.Path('.github/workflows/attach-release-apk.yml')
if not p.exists():
    print("file missing")
    raise SystemExit
text=p.read_text()
lines=text.splitlines()
in_steps=False
step_depth=0
uses_entries=[]
for i,line in enumerate(lines,1):
    if re.match(r'\s*steps:\s*$', line):
        in_steps=True
        step_depth=len(line)-len(line.lstrip())+2
        continue
    if in_steps:
        m=re.match(r'\s{4}uses:\s*(.+)\s*$', line)
        if m:
            uses_entries.append((i,m.group(1).strip()))
        if re.match(r'^\S', line):
            break
print("uses entries near job:")
for i,u in uses_entries:
  print(f"{i}: {u}")
print("uses paths under steps that target workflow files:", [u for i,u in uses_entries if '/workflows/' in u])
PY

Repository: GetStream/stream-chat-android

Length of output: 1944


Move the reusable workflow call out of steps.

GetStream/stream-build-conventions-android/.github/workflows/android-ci.yml targets a workflow file, and GitHub Actions reusable workflow calls belong at the job scope, not as a step entry. Replace this step with a setup action if the job still needs custom signing/upload steps.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/attach-release-apk.yml around lines 24 - 26, Move the
GetStream reusable workflow reference out of the job’s steps and invoke it at
job scope using the workflow-call syntax. Preserve the java-version input, and
keep any required signing or upload operations as separate steps in the calling
job, replacing the current workflow entry with a setup action only if those
steps still need to run.

- name: Prepare signing environment
env:
RELEASE_KEYSTORE: ${{ secrets.RELEASE_KEYSTORE }}
Expand Down
10 changes: 10 additions & 0 deletions .github/workflows/build-and-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ jobs:
- name: Check out code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- uses: GetStream/android-ci-actions/actions/setup-java@cb46e4f44d105a68738bfd2a1cfd156bb768665b
with:
java-version: '21'
- name: Build
run: ./gradlew assembleDebug
release_build:
Expand All @@ -33,6 +35,8 @@ jobs:
- name: Check out code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- uses: GetStream/android-ci-actions/actions/setup-java@cb46e4f44d105a68738bfd2a1cfd156bb768665b
with:
java-version: '21'
- name: Build
run: ./gradlew assembleRelease
tests:
Expand All @@ -47,6 +51,8 @@ jobs:
with:
fetch-depth: 0 # fetch all history for sonar analysis
- uses: GetStream/android-ci-actions/actions/setup-java@cb46e4f44d105a68738bfd2a1cfd156bb768665b
with:
java-version: '21'
- name: Unit tests
run: ./gradlew :testCoverage
- name: Upload test results
Expand All @@ -70,6 +76,8 @@ jobs:
- name: Check out code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- uses: GetStream/android-ci-actions/actions/setup-java@cb46e4f44d105a68738bfd2a1cfd156bb768665b
with:
java-version: '21'
- name: build demo debug
run: ./gradlew stream-chat-android-ui-components-sample:assembleDemoDebug
- name: Upload artifact to Emerge
Expand All @@ -88,6 +96,8 @@ jobs:
- name: Check out code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- uses: GetStream/android-ci-actions/actions/setup-java@cb46e4f44d105a68738bfd2a1cfd156bb768665b
with:
java-version: '21'
- name: build debug
run: ./gradlew stream-chat-android-compose-sample:assembleDebug
- name: Upload artifact to Emerge
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/check-entities.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ jobs:
with:
fetch-depth: 0
- uses: GetStream/android-ci-actions/actions/setup-java@main
with:
java-version: '21'
- name: Find touched DB Entities
id: touchedEntities
continue-on-error: true
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/clean-detekt-baseline.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ jobs:
with:
token: ${{ secrets.STREAM_PUBLIC_BOT_TOKEN }}
- uses: GetStream/android-ci-actions/actions/setup-java@cb46e4f44d105a68738bfd2a1cfd156bb768665b
with:
java-version: '21'
- uses: tibdex/github-app-token@v2.1.0
id: generate-token
with:
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/e2e-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ jobs:
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- uses: GetStream/android-ci-actions/actions/setup-java@cb46e4f44d105a68738bfd2a1cfd156bb768665b
with:
java-version: '21'
- uses: GetStream/android-ci-actions/actions/enable-kvm@main
- uses: GetStream/android-ci-actions/actions/setup-ruby@main
- uses: GetStream/android-ci-actions/actions/gradle-cache@main
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/e2e-test-backend.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ jobs:
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- uses: GetStream/android-ci-actions/actions/setup-java@cb46e4f44d105a68738bfd2a1cfd156bb768665b
with:
java-version: '21'
- uses: GetStream/android-ci-actions/actions/enable-kvm@main
- uses: GetStream/android-ci-actions/actions/setup-ruby@main
- name: Run tests
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/e2e-test-cron.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ jobs:
with:
name: apks
- uses: GetStream/android-ci-actions/actions/setup-java@cb46e4f44d105a68738bfd2a1cfd156bb768665b
with:
java-version: '21'
- uses: GetStream/android-ci-actions/actions/enable-kvm@main
- uses: GetStream/android-ci-actions/actions/setup-ruby@main
- uses: GetStream/android-ci-actions/actions/allure-launch@main
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/e2e-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ jobs:
with:
name: apks
- uses: GetStream/android-ci-actions/actions/setup-java@cb46e4f44d105a68738bfd2a1cfd156bb768665b
with:
java-version: '21'
- uses: GetStream/android-ci-actions/actions/enable-kvm@main
- uses: GetStream/android-ci-actions/actions/setup-ruby@main
- name: Run tests
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/pr-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
permissions:
contents: read
pull-requests: read
uses: GetStream/stream-build-conventions-android/.github/workflows/android-ci.yml@8c5fbade4ee9c06a0a979bcb0866e64669254f73
uses: GetStream/stream-build-conventions-android/.github/workflows/android-ci.yml@feature/rahullohra/build-on-sdk-37

Check failure on line 16 in .github/workflows/pr-checks.yml

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Use full commit SHA hash for this dependency.

See more on https://sonarcloud.io/project/issues?id=GetStream_stream-chat-android&issues=AZ_WN4TpM7QpearMwu3r&open=AZ_WN4TpM7QpearMwu3r&pullRequest=6590
secrets:
BUILD_CACHE_AWS_REGION: ${{ secrets.BUILD_CACHE_AWS_REGION }}
BUILD_CACHE_AWS_BUCKET: ${{ secrets.BUILD_CACHE_AWS_BUCKET }}
Expand All @@ -28,7 +28,7 @@
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- uses: GetStream/stream-build-conventions-android/.github/actions/setup-gradle@v0.13.1
- uses: GetStream/stream-build-conventions-android/.github/actions/setup-gradle@feature/rahullohra/build-on-sdk-37
- name: Detekt
run: ./gradlew detekt
rubocop:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/pr-quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,5 @@ concurrency:

jobs:
pr-checklist:
uses: GetStream/stream-build-conventions-android/.github/workflows/pr-quality.yml@v0.13.1
uses: GetStream/stream-build-conventions-android/.github/workflows/pr-quality.yml@feature/rahullohra/build-on-sdk-37
secrets: inherit
55 changes: 55 additions & 0 deletions .github/workflows/record-paparazzi.yml

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can't we regenerate them locally like today? I checked on my machine and:

  • When recording: some snapshots change, but the image diff shows 0 or close to 0 pixel changes
  • When running validation: the check passes

I'd avoid having to rely on CI for regenerating snapshots if possible, as it will slow us down compared to today.

Also one less workflow + script to maintain.

Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Record Paparazzi Snapshots

# Manually-triggered job that regenerates Paparazzi golden images on the CI runner (Linux/amd64)
# and uploads them as an artifact. Paparazzi renders via native layoutlib, whose pixels depend on
# OS + architecture, so goldens must be produced in the same environment which verifies —
# the CI runner.
# Download the artifact with scripts/paparazzi-pull-goldens.sh, then commit + push.
# Deliberately does NOT commit back: no write permissions needed, and you review the diff locally.
on:
# Manual trigger — only works once this file is on the default branch (kept for later).
workflow_dispatch:
# Branch trigger — works from a feature branch without default-branch access. The heavy job is
# gated by a commit-message marker (see the job's `if:`) so ordinary pushes don't run it.
# To trigger: git commit --allow-empty -m "record goldens [record-paparazzi]" && git push
push:
branches:
- "feature/rahullohra/**"

concurrency:
group: record-paparazzi-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
record:
name: Record golden images (Linux/amd64)
runs-on: ubuntu-latest # Same runner as the verify job, so recorded pixels match verification.
# Run only on manual dispatch, or on a push whose commit message contains [record-paparazzi].
if: >-
github.event_name == 'workflow_dispatch' ||
contains(github.event.head_commit.message, '[record-paparazzi]')
steps:
- uses: actions/checkout@v7
- name: Setup Java
uses: actions/setup-java@v4
with:
java-version: '21' # Paparazzi 2.0.0-alpha05 requires JDK 21.
distribution: temurin
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4

Check failure on line 42 in .github/workflows/record-paparazzi.yml

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Use full commit SHA hash for this dependency.

See more on https://sonarcloud.io/project/issues?id=GetStream_stream-chat-android&issues=AZ_WN4RYM7QpearMwu3q&open=AZ_WN4RYM7QpearMwu3q&pullRequest=6590
- name: Record Paparazzi goldens
# cleanRecord so stale / differently-named goldens are removed and the artifact is the
# exact set the current tests produce under this Paparazzi/layoutlib version.
run: ./gradlew cleanRecordPaparazziDebug --stacktrace
- name: Upload recorded goldens
uses: actions/upload-artifact@v4
with:
name: paparazzi-goldens
# Paths are preserved relative to the workspace, i.e. <module>/src/test/snapshots/...,
# so the local pull script can overlay them straight onto the repo root.
path: '**/src/test/snapshots/**'
if-no-files-found: error
retention-days: 7
2 changes: 1 addition & 1 deletion .github/workflows/sdk-size-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ concurrency:

jobs:
compare-sdk-sizes:
uses: GetStream/stream-build-conventions-android/.github/workflows/sdk-size-checks.yml@v0.13.1
uses: GetStream/stream-build-conventions-android/.github/workflows/sdk-size-checks.yml@feature/rahullohra/build-on-sdk-37
with:
modules: "stream-chat-android-client stream-chat-android-ui-components stream-chat-android-compose"
metrics-project: "stream-chat-android-metrics"
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/snapshot-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ jobs:
- name: Check out code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- uses: GetStream/android-ci-actions/actions/setup-java@cb46e4f44d105a68738bfd2a1cfd156bb768665b
with:
java-version: '21'
- uses: GetStream/android-ci-actions/actions/setup-ruby@main
- uses: GetStream/android-ci-actions/actions/gradle-cache@main
with:
Expand Down
18 changes: 17 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ plugins {
alias(libs.plugins.detekt) apply false
alias(libs.plugins.shot) apply false
alias(libs.plugins.androidx.navigation) apply false
alias(libs.plugins.gitversioner)
alias(libs.plugins.gradle.versions)
alias(libs.plugins.binary.compatibility.validator)
}
Expand Down Expand Up @@ -98,6 +97,23 @@ subprojects {
}

apply(plugin = "io.gitlab.arturbosch.detekt")

// Align the androidx.test family across every configuration. Shot (in the sample apps) drags an
// old androidx.test (core 1.5.0 / monitor 1.6.0 / storage 1.4.2) onto the main runtime classpath
// via fragment-testing / compose-ui-test, while androidx.test.ext:junit 1.2.1 needs newer ones on
// the androidTest classpath. AGP consistent resolution then can't reconcile the two. Forcing the
// family (main included) makes both classpaths resolve the same versions.
configurations.configureEach {
resolutionStrategy {
force(
"androidx.test:core:1.6.1",
"androidx.test:core-ktx:1.6.1",
"androidx.test:runner:1.6.2",
"androidx.test:monitor:1.7.2",
"androidx.test.services:storage:1.5.0",
)
}
}
Comment on lines +101 to +116

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It isn't Shot — it's debugImplementation(libs.androidx.fragment.testing) at stream-chat-android-ui-components-sample/build.gradle.kts:176. That's the pre-fragment-1.6 pattern (before the fragment-testing-manifest split), so it lands fragment-testing and its old androidx.test:core:1.5.0 directly on demoDebugRuntimeClasspath — which is where the strict constraint AGP can't reconcile comes from.

It's also unused: that module has no androidTest source set and never touches FragmentScenario.

I removed that line and this block together and re-resolved: ui-components-sample, compose-sample and ui-uitests androidTest classpaths all resolve, and the {strictly androidx.test:*} constraints disappear. ui-uitests does use FragmentScenario, but its existing exclude(module = "monitor") already covers it.

Worth preferring that: force silently overrides every configuration in every module, and this block leaves the debug APK shipping fragment-testing anyway (just at 1.6.1). It also means "remove when Shot is retired/updated" can never actually fire.

}

tasks.withType<DependencyUpdatesTask> {
Expand Down
13 changes: 12 additions & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,18 @@ org.gradle.parallel=true
org.gradle.caching=true
# Disabled R8 full mode
android.enableR8.fullMode=true
android.suppressUnsupportedCompileSdk=34
android.suppressUnsupportedCompileSdk=37
# AGP 9 ships built-in Kotlin and registers its own `kotlin` extension. Opt out so the
# standalone `org.jetbrains.kotlin.android` plugin (applied across modules) keeps working.
# Transitional: AGP 10 removes this escape hatch — migrate to built-in Kotlin before then.
android.builtInKotlin=false
# AGP 9 removed the legacy DSL implementations; the standalone KGP still casts the module
# extension to the removed `BaseExtension` (fails on com.android.test / TestExtension). Restore
# the old DSL so KGP works. Also transitional — removed in AGP 10.
android.newDsl=false

# Project version
version=7.7.0

# Enabled parallel sync for Gradle 9.4+
org.gradle.tooling.parallel=true
Loading
Loading