From c355b9001e156b4c754206a3891bbeaa97f7ad2f Mon Sep 17 00:00:00 2001 From: Jordan Haven Date: Wed, 3 Apr 2024 11:54:43 -0400 Subject: [PATCH 1/3] Bump retrofit and moshi versions to incorporate new proguard rules; annotate our requests/responses with Keep to prevent them from being stripped; force minify in workbench apps for testing purposes; bump version --- b2bExampleApp/build.gradle | 1 + build.gradle | 4 +- consumerExampleApp/build.gradle | 1 + sdk/build.gradle | 4 +- sdk/proguard-rules.pro | 1 + .../sdk/b2b/network/models/B2BRequests.kt | 16 ++++++++ .../sdk/b2b/network/models/B2BResponseData.kt | 36 +++++++++++++++--- .../sdk/b2b/network/models/B2BResponses.kt | 34 ++++++++++++----- .../stytch/sdk/b2b/network/models/Enums.kt | 6 +++ .../sdk/common/network/StytchDataResponse.kt | 3 ++ .../common/network/models/CommonRequests.kt | 9 ++++- .../network/models/CommonResponseData.kt | 29 +++++++++++++++ .../common/network/models/CommonResponses.kt | 9 ++++- .../network/models/ConsumerRequests.kt | 37 ++++++++++++++++--- .../network/models/ConsumerResponses.kt | 20 +++++++++- .../consumer/network/models/ResponseData.kt | 37 +++++++++++++++---- .../sdk/ui/data/EmailMagicLinksOptions.kt | 6 ++- .../stytch/sdk/ui/data/GoogleOAuthOptions.kt | 1 + .../com/stytch/sdk/ui/data/OAuthOptions.kt | 1 + .../com/stytch/sdk/ui/data/OTPOptions.kt | 32 +++++++++------- .../com/stytch/sdk/ui/data/PasswordOptions.kt | 21 ++++++----- .../com/stytch/sdk/ui/data/SessionOptions.kt | 1 + .../stytch/sdk/ui/data/StytchProductConfig.kt | 12 +++--- 23 files changed, 258 insertions(+), 63 deletions(-) diff --git a/b2bExampleApp/build.gradle b/b2bExampleApp/build.gradle index 05c26d6ca..1b8e2b808 100644 --- a/b2bExampleApp/build.gradle +++ b/b2bExampleApp/build.gradle @@ -38,6 +38,7 @@ android { b2bOrganizationId = STYTCH_B2B_ORG_ID } buildConfigField "String", "STYTCH_B2B_ORG_ID", "\"$b2bOrganizationId\"" + minifyEnabled true } release { minifyEnabled false diff --git a/build.gradle b/build.gradle index 624519ee7..566af7fe0 100644 --- a/build.gradle +++ b/build.gradle @@ -3,10 +3,10 @@ buildscript { ext { kotlin_version = '1.8.22' dokka_version = '1.9.10' - retrofit_version = '2.9.0' + retrofit_version = '2.11.0' okhttp_version = '4.11.0' compose_version = '1.4.3' - moshi_version = '1.15.0' + moshi_version = '1.15.1' kotlin_coroutines_version = '1.7.2' } repositories { diff --git a/consumerExampleApp/build.gradle b/consumerExampleApp/build.gradle index bbf3d58c5..b57b5b1e7 100644 --- a/consumerExampleApp/build.gradle +++ b/consumerExampleApp/build.gradle @@ -44,6 +44,7 @@ android { passkeysDomain = PASSKEYS_DOMAIN } buildConfigField "String", "PASSKEYS_DOMAIN", "\"$passkeysDomain\"" + minifyEnabled true } release { minifyEnabled false diff --git a/sdk/build.gradle b/sdk/build.gradle index d37033de5..51ea9e3a1 100644 --- a/sdk/build.gradle +++ b/sdk/build.gradle @@ -8,7 +8,7 @@ plugins { ext { PUBLISH_GROUP_ID = 'com.stytch.sdk' - PUBLISH_VERSION = '0.20.2' + PUBLISH_VERSION = '0.20.3' PUBLISH_ARTIFACT_ID = 'sdk' } @@ -30,7 +30,7 @@ android { } buildTypes { release { - minifyEnabled false + minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' buildConfigField "Boolean", "DEBUG_MODE", "false" buildConfigField "String", "STYTCH_SDK_VERSION", "\"$PUBLISH_VERSION\"" diff --git a/sdk/proguard-rules.pro b/sdk/proguard-rules.pro index 1145ac728..44559421c 100644 --- a/sdk/proguard-rules.pro +++ b/sdk/proguard-rules.pro @@ -28,3 +28,4 @@ -keep class androidx.credentials.playservices.** { *; } +-dontwarn java.lang.invoke.StringConcatFactory \ No newline at end of file diff --git a/sdk/src/main/java/com/stytch/sdk/b2b/network/models/B2BRequests.kt b/sdk/src/main/java/com/stytch/sdk/b2b/network/models/B2BRequests.kt index 50ac72dcf..420e948a2 100644 --- a/sdk/src/main/java/com/stytch/sdk/b2b/network/models/B2BRequests.kt +++ b/sdk/src/main/java/com/stytch/sdk/b2b/network/models/B2BRequests.kt @@ -1,11 +1,13 @@ package com.stytch.sdk.b2b.network.models +import androidx.annotation.Keep import com.squareup.moshi.Json import com.squareup.moshi.JsonClass internal object B2BRequests { object MagicLinks { object Email { + @Keep @JsonClass(generateAdapter = true) data class LoginOrSignupRequest( @Json(name = "email_address") @@ -26,6 +28,7 @@ internal object B2BRequests { } object Discovery { + @Keep @JsonClass(generateAdapter = true) data class SendRequest( @Json(name = "email_address") @@ -38,6 +41,7 @@ internal object B2BRequests { val loginTemplateId: String? = null, ) + @Keep @JsonClass(generateAdapter = true) data class AuthenticateRequest( @Json(name = "discovery_magic_links_token") @@ -47,6 +51,7 @@ internal object B2BRequests { ) } + @Keep @JsonClass(generateAdapter = true) data class AuthenticateRequest( @Json(name = "magic_links_token") @@ -59,6 +64,7 @@ internal object B2BRequests { } object Passwords { + @Keep @JsonClass(generateAdapter = true) data class AuthenticateRequest( @Json(name = "organization_id") @@ -70,6 +76,7 @@ internal object B2BRequests { val sessionDurationMinutes: Int, ) + @Keep @JsonClass(generateAdapter = true) data class ResetByEmailStartRequest( @Json(name = "organization_id") @@ -88,6 +95,7 @@ internal object B2BRequests { val codeChallenge: String, ) + @Keep @JsonClass(generateAdapter = true) data class ResetByEmailRequest( @Json(name = "password_reset_token") @@ -99,6 +107,7 @@ internal object B2BRequests { val codeVerifier: String, ) + @Keep @JsonClass(generateAdapter = true) data class ResetByExistingPasswordRequest( @Json(name = "organization_id") @@ -113,6 +122,7 @@ internal object B2BRequests { val sessionDurationMinutes: Int, ) + @Keep @JsonClass(generateAdapter = true) data class ResetBySessionRequest( @Json(name = "organization_id") @@ -120,19 +130,23 @@ internal object B2BRequests { val password: String, ) + @Keep @JsonClass(generateAdapter = true) data class StrengthCheckRequest( val email: String?, val password: String, ) } + object Discovery { + @Keep @JsonClass(generateAdapter = true) data class MembershipsRequest( @Json(name = "intermediate_session_token") val intermediateSessionToken: String? = null, ) + @Keep @JsonClass(generateAdapter = true) data class SessionExchangeRequest( @Json(name = "intermediate_session_token") @@ -143,6 +157,7 @@ internal object B2BRequests { val sessionDurationMinutes: Int, ) + @Keep @JsonClass(generateAdapter = true) data class CreateRequest( @Json(name = "intermediate_session_token") @@ -171,6 +186,7 @@ internal object B2BRequests { } object SSO { + @Keep @JsonClass(generateAdapter = true) data class AuthenticateRequest( @Json(name = "sso_token") diff --git a/sdk/src/main/java/com/stytch/sdk/b2b/network/models/B2BResponseData.kt b/sdk/src/main/java/com/stytch/sdk/b2b/network/models/B2BResponseData.kt index 8847c8578..ebc7e2a09 100644 --- a/sdk/src/main/java/com/stytch/sdk/b2b/network/models/B2BResponseData.kt +++ b/sdk/src/main/java/com/stytch/sdk/b2b/network/models/B2BResponseData.kt @@ -1,6 +1,7 @@ package com.stytch.sdk.b2b.network.models import android.os.Parcelable +import androidx.annotation.Keep import com.squareup.moshi.Json import com.squareup.moshi.JsonClass import com.stytch.sdk.common.network.models.AuthenticationFactor @@ -16,6 +17,7 @@ public interface IB2BAuthData : CommonAuthenticationData { public val organization: Organization } +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class B2BAuthData( @@ -30,9 +32,10 @@ public data class B2BAuthData( @Json(name = "session_token") override val sessionToken: String, override val member: MemberData, - override val organization: Organization + override val organization: Organization, ) : IB2BAuthData, Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class B2BEMLAuthenticateData( @@ -49,9 +52,10 @@ public data class B2BEMLAuthenticateData( override val memberSession: B2BSessionData, @Json(name = "reset_sessions") val resetSessions: Boolean, - override val organization: Organization + override val organization: Organization, ) : IB2BAuthData, Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class B2BSessionData( @@ -73,6 +77,7 @@ public data class B2BSessionData( val customClaims: @RawValue Map?, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class MemberResponseData( @@ -83,6 +88,7 @@ public data class MemberResponseData( val member: MemberData, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class MemberData( @@ -99,9 +105,10 @@ public data class MemberData( @Json(name = "untrusted_metadata") val untrustedMetadata: @RawValue Map?, @Json(name = "sso_registrations") - val ssoRegistrations: List + val ssoRegistrations: List, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class SSORegistration( @@ -115,6 +122,7 @@ public data class SSORegistration( val ssoAttributes: @RawValue Map?, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class OrganizationResponseData( @@ -125,6 +133,7 @@ public data class OrganizationResponseData( val organization: Organization, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class Organization( @@ -158,6 +167,7 @@ public data class Organization( val allowedAuthMethods: List?, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class SSOActiveConnection( @@ -167,6 +177,7 @@ public data class SSOActiveConnection( val displayName: String, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class PasswordsAuthenticateResponseData( @@ -188,6 +199,7 @@ public data class PasswordsAuthenticateResponseData( val organizationId: String, ) : IB2BAuthData, Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class EmailResetResponseData( @@ -211,6 +223,7 @@ public data class EmailResetResponseData( val memberEmailId: String, ) : IB2BAuthData, Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class SessionResetResponseData( @@ -226,6 +239,7 @@ public data class SessionResetResponseData( val organization: Organization, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class StrengthCheckResponseData( @@ -243,6 +257,7 @@ public data class StrengthCheckResponseData( @Json(name = "luds_feedback") val ludsFeedback: LUDSFeedback, ) : Parcelable { + @Keep @JsonClass(generateAdapter = true) @Parcelize public data class ZXCVBNFeedback( @@ -250,6 +265,7 @@ public data class StrengthCheckResponseData( val warning: String, ) : Parcelable + @Keep @JsonClass(generateAdapter = true) @Parcelize public data class LUDSFeedback( @@ -268,15 +284,17 @@ public data class StrengthCheckResponseData( ) : Parcelable } +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class DiscoveredOrganizationsResponseData( @Json(name = "email_address") val emailAddress: String, @Json(name = "discovered_organizations") - val discoveredOrganizations: List + val discoveredOrganizations: List, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class DiscoveredOrganization( @@ -286,6 +304,7 @@ public data class DiscoveredOrganization( val memberAuthenticated: Boolean, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class Membership( @@ -294,12 +313,14 @@ public data class Membership( val member: MemberData?, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class MembershipDetails( val domain: String, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class IntermediateSessionExchangeResponseData( @@ -315,6 +336,7 @@ public data class IntermediateSessionExchangeResponseData( val sessionToken: String, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class OrganizationCreateResponseData( @@ -330,6 +352,7 @@ public data class OrganizationCreateResponseData( val sessionToken: String, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class DiscoveryAuthenticateResponseData( @@ -338,9 +361,10 @@ public data class DiscoveryAuthenticateResponseData( @Json(name = "email_address") val emailAddress: String, @Json(name = "discovered_organizations") - val discoveredOrganizations: List + val discoveredOrganizations: List, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class SSOAuthenticateResponseData( @@ -359,5 +383,5 @@ public data class SSOAuthenticateResponseData( override val memberSession: B2BSessionData, @Json(name = "reset_session") val resetSession: Boolean, - override val organization: Organization + override val organization: Organization, ) : IB2BAuthData, Parcelable diff --git a/sdk/src/main/java/com/stytch/sdk/b2b/network/models/B2BResponses.kt b/sdk/src/main/java/com/stytch/sdk/b2b/network/models/B2BResponses.kt index 5717b78a0..b3b0c0bc0 100644 --- a/sdk/src/main/java/com/stytch/sdk/b2b/network/models/B2BResponses.kt +++ b/sdk/src/main/java/com/stytch/sdk/b2b/network/models/B2BResponses.kt @@ -1,82 +1,98 @@ package com.stytch.sdk.b2b.network.models +import androidx.annotation.Keep import com.squareup.moshi.JsonClass import com.stytch.sdk.common.network.StytchDataResponse import com.stytch.sdk.common.network.models.BasicData internal object B2BResponses { object MagicLinks { + @Keep @JsonClass(generateAdapter = true) class AuthenticateResponse(data: B2BEMLAuthenticateData) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class DiscoveryAuthenticateResponse( - data: DiscoveryAuthenticateResponseData + data: DiscoveryAuthenticateResponseData, ) : StytchDataResponse(data) } object Sessions { + @Keep @JsonClass(generateAdapter = true) class AuthenticateResponse(data: B2BAuthData) : StytchDataResponse(data) } object Organizations { + @Keep @JsonClass(generateAdapter = true) class GetOrganizationResponse( - data: OrganizationResponseData + data: OrganizationResponseData, ) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class GetMemberResponse(data: MemberResponseData) : StytchDataResponse(data) } object Passwords { + @Keep @JsonClass(generateAdapter = true) class AuthenticateResponse( - data: PasswordsAuthenticateResponseData + data: PasswordsAuthenticateResponseData, ) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class ResetByEmailStartResponse(data: BasicData) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class ResetByEmailResponse(data: EmailResetResponseData) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class ResetByExistingPasswordResponse(data: B2BAuthData) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class ResetBySessionResponse( - data: SessionResetResponseData + data: SessionResetResponseData, ) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class StrengthCheckResponse( - data: StrengthCheckResponseData + data: StrengthCheckResponseData, ) : StytchDataResponse(data) } object Discovery { + @Keep @JsonClass(generateAdapter = true) class DiscoverOrganizationsResponse( - data: DiscoveredOrganizationsResponseData + data: DiscoveredOrganizationsResponseData, ) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class SessionExchangeResponse( - data: IntermediateSessionExchangeResponseData + data: IntermediateSessionExchangeResponseData, ) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class CreateOrganizationResponse( - data: OrganizationCreateResponseData + data: OrganizationCreateResponseData, ) : StytchDataResponse(data) } object SSO { + @Keep @JsonClass(generateAdapter = true) class AuthenticateResponse( - data: SSOAuthenticateResponseData + data: SSOAuthenticateResponseData, ) : StytchDataResponse(data) } } diff --git a/sdk/src/main/java/com/stytch/sdk/b2b/network/models/Enums.kt b/sdk/src/main/java/com/stytch/sdk/b2b/network/models/Enums.kt index 2c57f14db..ff177e184 100644 --- a/sdk/src/main/java/com/stytch/sdk/b2b/network/models/Enums.kt +++ b/sdk/src/main/java/com/stytch/sdk/b2b/network/models/Enums.kt @@ -1,29 +1,35 @@ package com.stytch.sdk.b2b.network.models +import com.squareup.moshi.JsonClass import com.stytch.sdk.common.utils.IEnumValue +@JsonClass(generateAdapter = false) public enum class SsoJitProvisioning { ALL_ALLOWED, RESTRICTED, NOT_ALLOWED, } +@JsonClass(generateAdapter = false) public enum class EmailJitProvisioning { RESTRICTED, NOT_ALLOWED, } +@JsonClass(generateAdapter = false) public enum class EmailInvites { ALL_ALLOWED, RESTRICTED, NOT_ALLOWED, } +@JsonClass(generateAdapter = false) public enum class AuthMethods { ALL_ALLOWED, RESTRICTED, } +@JsonClass(generateAdapter = false) public enum class AllowedAuthMethods(override val jsonName: String) : IEnumValue { SSO("sso"), MAGIC_LINK("magic_link"), diff --git a/sdk/src/main/java/com/stytch/sdk/common/network/StytchDataResponse.kt b/sdk/src/main/java/com/stytch/sdk/common/network/StytchDataResponse.kt index 651be156e..caa7e36ef 100644 --- a/sdk/src/main/java/com/stytch/sdk/common/network/StytchDataResponse.kt +++ b/sdk/src/main/java/com/stytch/sdk/common/network/StytchDataResponse.kt @@ -1,3 +1,6 @@ package com.stytch.sdk.common.network +import androidx.annotation.Keep + +@Keep internal open class StytchDataResponse(internal val data: T) diff --git a/sdk/src/main/java/com/stytch/sdk/common/network/models/CommonRequests.kt b/sdk/src/main/java/com/stytch/sdk/common/network/models/CommonRequests.kt index cb35c7b9e..95fd78c8e 100644 --- a/sdk/src/main/java/com/stytch/sdk/common/network/models/CommonRequests.kt +++ b/sdk/src/main/java/com/stytch/sdk/common/network/models/CommonRequests.kt @@ -1,10 +1,12 @@ package com.stytch.sdk.common.network.models +import androidx.annotation.Keep import com.squareup.moshi.Json import com.squareup.moshi.JsonClass internal object CommonRequests { object Sessions { + @Keep @JsonClass(generateAdapter = true) data class AuthenticateRequest( @Json(name = "session_duration_minutes") @@ -13,12 +15,14 @@ internal object CommonRequests { } object Events { + @Keep @JsonClass(generateAdapter = true) data class Event( val telemetry: EventTelemetry, val event: EventEvent, ) + @Keep @JsonClass(generateAdapter = true) data class EventTelemetry( @Json(name = "event_id") @@ -36,12 +40,14 @@ internal object CommonRequests { val device: DeviceIdentifier, ) + @Keep @JsonClass(generateAdapter = true) data class VersionIdentifier( val identifier: String, - val version: String? = null + val version: String? = null, ) + @Keep @JsonClass(generateAdapter = true) data class DeviceIdentifier( val model: String? = null, @@ -49,6 +55,7 @@ internal object CommonRequests { val screenSize: String? = null, ) + @Keep @JsonClass(generateAdapter = true) data class EventEvent( @Json(name = "public_token") diff --git a/sdk/src/main/java/com/stytch/sdk/common/network/models/CommonResponseData.kt b/sdk/src/main/java/com/stytch/sdk/common/network/models/CommonResponseData.kt index d5baf67e6..d893dbd57 100644 --- a/sdk/src/main/java/com/stytch/sdk/common/network/models/CommonResponseData.kt +++ b/sdk/src/main/java/com/stytch/sdk/common/network/models/CommonResponseData.kt @@ -1,11 +1,13 @@ package com.stytch.sdk.common.network.models import android.os.Parcelable +import androidx.annotation.Keep import com.squareup.moshi.Json import com.squareup.moshi.JsonClass import kotlinx.parcelize.Parcelize import kotlinx.parcelize.RawValue +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class BasicData( @@ -15,6 +17,7 @@ public data class BasicData( val requestId: String, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class StytchErrorResponse( @@ -30,6 +33,7 @@ public data class StytchErrorResponse( val errorUrl: String? = null, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class StytchSchemaError( @@ -38,6 +42,7 @@ public data class StytchSchemaError( val query: @RawValue Any?, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class CryptoWalletData( @@ -53,6 +58,7 @@ public data class CryptoWalletData( val verified: Boolean, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class EmailData( @@ -62,6 +68,7 @@ public data class EmailData( public val verified: Boolean, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class NameData( @@ -73,6 +80,7 @@ public data class NameData( val middleName: String?, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class WebAuthNRegistrations( @@ -89,6 +97,7 @@ public data class WebAuthNRegistrations( val name: String? = null, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class PhoneNumber( @@ -102,6 +111,7 @@ public data class PhoneNumber( val verified: Boolean, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class Provider( @@ -116,6 +126,7 @@ public data class Provider( val profilePictureUrl: String? = null, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class TOTP( @@ -126,6 +137,7 @@ public data class TOTP( val verified: Boolean, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class BiometricRegistrations( @@ -136,6 +148,7 @@ public data class BiometricRegistrations( val verified: Boolean, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class Password( @@ -145,6 +158,7 @@ public data class Password( val requiresReset: Boolean, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class BiometricsStartResponse( @@ -157,6 +171,7 @@ public data class BiometricsStartResponse( val challenge: String, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class LoginOrCreateOTPData( @@ -168,6 +183,7 @@ public data class LoginOrCreateOTPData( val methodId: String, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class OTPSendResponseData( @@ -179,6 +195,7 @@ public data class OTPSendResponseData( val methodId: String, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class AuthenticationFactor( @@ -240,6 +257,7 @@ public data class AuthenticationFactor( @Json(name = "crypto_wallet_factor") val cryptoWalletFactor: CryptoWalletFactor?, ) : Parcelable { + @Keep @JsonClass(generateAdapter = true) @Parcelize public data class EmailFactor( @@ -249,6 +267,7 @@ public data class AuthenticationFactor( val emailAddress: String, ) : Parcelable + @Keep @JsonClass(generateAdapter = true) @Parcelize public data class PhoneFactor( @@ -258,6 +277,7 @@ public data class AuthenticationFactor( val phoneNumber: String, ) : Parcelable + @Keep @JsonClass(generateAdapter = true) @Parcelize public data class OAuthFactor( @@ -268,6 +288,7 @@ public data class AuthenticationFactor( val providerSubject: String, ) : Parcelable + @Keep @JsonClass(generateAdapter = true) @Parcelize public data class WebAuthnFactor( @@ -278,6 +299,7 @@ public data class AuthenticationFactor( val userAgent: String, ) : Parcelable + @Keep @JsonClass(generateAdapter = true) @Parcelize public data class BiometricFactor( @@ -285,6 +307,7 @@ public data class AuthenticationFactor( val biometricRegistrationId: String, ) : Parcelable + @Keep @JsonClass(generateAdapter = true) @Parcelize public data class AuthenticatorAppFactor( @@ -292,6 +315,7 @@ public data class AuthenticationFactor( val totpId: String, ) : Parcelable + @Keep @JsonClass(generateAdapter = true) @Parcelize public data class RecoveryCodeFactor( @@ -299,6 +323,7 @@ public data class AuthenticationFactor( val totpRecoveryCodeId: String, ) : Parcelable + @Keep @JsonClass(generateAdapter = true) @Parcelize public data class CryptoWalletFactor( @@ -316,6 +341,7 @@ public interface CommonAuthenticationData { public val sessionToken: String } +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class BootstrapData( @@ -347,6 +373,7 @@ public data class BootstrapData( val passwordConfig: PasswordConfig? = null, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class PasswordConfig( @@ -361,6 +388,7 @@ public enum class DFPProtectedAuthMode { DECISIONING, } +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class CaptchaSettings( @@ -368,6 +396,7 @@ public data class CaptchaSettings( val siteKey: String = "", ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public class NoResponseData : Parcelable diff --git a/sdk/src/main/java/com/stytch/sdk/common/network/models/CommonResponses.kt b/sdk/src/main/java/com/stytch/sdk/common/network/models/CommonResponses.kt index a177b55ed..1de128743 100644 --- a/sdk/src/main/java/com/stytch/sdk/common/network/models/CommonResponses.kt +++ b/sdk/src/main/java/com/stytch/sdk/common/network/models/CommonResponses.kt @@ -1,36 +1,43 @@ package com.stytch.sdk.common.network.models +import androidx.annotation.Keep import com.squareup.moshi.JsonClass import com.stytch.sdk.common.network.StytchDataResponse internal object CommonResponses { - object Biometrics { + @Keep @JsonClass(generateAdapter = true) class RegisterStartResponse(data: BiometricsStartResponse) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class AuthenticateStartResponse(data: BiometricsStartResponse) : StytchDataResponse(data) } object Sessions { + @Keep @JsonClass(generateAdapter = true) class RevokeResponse(data: BasicData) : StytchDataResponse(data) } object Bootstrap { + @Keep @JsonClass(generateAdapter = true) class BootstrapResponse(data: BootstrapData) : StytchDataResponse(data) } + @Keep @JsonClass(generateAdapter = true) class BasicResponse(data: BasicData) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class SendResponse(data: BasicData) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class NoResponse(data: NoResponseData) : StytchDataResponse(data) } diff --git a/sdk/src/main/java/com/stytch/sdk/consumer/network/models/ConsumerRequests.kt b/sdk/src/main/java/com/stytch/sdk/consumer/network/models/ConsumerRequests.kt index f51730088..14cc84bf3 100644 --- a/sdk/src/main/java/com/stytch/sdk/consumer/network/models/ConsumerRequests.kt +++ b/sdk/src/main/java/com/stytch/sdk/consumer/network/models/ConsumerRequests.kt @@ -1,13 +1,14 @@ package com.stytch.sdk.consumer.network.models +import androidx.annotation.Keep import com.squareup.moshi.Json import com.squareup.moshi.JsonClass import com.stytch.sdk.common.network.models.NameData internal object ConsumerRequests { - object MagicLinks { object Email { + @Keep @JsonClass(generateAdapter = true) data class LoginOrCreateUserRequest( val email: String, @@ -24,6 +25,7 @@ internal object ConsumerRequests { ) } + @Keep @JsonClass(generateAdapter = true) data class AuthenticateRequest( val token: String, @@ -33,6 +35,7 @@ internal object ConsumerRequests { val sessionDurationMinutes: Int, ) + @Keep @JsonClass(generateAdapter = true) data class SendRequest( val email: String, @@ -54,6 +57,7 @@ internal object ConsumerRequests { } object Passwords { + @Keep @JsonClass(generateAdapter = true) data class CreateRequest( val email: String, @@ -62,6 +66,7 @@ internal object ConsumerRequests { val sessionDurationMinutes: Int, ) + @Keep @JsonClass(generateAdapter = true) data class AuthenticateRequest( val email: String, @@ -70,6 +75,7 @@ internal object ConsumerRequests { val sessionDurationMinutes: Int, ) + @Keep @JsonClass(generateAdapter = true) data class ResetByEmailStartRequest( val email: String, @@ -89,6 +95,7 @@ internal object ConsumerRequests { val resetPasswordTemplateId: String?, ) + @Keep @JsonClass(generateAdapter = true) data class ResetByEmailRequest( val token: String, @@ -99,6 +106,7 @@ internal object ConsumerRequests { val codeVerifier: String, ) + @Keep @JsonClass(generateAdapter = true) data class ResetBySessionRequest( val password: String, @@ -106,6 +114,7 @@ internal object ConsumerRequests { val sessionDurationMinutes: Int, ) + @Keep @JsonClass(generateAdapter = true) data class StrengthCheckRequest( val email: String?, @@ -114,6 +123,7 @@ internal object ConsumerRequests { } object OTP { + @Keep @JsonClass(generateAdapter = true) data class SMS( @Json(name = "phone_number") @@ -122,6 +132,7 @@ internal object ConsumerRequests { val expirationMinutes: Int?, ) + @Keep @JsonClass(generateAdapter = true) data class WhatsApp( @Json(name = "phone_number") @@ -130,6 +141,7 @@ internal object ConsumerRequests { val expirationMinutes: Int?, ) + @Keep @JsonClass(generateAdapter = true) data class Email( val email: String, @@ -141,6 +153,7 @@ internal object ConsumerRequests { val signupTemplateId: String?, ) + @Keep @JsonClass(generateAdapter = true) data class Authenticate( val token: String, @@ -152,12 +165,14 @@ internal object ConsumerRequests { } object Biometrics { + @Keep @JsonClass(generateAdapter = true) data class RegisterStartRequest( @Json(name = "public_key") val publicKey: String, ) + @Keep @JsonClass(generateAdapter = true) data class RegisterRequest( val signature: String, @@ -167,12 +182,14 @@ internal object ConsumerRequests { val sessionDurationMinutes: Int, ) + @Keep @JsonClass(generateAdapter = true) data class AuthenticateStartRequest( @Json(name = "public_key") val publicKey: String, ) + @Keep @JsonClass(generateAdapter = true) data class AuthenticateRequest( val signature: String, @@ -185,6 +202,7 @@ internal object ConsumerRequests { object OAuth { object Google { + @Keep @JsonClass(generateAdapter = true) data class AuthenticateRequest( @Json(name = "id_token") @@ -194,7 +212,9 @@ internal object ConsumerRequests { val sessionDurationMinutes: Int, ) } + object ThirdParty { + @Keep @JsonClass(generateAdapter = true) data class AuthenticateRequest( val token: String, @@ -207,12 +227,13 @@ internal object ConsumerRequests { @Json(name = "session_token") val sessionToken: String? = null, @Json(name = "code_verifier") - val codeVerifier: String + val codeVerifier: String, ) } } object User { + @Keep @JsonClass(generateAdapter = true) data class UpdateRequest( val name: NameData? = null, @@ -220,6 +241,7 @@ internal object ConsumerRequests { val untrustedMetadata: Map? = null, ) + @Keep @JsonClass(generateAdapter = true) data class SearchRequest( val email: String, @@ -227,6 +249,7 @@ internal object ConsumerRequests { } object WebAuthn { + @Keep @JsonClass(generateAdapter = true) data class RegisterStartRequest( val domain: String, @@ -235,24 +258,27 @@ internal object ConsumerRequests { @Json(name = "authenticator_type") val authenticatorType: String? = null, @Json(name = "return_passkey_credential_options") - val isPasskey: Boolean? = false + val isPasskey: Boolean? = false, ) + @Keep @JsonClass(generateAdapter = true) data class RegisterRequest( @Json(name = "public_key_credential") - val publicKeyCredential: String + val publicKeyCredential: String, ) + @Keep @JsonClass(generateAdapter = true) data class AuthenticateStartRequest( @Json(name = "user_id") val userId: String? = null, val domain: String, @Json(name = "return_passkey_credential_options") - val isPasskey: Boolean? = false + val isPasskey: Boolean? = false, ) + @Keep @JsonClass(generateAdapter = true) data class AuthenticateRequest( @Json(name = "public_key_credential") @@ -267,6 +293,7 @@ internal object ConsumerRequests { val sessionToken: String? = null, ) + @Keep @JsonClass(generateAdapter = true) data class UpdateRequest( val name: String, diff --git a/sdk/src/main/java/com/stytch/sdk/consumer/network/models/ConsumerResponses.kt b/sdk/src/main/java/com/stytch/sdk/consumer/network/models/ConsumerResponses.kt index de14f5e24..ee4df053a 100644 --- a/sdk/src/main/java/com/stytch/sdk/consumer/network/models/ConsumerResponses.kt +++ b/sdk/src/main/java/com/stytch/sdk/consumer/network/models/ConsumerResponses.kt @@ -1,5 +1,6 @@ package com.stytch.sdk.consumer.network.models +import androidx.annotation.Keep import com.squareup.moshi.JsonClass import com.stytch.sdk.common.network.StytchDataResponse import com.stytch.sdk.common.network.models.LoginOrCreateOTPData @@ -7,69 +8,86 @@ import com.stytch.sdk.common.network.models.OTPSendResponseData internal object ConsumerResponses { object Passwords { - + @Keep @JsonClass(generateAdapter = true) class PasswordsCreateResponse(data: CreateResponse) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class PasswordsStrengthCheckResponse(data: StrengthCheckResponse) : StytchDataResponse(data) } object Biometrics { + @Keep @JsonClass(generateAdapter = true) class RegisterResponse(data: BiometricsAuthData) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class AuthenticateResponse(data: BiometricsAuthData) : StytchDataResponse(data) } object User { + @Keep @JsonClass(generateAdapter = true) class UserResponse(data: UserData) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class DeleteFactorResponse(data: DeleteAuthenticationFactorData) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class UpdateUserResponse(data: UpdateUserResponseData) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class UserSearchResponse(data: UserSearchResponseData) : StytchDataResponse(data) } object OAuth { + @Keep @JsonClass(generateAdapter = true) class OAuthAuthenticateResponse(data: OAuthData) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class NativeOAuthAuthenticateResponse(data: NativeOAuthData) : StytchDataResponse(data) } object WebAuthn { + @Keep @JsonClass(generateAdapter = true) class RegisterStartResponse(data: WebAuthnRegisterStartData) : StytchDataResponse(data) + + @Keep @JsonClass(generateAdapter = true) class RegisterResponse(data: WebAuthnRegisterData) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class AuthenticateResponse(data: WebAuthnAuthenticateStartData) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class UpdateResponse(data: WebAuthnUpdateResponseData) : StytchDataResponse(data) } + @Keep @JsonClass(generateAdapter = true) class AuthenticateResponse(data: AuthData) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class LoginOrCreateOTPResponse(data: LoginOrCreateOTPData) : StytchDataResponse(data) + @Keep @JsonClass(generateAdapter = true) class OTPSendResponse(data: OTPSendResponseData) : StytchDataResponse(data) } diff --git a/sdk/src/main/java/com/stytch/sdk/consumer/network/models/ResponseData.kt b/sdk/src/main/java/com/stytch/sdk/consumer/network/models/ResponseData.kt index ca2138bba..9d6e49e05 100644 --- a/sdk/src/main/java/com/stytch/sdk/consumer/network/models/ResponseData.kt +++ b/sdk/src/main/java/com/stytch/sdk/consumer/network/models/ResponseData.kt @@ -1,6 +1,7 @@ package com.stytch.sdk.consumer.network.models import android.os.Parcelable +import androidx.annotation.Keep import com.squareup.moshi.Json import com.squareup.moshi.JsonClass import com.stytch.sdk.common.network.models.AuthenticationFactor @@ -28,6 +29,7 @@ public interface INativeOAuthData : IAuthData { public val userCreated: Boolean } +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class AuthData( @@ -43,6 +45,7 @@ public data class AuthData( override val user: UserData, ) : IAuthData, Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class SessionData( @@ -62,6 +65,7 @@ public data class SessionData( @Json(name = "authentication_factors") val authenticationFactors: List, ) : Parcelable { + @Keep @JsonClass(generateAdapter = true) @Parcelize public data class AttributesData( @@ -72,6 +76,7 @@ public data class SessionData( ) : Parcelable } +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class UserData( @@ -103,6 +108,7 @@ public data class UserData( val untrustedMetadata: @RawValue Map?, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class CreateResponse( @@ -126,6 +132,7 @@ public data class CreateResponse( val userId: String, ) : IAuthData, Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class BiometricsAuthData( @@ -143,6 +150,7 @@ public data class BiometricsAuthData( val biometricRegistrationId: String, ) : IAuthData, Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class DeleteAuthenticationFactorData( @@ -150,9 +158,10 @@ public data class DeleteAuthenticationFactorData( val statusCode: Int, @Json(name = "request_id") val requestId: String, - val user: UserData + val user: UserData, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class OAuthData( @@ -173,8 +182,9 @@ public data class OAuthData( @Json(name = "provider_type") val providerType: String, @Json(name = "provider_values") - val providerValues: OAuthProviderValues + val providerValues: OAuthProviderValues, ) : IAuthData, Parcelable { + @Keep @JsonClass(generateAdapter = true) @Parcelize public data class OAuthProviderValues( @@ -188,6 +198,7 @@ public data class OAuthData( ) : Parcelable } +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class NativeOAuthData( @@ -198,18 +209,20 @@ public data class NativeOAuthData( override val sessionToken: String, override val user: UserData, @Json(name = "user_created") - override val userCreated: Boolean + override val userCreated: Boolean, ) : INativeOAuthData, Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class Feedback( val suggestions: List, val warning: String, @Json(name = "luds_requirements") - val ludsRequirements: LUDSRequirements? + val ludsRequirements: LUDSRequirements?, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class LUDSRequirements( @@ -227,6 +240,7 @@ public data class LUDSRequirements( val missingCharacters: Int, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class StrengthCheckResponse( @@ -241,17 +255,19 @@ public data class StrengthCheckResponse( @Json(name = "valid_password") val validPassword: Boolean, @Json(name = "strength_policy") - val strengthPolicy: StrengthPolicy + val strengthPolicy: StrengthPolicy, ) : Parcelable @JsonClass(generateAdapter = false) public enum class StrengthPolicy { @Json(name = "zxcvbn") ZXCVBN, + @Json(name = "luds") LUDS, } +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class UpdateUserResponseData( @@ -259,13 +275,14 @@ public data class UpdateUserResponseData( val statusCode: Int, @Json(name = "request_id") val requestId: String, - val user: UserData + val user: UserData, ) : Parcelable +@Keep @JsonClass(generateAdapter = true) @Parcelize public data class UserSearchResponseData( - val userType: UserType + val userType: UserType, ) : Parcelable @JsonClass(generateAdapter = false) @@ -273,12 +290,15 @@ public data class UserSearchResponseData( public enum class UserType : Parcelable { @Json(name = "new") NEW, + @Json(name = "password") PASSWORD, + @Json(name = "passwordless") PASSWORDLESS, } +@Keep @JsonClass(generateAdapter = true) public data class WebAuthnRegisterStartData( @Json(name = "user_id") @@ -287,6 +307,7 @@ public data class WebAuthnRegisterStartData( val publicKeyCredentialCreationOptions: String, ) +@Keep @JsonClass(generateAdapter = true) public data class WebAuthnRegisterData( @Json(name = "status_code") @@ -303,12 +324,14 @@ public data class WebAuthnRegisterData( val webauthnRegistrationId: String, ) : IAuthData +@Keep @JsonClass(generateAdapter = true) public data class WebAuthnAuthenticateStartData( @Json(name = "public_key_credential_request_options") val publicKeyCredentialRequestOptions: String, ) +@Keep @JsonClass(generateAdapter = true) public data class WebAuthnUpdateResponseData( @Json(name = "status_code") diff --git a/ui/src/main/kotlin/com/stytch/sdk/ui/data/EmailMagicLinksOptions.kt b/ui/src/main/kotlin/com/stytch/sdk/ui/data/EmailMagicLinksOptions.kt index ecd76c808..f3f003c39 100644 --- a/ui/src/main/kotlin/com/stytch/sdk/ui/data/EmailMagicLinksOptions.kt +++ b/ui/src/main/kotlin/com/stytch/sdk/ui/data/EmailMagicLinksOptions.kt @@ -13,6 +13,7 @@ import kotlinx.parcelize.Parcelize * @property signupTemplateId The ID of an email template (defined in the Stytch Dashboard) for signup emails */ @Parcelize +@Keep @JsonClass(generateAdapter = true) public data class EmailMagicLinksOptions( val loginExpirationMinutes: Int? = null, @@ -20,7 +21,10 @@ public data class EmailMagicLinksOptions( val loginTemplateId: String? = null, val signupTemplateId: String? = null, ) : Parcelable { - internal fun toParameters(emailAddress: String, publicToken: String) = MagicLinks.EmailMagicLinks.Parameters( + internal fun toParameters( + emailAddress: String, + publicToken: String, + ) = MagicLinks.EmailMagicLinks.Parameters( email = emailAddress, loginMagicLinkUrl = "stytchui-$publicToken://deeplink", signupMagicLinkUrl = "stytchui-$publicToken://deeplink", diff --git a/ui/src/main/kotlin/com/stytch/sdk/ui/data/GoogleOAuthOptions.kt b/ui/src/main/kotlin/com/stytch/sdk/ui/data/GoogleOAuthOptions.kt index 3addf1017..e5365bd84 100644 --- a/ui/src/main/kotlin/com/stytch/sdk/ui/data/GoogleOAuthOptions.kt +++ b/ui/src/main/kotlin/com/stytch/sdk/ui/data/GoogleOAuthOptions.kt @@ -9,6 +9,7 @@ import kotlinx.parcelize.Parcelize * @property clientId the client ID you used to configure Google OAuth */ @Parcelize +@Keep @JsonClass(generateAdapter = true) public data class GoogleOAuthOptions( val clientId: String? = null, diff --git a/ui/src/main/kotlin/com/stytch/sdk/ui/data/OAuthOptions.kt b/ui/src/main/kotlin/com/stytch/sdk/ui/data/OAuthOptions.kt index 4420b8104..a785dd1f1 100644 --- a/ui/src/main/kotlin/com/stytch/sdk/ui/data/OAuthOptions.kt +++ b/ui/src/main/kotlin/com/stytch/sdk/ui/data/OAuthOptions.kt @@ -11,6 +11,7 @@ import kotlinx.parcelize.Parcelize * @property providers A list of [OAuthProvider]s that you would like to support */ @Parcelize +@Keep @JsonClass(generateAdapter = true) public data class OAuthOptions( val loginRedirectURL: String? = null, diff --git a/ui/src/main/kotlin/com/stytch/sdk/ui/data/OTPOptions.kt b/ui/src/main/kotlin/com/stytch/sdk/ui/data/OTPOptions.kt index 043a03c16..132a6c1de 100644 --- a/ui/src/main/kotlin/com/stytch/sdk/ui/data/OTPOptions.kt +++ b/ui/src/main/kotlin/com/stytch/sdk/ui/data/OTPOptions.kt @@ -14,6 +14,7 @@ import kotlinx.parcelize.Parcelize * @property signupTemplateId The ID of an OTP template (defined in the Stytch Dashboard) for signup requests */ @Parcelize +@Keep @JsonClass(generateAdapter = true) public data class OTPOptions( val methods: List = emptyList(), @@ -21,20 +22,23 @@ public data class OTPOptions( val loginTemplateId: String? = null, val signupTemplateId: String? = null, ) : Parcelable { - internal fun toEmailOtpParameters(emailAddress: String) = OTP.EmailOTP.Parameters( - email = emailAddress, - expirationMinutes = expirationMinutes.toUInt(), - loginTemplateId = loginTemplateId, - signupTemplateId = signupTemplateId, - ) + internal fun toEmailOtpParameters(emailAddress: String) = + OTP.EmailOTP.Parameters( + email = emailAddress, + expirationMinutes = expirationMinutes.toUInt(), + loginTemplateId = loginTemplateId, + signupTemplateId = signupTemplateId, + ) - internal fun toSMSOtpParameters(phoneNumber: String) = OTP.SmsOTP.Parameters( - phoneNumber = phoneNumber, - expirationMinutes = expirationMinutes.toUInt(), - ) + internal fun toSMSOtpParameters(phoneNumber: String) = + OTP.SmsOTP.Parameters( + phoneNumber = phoneNumber, + expirationMinutes = expirationMinutes.toUInt(), + ) - internal fun toWhatsAppOtpParameters(phoneNumber: String) = OTP.WhatsAppOTP.Parameters( - phoneNumber = phoneNumber, - expirationMinutes = expirationMinutes.toUInt(), - ) + internal fun toWhatsAppOtpParameters(phoneNumber: String) = + OTP.WhatsAppOTP.Parameters( + phoneNumber = phoneNumber, + expirationMinutes = expirationMinutes.toUInt(), + ) } diff --git a/ui/src/main/kotlin/com/stytch/sdk/ui/data/PasswordOptions.kt b/ui/src/main/kotlin/com/stytch/sdk/ui/data/PasswordOptions.kt index 6a226c76b..67ef0d3f9 100644 --- a/ui/src/main/kotlin/com/stytch/sdk/ui/data/PasswordOptions.kt +++ b/ui/src/main/kotlin/com/stytch/sdk/ui/data/PasswordOptions.kt @@ -12,19 +12,22 @@ import kotlinx.parcelize.Parcelize * @property resetPasswordTemplateId The ID of an email template (defined in the Stytch Dashboard) for password resets */ @Parcelize +@Keep @JsonClass(generateAdapter = true) public data class PasswordOptions( val loginExpirationMinutes: Int? = null, val resetPasswordExpirationMinutes: Int? = null, val resetPasswordTemplateId: String? = null, ) : Parcelable { - internal fun toResetByEmailStartParameters(emailAddress: String, publicToken: String) = - Passwords.ResetByEmailStartParameters( - email = emailAddress, - loginRedirectUrl = "stytchui-$publicToken://deeplink", - loginExpirationMinutes = loginExpirationMinutes?.toUInt(), - resetPasswordRedirectUrl = "stytchui-$publicToken://deeplink", - resetPasswordExpirationMinutes = resetPasswordExpirationMinutes?.toUInt(), - resetPasswordTemplateId = resetPasswordTemplateId, - ) + internal fun toResetByEmailStartParameters( + emailAddress: String, + publicToken: String, + ) = Passwords.ResetByEmailStartParameters( + email = emailAddress, + loginRedirectUrl = "stytchui-$publicToken://deeplink", + loginExpirationMinutes = loginExpirationMinutes?.toUInt(), + resetPasswordRedirectUrl = "stytchui-$publicToken://deeplink", + resetPasswordExpirationMinutes = resetPasswordExpirationMinutes?.toUInt(), + resetPasswordTemplateId = resetPasswordTemplateId, + ) } diff --git a/ui/src/main/kotlin/com/stytch/sdk/ui/data/SessionOptions.kt b/ui/src/main/kotlin/com/stytch/sdk/ui/data/SessionOptions.kt index 6c2e5e990..a80a6aa6f 100644 --- a/ui/src/main/kotlin/com/stytch/sdk/ui/data/SessionOptions.kt +++ b/ui/src/main/kotlin/com/stytch/sdk/ui/data/SessionOptions.kt @@ -10,6 +10,7 @@ import kotlinx.parcelize.Parcelize * @property sessionDurationMinutes The number of minutes that a granted session should be active. Defaults to 30 */ @Parcelize +@Keep @JsonClass(generateAdapter = true) public data class SessionOptions( val sessionDurationMinutes: Int = DEFAULT_SESSION_TIME_MINUTES.toInt(), diff --git a/ui/src/main/kotlin/com/stytch/sdk/ui/data/StytchProductConfig.kt b/ui/src/main/kotlin/com/stytch/sdk/ui/data/StytchProductConfig.kt index b80413bcb..de6bda2fe 100644 --- a/ui/src/main/kotlin/com/stytch/sdk/ui/data/StytchProductConfig.kt +++ b/ui/src/main/kotlin/com/stytch/sdk/ui/data/StytchProductConfig.kt @@ -15,13 +15,15 @@ import kotlinx.parcelize.Parcelize * @property googleOauthOptions an instance of [GoogleOAuthOptions] */ @Parcelize +@Keep @JsonClass(generateAdapter = true) public data class StytchProductConfig( - val products: List = listOf( - StytchProduct.EMAIL_MAGIC_LINKS, - StytchProduct.PASSWORDS, - StytchProduct.OTP, - ), + val products: List = + listOf( + StytchProduct.EMAIL_MAGIC_LINKS, + StytchProduct.PASSWORDS, + StytchProduct.OTP, + ), val emailMagicLinksOptions: EmailMagicLinksOptions = EmailMagicLinksOptions(), val oAuthOptions: OAuthOptions = OAuthOptions(), val otpOptions: OTPOptions = OTPOptions(), From 2a4244dffda2f565b872e60c6fc38692c4b8fd47 Mon Sep 17 00:00:00 2001 From: Jordan Haven Date: Wed, 3 Apr 2024 12:02:10 -0400 Subject: [PATCH 2/3] Add missing imports --- .../main/kotlin/com/stytch/sdk/ui/data/EmailMagicLinksOptions.kt | 1 + ui/src/main/kotlin/com/stytch/sdk/ui/data/GoogleOAuthOptions.kt | 1 + ui/src/main/kotlin/com/stytch/sdk/ui/data/OAuthOptions.kt | 1 + ui/src/main/kotlin/com/stytch/sdk/ui/data/OTPOptions.kt | 1 + ui/src/main/kotlin/com/stytch/sdk/ui/data/PasswordOptions.kt | 1 + ui/src/main/kotlin/com/stytch/sdk/ui/data/SessionOptions.kt | 1 + ui/src/main/kotlin/com/stytch/sdk/ui/data/StytchProductConfig.kt | 1 + 7 files changed, 7 insertions(+) diff --git a/ui/src/main/kotlin/com/stytch/sdk/ui/data/EmailMagicLinksOptions.kt b/ui/src/main/kotlin/com/stytch/sdk/ui/data/EmailMagicLinksOptions.kt index f3f003c39..76048f673 100644 --- a/ui/src/main/kotlin/com/stytch/sdk/ui/data/EmailMagicLinksOptions.kt +++ b/ui/src/main/kotlin/com/stytch/sdk/ui/data/EmailMagicLinksOptions.kt @@ -1,6 +1,7 @@ package com.stytch.sdk.ui.data import android.os.Parcelable +import androidx.annotation.Keep import com.squareup.moshi.JsonClass import com.stytch.sdk.consumer.magicLinks.MagicLinks import kotlinx.parcelize.Parcelize diff --git a/ui/src/main/kotlin/com/stytch/sdk/ui/data/GoogleOAuthOptions.kt b/ui/src/main/kotlin/com/stytch/sdk/ui/data/GoogleOAuthOptions.kt index e5365bd84..e6283db77 100644 --- a/ui/src/main/kotlin/com/stytch/sdk/ui/data/GoogleOAuthOptions.kt +++ b/ui/src/main/kotlin/com/stytch/sdk/ui/data/GoogleOAuthOptions.kt @@ -1,6 +1,7 @@ package com.stytch.sdk.ui.data import android.os.Parcelable +import androidx.annotation.Keep import com.squareup.moshi.JsonClass import kotlinx.parcelize.Parcelize diff --git a/ui/src/main/kotlin/com/stytch/sdk/ui/data/OAuthOptions.kt b/ui/src/main/kotlin/com/stytch/sdk/ui/data/OAuthOptions.kt index a785dd1f1..d41965c85 100644 --- a/ui/src/main/kotlin/com/stytch/sdk/ui/data/OAuthOptions.kt +++ b/ui/src/main/kotlin/com/stytch/sdk/ui/data/OAuthOptions.kt @@ -1,6 +1,7 @@ package com.stytch.sdk.ui.data import android.os.Parcelable +import androidx.annotation.Keep import com.squareup.moshi.JsonClass import kotlinx.parcelize.Parcelize diff --git a/ui/src/main/kotlin/com/stytch/sdk/ui/data/OTPOptions.kt b/ui/src/main/kotlin/com/stytch/sdk/ui/data/OTPOptions.kt index 132a6c1de..cc509a035 100644 --- a/ui/src/main/kotlin/com/stytch/sdk/ui/data/OTPOptions.kt +++ b/ui/src/main/kotlin/com/stytch/sdk/ui/data/OTPOptions.kt @@ -1,6 +1,7 @@ package com.stytch.sdk.ui.data import android.os.Parcelable +import androidx.annotation.Keep import com.squareup.moshi.JsonClass import com.stytch.sdk.common.Constants.DEFAULT_OTP_EXPIRATION_TIME_MINUTES import com.stytch.sdk.consumer.otp.OTP diff --git a/ui/src/main/kotlin/com/stytch/sdk/ui/data/PasswordOptions.kt b/ui/src/main/kotlin/com/stytch/sdk/ui/data/PasswordOptions.kt index 67ef0d3f9..87d44bec3 100644 --- a/ui/src/main/kotlin/com/stytch/sdk/ui/data/PasswordOptions.kt +++ b/ui/src/main/kotlin/com/stytch/sdk/ui/data/PasswordOptions.kt @@ -1,6 +1,7 @@ package com.stytch.sdk.ui.data import android.os.Parcelable +import androidx.annotation.Keep import com.squareup.moshi.JsonClass import com.stytch.sdk.consumer.passwords.Passwords import kotlinx.parcelize.Parcelize diff --git a/ui/src/main/kotlin/com/stytch/sdk/ui/data/SessionOptions.kt b/ui/src/main/kotlin/com/stytch/sdk/ui/data/SessionOptions.kt index a80a6aa6f..68c7197c3 100644 --- a/ui/src/main/kotlin/com/stytch/sdk/ui/data/SessionOptions.kt +++ b/ui/src/main/kotlin/com/stytch/sdk/ui/data/SessionOptions.kt @@ -1,6 +1,7 @@ package com.stytch.sdk.ui.data import android.os.Parcelable +import androidx.annotation.Keep import com.squareup.moshi.JsonClass import com.stytch.sdk.common.Constants.DEFAULT_SESSION_TIME_MINUTES import kotlinx.parcelize.Parcelize diff --git a/ui/src/main/kotlin/com/stytch/sdk/ui/data/StytchProductConfig.kt b/ui/src/main/kotlin/com/stytch/sdk/ui/data/StytchProductConfig.kt index de6bda2fe..b38e88cf2 100644 --- a/ui/src/main/kotlin/com/stytch/sdk/ui/data/StytchProductConfig.kt +++ b/ui/src/main/kotlin/com/stytch/sdk/ui/data/StytchProductConfig.kt @@ -1,6 +1,7 @@ package com.stytch.sdk.ui.data import android.os.Parcelable +import androidx.annotation.Keep import com.squareup.moshi.JsonClass import kotlinx.parcelize.Parcelize From bf87cda016ed804c6f718e8487f6fe7774da7a7e Mon Sep 17 00:00:00 2001 From: Jordan Haven Date: Wed, 3 Apr 2024 14:35:33 -0400 Subject: [PATCH 3/3] Add newline --- sdk/proguard-rules.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/proguard-rules.pro b/sdk/proguard-rules.pro index 44559421c..c1338bcfc 100644 --- a/sdk/proguard-rules.pro +++ b/sdk/proguard-rules.pro @@ -28,4 +28,4 @@ -keep class androidx.credentials.playservices.** { *; } --dontwarn java.lang.invoke.StringConcatFactory \ No newline at end of file +-dontwarn java.lang.invoke.StringConcatFactory