From 5ab1be6cd47724dc2d0d95a7fe55df9022b98e6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Orzech?= Date: Sat, 31 Jan 2026 02:10:24 +0100 Subject: [PATCH] Release v1.1: Fix ProGuard/R8 minification crash - Fix ParameterizedType casting error in release builds - Add ProGuard rules for Google Tink (security-crypto dependency) - Add dontwarn rules for Tink optional dependencies - Bump version to 1.1 - Update README with changelog --- README.md | 13 +++ app/build.gradle.kts | 8 +- app/proguard-rules.pro | 14 ++- app/src/main/AndroidManifest.xml | 1 + .../main/java/com/fastmask/ui/theme/Type.kt | 101 ++++++++++++++---- .../res/drawable/ic_launcher_monochrome.xml | 24 +++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 1 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 1 + app/src/main/res/values/font_certs.xml | 17 +++ app/src/main/res/xml/locales_config.xml | 4 + 10 files changed, 160 insertions(+), 24 deletions(-) create mode 100644 app/src/main/res/drawable/ic_launcher_monochrome.xml create mode 100644 app/src/main/res/values/font_certs.xml create mode 100644 app/src/main/res/xml/locales_config.xml diff --git a/README.md b/README.md index e1e3406..8c8a04f 100644 --- a/README.md +++ b/README.md @@ -186,6 +186,19 @@ Contributions are welcome! Here's how you can help: - Use meaningful commit messages - Write tests for new features when applicable +## Changelog + +### v1.1 (January 2026) +- **Fixed**: ProGuard/R8 minification crash with `ParameterizedType` casting error +- **Improved**: Added proper ProGuard rules for Google Tink (security-crypto dependency) +- **Stability**: Release builds now work correctly with code minification enabled + +### v1.0 (Initial Release) +- Manage Fastmail masked emails +- Create, edit, enable/disable, and delete masks +- Material 3 dynamic theming +- Secure token storage with EncryptedSharedPreferences + ## Roadmap - [ ] Add screenshots to README diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 83430d7..0f0b72d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -14,8 +14,8 @@ android { applicationId = "com.fastmask" minSdk = 26 targetSdk = 34 - versionCode = 1 - versionName = "1.0" + versionCode = 2 + versionName = "1.1" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { @@ -130,3 +130,7 @@ dependencies { kapt { correctErrorTypes = true } + +kotlin { + jvmToolchain(17) +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 9f3f11e..f3e0d40 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -38,8 +38,20 @@ -dontwarn okhttp3.** -dontwarn okio.** -# Google Tink / Error Prone annotations +# Google Tink (used by security-crypto) +-keep class com.google.crypto.tink.** { *; } +-keepclassmembers class * extends com.google.crypto.tink.shaded.protobuf.GeneratedMessageLite { + ; +} + +# Tink optional dependencies (not used but referenced) +-dontwarn com.google.api.client.http.** +-dontwarn com.google.errorprone.annotations.InlineMe +-dontwarn org.joda.time.** + +# Google Error Prone annotations -dontwarn com.google.errorprone.annotations.CanIgnoreReturnValue -dontwarn com.google.errorprone.annotations.CheckReturnValue -dontwarn com.google.errorprone.annotations.Immutable -dontwarn com.google.errorprone.annotations.RestrictedApi +-dontwarn javax.annotation.** diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2785683..a00d9d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,6 +12,7 @@ android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" + android:localeConfig="@xml/locales_config" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.FastMask" diff --git a/app/src/main/java/com/fastmask/ui/theme/Type.kt b/app/src/main/java/com/fastmask/ui/theme/Type.kt index c477e29..2bbc371 100644 --- a/app/src/main/java/com/fastmask/ui/theme/Type.kt +++ b/app/src/main/java/com/fastmask/ui/theme/Type.kt @@ -4,67 +4,126 @@ import androidx.compose.material3.Typography import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.googlefonts.Font +import androidx.compose.ui.text.googlefonts.GoogleFont import androidx.compose.ui.unit.sp +val provider = GoogleFont.Provider( + providerAuthority = "com.google.android.gms.fonts", + providerPackage = "com.google.android.gms", + certificates = com.fastmask.R.array.com_google_android_gms_fonts_certs +) + +val InterFont = GoogleFont("Inter") + +val InterFontFamily = FontFamily( + Font(googleFont = InterFont, fontProvider = provider, weight = FontWeight.Normal), + Font(googleFont = InterFont, fontProvider = provider, weight = FontWeight.Medium), + Font(googleFont = InterFont, fontProvider = provider, weight = FontWeight.SemiBold), + Font(googleFont = InterFont, fontProvider = provider, weight = FontWeight.Bold) +) + val Typography = Typography( - bodyLarge = TextStyle( - fontFamily = FontFamily.Default, + displayLarge = TextStyle( + fontFamily = InterFontFamily, fontWeight = FontWeight.Normal, - fontSize = 16.sp, - lineHeight = 24.sp, - letterSpacing = 0.5.sp + fontSize = 57.sp, + lineHeight = 64.sp, + letterSpacing = (-0.25).sp ), - bodyMedium = TextStyle( - fontFamily = FontFamily.Default, + displayMedium = TextStyle( + fontFamily = InterFontFamily, fontWeight = FontWeight.Normal, - fontSize = 14.sp, - lineHeight = 20.sp, - letterSpacing = 0.25.sp + fontSize = 45.sp, + lineHeight = 52.sp, + letterSpacing = 0.sp ), - bodySmall = TextStyle( - fontFamily = FontFamily.Default, + displaySmall = TextStyle( + fontFamily = InterFontFamily, fontWeight = FontWeight.Normal, - fontSize = 12.sp, - lineHeight = 16.sp, - letterSpacing = 0.4.sp + fontSize = 36.sp, + lineHeight = 44.sp, + letterSpacing = 0.sp + ), + headlineLarge = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.Normal, + fontSize = 32.sp, + lineHeight = 40.sp, + letterSpacing = 0.sp + ), + headlineMedium = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.Normal, + fontSize = 28.sp, + lineHeight = 36.sp, + letterSpacing = 0.sp + ), + headlineSmall = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.Normal, + fontSize = 24.sp, + lineHeight = 32.sp, + letterSpacing = 0.sp ), titleLarge = TextStyle( - fontFamily = FontFamily.Default, + fontFamily = InterFontFamily, fontWeight = FontWeight.SemiBold, fontSize = 22.sp, lineHeight = 28.sp, letterSpacing = 0.sp ), titleMedium = TextStyle( - fontFamily = FontFamily.Default, + fontFamily = InterFontFamily, fontWeight = FontWeight.SemiBold, fontSize = 16.sp, lineHeight = 24.sp, letterSpacing = 0.15.sp ), titleSmall = TextStyle( - fontFamily = FontFamily.Default, + fontFamily = InterFontFamily, fontWeight = FontWeight.Medium, fontSize = 14.sp, lineHeight = 20.sp, letterSpacing = 0.1.sp ), + bodyLarge = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ), + bodyMedium = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.Normal, + fontSize = 14.sp, + lineHeight = 20.sp, + letterSpacing = 0.25.sp + ), + bodySmall = TextStyle( + fontFamily = InterFontFamily, + fontWeight = FontWeight.Normal, + fontSize = 12.sp, + lineHeight = 16.sp, + letterSpacing = 0.4.sp + ), labelLarge = TextStyle( - fontFamily = FontFamily.Default, + fontFamily = InterFontFamily, fontWeight = FontWeight.Medium, fontSize = 14.sp, lineHeight = 20.sp, letterSpacing = 0.1.sp ), labelMedium = TextStyle( - fontFamily = FontFamily.Default, + fontFamily = InterFontFamily, fontWeight = FontWeight.Medium, fontSize = 12.sp, lineHeight = 16.sp, letterSpacing = 0.5.sp ), labelSmall = TextStyle( - fontFamily = FontFamily.Default, + fontFamily = InterFontFamily, fontWeight = FontWeight.Medium, fontSize = 11.sp, lineHeight = 16.sp, diff --git a/app/src/main/res/drawable/ic_launcher_monochrome.xml b/app/src/main/res/drawable/ic_launcher_monochrome.xml new file mode 100644 index 0000000..605e70a --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_monochrome.xml @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index d378acd..80faec8 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -2,4 +2,5 @@ + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index d378acd..80faec8 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -2,4 +2,5 @@ + diff --git a/app/src/main/res/values/font_certs.xml b/app/src/main/res/values/font_certs.xml new file mode 100644 index 0000000..691ec2b --- /dev/null +++ b/app/src/main/res/values/font_certs.xml @@ -0,0 +1,17 @@ + + + + @array/com_google_android_gms_fonts_certs_dev + @array/com_google_android_gms_fonts_certs_prod + + + + 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 + + + diff --git a/app/src/main/res/xml/locales_config.xml b/app/src/main/res/xml/locales_config.xml new file mode 100644 index 0000000..ade0d80 --- /dev/null +++ b/app/src/main/res/xml/locales_config.xml @@ -0,0 +1,4 @@ + + + +