From f8324e32590163cbbb08ee1c3182f058f190e23f Mon Sep 17 00:00:00 2001 From: Aleksandar Apostolov Date: Thu, 25 Sep 2025 10:19:19 +0200 Subject: [PATCH 1/2] Update CI and linter --- .github/workflows/android.yml | 4 ++-- .../core/lint/detectors/StreamApiExplicitMarkerDetector.kt | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index eb0ccaa..4ddbee8 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -48,7 +48,7 @@ jobs: - name: Check out code uses: actions/checkout@v3.1.0 - uses: GetStream/android-ci-actions/actions/setup-java@main - - name: spotless + - name: Run spotless check run: ./gradlew spotlessCheck --scan lint: name: Lint @@ -57,7 +57,7 @@ jobs: - name: Check out code uses: actions/checkout@v3.1.0 - uses: GetStream/android-ci-actions/actions/setup-java@main - - name: spotless + - name: Run lint check run: ./gradlew lint unitTest: diff --git a/stream-android-core-lint/src/main/java/io/getstream/android/core/lint/detectors/StreamApiExplicitMarkerDetector.kt b/stream-android-core-lint/src/main/java/io/getstream/android/core/lint/detectors/StreamApiExplicitMarkerDetector.kt index aab2e20..a396762 100644 --- a/stream-android-core-lint/src/main/java/io/getstream/android/core/lint/detectors/StreamApiExplicitMarkerDetector.kt +++ b/stream-android-core-lint/src/main/java/io/getstream/android/core/lint/detectors/StreamApiExplicitMarkerDetector.kt @@ -144,8 +144,11 @@ class StreamApiExplicitMarkerDetector : Detector(), Detector.UastScanner { private fun JavaContext.packageMatchesConfig(pkg: String): Boolean { val patterns = configuredPackageGlobs() - // Default if not configured → only io.getstream.android.core.* - val effectivePatterns = patterns.ifEmpty { listOf("io.getstream.android.core.api") } + // Default if not configured → io.getstream.android.core.api and its subpackages. + val effectivePatterns = + patterns.ifEmpty { + listOf("io.getstream.android.core.api", "io.getstream.android.core.api.*") + } val included = effectivePatterns.any { pkgMatchesGlob(pkg, it) } val excluded = packageMatchesExcludeConfig(pkg) From 92aa446f7a1a6a2026df076f8f4584a788a80caf Mon Sep 17 00:00:00 2001 From: Aleksandar Apostolov Date: Thu, 25 Sep 2025 11:03:04 +0200 Subject: [PATCH 2/2] Add published API annotation --- .../java/io/getstream/android/core/api/filter/FilterField.kt | 3 +++ .../main/java/io/getstream/android/core/api/filter/Filters.kt | 1 + .../src/main/java/io/getstream/android/core/api/sort/Sort.kt | 3 +++ .../java/io/getstream/android/core/api/sort/SortComparator.kt | 3 +++ .../main/java/io/getstream/android/core/api/utils/Response.kt | 2 ++ 5 files changed, 12 insertions(+) diff --git a/stream-android-core/src/main/java/io/getstream/android/core/api/filter/FilterField.kt b/stream-android-core/src/main/java/io/getstream/android/core/api/filter/FilterField.kt index 4caa573..3f9fb6e 100644 --- a/stream-android-core/src/main/java/io/getstream/android/core/api/filter/FilterField.kt +++ b/stream-android-core/src/main/java/io/getstream/android/core/api/filter/FilterField.kt @@ -15,6 +15,8 @@ */ package io.getstream.android.core.api.filter +import io.getstream.android.core.annotations.StreamPublishedApi + /** * Interface representing a field that can be used in filters for querying data from the Stream API. * @@ -22,6 +24,7 @@ package io.getstream.android.core.api.filter * expected by the Stream API, and [localValue], a function to extract the field's value from a * model instance. */ +@StreamPublishedApi public interface FilterField { /** The name of this field as expected by the Stream API. */ public val remote: String diff --git a/stream-android-core/src/main/java/io/getstream/android/core/api/filter/Filters.kt b/stream-android-core/src/main/java/io/getstream/android/core/api/filter/Filters.kt index 8f0ccae..13bcbd0 100644 --- a/stream-android-core/src/main/java/io/getstream/android/core/api/filter/Filters.kt +++ b/stream-android-core/src/main/java/io/getstream/android/core/api/filter/Filters.kt @@ -20,6 +20,7 @@ import io.getstream.android.core.internal.filter.BinaryOperator import io.getstream.android.core.internal.filter.CollectionOperator /** Utility class for building filters. */ +@StreamPublishedApi public object Filters { /** * Creates a filter that combines multiple filters with a logical AND operation. diff --git a/stream-android-core/src/main/java/io/getstream/android/core/api/sort/Sort.kt b/stream-android-core/src/main/java/io/getstream/android/core/api/sort/Sort.kt index b519d17..c628820 100644 --- a/stream-android-core/src/main/java/io/getstream/android/core/api/sort/Sort.kt +++ b/stream-android-core/src/main/java/io/getstream/android/core/api/sort/Sort.kt @@ -15,6 +15,8 @@ */ package io.getstream.android.core.api.sort +import io.getstream.android.core.annotations.StreamPublishedApi + /** * A sort configuration that combines a sort field with a direction. * @@ -22,6 +24,7 @@ package io.getstream.android.core.api.sort * associated model type. It provides both local sorting capabilities and the ability to generate * remote API request parameters. */ +@StreamPublishedApi public open class Sort(public val field: SortField, public val direction: SortDirection) : Comparator { diff --git a/stream-android-core/src/main/java/io/getstream/android/core/api/sort/SortComparator.kt b/stream-android-core/src/main/java/io/getstream/android/core/api/sort/SortComparator.kt index f74201f..c28dda2 100644 --- a/stream-android-core/src/main/java/io/getstream/android/core/api/sort/SortComparator.kt +++ b/stream-android-core/src/main/java/io/getstream/android/core/api/sort/SortComparator.kt @@ -16,6 +16,7 @@ package io.getstream.android.core.api.sort import io.getstream.android.core.annotations.StreamInternalApi +import io.getstream.android.core.annotations.StreamPublishedApi /** * A comparator that can sort model instances by extracting comparable values. @@ -28,6 +29,7 @@ import io.getstream.android.core.annotations.StreamInternalApi * @param V The type of the comparable value extracted from the model instances. * @property value A lambda that extracts a comparable value from a model instance. */ +@StreamPublishedApi public class SortComparator>(public val value: (T) -> V) { /** @@ -70,6 +72,7 @@ public class SortComparator>(public val value: (T) -> V) { * Type erased type avoids making SortField generic while keeping the underlying value type intact * (no runtime type checks while sorting). */ +@StreamPublishedApi public class AnySortComparator(private val compare: (T?, T?, SortDirection) -> Int) { /** diff --git a/stream-android-core/src/main/java/io/getstream/android/core/api/utils/Response.kt b/stream-android-core/src/main/java/io/getstream/android/core/api/utils/Response.kt index 828f747..2d3662a 100644 --- a/stream-android-core/src/main/java/io/getstream/android/core/api/utils/Response.kt +++ b/stream-android-core/src/main/java/io/getstream/android/core/api/utils/Response.kt @@ -15,6 +15,7 @@ */ package io.getstream.android.core.api.utils +import io.getstream.android.core.annotations.StreamInternalApi import io.getstream.android.core.api.model.exceptions.StreamEndpointErrorData import io.getstream.android.core.api.serialization.StreamJsonSerialization import okhttp3.Response @@ -26,6 +27,7 @@ import okhttp3.Response * @return The API error, or a failure if the response body could not be parsed. * @receiver The response to extract the error from. */ +@StreamInternalApi public fun Response.toErrorData(with: StreamJsonSerialization): Result = runCatching { peekBody(Long.MAX_VALUE).string() } .flatMap { with.fromJson(it, StreamEndpointErrorData::class.java) }