Skip to content

Commit 27c702c

Browse files
authored
chore: Add Binary Compatibility Validator (#115)
1 parent 4cc17dc commit 27c702c

File tree

8 files changed

+1149
-2
lines changed

8 files changed

+1149
-2
lines changed

CONTRIBUTING.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,13 @@ To send us a pull request, please:
3939
GitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and
4040
[creating a pull request](https://help.github.com/articles/creating-a-pull-request/).
4141

42+
### Public API Changes
43+
This project uses the [Kotlin Binary Compatibility Validator Plugin](https://github.com/Kotlin/binary-compatibility-validator) to validate our public API surface. Pull requests that include public API changes must modify the API file by running this gradle command:
44+
45+
```bash
46+
./gradlew apiDump
47+
```
48+
4249

4350
## Finding contributions to work on
4451
Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels (enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any 'help wanted' issues is a great place to start.

authenticator/api/authenticator.api

Lines changed: 968 additions & 0 deletions
Large diffs are not rendered by default.

build-logic/plugins/build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ ktlint {
2929

3030
dependencies {
3131
compileOnly(libs.plugin.android.gradle)
32+
compileOnly(libs.plugin.binary.compatibility)
3233
compileOnly(libs.plugin.kotlin.android)
3334
compileOnly(libs.plugin.kover)
3435
compileOnly(libs.plugin.ktlint)
@@ -40,6 +41,10 @@ gradlePlugin {
4041
id = "amplify.android.library"
4142
implementationClass = "AndroidLibraryConventionPlugin"
4243
}
44+
register("apiValidator") {
45+
id = "amplify.android.api.validator"
46+
implementationClass = "ApiValidatorConventionPlugin"
47+
}
4348
register("publishing") {
4449
id = "amplify.android.publishing"
4550
implementationClass = "PublishingConventionPlugin"
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License").
5+
* You may not use this file except in compliance with the License.
6+
* A copy of the License is located at
7+
*
8+
* http://aws.amazon.com/apache2.0
9+
*
10+
* or in the "license" file accompanying this file. This file is distributed
11+
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12+
* express or implied. See the License for the specific language governing
13+
* permissions and limitations under the License.
14+
*/
15+
16+
import kotlinx.validation.ApiValidationExtension
17+
import org.gradle.api.Plugin
18+
import org.gradle.api.Project
19+
import org.gradle.kotlin.dsl.configure
20+
21+
/**
22+
* This plugin configures the [Binary Compatibility Validator](https://github.com/Kotlin/binary-compatibility-validator)
23+
* to ensure that we don't change public API surface unintentionally.
24+
*/
25+
class ApiValidatorConventionPlugin : Plugin<Project> {
26+
override fun apply(target: Project) {
27+
with(target) {
28+
pluginManager.apply("org.jetbrains.kotlinx.binary-compatibility-validator")
29+
30+
extensions.configure<ApiValidationExtension> {
31+
// Ignore anything marked with an internal API marker
32+
nonPublicMarkers += amplifyInternalMarkers
33+
}
34+
}
35+
}
36+
}

build-logic/plugins/src/main/kotlin/ComponentConventionPlugin.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import org.gradle.api.Project
1818
import org.gradle.kotlin.dsl.withType
1919
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
2020

21-
val optInAnnotations = listOf(
21+
val amplifyInternalMarkers = listOf(
2222
"com.amplifyframework.annotations.InternalApiWarning",
2323
"com.amplifyframework.annotations.InternalAmplifyApi"
2424
)
@@ -32,10 +32,11 @@ class ComponentConventionPlugin : Plugin<Project> {
3232
pluginManager.apply("amplify.android.library")
3333
pluginManager.apply("amplify.android.publishing")
3434
pluginManager.apply("amplify.android.kover")
35+
pluginManager.apply("amplify.android.api.validator")
3536

3637
tasks.withType<KotlinCompile>().configureEach {
3738
kotlinOptions {
38-
freeCompilerArgs = freeCompilerArgs + optInAnnotations.map { "-opt-in=$it" }
39+
freeCompilerArgs = freeCompilerArgs + amplifyInternalMarkers.map { "-opt-in=$it" }
3940
}
4041
}
4142
}

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ subprojects {
6363
plugins {
6464
alias(libs.plugins.android.application) apply false
6565
alias(libs.plugins.android.library) apply false
66+
alias(libs.plugins.binary.compatibility) apply false
6667
alias(libs.plugins.kotlin.android) apply false
6768
alias(libs.plugins.kotlin.serialization) apply false
6869
alias(libs.plugins.kover)

gradle/libs.versions.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
[versions]
22
agp = "8.1.4"
33
amplify = "2.14.8"
4+
binary-compatibility = "0.14.0"
45
cameraX = "1.2.0"
56
compose = "1.5.4"
67
coroutines = "1.7.3"
@@ -57,6 +58,7 @@ test-turbine = { module = "app.cash.turbine:turbine", version.ref = "turbine" }
5758

5859
# Dependencies for convention plugins
5960
plugin-android-gradle = { module = "com.android.tools.build:gradle", version.ref = "agp" }
61+
plugin-binary-compatibility = { module = "org.jetbrains.kotlinx:binary-compatibility-validator", version.ref = "binary-compatibility" }
6062
plugin-kotlin-android = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
6163
plugin-kover = { module = "org.jetbrains.kotlinx:kover-gradle-plugin", version.ref = "kover" }
6264
plugin-ktlint = { module = "org.jlleitschuh.gradle:ktlint-gradle", version.ref = "ktlint" }
@@ -80,6 +82,7 @@ test = [
8082
[plugins]
8183
android-application = { id = "com.android.application", version.ref = "agp" }
8284
android-library = { id = "com.android.library", version.ref = "agp" }
85+
binary-compatibility = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version.ref = "binary-compatibility" }
8386
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
8487
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
8588
kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" }

liveness/api/liveness.api

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
public final class com/amplifyframework/ui/liveness/BuildConfig {
2+
public static final field BUILD_TYPE Ljava/lang/String;
3+
public static final field DEBUG Z
4+
public static final field LIBRARY_PACKAGE_NAME Ljava/lang/String;
5+
public static final field VERSION_NAME Ljava/lang/String;
6+
public fun <init> ()V
7+
}
8+
9+
public class com/amplifyframework/ui/liveness/model/FaceLivenessDetectionException {
10+
public static final field $stable I
11+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V
12+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
13+
public final fun getMessage ()Ljava/lang/String;
14+
public final fun getRecoverySuggestion ()Ljava/lang/String;
15+
public final fun getThrowable ()Ljava/lang/Throwable;
16+
}
17+
18+
public final class com/amplifyframework/ui/liveness/model/FaceLivenessDetectionException$AccessDeniedException : com/amplifyframework/ui/liveness/model/FaceLivenessDetectionException {
19+
public static final field $stable I
20+
public fun <init> ()V
21+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V
22+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
23+
}
24+
25+
public final class com/amplifyframework/ui/liveness/model/FaceLivenessDetectionException$CameraPermissionDeniedException : com/amplifyframework/ui/liveness/model/FaceLivenessDetectionException {
26+
public static final field $stable I
27+
public fun <init> ()V
28+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V
29+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
30+
}
31+
32+
public final class com/amplifyframework/ui/liveness/model/FaceLivenessDetectionException$SessionNotFoundException : com/amplifyframework/ui/liveness/model/FaceLivenessDetectionException {
33+
public static final field $stable I
34+
public fun <init> ()V
35+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V
36+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
37+
}
38+
39+
public final class com/amplifyframework/ui/liveness/model/FaceLivenessDetectionException$SessionTimedOutException : com/amplifyframework/ui/liveness/model/FaceLivenessDetectionException {
40+
public static final field $stable I
41+
public fun <init> ()V
42+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V
43+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
44+
}
45+
46+
public final class com/amplifyframework/ui/liveness/model/FaceLivenessDetectionException$UserCancelledException : com/amplifyframework/ui/liveness/model/FaceLivenessDetectionException {
47+
public static final field $stable I
48+
public fun <init> ()V
49+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V
50+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
51+
}
52+
53+
public final class com/amplifyframework/ui/liveness/ui/ComposableSingletons$CancelChallengeButtonKt {
54+
public static final field INSTANCE Lcom/amplifyframework/ui/liveness/ui/ComposableSingletons$CancelChallengeButtonKt;
55+
public static field lambda-1 Lkotlin/jvm/functions/Function2;
56+
public static field lambda-2 Lkotlin/jvm/functions/Function2;
57+
public fun <init> ()V
58+
public final fun getLambda-1$liveness_release ()Lkotlin/jvm/functions/Function2;
59+
public final fun getLambda-2$liveness_release ()Lkotlin/jvm/functions/Function2;
60+
}
61+
62+
public final class com/amplifyframework/ui/liveness/ui/ComposableSingletons$FaceLivenessDetectorKt {
63+
public static final field INSTANCE Lcom/amplifyframework/ui/liveness/ui/ComposableSingletons$FaceLivenessDetectorKt;
64+
public static field lambda-1 Lkotlin/jvm/functions/Function3;
65+
public fun <init> ()V
66+
public final fun getLambda-1$liveness_release ()Lkotlin/jvm/functions/Function3;
67+
}
68+
69+
public final class com/amplifyframework/ui/liveness/ui/ComposableSingletons$InstructionMessageKt {
70+
public static final field INSTANCE Lcom/amplifyframework/ui/liveness/ui/ComposableSingletons$InstructionMessageKt;
71+
public static field lambda-1 Lkotlin/jvm/functions/Function2;
72+
public static field lambda-2 Lkotlin/jvm/functions/Function2;
73+
public static field lambda-3 Lkotlin/jvm/functions/Function2;
74+
public static field lambda-4 Lkotlin/jvm/functions/Function2;
75+
public static field lambda-5 Lkotlin/jvm/functions/Function2;
76+
public fun <init> ()V
77+
public final fun getLambda-1$liveness_release ()Lkotlin/jvm/functions/Function2;
78+
public final fun getLambda-2$liveness_release ()Lkotlin/jvm/functions/Function2;
79+
public final fun getLambda-3$liveness_release ()Lkotlin/jvm/functions/Function2;
80+
public final fun getLambda-4$liveness_release ()Lkotlin/jvm/functions/Function2;
81+
public final fun getLambda-5$liveness_release ()Lkotlin/jvm/functions/Function2;
82+
}
83+
84+
public final class com/amplifyframework/ui/liveness/ui/ComposableSingletons$PhotosensitivityViewKt {
85+
public static final field INSTANCE Lcom/amplifyframework/ui/liveness/ui/ComposableSingletons$PhotosensitivityViewKt;
86+
public static field lambda-1 Lkotlin/jvm/functions/Function3;
87+
public static field lambda-2 Lkotlin/jvm/functions/Function2;
88+
public static field lambda-3 Lkotlin/jvm/functions/Function2;
89+
public static field lambda-4 Lkotlin/jvm/functions/Function2;
90+
public static field lambda-5 Lkotlin/jvm/functions/Function2;
91+
public fun <init> ()V
92+
public final fun getLambda-1$liveness_release ()Lkotlin/jvm/functions/Function3;
93+
public final fun getLambda-2$liveness_release ()Lkotlin/jvm/functions/Function2;
94+
public final fun getLambda-3$liveness_release ()Lkotlin/jvm/functions/Function2;
95+
public final fun getLambda-4$liveness_release ()Lkotlin/jvm/functions/Function2;
96+
public final fun getLambda-5$liveness_release ()Lkotlin/jvm/functions/Function2;
97+
}
98+
99+
public final class com/amplifyframework/ui/liveness/ui/ComposableSingletons$RecordingIndicatorKt {
100+
public static final field INSTANCE Lcom/amplifyframework/ui/liveness/ui/ComposableSingletons$RecordingIndicatorKt;
101+
public static field lambda-1 Lkotlin/jvm/functions/Function2;
102+
public static field lambda-2 Lkotlin/jvm/functions/Function2;
103+
public static field lambda-3 Lkotlin/jvm/functions/Function2;
104+
public fun <init> ()V
105+
public final fun getLambda-1$liveness_release ()Lkotlin/jvm/functions/Function2;
106+
public final fun getLambda-2$liveness_release ()Lkotlin/jvm/functions/Function2;
107+
public final fun getLambda-3$liveness_release ()Lkotlin/jvm/functions/Function2;
108+
}
109+
110+
public final class com/amplifyframework/ui/liveness/ui/FaceLivenessDetectorKt {
111+
public static final fun FaceLivenessDetector (Ljava/lang/String;Ljava/lang/String;Lcom/amplifyframework/auth/AWSCredentialsProvider;ZLcom/amplifyframework/core/Action;Lcom/amplifyframework/core/Consumer;Landroidx/compose/runtime/Composer;II)V
112+
}
113+
114+
public final class com/amplifyframework/ui/liveness/ui/LivenessColorScheme {
115+
public static final field $stable I
116+
public static final field INSTANCE Lcom/amplifyframework/ui/liveness/ui/LivenessColorScheme;
117+
public final fun default (Landroidx/compose/runtime/Composer;I)Landroidx/compose/material3/ColorScheme;
118+
}
119+
120+
public final class com/amplifyframework/ui/liveness/ui/LivenessColorScheme$Defaults {
121+
public static final field $stable I
122+
public static final field INSTANCE Lcom/amplifyframework/ui/liveness/ui/LivenessColorScheme$Defaults;
123+
public final fun getDarkColorScheme ()Landroidx/compose/material3/ColorScheme;
124+
public final fun getLightColorScheme ()Landroidx/compose/material3/ColorScheme;
125+
}
126+

0 commit comments

Comments
 (0)