From a5cb592fa59262a14637bfb6919d1890fcc25034 Mon Sep 17 00:00:00 2001 From: Toni Rico Date: Wed, 11 Oct 2023 12:46:37 +0200 Subject: [PATCH 1/5] Support Google fonts and font families with multiple fonts --- gradle/libs.versions.toml | 1 + ui/revenuecatui/build.gradle | 1 + .../revenuecatui/activity/PaywallActivity.kt | 27 +++++++++++-- .../activity/PaywallActivityArgs.kt | 9 +++-- .../activity/PaywallActivityLauncher.kt | 6 +-- .../revenuecatui/fonts/FontStyleParceler.kt | 13 ++++++ .../revenuecatui/fonts/FontWeightParceler.kt | 13 ++++++ .../revenuecatui/fonts/GoogleFontProvider.kt | 40 +++++++++++++++++++ ...rovider.kt => ParcelizableFontProvider.kt} | 10 ++--- .../ui/revenuecatui/fonts/PaywallFont.kt | 30 ++++++++++++++ .../revenuecatui/fonts/PaywallFontFamily.kt | 10 +++++ 11 files changed, 143 insertions(+), 17 deletions(-) create mode 100644 ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontStyleParceler.kt create mode 100644 ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontWeightParceler.kt create mode 100644 ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/GoogleFontProvider.kt rename ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/{FontResourceProvider.kt => ParcelizableFontProvider.kt} (62%) create mode 100644 ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/PaywallFont.kt create mode 100644 ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/PaywallFontFamily.kt diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e224d84c4e..8b02341f52 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -113,6 +113,7 @@ compose-ui = { module = "androidx.compose.ui:ui" } compose-ui-util = { module = "androidx.compose.ui:ui-util" } compose-ui-graphics = { module = "androidx.compose.ui:ui-graphics" } compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview" } +compose-ui-google-fonts = { module = "androidx.compose.ui:ui-text-google-fonts" } compose-material = { module = "androidx.compose.material:material" } compose-material3 = { module = "androidx.compose.material3:material3" } compose-window-size = { module = "androidx.compose.material3:material3-window-size-class" } diff --git a/ui/revenuecatui/build.gradle b/ui/revenuecatui/build.gradle index 5a10ddef3c..53f89eab64 100644 --- a/ui/revenuecatui/build.gradle +++ b/ui/revenuecatui/build.gradle @@ -65,6 +65,7 @@ dependencies { implementation libs.commonmark.strikethrough implementation libs.activity.compose implementation libs.androidx.fragment.ktx + implementation libs.compose.ui.google.fonts debugImplementation libs.compose.ui.tooling debugImplementation libs.androidx.test.compose.manifest diff --git a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/activity/PaywallActivity.kt b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/activity/PaywallActivity.kt index 215a7bfc4d..5d4c14376e 100644 --- a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/activity/PaywallActivity.kt +++ b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/activity/PaywallActivity.kt @@ -11,8 +11,10 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.Font import androidx.compose.ui.text.font.FontFamily -import androidx.core.content.res.ResourcesCompat +import androidx.compose.ui.text.googlefonts.Font +import androidx.compose.ui.text.googlefonts.GoogleFont import com.revenuecat.purchases.CustomerInfo import com.revenuecat.purchases.PurchasesError import com.revenuecat.purchases.PurchasesErrorCode @@ -21,6 +23,8 @@ import com.revenuecat.purchases.ui.revenuecatui.Paywall import com.revenuecat.purchases.ui.revenuecatui.PaywallListener import com.revenuecat.purchases.ui.revenuecatui.PaywallOptions import com.revenuecat.purchases.ui.revenuecatui.fonts.FontProvider +import com.revenuecat.purchases.ui.revenuecatui.fonts.GoogleFontProvider +import com.revenuecat.purchases.ui.revenuecatui.fonts.PaywallFont import com.revenuecat.purchases.ui.revenuecatui.fonts.TypographyType /** @@ -43,9 +47,24 @@ internal class PaywallActivity : ComponentActivity(), PaywallListener { } private fun getFontProvider(): FontProvider? { - val fontsMap = getArgs()?.fonts?.mapValues { entry -> - entry.value?.let { fontRes -> - ResourcesCompat.getFont(this, fontRes)?.let { FontFamily(it) } + val googleFontProviders = mutableMapOf() + val fontsMap = getArgs()?.fonts?.mapValues { fontFamilyMap -> + fontFamilyMap.value?.let { fontFamily -> + val fonts = fontFamily.fonts.map { font -> + when (font) { + is PaywallFont.ResourceFont -> Font(font.resourceId, font.fontWeight, font.fontStyle) + is PaywallFont.GoogleFont -> { + val googleFontProvider = font.fontProvider + val provider = googleFontProviders.getOrElse(googleFontProvider) { + val googleProvider = googleFontProvider.toGoogleProvider() + googleFontProviders[googleFontProvider] = googleProvider + googleProvider + } + Font(GoogleFont(font.fontName), provider, font.fontWeight, font.fontStyle) + } + } + } + FontFamily(fonts) } } ?: return null return object : FontProvider { diff --git a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/activity/PaywallActivityArgs.kt b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/activity/PaywallActivityArgs.kt index f02b7cf72e..b2bb250fb7 100644 --- a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/activity/PaywallActivityArgs.kt +++ b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/activity/PaywallActivityArgs.kt @@ -1,17 +1,18 @@ package com.revenuecat.purchases.ui.revenuecatui.activity import android.os.Parcelable -import com.revenuecat.purchases.ui.revenuecatui.fonts.FontResourceProvider +import com.revenuecat.purchases.ui.revenuecatui.fonts.ParcelizableFontProvider +import com.revenuecat.purchases.ui.revenuecatui.fonts.PaywallFontFamily import com.revenuecat.purchases.ui.revenuecatui.fonts.TypographyType import kotlinx.parcelize.Parcelize @Parcelize internal data class PaywallActivityArgs( val offeringId: String? = null, - val fonts: Map? = null, + val fonts: Map? = null, ) : Parcelable { - constructor(offeringId: String? = null, fontProvider: FontResourceProvider?) : this( + constructor(offeringId: String? = null, fontProvider: ParcelizableFontProvider?) : this( offeringId, - fontProvider?.let { TypographyType.values().associateBy({ it }, { fontProvider.getFontResourceId(it) }) }, + fontProvider?.let { TypographyType.values().associateBy({ it }, { fontProvider.getFont(it) }) }, ) } diff --git a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/activity/PaywallActivityLauncher.kt b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/activity/PaywallActivityLauncher.kt index 417af44eb6..512f875384 100644 --- a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/activity/PaywallActivityLauncher.kt +++ b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/activity/PaywallActivityLauncher.kt @@ -6,7 +6,7 @@ import androidx.activity.result.ActivityResultLauncher import androidx.fragment.app.Fragment import com.revenuecat.purchases.CustomerInfo import com.revenuecat.purchases.Offering -import com.revenuecat.purchases.ui.revenuecatui.fonts.FontResourceProvider +import com.revenuecat.purchases.ui.revenuecatui.fonts.ParcelizableFontProvider import com.revenuecat.purchases.ui.revenuecatui.helpers.shouldDisplayBlockForEntitlementIdentifier import com.revenuecat.purchases.ui.revenuecatui.helpers.shouldDisplayPaywall @@ -42,11 +42,11 @@ class PaywallActivityLauncher { * @param offering The offering to be shown in the paywall. If null, the current offering will be shown. */ @JvmOverloads - fun launch(offering: Offering? = null, fontResourceProvider: FontResourceProvider? = null) { + fun launch(offering: Offering? = null, parcelizableFontProvider: ParcelizableFontProvider? = null) { activityResultLauncher.launch( PaywallActivityArgs( offeringId = offering?.identifier, - fontProvider = fontResourceProvider, + fontProvider = parcelizableFontProvider, ), ) } diff --git a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontStyleParceler.kt b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontStyleParceler.kt new file mode 100644 index 0000000000..e1ede1cfa6 --- /dev/null +++ b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontStyleParceler.kt @@ -0,0 +1,13 @@ +package com.revenuecat.purchases.ui.revenuecatui.fonts + +import android.os.Parcel +import androidx.compose.ui.text.font.FontStyle +import kotlinx.parcelize.Parceler + +object FontStyleParceler : Parceler { + override fun create(parcel: Parcel) = FontStyle(parcel.readInt()) + + override fun FontStyle.write(parcel: Parcel, flags: Int) { + parcel.writeInt(value) + } +} diff --git a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontWeightParceler.kt b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontWeightParceler.kt new file mode 100644 index 0000000000..5935874a11 --- /dev/null +++ b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontWeightParceler.kt @@ -0,0 +1,13 @@ +package com.revenuecat.purchases.ui.revenuecatui.fonts + +import android.os.Parcel +import androidx.compose.ui.text.font.FontWeight +import kotlinx.parcelize.Parceler + +object FontWeightParceler : Parceler { + override fun create(parcel: Parcel) = FontWeight(parcel.readInt()) + + override fun FontWeight.write(parcel: Parcel, flags: Int) { + parcel.writeInt(weight) + } +} diff --git a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/GoogleFontProvider.kt b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/GoogleFontProvider.kt new file mode 100644 index 0000000000..56db5c942f --- /dev/null +++ b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/GoogleFontProvider.kt @@ -0,0 +1,40 @@ +package com.revenuecat.purchases.ui.revenuecatui.fonts + +import android.os.Parcelable +import androidx.annotation.ArrayRes +import androidx.compose.ui.text.googlefonts.GoogleFont +import kotlinx.parcelize.Parcelize + +sealed class GoogleFontProvider( + open val providerAuthority: String, + open val providerPackage: String = "com.google.android.gms", +) : Parcelable { + @Parcelize + data class ResourceProvider( + override val providerAuthority: String = "com.google.android.gms.fonts", + override val providerPackage: String = "com.google.android.gms", + @ArrayRes val certificates: Int, + ) : GoogleFontProvider(providerAuthority, providerPackage) + + @Parcelize + data class ByteArrayProvider( + override val providerAuthority: String = "com.google.android.gms.fonts", + override val providerPackage: String = "com.google.android.gms", + val certificates: List>, + ) : GoogleFontProvider(providerAuthority, providerPackage) + + fun toGoogleProvider(): GoogleFont.Provider { + return when (this) { + is ResourceProvider -> GoogleFont.Provider( + providerAuthority, + providerPackage, + certificates, + ) + is ByteArrayProvider -> GoogleFont.Provider( + providerAuthority, + providerPackage, + certificates, + ) + } + } +} diff --git a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontResourceProvider.kt b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/ParcelizableFontProvider.kt similarity index 62% rename from ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontResourceProvider.kt rename to ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/ParcelizableFontProvider.kt index 11ee7cc2bc..a267c47a74 100644 --- a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontResourceProvider.kt +++ b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/ParcelizableFontProvider.kt @@ -1,6 +1,5 @@ package com.revenuecat.purchases.ui.revenuecatui.fonts -import androidx.annotation.FontRes import com.revenuecat.purchases.ui.revenuecatui.activity.PaywallActivityLauncher /** @@ -8,13 +7,12 @@ import com.revenuecat.purchases.ui.revenuecatui.activity.PaywallActivityLauncher * If you don't, the default material3 theme fonts will be used. * Use [FontProvider] instead if you are using Compose with [PaywallView] or [PaywallDialog]. */ -interface FontResourceProvider { +interface ParcelizableFontProvider { /** - * Returns the font resource id to be used for the given [TypographyType]. If null is returned, + * Returns the [PaywallFontFamily] to be used for the given [TypographyType]. If null is returned, * the default font will be used. * @param type the [TypographyType] for which the font is being requested. - * @return the font resource id to be used for the given [TypographyType]. + * @return the [PaywallFontFamily] to be used for the given [TypographyType]. */ - @FontRes - fun getFontResourceId(type: TypographyType): Int? + fun getFont(type: TypographyType): PaywallFontFamily? } diff --git a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/PaywallFont.kt b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/PaywallFont.kt new file mode 100644 index 0000000000..ed21840023 --- /dev/null +++ b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/PaywallFont.kt @@ -0,0 +1,30 @@ +package com.revenuecat.purchases.ui.revenuecatui.fonts + +import android.os.Parcelable +import androidx.annotation.FontRes +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight +import kotlinx.parcelize.Parcelize +import kotlinx.parcelize.TypeParceler + +sealed class PaywallFont : Parcelable { + @Parcelize + data class GoogleFont( + val fontName: String, + val fontProvider: GoogleFontProvider, + @TypeParceler() + val fontWeight: FontWeight = FontWeight.Normal, + @TypeParceler() + val fontStyle: FontStyle = FontStyle.Normal, + ) : PaywallFont() + + @Parcelize + data class ResourceFont( + @FontRes + val resourceId: Int, + @TypeParceler() + val fontWeight: FontWeight = FontWeight.Normal, + @TypeParceler() + val fontStyle: FontStyle = FontStyle.Normal, + ) : PaywallFont() +} diff --git a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/PaywallFontFamily.kt b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/PaywallFontFamily.kt new file mode 100644 index 0000000000..5c1e14ed41 --- /dev/null +++ b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/PaywallFontFamily.kt @@ -0,0 +1,10 @@ +package com.revenuecat.purchases.ui.revenuecatui.fonts + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +/** + * Represents a font family. You can add one ore more [PaywallFont] with different weights and font styles. + */ +@Parcelize +data class PaywallFontFamily(val fonts: List) : Parcelable From 736d21933eebcb01f1b9529edab4606324d27ded Mon Sep 17 00:00:00 2001 From: Toni Rico Date: Wed, 11 Oct 2023 13:25:11 +0200 Subject: [PATCH 2/5] Some cleanup and docs --- .../revenuecatui/fonts/FontStyleParceler.kt | 2 +- .../revenuecatui/fonts/FontWeightParceler.kt | 2 +- .../revenuecatui/fonts/GoogleFontProvider.kt | 44 +++++++------------ .../ui/revenuecatui/fonts/PaywallFont.kt | 27 ++++++++++++ 4 files changed, 45 insertions(+), 30 deletions(-) diff --git a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontStyleParceler.kt b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontStyleParceler.kt index e1ede1cfa6..ec49ae154c 100644 --- a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontStyleParceler.kt +++ b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontStyleParceler.kt @@ -4,7 +4,7 @@ import android.os.Parcel import androidx.compose.ui.text.font.FontStyle import kotlinx.parcelize.Parceler -object FontStyleParceler : Parceler { +internal object FontStyleParceler : Parceler { override fun create(parcel: Parcel) = FontStyle(parcel.readInt()) override fun FontStyle.write(parcel: Parcel, flags: Int) { diff --git a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontWeightParceler.kt b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontWeightParceler.kt index 5935874a11..7fa49b4819 100644 --- a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontWeightParceler.kt +++ b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontWeightParceler.kt @@ -4,7 +4,7 @@ import android.os.Parcel import androidx.compose.ui.text.font.FontWeight import kotlinx.parcelize.Parceler -object FontWeightParceler : Parceler { +internal object FontWeightParceler : Parceler { override fun create(parcel: Parcel) = FontWeight(parcel.readInt()) override fun FontWeight.write(parcel: Parcel, flags: Int) { diff --git a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/GoogleFontProvider.kt b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/GoogleFontProvider.kt index 56db5c942f..9cd4516a15 100644 --- a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/GoogleFontProvider.kt +++ b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/GoogleFontProvider.kt @@ -5,36 +5,24 @@ import androidx.annotation.ArrayRes import androidx.compose.ui.text.googlefonts.GoogleFont import kotlinx.parcelize.Parcelize -sealed class GoogleFontProvider( - open val providerAuthority: String, - open val providerPackage: String = "com.google.android.gms", +/** + * Represents a Google font provider. + */ +@Parcelize +data class GoogleFontProvider( + /** + * The resource ID of the font provider's certificate(s). + */ + @ArrayRes val certificates: Int, + val providerAuthority: String = "com.google.android.gms.fonts", + val providerPackage: String = "com.google.android.gms", ) : Parcelable { - @Parcelize - data class ResourceProvider( - override val providerAuthority: String = "com.google.android.gms.fonts", - override val providerPackage: String = "com.google.android.gms", - @ArrayRes val certificates: Int, - ) : GoogleFontProvider(providerAuthority, providerPackage) - - @Parcelize - data class ByteArrayProvider( - override val providerAuthority: String = "com.google.android.gms.fonts", - override val providerPackage: String = "com.google.android.gms", - val certificates: List>, - ) : GoogleFontProvider(providerAuthority, providerPackage) fun toGoogleProvider(): GoogleFont.Provider { - return when (this) { - is ResourceProvider -> GoogleFont.Provider( - providerAuthority, - providerPackage, - certificates, - ) - is ByteArrayProvider -> GoogleFont.Provider( - providerAuthority, - providerPackage, - certificates, - ) - } + return GoogleFont.Provider( + providerAuthority, + providerPackage, + certificates, + ) } } diff --git a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/PaywallFont.kt b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/PaywallFont.kt index ed21840023..c15e0fc891 100644 --- a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/PaywallFont.kt +++ b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/PaywallFont.kt @@ -7,23 +7,50 @@ import androidx.compose.ui.text.font.FontWeight import kotlinx.parcelize.Parcelize import kotlinx.parcelize.TypeParceler +/** + * Represents a font. You can create either a [GoogleFont] or a [ResourceFont]. + */ sealed class PaywallFont : Parcelable { + /** + * Represents a downloadable Google Font. + */ @Parcelize data class GoogleFont( + /** + * Name of the Google font you want to use. + */ val fontName: String, + /** + * Provider of the Google font. + */ val fontProvider: GoogleFontProvider, + /** + * The weight of the font. The system uses this to match a font to a font request. + */ @TypeParceler() val fontWeight: FontWeight = FontWeight.Normal, + /** + * The style of the font, normal or italic. The system uses this to match a font to a font request. + */ @TypeParceler() val fontStyle: FontStyle = FontStyle.Normal, ) : PaywallFont() @Parcelize data class ResourceFont( + /** + * The resource ID of the font file in font resources. + */ @FontRes val resourceId: Int, + /** + * The weight of the font. The system uses this to match a font to a font request. + */ @TypeParceler() val fontWeight: FontWeight = FontWeight.Normal, + /** + * The style of the font, normal or italic. The system uses this to match a font to a font request. + */ @TypeParceler() val fontStyle: FontStyle = FontStyle.Normal, ) : PaywallFont() From 7cab8fb00b5c63e8ff199626bb2d3f1e00410568 Mon Sep 17 00:00:00 2001 From: Toni Rico Date: Wed, 11 Oct 2023 15:42:44 +0200 Subject: [PATCH 3/5] Use destructured entry --- .../revenuecatui/activity/PaywallActivity.kt | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/activity/PaywallActivity.kt b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/activity/PaywallActivity.kt index 5d4c14376e..8e8a93c229 100644 --- a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/activity/PaywallActivity.kt +++ b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/activity/PaywallActivity.kt @@ -48,24 +48,22 @@ internal class PaywallActivity : ComponentActivity(), PaywallListener { private fun getFontProvider(): FontProvider? { val googleFontProviders = mutableMapOf() - val fontsMap = getArgs()?.fonts?.mapValues { fontFamilyMap -> - fontFamilyMap.value?.let { fontFamily -> - val fonts = fontFamily.fonts.map { font -> - when (font) { - is PaywallFont.ResourceFont -> Font(font.resourceId, font.fontWeight, font.fontStyle) - is PaywallFont.GoogleFont -> { - val googleFontProvider = font.fontProvider - val provider = googleFontProviders.getOrElse(googleFontProvider) { - val googleProvider = googleFontProvider.toGoogleProvider() - googleFontProviders[googleFontProvider] = googleProvider - googleProvider - } - Font(GoogleFont(font.fontName), provider, font.fontWeight, font.fontStyle) + val fontsMap = getArgs()?.fonts?.mapValues { (_, fontFamily) -> + val fonts = fontFamily?.fonts?.map { font -> + when (font) { + is PaywallFont.ResourceFont -> Font(font.resourceId, font.fontWeight, font.fontStyle) + is PaywallFont.GoogleFont -> { + val googleFontProvider = font.fontProvider + val provider = googleFontProviders.getOrElse(googleFontProvider) { + val googleProvider = googleFontProvider.toGoogleProvider() + googleFontProviders[googleFontProvider] = googleProvider + googleProvider } + Font(GoogleFont(font.fontName), provider, font.fontWeight, font.fontStyle) } } - FontFamily(fonts) } + fonts?.let { FontFamily(it) } } ?: return null return object : FontProvider { override fun getFont(type: TypographyType): FontFamily? { From fa8be70d2f6ee1978059f5817bc9a04c84344440 Mon Sep 17 00:00:00 2001 From: Toni Rico Date: Mon, 16 Oct 2023 13:35:42 +0200 Subject: [PATCH 4/5] Add CustomFontProvider implementations that accept a single font to be used by all text styles --- .../ui/revenuecatui/fonts/CustomFontProvider.kt | 11 +++++++++++ .../fonts/CustomParcelizableFontProvider.kt | 11 +++++++++++ .../purchases/ui/revenuecatui/fonts/FontProvider.kt | 1 + .../ui/revenuecatui/fonts/ParcelizableFontProvider.kt | 1 + 4 files changed, 24 insertions(+) create mode 100644 ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/CustomFontProvider.kt create mode 100644 ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/CustomParcelizableFontProvider.kt diff --git a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/CustomFontProvider.kt b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/CustomFontProvider.kt new file mode 100644 index 0000000000..42c1661f8f --- /dev/null +++ b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/CustomFontProvider.kt @@ -0,0 +1,11 @@ +package com.revenuecat.purchases.ui.revenuecatui.fonts + +import androidx.compose.ui.text.font.FontFamily + +/** + * Class that allows to provide a font family for all text styles. + * @param fontFamily the [FontFamily] to be used for all text styles. + */ +class CustomFontProvider(private val fontFamily: FontFamily) : FontProvider { + override fun getFont(type: TypographyType) = fontFamily +} diff --git a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/CustomParcelizableFontProvider.kt b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/CustomParcelizableFontProvider.kt new file mode 100644 index 0000000000..16eaca440d --- /dev/null +++ b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/CustomParcelizableFontProvider.kt @@ -0,0 +1,11 @@ +package com.revenuecat.purchases.ui.revenuecatui.fonts + +/** + * Class that allows to provide a font family for all text styles. + * @param fontFamily the [PaywallFontFamily] to be used for all text styles. + */ +class CustomParcelizableFontProvider( + private val fontFamily: PaywallFontFamily, +) : ParcelizableFontProvider { + override fun getFont(type: TypographyType) = fontFamily +} diff --git a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontProvider.kt b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontProvider.kt index 6a0f8de48a..db2a3ff3b2 100644 --- a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontProvider.kt +++ b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/FontProvider.kt @@ -5,6 +5,7 @@ import androidx.compose.ui.text.font.FontFamily /** * Implement this interface to provide custom fonts to the [PaywallView]. If you don't, the current material3 theme * typography will be used. + * If you only want to use a single FontFamily for all text styles use [CustomFontProvider]. * This can't be used when launching the paywall as an activity since the fonts are not parcelable/serializable. * Use [FontResourceProvider] instead. */ diff --git a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/ParcelizableFontProvider.kt b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/ParcelizableFontProvider.kt index a267c47a74..10320dc65f 100644 --- a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/ParcelizableFontProvider.kt +++ b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/fonts/ParcelizableFontProvider.kt @@ -5,6 +5,7 @@ import com.revenuecat.purchases.ui.revenuecatui.activity.PaywallActivityLauncher /** * Implement this interface to provide custom fonts to the [PaywallActivityLauncher]. * If you don't, the default material3 theme fonts will be used. + * If you only want to use a single [PaywallFontFamily] for all text styles use [CustomParcelizableFontProvider]. * Use [FontProvider] instead if you are using Compose with [PaywallView] or [PaywallDialog]. */ interface ParcelizableFontProvider { From 3a1f158ee9b6415f646b75d9534ca3ba644dd25c Mon Sep 17 00:00:00 2001 From: Toni Rico Date: Tue, 17 Oct 2023 10:20:45 +0200 Subject: [PATCH 5/5] Add font provider parameter for new launch activity methods --- .../activity/PaywallActivityLauncher.kt | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/activity/PaywallActivityLauncher.kt b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/activity/PaywallActivityLauncher.kt index 512f875384..7e37d16bd9 100644 --- a/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/activity/PaywallActivityLauncher.kt +++ b/ui/revenuecatui/src/main/kotlin/com/revenuecat/purchases/ui/revenuecatui/activity/PaywallActivityLauncher.kt @@ -40,13 +40,15 @@ class PaywallActivityLauncher { /** * Launch the paywall activity. * @param offering The offering to be shown in the paywall. If null, the current offering will be shown. + * @param fontProvider The [ParcelizableFontProvider] to be used in the paywall. If null, the default fonts + * will be used. */ @JvmOverloads - fun launch(offering: Offering? = null, parcelizableFontProvider: ParcelizableFontProvider? = null) { + fun launch(offering: Offering? = null, fontProvider: ParcelizableFontProvider? = null) { activityResultLauncher.launch( PaywallActivityArgs( offeringId = offering?.identifier, - fontProvider = parcelizableFontProvider, + fontProvider = fontProvider, ), ) } @@ -54,16 +56,20 @@ class PaywallActivityLauncher { /** * Launch the paywall activity if the current user does not have [requiredEntitlementIdentifier] active. * @param offering The offering to be shown in the paywall. If null, the current offering will be shown. + * @param fontProvider The [ParcelizableFontProvider] to be used in the paywall. If null, the default fonts + * will be used. * @param requiredEntitlementIdentifier the paywall will be displayed only if the current user does not * have this entitlement active. */ @JvmOverloads fun launchIfNeeded( offering: Offering? = null, + fontProvider: ParcelizableFontProvider? = null, requiredEntitlementIdentifier: String, ) { launchIfNeeded( offering = offering, + fontProvider = fontProvider, shouldDisplayBlock = shouldDisplayBlockForEntitlementIdentifier(requiredEntitlementIdentifier), ) } @@ -71,16 +77,24 @@ class PaywallActivityLauncher { /** * Launch the paywall activity based on whether the result of [shouldDisplayBlock] is true. * @param offering The offering to be shown in the paywall. If null, the current offering will be shown. + * @param fontProvider The [ParcelizableFontProvider] to be used in the paywall. If null, the default fonts + * will be used. * @param shouldDisplayBlock the paywall will be displayed only if this returns true. */ @JvmOverloads fun launchIfNeeded( offering: Offering? = null, + fontProvider: ParcelizableFontProvider? = null, shouldDisplayBlock: (CustomerInfo) -> Boolean, ) { shouldDisplayPaywall(shouldDisplayBlock) { shouldDisplay -> if (shouldDisplay) { - activityResultLauncher.launch(PaywallActivityArgs(offeringId = offering?.identifier)) + activityResultLauncher.launch( + PaywallActivityArgs( + offeringId = offering?.identifier, + fontProvider = fontProvider, + ), + ) } } }