From 656ad774cec0272bf19f2fbc5ff85259a84881a8 Mon Sep 17 00:00:00 2001 From: naresh chocha Date: Fri, 27 Jun 2025 15:14:57 +0530 Subject: [PATCH 1/5] Upgrade Gradle, Kotlin, AGP, and dependencies - Gradle wrapper updated to 8.14.2 - Kotlin version bumped to 2.2.0 - AGP version bumped to 8.11.0 - Updated compileSdk and targetSdk to 36 - Changed Java compatibility to version 21 - Updated various dependencies to their latest versions: - coreKtx to 1.16.0 - lifecycleRuntimeKtx to 2.9.1 - activityCompose to 1.10.1 - composeBom to 2025.06.01 - material3v to 1.3.2 - Added core-splashscreen dependency --- formz/build.gradle.kts | 12 ++++++++---- gradle/libs.versions.toml | 19 ++++++++++--------- gradle/wrapper/gradle-wrapper.properties | 2 +- sample/build.gradle.kts | 14 +++++++++----- 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/formz/build.gradle.kts b/formz/build.gradle.kts index fbb5121..ad321ae 100644 --- a/formz/build.gradle.kts +++ b/formz/build.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias(libs.plugins.android.library) alias(libs.plugins.jetbrains.kotlin.android) @@ -23,11 +25,13 @@ android { } } compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.toString() + kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_21) + } } publishing { singleVariant("release") { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dafcabe..db92e7f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,17 +1,17 @@ [versions] -agp = "8.8.2" -kotlin = "2.1.0" -compileSdk = "35" -targetSdk = "35" +agp = "8.11.0" +kotlin = "2.2.0" +compileSdk = "36" +targetSdk = "36" minSdk = "21" -jdkVersion = "VERSION_17" -coreKtx = "1.15.0" +coreKtx = "1.16.0" +core-splashscreen="1.0.1" -lifecycleRuntimeKtx = "2.8.7" +lifecycleRuntimeKtx = "2.9.1" activityCompose = "1.10.1" -composeBom = "2025.02.00" -material3v = "1.3.1" +composeBom = "2025.06.01" +material3v = "1.3.2" timber = "5.0.1" @@ -22,6 +22,7 @@ espressoCore = "3.6.1" [libraries] # core +core-splashscreen = { group = "androidx.core", name = "core-splashscreen", version.ref = "core-splashscreen" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 337d736..a1797fa 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Aug 09 10:49:58 IST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index 34c8566..6fad2b9 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias(libs.plugins.android.application) alias(libs.plugins.jetbrains.kotlin.android) @@ -31,11 +33,13 @@ android { } } compileOptions { - sourceCompatibility = JavaVersion.valueOf(libs.versions.jdkVersion.get()) - targetCompatibility = JavaVersion.valueOf(libs.versions.jdkVersion.get()) + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } - kotlinOptions { - jvmTarget = JavaVersion.valueOf(libs.versions.jdkVersion.get()).toString() + kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_21) + } } buildFeatures { compose = true @@ -43,7 +47,7 @@ android { } dependencies { - + implementation(libs.core.splashscreen) implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) From 15ebc814a3abf23bc7c73eb80906ca83382b75b4 Mon Sep 17 00:00:00 2001 From: naresh chocha Date: Fri, 27 Jun 2025 15:15:14 +0530 Subject: [PATCH 2/5] Update splash screen for sample app - Implemented splash screen functionality. - Added new app icons. - Removed old launcher icons. - Updated theme files for splash screen support and dark mode adjustments. - Modified MainActivity to include splash screen logic and UI updates. --- sample/src/main/AndroidManifest.xml | 6 +- sample/src/main/ic_launcher-playstore.png | Bin 0 -> 61238 bytes .../com/nareshchocha/sample/MainActivity.kt | 59 +++++- .../drawable-v24/ic_launcher_foreground.xml | 30 ---- .../res/drawable/ic_launcher_background.xml | 170 ------------------ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 +- .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 1404 -> 1804 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 0 -> 2982 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 2898 -> 3276 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 982 -> 1176 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 0 -> 1782 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 1772 -> 1996 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 1900 -> 2498 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 0 -> 4366 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 3918 -> 4594 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 2884 -> 4018 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 0 -> 8702 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 5914 -> 7426 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 3844 -> 5526 bytes .../ic_launcher_foreground.webp | Bin 0 -> 14758 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 7778 -> 10696 bytes sample/src/main/res/values-night/themes.xml | 23 +++ .../res/values/ic_launcher_background.xml | 4 + sample/src/main/res/values/themes.xml | 24 ++- 25 files changed, 104 insertions(+), 222 deletions(-) create mode 100644 sample/src/main/ic_launcher-playstore.png delete mode 100644 sample/src/main/res/drawable-v24/ic_launcher_foreground.xml delete mode 100644 sample/src/main/res/drawable/ic_launcher_background.xml create mode 100644 sample/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp create mode 100644 sample/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp create mode 100644 sample/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp create mode 100644 sample/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp create mode 100644 sample/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp create mode 100644 sample/src/main/res/values-night/themes.xml create mode 100644 sample/src/main/res/values/ic_launcher_background.xml diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index 1954b3e..3258e30 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -10,13 +10,11 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/Theme.Formz" + android:theme="@style/Theme.Formz.Splash" tools:targetApi="31"> + android:exported="true"> diff --git a/sample/src/main/ic_launcher-playstore.png b/sample/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..71d70918a1108800a088c8967fac3847b209e7d7 GIT binary patch literal 61238 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 literal 0 HcmV?d00001 diff --git a/sample/src/main/java/com/nareshchocha/sample/MainActivity.kt b/sample/src/main/java/com/nareshchocha/sample/MainActivity.kt index ee450f4..ebc529e 100644 --- a/sample/src/main/java/com/nareshchocha/sample/MainActivity.kt +++ b/sample/src/main/java/com/nareshchocha/sample/MainActivity.kt @@ -2,7 +2,9 @@ package com.nareshchocha.sample import android.os.Bundle import androidx.activity.ComponentActivity +import androidx.activity.SystemBarStyle import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize @@ -14,11 +16,14 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Visibility import androidx.compose.material.icons.filled.VisibilityOff import androidx.compose.material3.Checkbox +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -26,6 +31,8 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardCapitalization @@ -34,6 +41,7 @@ import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import com.nareshchocha.sample.baseComponents.AppOutlinedTextField import com.nareshchocha.sample.ui.theme.SampleTheme import com.nareshchocha.sample.velidate.BooleanInput @@ -45,22 +53,55 @@ import com.nareshchocha.sample.velidate.getErrorMessage class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - //enableEdgeToEdge() + installSplashScreen() + enableEdgeToEdge( + statusBarStyle = + SystemBarStyle.dark( + Color.Transparent.toArgb() + ), + navigationBarStyle = + SystemBarStyle.light( + Color.Transparent.toArgb(), + Color.Transparent.toArgb() + ) + ) setContent { SampleTheme { - Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> - AllComponents( - modifier = Modifier - .fillMaxSize() - .padding(14.dp) - .padding(innerPadding) - ) - } + RootUI() } } } } +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun RootUI() { + Scaffold( + modifier = Modifier.fillMaxSize(), + topBar = { + TopAppBar( + title = { + Text( + text = "Formz Sample", + style = MaterialTheme.typography.headlineMedium.copy(color = Color.White) + ) + }, + colors = + TopAppBarDefaults.topAppBarColors( + containerColor = MaterialTheme.colorScheme.primary + ) + ) + } + ) { innerPadding -> + AllComponents( + modifier = Modifier + .fillMaxSize() + .padding(14.dp) + .padding(innerPadding) + ) + } +} + @Composable fun AllComponents(modifier: Modifier = Modifier) { var testInputTextField by remember { mutableStateOf(NonEmptyInput()) } diff --git a/sample/src/main/res/drawable-v24/ic_launcher_foreground.xml b/sample/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/sample/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/sample/src/main/res/drawable/ic_launcher_background.xml b/sample/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/sample/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sample/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/sample/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 6f3b755..036d09b 100644 --- a/sample/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/sample/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,6 +1,5 @@ - - - + + \ No newline at end of file diff --git a/sample/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/sample/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 6f3b755..036d09b 100644 --- a/sample/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/sample/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,6 +1,5 @@ - - - + + \ No newline at end of file diff --git a/sample/src/main/res/mipmap-hdpi/ic_launcher.webp b/sample/src/main/res/mipmap-hdpi/ic_launcher.webp index c209e78ecd372343283f4157dcfd918ec5165bb3..39f5784d51292a7a4628ea3d3040d289f8505848 100644 GIT binary patch literal 1804 zcmV+n2lMz+Nk&El2LJ$9MM6+kP&iEZ1^@srN5Byf6^DR?;Qw)15D`gpB*3k5$6ZOImlgFaEv%`ChDihxi9bOXb>8@|V~EUTdY_09k}3{=)`2 zOz=;TGKV_CX|-+3a(;Jrseck+1B)CYna&DSl1p-z^#9CY1L!*TvT@r+5;Ze>RB7i6 zlB{hzCTDAQ7h17x+cv8@wr$(CZ98p+g`mD9E64(D3^lavcMW}F`#Yz05o2oG_AvQk z+xFCeBmivMMlO!Ga%+zn@4GR>iShprh-9`T=eBKQd(OFhuJwHO_r-Slj8ryy+jjEe zhs7-2+cx^o$ZaG=ZqUpP7T>@d@BD}#Cuz$7KgvWUjm+UM`3VFl_(;s3@ouwHOsqsv{?fQoPJXvB+Z1To`bKx`2mZ1+g|o zK@$KWkHK`Bw*xpMKT}!C(pd5^Maa7Ioe~ueT+{(+LQh1G#GXN9SblLb0eYRa^lAq)#cO-)ZWGcDQlRIaenm@5hkgEvOB6-A^P zV7!^xhV&__zC_Utn!ZFc4et2!mS!$l8|^OA>_j6+Yf#=?pqdudG%2P<)y)@_B(StatdSm+UfYcJ`~iIIQaq-LSAr;&5RFanHsI8uzcNH9__{S_0tZobo%`l zXy6xw5X@$3awJ=O7zX)WT=Ijye#+6cVEkRnaPSNX+k--%HD=%T4;m3CGuz@pqN+e>KCwQ$!7ugflZCdwaKAewN1WgP7|r~>f=V|+$P3S% z^~yB`0GhzOb=J^KLw@ss^M@bI->YAbjvtS%5xTzQrL#_1DQM!Yv-+X@)_&&?-=~fr zKmI5hP3-qKv-P8!hR5!PY^`A*omEuRIN<#8`_!+jIyye{-g6|+(YJo@+4(|2pQo5+ zXBSUjr;g{0BI6H8p6fJI6K7I&s~_ptj}W=d!>%4b9vwfPV;=nFo_gyK5^p_q*VA-^ z5b|QT{N_QIk6*@*=j8kATHe(+)fAw4@2S@0y(|3)mftwUt|2T+KUV_0-psl2s+t01 z@8LYHz7PwGJajj@>8}rd!lIu&XdC_Pe%rQfqn|yDfBIyY%G58U-|=dIx(chQ|6Fmp zVgApl0vIqVM$p}rg38NO6Y#$)Z(VrXxQd_#V1y(YQ9lflQ~{Pr(Ton-bL1Gm+ zRb>SO#fll!!-vTW4hD4O0}y5;qIzD}qHo#lk{edfQadCb6nSO_G;xml0A&Z_|Ok^&~vQEkjzXn7&egGA-t8zHP6d+RT#+7e_=tx|+2 zfv3X83V`n+n8p613YwHYO17L^ZOwX@-slLJx8A08MTI^O8LQk(6)|REw&+t~CdM$z zVqyjrFjT1v literal 1404 zcmV-?1%vuhNk&F=1pok7MM6+kP&il$0000G0000-002h-06|PpNX!5L00Dqw+t%{r zzW2vH!KF=w&cMnnN@{whkTw+#mAh0SV?YL=)3MimFYCWp#fpdtz~8$hD5VPuQgtcN zXl<@<#Cme5f5yr2h%@8TWh?)bSK`O z^Z@d={gn7J{iyxL_y_%J|L>ep{dUxUP8a{byupH&!UNR*OutO~0{*T4q5R6@ApLF! z5{w?Z150gC7#>(VHFJZ-^6O@PYp{t!jH(_Z*nzTK4 zkc{fLE4Q3|mA2`CWQ3{8;gxGizgM!zccbdQoOLZc8hThi-IhN90RFT|zlxh3Ty&VG z?Fe{#9RrRnxzsu|Lg2ddugg7k%>0JeD+{XZ7>Z~{=|M+sh1MF7~ zz>To~`~LVQe1nNoR-gEzkpe{Ak^7{{ZBk2i_<+`Bq<^GB!RYG+z)h;Y3+<{zlMUYd zrd*W4w&jZ0%kBuDZ1EW&KLpyR7r2=}fF2%0VwHM4pUs}ZI2egi#DRMYZPek*^H9YK zay4Iy3WXFG(F14xYsoDA|KXgGc5%2DhmQ1gFCkrgHBm!lXG8I5h*uf{rn48Z!_@ z4Bk6TJAB2CKYqPjiX&mWoW>OPFGd$wqroa($ne7EUK;#3VYkXaew%Kh^3OrMhtjYN?XEoY`tRPQsAkH-DSL^QqyN0>^ zmC>{#F14jz4GeW{pJoRpLFa_*GI{?T93^rX7SPQgT@LbLqpNA}<@2wH;q493)G=1Y z#-sCiRNX~qf3KgiFzB3I>4Z%AfS(3$`-aMIBU+6?gbgDb!)L~A)je+;fR0jWLL-Fu z4)P{c7{B4Hp91&%??2$v9iRSFnuckHUm}or9seH6 z>%NbT+5*@L5(I9j@06@(!{ZI?U0=pKn8uwIg&L{JV14+8s2hnvbRrU|hZCd}IJu7*;;ECgO%8_*W Kmw_-CKmY()leWbG diff --git a/sample/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/sample/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..3bf6515e4eb52f0a76741f2ca8c42bf8a0799732 GIT binary patch literal 2982 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 literal 0 HcmV?d00001 diff --git a/sample/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/sample/src/main/res/mipmap-hdpi/ic_launcher_round.webp index b2dfe3d1ba5cf3ee31b3ecc1ced89044a1f3b7a9..634e58298b170cfed7a3f3248f1acbd8941f6356 100644 GIT binary patch literal 3276 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 K*g@&kKBNHhX)7lH literal 2898 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 diff --git a/sample/src/main/res/mipmap-mdpi/ic_launcher.webp b/sample/src/main/res/mipmap-mdpi/ic_launcher.webp index 4f0f1d64e58ba64d180ce43ee13bf9a17835fbca..04c1f0e46cf98849f510e0c6f5e7430116b229b8 100644 GIT binary patch literal 1176 zcmV;J1ZVqFNk&GH1ONb6MM6+kP&iD41ONapFTe{B)doSfP3N!uJ4D0;xYa-}8;)#k z%bIUn3@t2yl8VK!5AAFR?ojI%G)ea>{>{9<^bgU>-QA_iq{1Q`*|u#)v28mkkD{uZ z=@n;SjLK^IDRSGkkGwiRAz2%2To&r2s3a0|3D+lBnz@_Ylfcs3hl0H{Bbg}jcH!NwryMeWU(`{ow1$t zUy<9k4U_J1Yaao#*u}d9*)Kj_YzhsWPI*%Rx_US2hD6`)fGMYRx$aOsC|9zN%J3i4 zapbWI3TWZVjG?1^VaihpDL`K6E41nT%ue`_oKHXvTyfmk4PJrqa-Wo zrV)V-2d#pqYaj*ym1pb{WRsw}N4YBFA8`5rIY$NFIOux^6J4~%#c%BIJ^)|>6T@g6 zelnAp)(Vbi#%cLMFf&lv1z5=9BHkrvXJ@BFfP(~^Y^@4Nzp}GB#JFjjSL5hxV*@FN;M2_N^RVU1h zk(e<=F}|>XD8~MXi*d+|)9ap~Q8EavZIw-T!YU7{Jy^K_s}`Wj8xN9V5?;-pG3eg9 zj?jR@ULdL%{eOR-z^|H;1`&L!8LB<%!`i~Rq5=86U}Q1&JE`!hmg=ru*7Y%)Zp3-D z`rSjt?nw&}q9W8MEnOhQ<5-pO)B-r2 zNl_-f08jZsN;B>Ts1jT!u+u6~D!5VL@bH&}Nzmv~NRbhq7{4{e$Yi#{J}B3$$Y0EZ zD(Xyb%U`veMuj4nC2=xv_Ktg$=0=DN+n{(wNtBE}L3vDQQRsS2&Kas+S9Q9GegFykY$9UzG*Gjc<(ej%)tn~4OOHc`QE>@^n4 z%Y@LND9U7KPV9r?9_5`b08OtmkYFJZk(gan+>(5!<~4b5q%a9gG>xf{GaaLhK*4Se zwLrY|Ehlfe5R>Y@byON z;s^%f=dIg+}bJb8n@1~{g{y4oHTFQ qy`{IyNz9)twf9}MvnKjx8=QY~6TgFEJd?=o>`%dUSt7|UVG;q1Pfm3J literal 982 zcmV;{11bDcNk&G_0{{S5MM6+kP&il$0000G0000l001ul06|PpNU8t;00Dqo+t#w^ z^1csucXz7-Qrhzl9HuHB%l>&>1tG2^vb*E&k^T3$FG1eQZ51g$uv4V+kI`0<^1Z@N zk?Jjh$olyC%l>)Xq;7!>{iBj&BjJ`P&$fsCfpve_epJOBkTF?nu-B7D!hO=2ZR}

C%4 zc_9eOXvPbC4kzU8YowIA8cW~Uv|eB&yYwAObSwL2vY~UYI7NXPvf3b+c^?wcs~_t{ ze_m66-0)^{JdOMKPwjpQ@Sna!*?$wTZ~su*tNv7o!gXT!GRgivP}ec?5>l1!7<(rT zds|8x(qGc673zrvYIz;J23FG{9nHMnAuP}NpAED^laz3mAN1sy+NXK)!6v1FxQ;lh zOBLA>$~P3r4b*NcqR;y6pwyhZ3_PiDb|%n1gGjl3ZU}ujInlP{eks-#oA6>rh&g+!f`hv#_%JrgYPu z(U^&XLW^QX7F9Z*SRPpQl{B%x)_AMp^}_v~?j7 zapvHMKxSf*Mtyx8I}-<*UGn3)oHd(nn=)BZ`d$lDBwq_GL($_TPaS{UeevT(AJ`p0 z9%+hQb6z)U9qjbuXjg|dExCLjpS8$VKQ55VsIC%@{N5t{NsW)=hNGI`J=x97_kbz@ E0Of=7!T3{}jn- z8&2FZGhRGlQZEGr7G$>$sND za{x$@ZM#;s527Q+AH<*%5jmW-_Idxq1accmj--0+o~o|Q$U5~qQMywvpPlZQDPxZQHi(e{d&2ZnSM~++05_!Fz(c*gbjMiVC22K*s*J|+e$+L(Gha)!@Z1D0CBG+ zHDl92jwDHuv?{P>`(kFs=Rj3vuUdNz_hV*~)cT8CU50&c(Dz!5RAnjh7fpz) z3O)jfZb{K5WvW#t8S$t&EY?W6TtJx0cStY3;OhzpWzQ!#m2zIjZ&lTS-11>MU5f zSW8q4@(efe*7_?)olz;aionL)^XAi>dmcrAC8bnnOnNOdTgaQsvSnsSXA?{D3UsV+*GGi23NpA>$6hI#c@|~D7Cav6a{{xn@-teLM=BI1({omj2|E0DZ8?Dy<;#)-bqr2wr@8` zK1r8(l?SP}+*+lRU46H1^8J&DG}6!%n{*!l57IF@>yXo~ezSAEM)D42|LI35vLq2N z5cxDf0=gGNDcI~jeHYVgB%L0U0{{=DzTZ@3_kMwtQkEjpH0j&Q-aQQU{uwP%yrLxR z(BwnF1G!(O+fEU|67VF4_S?5_-xl~&7lHuE z-clU+^5tOf72L{kM#4$3_6$}o0@h}T%7B0kNuXcb62?u!x#`_eVRcHx5)mPS120Sp zyqjE@^pxq#mmDu7OgHL67$9U50GL^dCb(}$8R+W+k0PH6KApVL%?SWbiX05rnUR{r zN@}9W@3oo~z1y)isR_C;2@LgKUa`NDT(_mUw2_+pGdX`j^!Z5vZvtKcfWuUJLeym> z1Z*f4G1bIMXNmv`Hw_URIW{G6ouc`$;*olA9AQ=SjD}?xkKXasc3} Y0>AEeQj}gNzf>Ysf64Q7>tc+n0B>Dk!2kdN literal 0 HcmV?d00001 diff --git a/sample/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/sample/src/main/res/mipmap-mdpi/ic_launcher_round.webp index 62b611da081676d42f6c3f78a2c91e7bcedddedb..45e20e60431adce7776e5a5710ef1fdf71357188 100644 GIT binary patch literal 1996 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

FJ$wK}0tWNB{uH;AM~i diff --git a/sample/src/main/res/mipmap-xhdpi/ic_launcher.webp b/sample/src/main/res/mipmap-xhdpi/ic_launcher.webp index 948a3070fe34c611c42c0d3ad3013a0dce358be0..65f0dddba9e3c2b54e8ce01a51aead7a9ada0a60 100644 GIT binary patch literal 2498 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 diff --git a/sample/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/sample/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..e31f881e2086f5bbfc432618c764be9820f9b292 GIT binary patch literal 4366 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 I|Fv5J0B~<_V*mgE literal 0 HcmV?d00001 diff --git a/sample/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/sample/src/main/res/mipmap-xhdpi/ic_launcher_round.webp index 1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f..a8125656b204caab8c49c635445d7ff6c3af393b 100644 GIT binary patch literal 4594 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 literal 3918 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 YA4LwhyB|c5yZgLD3g&|#zM4`T0AGa4KmY&$ literal 2884 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 literal 0 HcmV?d00001 diff --git a/sample/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/sample/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp index 9287f5083623b375139afb391af71cc533a7dd37..55ed73e6728b1d5e4b0161a93bee95b64c192f58 100644 GIT binary patch literal 7426 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]J+i5y*}U{d8>HCx_^){BBmh`euTP3G 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�(p-{x$&=IACIfoAR!za)F-^da-t3#0Dycnp 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 Y$bAJBRfP?vL}F`MQSo?SWqnTt8zk{{*#H0l literal 3844 zcmV+f5Bu;^Nk&He4gdgGMM6+kP&il$0000G0002L006%L06|PpNQVLd01cqCZJQ!l zdEc+9kGs3OD-bz^9uc|AA8?1rA#x4f-93WH-QAt;uJ6U6Yp<>o!9>IaV6aUZ*?W>} zs4%E?srLW`CJh0GCIK@hTkrW7A15Iu%N&?Q^$0+!{Tv&|t^Y@u%!L zglTg&?Q5q#ijZ;&HBQ?FNPp;k3J5!&{^+SGq?AX~SiOM9jJMRpyP?RCr@z38AQyy&WRMaC;n4una$~nJKSp?q|s8F00c9?Q! zY_ovvjTFm+DeQM^LXJ#v0}6HRt3R1%5PT*}W!k8BEM;Jrj8dIceFo2fhzTqaB3KKk zGlCLI)gU25(#u6ch6GeB1k@eHq7l{EHXv0n6xE#ws#ri}08kkCf8hUt{|Ejb`2YW* zvg}0nSSX1m=76s?sZhRY$K=3dpJ+y*eDULGnL2}4>4nvW^7_<~wIM_5fjvwt4h1|g z)g0Z6ZFq9j<~9~b8((~TN{Z?ZQfw|is&Xp~AC61sj;xItKyCHdI|tCMC_LbXF>~vR z=w6V3^H=W4CbAgR4#xw}ETTwu2guW~=Crl@SMXv85jQ=%y!s^?m4PI0My7MWICO;- z175jm%&PcPWh8QdOU(#8bp4!N7ET-+)N}N2zk2)8ch|4Q&lPFNQgT-thu053`r*h3 z_8dI@G;`zn;lH$zX3RzIk`E8~`J=BBdR}qD%n@vVG1834)!pS1Y?zVkJGtsa(sB~y zNfMYKsOJb%5J(0ivK8d+l2D2y&5X!cg3BG!AJ}910|_${nF}sC1QF^nLIhzXk-Y#x z0)&1iK!O;Og0Ky!;`b~v%b$`S4E&fB)1NB4v@8wr( z&+NX4e^&o)ecb=)dd~C!{(1e6t?&9j{l8%U*k4)?`(L3;Qjw z#w7FS+U(94MaJKS!J9O8^$)36_J8;thW#2$y9i{bB{?M{QS_inZIJ!jwqAbfXYVd$ zQ5fC$6Nc9hFi8m^;oI-%C#BS|c8vy+@{jx6hFcf^_;2VRgkoN(0h!_VSGmgNPRsxI z8$rTo0LaYq-H5i&gtj81=&xU?H-Y2==G@uQV7E`@+2E9XQW@{&j`?EOktk|Ho{HU>ZqDzvgjwBmdex z&uZNd2C1h{{}2k6Ys9$*nFP3;K%u!MhW`uZy7Sn`1M1zs@Es&;z*Z>Gsh@-3Fe6pE zQD2@cqF((NrRevgvLsvM_8;;iNyJ5nyPyy?e!kvKjGj`6diRFBEe49Oa7wwkJFV7Z z$YT&DWloYu-H?3<0BKn9L&JYDT-SK~*6c5pi18P26$JESKRYj{T7Zk6KiRJcbvOO*{P56Q6s8msbeI3>|j>K9}Q9UBeq*inXKemCm`-<5|-$ZyN4u$(3 z&HcvqehFD%5Yrmykg-^d`=BSa8(i=>ZoC77^mWY{evp(km@aHqhUECBz76YiR+VYK zY_avFC~V3$=`6C4JhfHAQ@DZtUOwH`L;oYX6zK0-uI^?hS$ALfq}A7evR;ohJHij} zHSZdW?EKv9U1s4oD*<(0oQ*;MaQ6@cvGL zuHCPgm_NhVsgp^sfr*ia^Db}swo1?O(_Q2)y+S$CBm+g=9wCOUPbz(x)_GbaKa@A7 zuI&!ynLiZRT#V%_y_-D`0Z5lT*auoe{(U5NylTzFSJW()W-#F6*&A`LNO1bV#Y;QJ zSbLBnp|B^dtK|KIWC|No>JjWBWE@n7O)x{&^E(WMeMvp57#qA8m* zeTow*U@_86B#Fm*rxyYu5PRWaWHx8y> z*qmHEp(AMDl0v)ij(AY8fnH=~ZwwjVAbu*m5;xPfidh@ov6d8g zfJsi&!QyK53Es%sC39ts;54V68koALD4b|%tNHW0bIkZAJKa=W&FomJSEDT>W1xIX z1x%Z>AvNIsSPLcn3RTcHXb@KB?cuM)=x6fcIx>&(GxqZ8w3p#jJ(GVgc*`c0HG}dv zIop&Qim!K1NFwic%07KcjWgHBPUkq7f~lj;TPqVGTiT#cUeim>;nY`>h@a*S{qQex zQ`z62WK|Mj)Y{tfF{;T4P;c8$Q|KU?Joh zIkA^z%X7z|r>4aTh@|StTi!-r1D!g=zb#3d#{{&K3CqE$Iz-UH<%37c zRfkO`&uM%#AD3PHv`g5t0e^O%nVL0d{Xlx^EjEC3#skF@`zl-7PF^0oxW)1!C!JxR zWvuAHH?)61FKA1QeT*_sY7;_Id#!GmV4n`MO{~sv}VLSK` zXRw=Y=Clz*00B(5y^K;gCZMAzjT5+c3IC=)l(9VIDdatpxj3y89WwI|bH&$!ZEvp` zPR!T@#!(|KfI-w?!&+7$N3F6>tD{YO4Qg$d_`nNEdfVCha9vaPn0jI0`)`@*72hq! zpU5ND^P*RoEkbD5o#az(-g=Y)L>HH>Oc%}$ zT3Rs_ih0;4+Lv4Y;@Iv(;fUbQ=i-G(#>vghec~*j(I#r|5mqFiJBpzi&hzEcD{u$< zRsm0BVYn=pT;0>R(itW|*D&;O%bOc7et9ACaH#J>z3A1A~6fdP>pmbM%xzm4>|;c_?B+%sl;Qs2{t!60$^u zH1t@9^6>;?!FuusnISi$f5CL&;z?EqJN$FBuWDA#D5`cy_UvCFIVvf{c?4N0teh;d zET$7aVbj08KTQS!x?Nd1Is8q8qFzs}a=!@nJ;7FSfCY^T@D-gpw`w<6e#X3+;O}1h z$%I!M)0bg|EKUA04Qjn@+x{Rj8vt6Wn!R|3A92z}^$KfF5(#CWr4y#~re1CN4i4w0 z#GsypBR{xA3Er7sgAi(|}1-W?s~n$7?K|9WL8kpVfw-;#b9 z+mn;=ep!162U5R>_t}fOt~tE?s#m( zO-S$7>Ay6*hHdZ)7_oU915WYYCIX;hFI-U2EWYX!pllONr@Q--2o~`!isi6vTPLJ4@(|o=%NHYjo0_S&q*UQIROw@*N-By@PaQ&;YxFZ0aR zX&}LeOEz);#m~Hwm^VAY8DK}b$F4bo{jMN?d!lxKPhNklzr^Cd`0f4oJr^z=I|l`* zm8AHm*fPV`0=lF3Pnnp}&J0N1X@}-D94YvmUabFrLGSnTz7Mu^21F#O5tN#CuY9Vh zUZBH=ez%h*wkf0hBtXJh1SN3d+IF{gzT7lp)j}n?03lt;XSQRAh7qd&v;RwTYDuQ# zbI2*r<>?x-G0@hM{;%{VBD7nLKt~D`T~-HAt5;h%i0_=Ifs=yHma5dhJ+QMG?Ux(a z|E?1CMy1!~oA`FP!k~iG=t&5#>bVdz=peT8HMB6Y)#7PpETtNryT^+Rv3vpJaF^zP z{H}0-LyV9Fu21ID%wO9f1IKlFr1p4c{o-?03vyB-tr5duk^&L$;m_|f$vs`^Sl{j2 z95}oY{LlY+=ZS%J+tZoXCd0*sSU7w^gjovXn+g7uyra5{cU49@yHf#Z^Jl-$9cIfo z+AJuxH$VLb=#+uBbVmUjnx zxb1pZ@-O9=AIk4@S)m6fJ2?{HrNYwwnL3a45muuNjr;6$O`bGEM0T4A2_S$t=86*- zcO+0mywg*j|yfhF#%B$n(SV96yf5~UKZl_UtlBn>KNXFexxW7}4h{at`Nrv&=1 z>V|}Gh}`XDKXu$lk|O16nVGlzw`!U1Y+xNpvXaI5qR2nGjR2RaMXLW~lQw2*PXR4Q zcv5%FMr^YaiO??*!X;&G0RkjkWK-g2NG7sB@jI&DL*$nmPLkM@n9N)LLJCftET(rZ zjF-W0dkpd#(TzIs4hrLe!TN|IrT-_QXvhdmi7GK9G7QM=7m287uSkxH3rHZW!PbM8 zB#>Gdw{7G|?7!^Yy&S#~F#-N#%Okog4l^DE<>1NDvdNZn zKTmO2b$3Z*F*N7P&O_UfT$sriOm z?-K|N%4Nf3mwn_N``VGWOousf%$&%wVOa9EcjUScAq?vX0(Y2WBRiaGw`0qeeZyI@ zC!Cx@g}H1-mflwmqrz#~wp5@4C%~3DL(4{y9J}9e4j`%{`3$xlIDn`vZ=1;2DLrrk zVNUeEq8|CiwhiaCVK{@x*b)Qpb#1l#6k4W6<+=v_Y?++EK!us1%s|=dL)hDH8|yi; zZPm7I+e)d_+WMG_nVFdt*jpNsV5_hd;2qvt?9dMH7&GH!8q`}Y*{^Nes%_V{m2xh% zb(m9=q{YnOg2iCVUChjD{etX;7K67u@|c&mJT{p@G`Ww_d#fc=z_#spo88a*B@Ju4 zomtPeZLged+qT*LX=mGB|Jk<9u=(C+0<`G=_ezrNoRe8?uaWm=0iwd!?m?^63bY9A zK-8k^O`D1Xvd74WY<^*jY6D|}43waT)*4>;ipCaRdBrZ|4HXQkpap}zv~vqha}6&^ zT3ZO335O0nbZEj78B<$0qzA?t3X5r|=u0nb8u*&tfGkZaF9i)K!KNKd_|l|uMMWD9 zZm5EPDk?lsuBlAQ;90{T#y-vlWN9zqvI7bnTz3gU557=H&(n0MOoFomL2rVlmT*Ob zips5RTh*4e_kH&L{^K6g0U;S3XzWf!^gvDSuAjWKDc82G+N#E!`{3@bHBul4VjwDa zhXhCi>hAhoubjQtlw(`lu|4N{zVH8I+pba?wcTd|PTGGCNe1!Pv2EK)WwSHh=S)BX zVc-Az{@?fizW?|AzwiHj|L^;M-~apm-}nE%|M&g>b217L%}}c43Mnl*w!SFQWcx-c zCd2R|0*b&Lz~?M}HE6%;Sj&qJbh~NpZwUB(gGLiXZoIhAye<2Bb?s`+BgO`y2qRJm z3{rt00)#+Bh%{CSL1rlKT$YE_?H+SzZ|Xp2aZ`Z%h6w?N_O)w#>2cq^Wi7Rvd(lP# zk)i-V?xMkKiUhzxfdRzb@VtZM?w-pQ0Z(pt*Z^MZF81lIePLkRaT6ILiUdArU=0+F z*LWS35Jd1AC^9D$dcf5Q2X;Bc{`8Y3hB4_Av%-M3JGP0vdx72ISNP z2#TD>2ty*ES$S+6G`+Nz5o^XN;f93waQ~?#HmDx!AhHl4kW&yy642IIlQ6Q?sR&db zY1^dHWmMXR?cjAofdK9LUK*|~ime8Q0s&ylI0RyVvMC$9)YwVN!Y~-30`_R5Xx0ri zsOzQd4FfIX=-Y& zyKTJdP0&I*iN#`#B(aoriX|Xm-V~5ng8_r3tc@iNfoh}JLm8%+uf|mgwQzu86|6#G z=M4p^m`B(sAdNNF8USm`+G1vKwP5@)v0lw?$7cZyR)fJ9V7}mtC=dZM2wC8g425bm zhl)fCCnI4gDOhXV92TrCOPv+9udn3Ccs*nLX$bu(Mw%@ci#cPg1u1L}ga-@sQf~*~ zTIWgs-z877V?OU?XAL}4`x)He)U=q`#^Z=+=}mkSNvfCRwZRZ5o0j9S1C0bBpt-CPIkjuv;JzX4+B01*)i44ladddW2bGM00_gM&jL&FTuK4C#zP zAPNMX=IuUv&hGYJ0V;=8!24@m7Vgj3H7IVC8e6s$hMAQg}J> zQCtcF=3&O#V;Qjb+UGmg?ibhV;5gjsr?1Zj5n(t(!B}IB-UHb;#&6fUS=vK6B27ht zKv5Z(b5_dakhb;fM~>^cb8UZh>*o=YWvorXg0Y?S*RDFV#BKs!?=3c+HE`UcSI??I zsD{YC3pu&|U$id$-OU@2238>i-e*<{_#U?fo`r9O&XFODMO&jqK_YNJw(SgEI1E}fZi#0{CHG#KbOGaCd5Cl)rt)b#^Sg_Wr@@ADG_=SkqE}<*7 z6j79!H06L0sDtSJpvT!9u?_WLM01U}!bKa^B^u>Yeh|K38bcA=YhyzdlRcbxX<^Wem<-$G9G;XGcOC-n}%1BYI=~zDZkcOSu#Wu-FI*&0`6U(`tHGsacW1qyXk1 z+{>!>M^;~>y^`%D2`L87Hy0x4wMv|JDQn{FMdm?S=64tCIl`~3eb0-4u`roz8l4=c zt-^Yo*a4Wu3W$0*Rt6ZYf{p> z0*!?!KC88LH3(Qa#}vY#AM8)^=5h^6jj_;ap%iG}J_g$7c;S^??F#kt$O| z#m^g$JTm%81O%x~(|ea99T1;2P@3QEQWTPE4SvHJn3V&3mbeyYGw>2ZzJTo?(V(g9TPc(aUm}F> z@X4D~1EhR@Dbf%PvaAqmrR-XHzyq%Q;Qo$J_v$+)^&aQIP>B*Nk) z&MLPEDv2<>Fu`#dIw+ibUU=D-x|-a?e%#ri%$I|i+3WsyUwF**6wiJlZq3Q1+4b8! zwFMC~0j-?=AZI6-QReec1Tj3pO$~dUC3*yd81_bQ9bn0j8(`sG47Hn>xZR}%bkzqj zrBnPaSKxNYmzva1{rF*zAxflvuXfM;@DD9U!bO)*x2f+-@ad0r%H!&81+TdR#+F* zIv9#6-P!>ZVJwIfBhDc}ArK6Skq2a-9Jl=WrA_a0D?(B27V6Si_`XOx1OH zQH0a}K?CrF4U0Sr5Hu)QCwAba_4RaR@Xt?ZWJM!_PGPD++X`9*FzmH6Y@q-mYtw=v z2`xi*lqr^a*#F@ad%pR_MJ5+;KFmZ;rzR*^Fm4Q9c=c|ljqUCuV3013sYH$>k7$PQcddl3i;FCzf>8M~;5=!1{|US_>pK;q8`1Hegc=G&m8jX?A!bE*Rtaz0oVJuGf#UfZ7L;zT{5eq3w5Xj zZ-~Q8kP>>6Q|xN6SlqM=IXo&a?S5J zK9uTWq$m5&7e^0qx(im?=OK4wreIca;#LU$Ag8iA+0L^lxy!fPvh0`Q-G8aZzy8dX zLqH6B#Sp=OVPYy*~VIj4w+kAkUM~D;}v*1=yvxOFuj?VvgyX6C-uMIx2t%(y-mW0p2-Bd3Kgdt)(?MD=Ey7E6Y5tDLx-dM93o=rm2R5_r$OUH%pz}B*XRE2snwr5zT)eLoj>-) z#pj>*^pOytG|5#kbqM>B=vw`q4YYrpRM=d~*Fk%0gD`h1e8FsZA` zi&TMV-B2jhM>~mfXl*?yJ{l(rxD}-@vc<30;>HFPhZw{V3FWi%e~-WB^QYAbJcqxK zz{wx;{QR1){PKQlC-oO&5bIVfjP_LRiPAz=BQwEZ#j)%7uaY;$MqHmqzwvSj#mqWu z%e#5g%+xe4ciVy9gB0gZb2fX}tIwyi4C3ZUbYg}Uqpb~I1jdblkyRNrG?>-Ja3^4y z0A1JdpJT z+nC6fXZ2dj6rxQzUDJ~pcH-GvmGweNfs%TaQe=tjT8I$^OdtIFPmBZHeaV9OUk^ zsqBf<^Lu(U<3Vf#1dJ;H{ z-}B-puG9F&U+Z*{NT>uqCZHP5*725>rLNcR?UT)C*PGArf7$3+9u@u2no(u4)Lr6SK{10FL=sJ&I_%#Qq$rqfP z(?$Ao?mc)$!0(ai4M`D9;FXP(6y@8~^|thqVE<@>!{%@e@7WN21gi)eghk8+7hoEL%Fv22^c_BS`p zwmkk@pKYYoEt0qTBKI!N+IwXj5V5U;Q(8{BjoCk7v$Q&JXD=DOfO&(tojaw*nF2Sp zWIy^=+6IppJ&gvpUXN~6>wJ;3 zJz#UzbGnHfd2kh=R49u2uqL3yP##jrv-9*1!!n-#Jy}q1;HqC!uBb?&%A?bte94nL zJaXbciY#EvU#FW~hY<%Mo>Me^IXv7py}!kbUir5Ux6|g}uxwmnfhvD%^S5FfzzY#r ztrph(0fbTOE-y;*th?bKgX{K{iYcSqt))M})J5X%qx;|el4rNLcChA^gk;dzhux%a zE_95k&qvfLrqrXO47i~>ovKcCt|j?sn#fUATw9fzhA1oy9vF|$oqkvo1{plGXvnkc z`J>3x`~!H-zrib~q`&*0J+b!-U;5}iJG(QZc|3|zb(4O5J-g~%Esxx13i-{cthmFT z^ys;PXN`!+*ai(6)Vfwea6uqoE!I9?%)|=$UVHoxf^H)>JF0GJmIAZKKL6N9zvSs% zc6J80QkC8ed~y18-_u2Uo)fC2yE;bSQ{Irx|1G2VX)CYe;C7y9Byk4P8At$|y#gj(n#X9a`@t)EfM z?Dig8Dc`vB`$a5!2M^!gWlcKa+vC@6asH2_LnV2bM$2|GxD zck#Oa27+kad||e_It?#4l?qm_75rp_k@;osG9Fo4z9-N{!sEkLVA;o)sV%^EE54W5 z_1Vq;x4&`uN7q+=|G2DEt392XzwWwCN-sCEh_QUE+qTFTPa-ut&w z-^TYor4dj@z#IWb1?<^9w&M@gax^NTSd=(PN=gcf#gZ>+q20~*MCAF@pMxb89gIHX zwjmB(!75?6)6Kk|##!lXwPHF*q9nvsf-vpk8<^}OeY0-|+@H&N6J{dJ`gv|g`_iij zrFLGwkuJb2V3PxA{o6194TXO}009kL>TpXAP3Al#(N1W%}^i^RM-Ld1;jYg(%Mg%s}R`p*x?-p2Pn zsTHt+-0cO|q;*k2z)hs2%iiNz{N)!ihO@mP^8AWlTk4M7zFh)KfSOF@wP7}4P@2f_ zI7QJhqB8b`{Eu{zl7bS!yRC1|Ck;Uiyi)`vx&Qhj?FH0#Bd{m0q9G+-3K$242BkuP z3oWJY^tL3=@3p(5>{>NX2)7rPbJaR(Md94=_JCf2q4|V@W8m z0h*;{l_airrllV(VEnpcJSn`l{qH(=jA>I*yGb22i;+>Y8P>ziN-|z?Xc0p*cyYY& z4uAU9^`oQz?3olAo=nv^i9obc3rhXj9Z8GQhr zjDW&U>LIHG9(I#<43{kzT*N}+taSG~J`K`~68GLcKbi;c<(J>gAF6SE$bA0IN00vA z%xu>Xhuggq7kPet+ullw_N9wKLR`vx`5^HyX|w-q0p@%gvBPtenZ8D=*C}@vAn+@*T2l$f*Zl7%KUbAn17&{PV_g`M`-*full>bDY-(yV@svfR# zHFfSy!)ClAu0k3m_h1-GIrs1J zak5dkn<@FOmuiBei@cMOx;?<(^l@&qq9PDO0j($W@`b3SO|PdG4nmAlK5~F}&SC$j zU-^EF_(mo@i3e#`FpSYtIA8<|M)oUNDJnSZ+-oxGI zC3AQgROSSwpbpwrFSqNIly}#&>rKh3Tz>!y7w1LD!!C{8ZfFx#JoS|}C??DpsI&@3 z19&K24P7N{#NPz@sIxwX>FFl2*GEz%+97sg_1$uPvoUEY870I>ealX7lDU&qcxfKA zaA9ol22llqnt)LW0b7fI?EgP@k^VC=1YV_Y+A637J=Gu;*kTiy^PVh=8r}`pw-?DA zQ%nZnj~$3LmpgINF8PbcYSkbB!`1{a8Y%<{pvJj}bdwJQm)ci6`tqA|ADg)?l)YXW zX+vV_HE+wi*4ZqR;Es&Kv6SeF%4x5oa(?Lyh@w|qH`dk;G_4Knv{2H&4;Tm;Agw^V(uycR=owI+ ze|WQ-l%}kfM5?|R-r;K}Jooa#&ly&4C38dHsjuxe`~U4-3x1Z{U~gxh(@C61FY}1Z zqk`uMW9zYz*S&#JUliV579q-KU zpOs1aUn~|9$ZhoZSG$61P8v5q_LCUJ#E4Pw^qrG-Uec%W#$X*nH#tcf8)INLkI?{u zO|*`p4r-lSvW$3F{l$c-72d&Pi&i@YF#?g=zFvpxF&*Lj*p4Oo35^|M5es4`L*~`7 zmzI(AO`s(S^_k!Q)GpFazu{9V8p8WswTV1U}^3#h4T+!G+t=MQ6M?MkW;^QduRj{ywq0!7kF* zegEb4hgQQ-&p2mLwG|O&Bbs^8pfVc7J5es+D513;8~3jM(wooLe*VFM@sCX#`+dXr z_p?6#*treYy6w{@-s47*#n65_YemP=zGm#JA#!m<^b(pmNl>Z&3qx;d1B1|yGkRlV zcH}od`0|C{U8G(0xBqt1Xs*6))Wq{!5EN%U(c|$W-s7t&w*BtMrk(RX|KND{7alqL z;>n%;U5^eM2Pw{3@iFhY;`n!bIEf?0Su{q8v*m0Ax23AEz`2xtrIKpU??W4&UiL44 zvWxW8>d$ALdHsLsh%t`MgWA0mVWtt81Z}HUPUHEYZ5u=Jo;*v+4pZqAX*|~5btcyF zs`qT!)u%miGr02NZ+V@dRBJDS6a2$4oY7WoRe5bS?lRq?i~PgKU0<(n<~I_(cV1*O zxB1OkC3Bkls|nFZP^_9!6s9P#kAp>HoX<-6z$2|P`~CNih@&xnaTml8KmtHOKzoXK znn=a2?AI;ld)=geo~B<7KFWYFp9{n7>&;w@+>I+U81);9{(y^-F~Nn#IuVg3%IWfj zWzuz586#KX@qO%}Sb{_iYGFhS)Br{?+TLmULT8R&{cmxto5b}^Kbp!cFi8?oFO%pq zK}bo8Ta3kUl?4@#*1npj5TIJUCx*$8u{YCS+KH0TNlQ6OF@Oh_^Z63+Xa*=_@XRX4 z7?4qm`e02$yuPkyPySs#>ni>DS1(R?YW?$Eq$Ijo6&V-}@=?#yGH}5MLL}asJ0$qf zKLli+%Dk{+lXOG(P0WY@A9!IF6o}sXIRa3(U<3wA&^i~BtvLLPyGmUC&=Xe#+H~=F zgppvV-BmM6o&3)?b$bB5Jd27mLH>;hM(0z1%UYqyRNlxc?g);5eNZMof*+62`5Xdn z5ZLRmA`ldpI_2(nq5jGA3!mJVBVOMA%wy^|x@)G49k=?lxEc=2tCO;X(w8P&a`fuG z)7Ox|zlm-?NP$(iV>i17FUHY)#z!l&^fWL493_H<1N>3{Uf6 zmkYSr4PlzbD$q=VH+aXqmsh4WA2w-P=6~PPOnsOTP{mTCzz8yd!9h?JYGZIlLMh2A z(eijkw}1OnO6>Fw|NMDcbLCR+Y#~zP7b=uvSmtsdXK#zRDUmp06(VSrC9I_4BWCx)&Hh=OCilJDOQM1NjID_?{X)0kYx_o2#Hl@7jrtL&V8ZBrY7aXUS8H3crtdbP7 z1kfS_vIMOO%EDuBK?I}19u&lwAZJ)gK1=PS!n6E*2_TMs`g}*!9d;E35~(@%!E>DQ zKlSaLrtFCpm7J7qGY%1#pX1DqCX+H(i-zZKi>)b5K~TGz+0e^dJQxBdf+HAOH5(U2 zUy)qywubob^CaZnGe0-$eI9(ekOG=mb>>ZP`Km5(wH;?v+Fu9i1zKuu5FSPC=OwVsIG6xs{u?a^a|RHvpWnbPyWA zh+i|J34T{HTi5H}|MP;lJN)=>`KzrkOv@xh3e)4y{NM7kw0iPNT zi%argUO=^Q)WJrg)fzp*7(BfM)dc=M^|PP;%J=_oOW+RO^JnJO%I+7QTCs6n>KL+V zT$c(DG@=HifU7=FB#=^!BcA;A52NLozfg9VNna`&!X-IzHhOKuxg8mCuQ{yi>m(66 zySBw>n|K^S1hL{Cie3!D?t`#dz(Zp8YhHh&{<8Zn-n?C^+`ztEmKk4DBU)fnPzykd z3jV-!)aUYPUVb;VJpT{MP9s}}LZ-nq5%=22M`S{zF$Z42Oan$tA|xxwL=f;JYQ2i& z) zjwCylpGcPcZ(f@(ht}b3|K-spz|M2~|L3JHctA9KC=KtvckZVs&iVcaC$@i|gJbJ|&zI z=MO2lvrZ)iydJ4PgIasWZyfHqHr2dE0vi>+L#j@yYN)uc%stfC?((kPd#~*ny6HyK zUg^7Od1jPiVFaOwS2-yVrKijA2ZVCfR-O;Rn_hgbD}7|&SRT6(+P2lZb?x3YDS88& zSYG)M`F%Go#^tq1RcND5g%pPYk;Uh3BP!&c^cVq4fT3F2UV%5|-03@x*oTnG?aZf8#aZ!yL9Iyl(zgO8u=ea3LH{72~0Ejf8&<(EO zd@lvO9ijHYwaArOXKu`B))>)wC>n{-kSg&3=0hU)*4VqPYV7?-(UjI)?rO|p;+CQ* zrjn^DT24)ez`cq)(WyP9(E_gK+7NTneXi{?aU0LbUO7}-y zTv-b~rSpYJKoFqZ&l*#>#cplesz>fL%iIW}2Tpk%Y2qeKQ7Vb{+T-X)_HB67*76cJ zOmG#)6e*D2zNy@I{lGVmHAUhEN29+mQ-Rda2~5MHDG?Y{FcUg0;;Cq~x_|`pgJKIg zRXlDw@gio8*8qVHEgm@VZ_RNfJ@a9yA+<)y3QaNzQn8exr7Eg%KcwY0dez+=1MZc} z8S~pxm+A*b6w33)7iX51@yrbr@-EbX_dTrl?&`DR(y3IE+|-6b+Ln6eaYcJ1+o~ovLda61Nuv#*6&Gm`HQ)ZRYx zSxQxkLJ=X_I5vY?2R@@}9-GpeYBZVkTyUwYB1$wYGYS<~JvRO!R#Rrqp_1oGm4|6W zWREM3wmzc$^GsF}g~1vtG|Ld-&qYWX*34*f4U7p9y|Mx&?Obo!)i2*8>vI4eH4xln z`8K3Q)}nC%P$0PyWnE_a3Rs-uS8G-&%7KdPQ$IdP0FrwOq|}4CDb}UnL5BwIu0sT5 z0C!*VPSsdtyy&C~XlzUZ*1G94sw;aP*_3F=`GWIh(eSXj#YqU13`#Ik6-_buEUBDW zE%~{9_+{T%v;Rm;k;&T?{L=~j{2SZQsnYf%S)i=dK~ly6%DdB(A8nud!3yk;PJ55 zRf9NQ^!jv%_3;^g@Y3k_@}1ApqkZ>1%(H&;2mI6z|5bSxr%wrK>!to?HFkqDdIFF3 zt+>VG|Lj5K?*a)GA`McN6tih;>hy1)m`BkvD89kb(h5WpUU2>tr~k>Y{!8-i9A^#= z$&}%anl=bWYCL>KXRRo~fO2n1`u`DPN^ilRBO+e}tY`EB{s8OP4BKELPAtRfd=}vz zWb?s!HsJS>`%oNwd5_gsL6a3#Nh*3BF%okeLq6L-`JuCp>+21ABLfIp>>-Hz)cy&UU)I^zdQY2l+m`$>HRQW*V{rtRpB*P znnAnnpi}|lfXo>1m=w)_+k!*XPB7&e*4nyNyc z*`_Dmm(jQDHjf^1LnHt`OKa2=pr(ZqL>j;-_LX`+YHQgnKq;L37H|~MZy>>o1QnT3 zd5z7~fVPQujMq3 zfYutX836P&-vGQi1xb%`)XMh;2m@#fp{@JK%+b1g$T~0p1d6*cHzTD|L8+xYwv1@6 z$+~K-_@xyzA7nqd+kN%Iu|7CC<;B5 zbKf=}9LySue4?D=Vb?2AMcUd zckTsu{qNrAWLW_j@YtHnc?7k93aYx%4EYkknj&FbE0*hDFpu+{m*Psoah z08G}^q5y*7QI7PP@2xVXShX z^lFRV^%$uKOly=31C46Sc#-x|_|4gM#Ji}O*Gs$9wJpW$2gDjuY{&w3{G72B0)x_V z3wVH9kK!0*f(UkMaM&SWXI^X8OnHK_&8tPiNR6s(X@JZSyl2t+I=~_nO%d&ZWNN73 zyOf6h;9-KRrp7sD@O;b55l$k{Xk%2C2GaFU_3?cVog`~ntU85sk z0oUGTRA~sfpww&5BtwN8sA)6GOQ$MA^L%MuB#=5ACeWPc6K8j3ck=Q)cf9+JU%Z7S=7H?&;AALJ?d$)n*v(xstNwOO}nhuHfPXbp?0`n406IT?tb#3U*#C%f8f8FTt-5 z0e7Getp{Ib;Mg9tP{2O|g%n;hse}neu|gufVV=EeC{z61^A4e4u^y<9{oa9FJYtS!Ln)?t4L1XxistTDUEM3HY`zEIx&fz=I_s%=p6@V|1u*fK{uAZ<7B~=aBa;N!mcRK4vV$LMegXiXs`{(}; zZU1Yq<6l=bt$+^2>l5N2;MORi?~v^X!A)v7!3o@VNZz0N%%>pIXbP1(`lRF|VD2_J z7!qKBK4h&qtZxK-gSOrb(0Hxq_ru4xSNme`(3E&bbn$myDS0rwDpDE4b?Q(1Mi#y( zBOb+&B7r@`vKK!FsV=0L2|u+5FBk9=CQClSC!^RuXQju`CjqOIj8eD7g9N-L?#w9I zYqAM{JORHxhk)OogU`Vz`yp=*RB~Z`RA7B8F`w<6QV+sk128`z_dg$iSCg;FbXK|l zmw+d4_GT@q=vER#l28c+9nO;iK8+M00!lRLrC%NbzFrs2 zTf%BjD104022h>Ant7iJhz10ROG>HrSd3MaVgS_L)Y=hRIRnGB1lY5by{GHtcs0=| zFXwivWdgnc7ab9zWRb9oMyT7bj@n!*Uh)QG4}?#m^O)jl%LJAi#oY|haVJBn1i$M~KEgnUN;4rXjKbz5m>|<2Mk?W(7N3Q+hE1>O< z$<@6!)L4nD1&@{F9Oohh-J{&sW=4Xz?4cGxbB;Cp#Yye%OW3Le_JxQ0Zm&ZfF=(fp z%Lt|vMtnH#zq42#lvy&LL>5I=)B=Hz;MVe(BR8&zMrJnE8Olt^(xp2WHSeH?TsAYV zS%q4!(a5D8WRZYdIX*t8WTXk6=YQp3O^vu#TwZEU`Kg2YcIO334s^*}U@`~0*0Ag+ zkCvn?2g18sO9Xt+abeoZ(iqiY!M3S-*|^m2LW-tj`@y~W@!jS}8ro|j0}yTeVgk(n z{fh)8?BM3E4mqXAoOn%zsbQPlk8Ywoq$wG@x_U(^?!!t8lhW!{_?vaA7%`=fOq|k( z=k?x$-F$!Xa%!w1wN}}J0wfwEQLjXR>GLWyT5CC38}wT;oBoPiqC()cml2jDtv!9z zzpd2d1d@cSo*7f#>#rXh0kpECvIi1DC>MKB&VIT5CbR4&%O0GIvcgDFVush2^q|W{ zVI#s&K}6>yTF#aeX1z>8;kcrc#58iu%LYP+1p%+#3!A$8VwPXUCFv^NS}DIUR}-f78yQ@6KlJ zPFb}ry<)F(0V677Ev3ITOtcww?)W*aun7_+HIPt9&)Qb6oM0zkRy*Jr+9`UME~!uOh65XsG{UeRjBT0?rDk_AZOc zcNeeyF$u4!!rX<-Lu?a!1K|?|&udj(=0m?i=HxSf}c2=3n`D|2Nz2_z!a4`(Mbt z)8ArwuYZ;0PXCZ)>wmTV?;e&N+&b9g&hPVOOB4pY-2dNKXO9K!1?nAB-aEH){`_b9 zDWV#JrpThm!2HE9aJGbCgl5AfevvTYua#9GB#0u>!JS6}HpLW2rZzPZwMRuavMpHG ztr-M4G;n0n&xa1Y{S`d7|M&gB@Be-O@B4q>|NH*m_y4~C_x-=`|9$`O`~T-l4b}3U AGXMYp literal 0 HcmV?d00001 diff --git a/sample/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/sample/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp index 9126ae37cbc3587421d6889eadd1d91fbf1994d4..d060b347f3c1e6f0ef64b1ea9e437aa8afe04b50 100644 GIT binary patch literal 10696 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

UmY2RIYtNPVDpE$%vda+HD#3m z&VuXJ{BK&Qe+rBa7eq}Q(bq|tn(RrJAk|ztj2(i{d>nmQnM?;HF2k&9sA6up5tmjl z7lySlzMbifH17-m-Lwa_F&e7nOH?ESi3#ckR3tsM+jsck3`oG!uMS}|eAwVXv>}qxwq?QY%QJ0}r@^;fhuUA9W z*BVl>TGo&N004@xSiwDUXUvp51sVmqO3m)=B55aPwf@0=e}cN+$-BdKxY`YrT_4)0 z_d10#i44Q*rFr8MC>*)v$EJvz``(pb{e&*6k+b zsMz%($|1+8hn8c2?P(l@;Rb&CsZeYoCI3?2!LqjbwPXW3z4G$Qfj=cT5Yb%vY0(AX oeb?AaKtwrnc|$|zzw9vfvn^aJJ!zd)XFXqqy0000001=f@-~a#s diff --git a/sample/src/main/res/values-night/themes.xml b/sample/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..6cf451d --- /dev/null +++ b/sample/src/main/res/values-night/themes.xml @@ -0,0 +1,23 @@ + + + + + + + + + + \ No newline at end of file diff --git a/sample/src/main/res/values/ic_launcher_background.xml b/sample/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..c5d5899 --- /dev/null +++ b/sample/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/sample/src/main/res/values/themes.xml b/sample/src/main/res/values/themes.xml index 5d7ac4b..bf81393 100644 --- a/sample/src/main/res/values/themes.xml +++ b/sample/src/main/res/values/themes.xml @@ -1,5 +1,23 @@ - - + - + + + + \ No newline at end of file From e983f85d95009f9085cd66c11f199707d996682a Mon Sep 17 00:00:00 2001 From: naresh chocha Date: Fri, 27 Jun 2025 16:03:12 +0530 Subject: [PATCH 3/5] Refactor: Code cleanup and add tests This commit includes the following changes: - Adds `.editorconfig` to enforce consistent coding styles. - Formats code according to Ktlint rules. - Adds unit tests for `Formz`, `FormzInput`, and `FormzInterface`. - Renames `validation_error.kt` to `ValidationError.kt`. - Removes unused constants from `RegularExpressions`. - Adds Detekt for static code analysis. - Configures Spotless for code formatting. --- .editorconfig | 4 + build.gradle.kts | 53 ++ config/detekt/detekt.yml | 787 ++++++++++++++++++ formz/build.gradle.kts | 14 +- .../main/java/com/nareshchocha/formz/Formz.kt | 35 +- .../com/nareshchocha/formz/FormzInputTest.kt | 276 ++++++ .../nareshchocha/formz/FormzInterfaceTest.kt | 107 +++ .../java/com/nareshchocha/formz/FormzTest.kt | 125 +++ gradle/libs.versions.toml | 4 + sample/build.gradle.kts | 18 +- .../sample/ExampleInstrumentedTest.kt | 8 +- .../com/nareshchocha/sample/MainActivity.kt | 73 +- .../baseComponents/AppOutlinedTextField.kt | 45 +- .../com/nareshchocha/sample/ui/theme/Color.kt | 2 +- .../com/nareshchocha/sample/ui/theme/Theme.kt | 44 +- .../com/nareshchocha/sample/ui/theme/Type.kt | 22 +- .../sample/velidate/AnyNonEmptyInput.kt | 12 +- .../sample/velidate/BooleanInput.kt | 12 +- .../sample/velidate/NonEmptyInput.kt | 12 +- .../sample/velidate/RegexInput.kt | 23 +- ...validation_error.kt => ValidationError.kt} | 8 +- .../nareshchocha/sample/ExampleUnitTest.kt | 5 +- 22 files changed, 1531 insertions(+), 158 deletions(-) create mode 100644 .editorconfig create mode 100644 config/detekt/detekt.yml create mode 100644 formz/src/test/java/com/nareshchocha/formz/FormzInputTest.kt create mode 100644 formz/src/test/java/com/nareshchocha/formz/FormzInterfaceTest.kt create mode 100644 formz/src/test/java/com/nareshchocha/formz/FormzTest.kt rename sample/src/main/java/com/nareshchocha/sample/velidate/{validation_error.kt => ValidationError.kt} (82%) diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..0a42ba7 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +[*.{kt,kts}] +ij_kotlin_allow_trailing_comma = false +ij_kotlin_allow_trailing_comma_on_call_site = false +ktlint_function_naming_ignore_when_annotated_with = Composable, Test, Preview \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 9963956..e7c69b4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,60 @@ +import com.diffplug.gradle.spotless.SpotlessExtension +import com.diffplug.gradle.spotless.SpotlessPlugin +import io.gitlab.arturbosch.detekt.DetektPlugin +import io.gitlab.arturbosch.detekt.extensions.DetektExtension +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.withType +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.android.library) apply false alias(libs.plugins.jetbrains.kotlin.android) apply false alias(libs.plugins.compose.compiler) apply false + alias(libs.plugins.arturbosch.detekt) apply false + alias(libs.plugins.spotless) apply false +} + +val detektVersion = libs.versions.detekt.get() +subprojects { + // formatting code for all subprojects + apply() + configure { + kotlin { + target("src/**/*.kt") + targetExclude("build/**/*.kt") + ktlint() + endWithNewline() + } + kotlinGradle { + target("*.kts") + ktlint() + } + } + // code analysis for all subprojects + apply() + configure { + toolVersion = detektVersion + config.from("$rootDir/config/detekt/detekt.yml") + buildUponDefaultConfig = true + } + tasks.withType().configureEach { + reports { + xml.required.set(false) + html.required.set(true) + txt.required.set(false) + } + } + + afterEvaluate { + tasks.withType { + finalizedBy("spotlessApply") + } + + tasks.withType { + finalizedBy("detekt") + } + + } } \ No newline at end of file diff --git a/config/detekt/detekt.yml b/config/detekt/detekt.yml new file mode 100644 index 0000000..901e007 --- /dev/null +++ b/config/detekt/detekt.yml @@ -0,0 +1,787 @@ +build: + maxIssues: 0 + excludeCorrectable: false + weights: + # complexity: 2 + # LongParameterList: 1 + # style: 1 + # comments: 1 + +config: + validation: true + warningsAsErrors: false + checkExhaustiveness: false + # when writing own rules with new properties, exclude the property path e.g.: 'my_rule_set,.*>.*>[my_property]' + excludes: '' + +processors: + active: true + exclude: + - 'DetektProgressListener' + # - 'KtFileCountProcessor' + # - 'PackageCountProcessor' + # - 'ClassCountProcessor' + # - 'FunctionCountProcessor' + # - 'PropertyCountProcessor' + # - 'ProjectComplexityProcessor' + # - 'ProjectCognitiveComplexityProcessor' + # - 'ProjectLLOCProcessor' + # - 'ProjectCLOCProcessor' + # - 'ProjectLOCProcessor' + # - 'ProjectSLOCProcessor' + # - 'LicenseHeaderLoaderExtension' + +console-reports: + active: true + exclude: + - 'ProjectStatisticsReport' + - 'ComplexityReport' + - 'NotificationReport' + - 'FindingsReport' + - 'FileBasedFindingsReport' + # - 'LiteFindingsReport' + +output-reports: + active: true + exclude: + # - 'TxtOutputReport' + # - 'XmlOutputReport' + # - 'HtmlOutputReport' + # - 'MdOutputReport' + # - 'SarifOutputReport' + +comments: + active: true + AbsentOrWrongFileLicense: + active: false + licenseTemplateFile: 'license.template' + licenseTemplateIsRegex: false + CommentOverPrivateFunction: + active: false + CommentOverPrivateProperty: + active: false + DeprecatedBlockTag: + active: false + EndOfSentenceFormat: + active: false + endOfSentenceFormat: '([.?!][ \t\n\r\f<])|([.?!:]$)' + KDocReferencesNonPublicProperty: + active: false + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**' ] + OutdatedDocumentation: + active: false + matchTypeParameters: true + matchDeclarationsOrder: true + allowParamOnConstructorProperties: false + UndocumentedPublicClass: + active: false + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**' ] + searchInNestedClass: true + searchInInnerClass: true + searchInInnerObject: true + searchInInnerInterface: true + searchInProtectedClass: false + UndocumentedPublicFunction: + active: false + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**' ] + searchProtectedFunction: false + UndocumentedPublicProperty: + active: false + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**' ] + searchProtectedProperty: false + +complexity: + active: true + CognitiveComplexMethod: + active: false + threshold: 15 + ComplexCondition: + active: true + threshold: 4 + ComplexInterface: + active: false + threshold: 10 + includeStaticDeclarations: false + includePrivateDeclarations: false + ignoreOverloaded: false + CyclomaticComplexMethod: + active: true + threshold: 15 + ignoreSingleWhenExpression: false + ignoreSimpleWhenEntries: false + ignoreNestingFunctions: false + nestingFunctions: + - 'also' + - 'apply' + - 'forEach' + - 'isNotNull' + - 'ifNull' + - 'let' + - 'run' + - 'use' + - 'with' + LabeledExpression: + active: false + ignoredLabels: [ ] + LargeClass: + active: true + threshold: 600 + LongMethod: + active: true + threshold: 60 + LongParameterList: + active: true + functionThreshold: 6 + constructorThreshold: 7 + ignoreDefaultParameters: true + ignoreDataClasses: true + ignoreAnnotatedParameter: [] + MethodOverloading: + active: false + threshold: 6 + NamedArguments: + active: false + threshold: 3 + ignoreArgumentsMatchingNames: false + NestedBlockDepth: + active: true + threshold: 4 + NestedScopeFunctions: + active: false + threshold: 1 + functions: + - 'kotlin.apply' + - 'kotlin.run' + - 'kotlin.with' + - 'kotlin.let' + - 'kotlin.also' + ReplaceSafeCallChainWithRun: + active: false + StringLiteralDuplication: + active: false + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**' ] + threshold: 3 + ignoreAnnotation: true + excludeStringsWithLessThan5Characters: true + ignoreStringsRegex: '$^' + TooManyFunctions: + active: true + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**' ] + thresholdInFiles: 11 + thresholdInClasses: 11 + thresholdInInterfaces: 11 + thresholdInObjects: 11 + thresholdInEnums: 11 + ignoreDeprecated: false + ignorePrivate: false + ignoreOverridden: false + ignoreAnnotatedFunctions: [ 'Preview' ] + +coroutines: + active: true + GlobalCoroutineUsage: + active: false + InjectDispatcher: + active: true + dispatcherNames: + - 'IO' + - 'Default' + - 'Unconfined' + RedundantSuspendModifier: + active: true + SleepInsteadOfDelay: + active: true + SuspendFunSwallowedCancellation: + active: false + SuspendFunWithCoroutineScopeReceiver: + active: false + SuspendFunWithFlowReturnType: + active: true + +empty-blocks: + active: true + EmptyCatchBlock: + active: true + allowedExceptionNameRegex: '_|(ignore|expected).*' + EmptyClassBlock: + active: true + EmptyDefaultConstructor: + active: true + EmptyDoWhileBlock: + active: true + EmptyElseBlock: + active: true + EmptyFinallyBlock: + active: true + EmptyForBlock: + active: true + EmptyFunctionBlock: + active: true + ignoreOverridden: false + EmptyIfBlock: + active: true + EmptyInitBlock: + active: true + EmptyKtFile: + active: true + EmptySecondaryConstructor: + active: true + EmptyTryBlock: + active: true + EmptyWhenBlock: + active: true + EmptyWhileBlock: + active: true + +exceptions: + active: true + ExceptionRaisedInUnexpectedLocation: + active: true + methodNames: + - 'equals' + - 'finalize' + - 'hashCode' + - 'toString' + InstanceOfCheckForException: + active: true + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**' ] + NotImplementedDeclaration: + active: false + ObjectExtendsThrowable: + active: false + PrintStackTrace: + active: true + RethrowCaughtException: + active: true + ReturnFromFinally: + active: true + ignoreLabeled: false + SwallowedException: + active: true + ignoredExceptionTypes: + - 'InterruptedException' + - 'MalformedURLException' + - 'NumberFormatException' + - 'ParseException' + allowedExceptionNameRegex: '_|(ignore|expected).*' + ThrowingExceptionFromFinally: + active: true + ThrowingExceptionInMain: + active: false + ThrowingExceptionsWithoutMessageOrCause: + active: true + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**' ] + exceptions: + - 'ArrayIndexOutOfBoundsException' + - 'Exception' + - 'IllegalArgumentException' + - 'IllegalMonitorStateException' + - 'IllegalStateException' + - 'IndexOutOfBoundsException' + - 'NullPointerException' + - 'RuntimeException' + - 'Throwable' + ThrowingNewInstanceOfSameException: + active: true + TooGenericExceptionCaught: + active: true + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**' ] + exceptionNames: + - 'ArrayIndexOutOfBoundsException' + - 'Error' + - 'Exception' + - 'IllegalMonitorStateException' + - 'IndexOutOfBoundsException' + - 'NullPointerException' + - 'RuntimeException' + - 'Throwable' + allowedExceptionNameRegex: '_|(ignore|expected).*' + TooGenericExceptionThrown: + active: true + exceptionNames: + - 'Error' + - 'Exception' + - 'RuntimeException' + - 'Throwable' + +naming: + active: true + BooleanPropertyNaming: + active: false + allowedPattern: '^(is|has|are)' + ClassNaming: + active: true + classPattern: '[A-Z][a-zA-Z0-9]*' + ConstructorParameterNaming: + active: true + parameterPattern: '[a-z][A-Za-z0-9]*' + privateParameterPattern: '[a-z][A-Za-z0-9]*' + excludeClassPattern: '$^' + EnumNaming: + active: true + enumEntryPattern: '[A-Z][_a-zA-Z0-9]*' + ForbiddenClassName: + active: false + forbiddenName: [ ] + FunctionMaxLength: + active: false + maximumFunctionNameLength: 30 + FunctionMinLength: + active: false + minimumFunctionNameLength: 3 + FunctionNaming: + active: true + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**' ] + functionPattern: '[a-z][a-zA-Z0-9]*' + ignoreAnnotated: [ 'Composable' ] + excludeClassPattern: '$^' + FunctionParameterNaming: + active: true + parameterPattern: '[a-z][A-Za-z0-9]*' + excludeClassPattern: '$^' + InvalidPackageDeclaration: + active: true + rootPackage: '' + requireRootInDeclaration: false + LambdaParameterNaming: + active: false + parameterPattern: '[a-z][A-Za-z0-9]*|_' + MatchingDeclarationName: + active: true + mustBeFirst: true + MemberNameEqualsClassName: + active: true + ignoreOverridden: true + NoNameShadowing: + active: true + NonBooleanPropertyPrefixedWithIs: + active: false + ObjectPropertyNaming: + active: true + constantPattern: '[A-Za-z][_A-Za-z0-9]*' + propertyPattern: '[A-Za-z][_A-Za-z0-9]*' + privatePropertyPattern: '(_)?[A-Za-z][_A-Za-z0-9]*' + PackageNaming: + active: true + packagePattern: '[a-z]+(\.[a-z][A-Za-z0-9]*)*' + TopLevelPropertyNaming: + active: true + constantPattern: '[A-Z][_A-Z0-9]*' + propertyPattern: '[A-Za-z][_A-Za-z0-9]*' + privatePropertyPattern: '_?[A-Za-z][_A-Za-z0-9]*' + VariableMaxLength: + active: false + maximumVariableNameLength: 64 + VariableMinLength: + active: false + minimumVariableNameLength: 1 + VariableNaming: + active: true + variablePattern: '[a-z][A-Za-z0-9]*' + privateVariablePattern: '(_)?[a-z][A-Za-z0-9]*' + excludeClassPattern: '$^' + +performance: + active: true + ArrayPrimitive: + active: true + CouldBeSequence: + active: false + threshold: 3 + ForEachOnRange: + active: true + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**' ] + SpreadOperator: + active: true + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**' ] + UnnecessaryPartOfBinaryExpression: + active: false + UnnecessaryTemporaryInstantiation: + active: true + +potential-bugs: + active: true + AvoidReferentialEquality: + active: true + forbiddenTypePatterns: + - 'kotlin.String' + CastNullableToNonNullableType: + active: false + CastToNullableType: + active: false + Deprecation: + active: false + DontDowncastCollectionTypes: + active: false + DoubleMutabilityForCollection: + active: true + mutableTypes: + - 'kotlin.collections.MutableList' + - 'kotlin.collections.MutableMap' + - 'kotlin.collections.MutableSet' + - 'java.util.ArrayList' + - 'java.util.LinkedHashSet' + - 'java.util.HashSet' + - 'java.util.LinkedHashMap' + - 'java.util.HashMap' + ElseCaseInsteadOfExhaustiveWhen: + active: false + ignoredSubjectTypes: [ ] + EqualsAlwaysReturnsTrueOrFalse: + active: true + EqualsWithHashCodeExist: + active: true + ExitOutsideMain: + active: false + ExplicitGarbageCollectionCall: + active: true + HasPlatformType: + active: true + IgnoredReturnValue: + active: true + restrictToConfig: true + returnValueAnnotations: + - 'CheckResult' + - '*.CheckResult' + - 'CheckReturnValue' + - '*.CheckReturnValue' + ignoreReturnValueAnnotations: + - 'CanIgnoreReturnValue' + - '*.CanIgnoreReturnValue' + returnValueTypes: + - 'kotlin.sequences.Sequence' + - 'kotlinx.coroutines.flow.*Flow' + - 'java.util.stream.*Stream' + ignoreFunctionCall: [ ] + ImplicitDefaultLocale: + active: true + ImplicitUnitReturnType: + active: false + allowExplicitReturnType: true + InvalidRange: + active: true + IteratorHasNextCallsNextMethod: + active: true + IteratorNotThrowingNoSuchElementException: + active: true + LateinitUsage: + active: false + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**' ] + ignoreOnClassesPattern: '' + MapGetWithNotNullAssertionOperator: + active: true + MissingPackageDeclaration: + active: false + excludes: [ '**/*.kts' ] + NullCheckOnMutableProperty: + active: false + NullableToStringCall: + active: false + PropertyUsedBeforeDeclaration: + active: false + UnconditionalJumpStatementInLoop: + active: false + UnnecessaryNotNullCheck: + active: false + UnnecessaryNotNullOperator: + active: true + UnnecessarySafeCall: + active: true + UnreachableCatchBlock: + active: true + UnreachableCode: + active: true + UnsafeCallOnNullableType: + active: true + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**' ] + UnsafeCast: + active: true + UnusedUnaryOperator: + active: true + UselessPostfixExpression: + active: true + WrongEqualsTypeParameter: + active: true + +style: + active: true + AlsoCouldBeApply: + active: false + BracesOnIfStatements: + active: false + singleLine: 'never' + multiLine: 'always' + BracesOnWhenStatements: + active: false + singleLine: 'necessary' + multiLine: 'consistent' + CanBeNonNullable: + active: false + CascadingCallWrapping: + active: false + includeElvis: true + ClassOrdering: + active: false + CollapsibleIfStatements: + active: false + DataClassContainsFunctions: + active: false + conversionFunctionPrefix: + - 'to' + allowOperators: false + DataClassShouldBeImmutable: + active: false + DestructuringDeclarationWithTooManyEntries: + active: true + maxDestructuringEntries: 3 + DoubleNegativeLambda: + active: false + negativeFunctions: + - reason: 'Use `takeIf` instead.' + value: 'takeUnless' + - reason: 'Use `all` instead.' + value: 'none' + negativeFunctionNameParts: + - 'not' + - 'non' + EqualsNullCall: + active: true + EqualsOnSignatureLine: + active: false + ExplicitCollectionElementAccessMethod: + active: false + ExplicitItLambdaParameter: + active: true + ExpressionBodySyntax: + active: false + includeLineWrapping: false + ForbiddenAnnotation: + active: false + annotations: + - reason: 'it is a java annotation. Use `Suppress` instead.' + value: 'java.lang.SuppressWarnings' + - reason: 'it is a java annotation. Use `kotlin.Deprecated` instead.' + value: 'java.lang.Deprecated' + - reason: 'it is a java annotation. Use `kotlin.annotation.MustBeDocumented` instead.' + value: 'java.lang.annotation.Documented' + - reason: 'it is a java annotation. Use `kotlin.annotation.Target` instead.' + value: 'java.lang.annotation.Target' + - reason: 'it is a java annotation. Use `kotlin.annotation.Retention` instead.' + value: 'java.lang.annotation.Retention' + - reason: 'it is a java annotation. Use `kotlin.annotation.Repeatable` instead.' + value: 'java.lang.annotation.Repeatable' + - reason: 'Kotlin does not support @Inherited annotation, see https://youtrack.jetbrains.com/issue/KT-22265' + value: 'java.lang.annotation.Inherited' + ForbiddenComment: + active: true + comments: + - reason: 'Forbidden FIXME todo marker in comment, please fix the problem.' + value: 'FIXME:' + - reason: 'Forbidden STOPSHIP todo marker in comment, please address the problem before shipping the code.' + value: 'STOPSHIP:' + - reason: 'Forbidden TODO todo marker in comment, please do the changes.' + value: 'TODO:' + allowedPatterns: '' + ForbiddenImport: + active: false + imports: [ ] + forbiddenPatterns: '' + ForbiddenMethodCall: + active: false + methods: + - reason: 'print does not allow you to configure the output stream. Use a logger instead.' + value: 'kotlin.io.print' + - reason: 'println does not allow you to configure the output stream. Use a logger instead.' + value: 'kotlin.io.println' + ForbiddenSuppress: + active: false + rules: [ ] + ForbiddenVoid: + active: true + ignoreOverridden: false + ignoreUsageInGenerics: false + FunctionOnlyReturningConstant: + active: true + ignoreOverridableFunction: true + ignoreActualFunction: true + excludedFunctions: [ ] + LoopWithTooManyJumpStatements: + active: true + maxJumpCount: 1 + MagicNumber: + active: true + excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**', '**/*.kts' ] + ignoreNumbers: + - '-1' + - '0' + - '1' + - '2' + ignoreHashCodeFunction: true + ignorePropertyDeclaration: true + ignoreLocalVariableDeclaration: false + ignoreConstantDeclaration: true + ignoreCompanionObjectPropertyDeclaration: true + ignoreAnnotation: false + ignoreNamedArgument: true + ignoreEnums: false + ignoreRanges: false + ignoreExtensionFunctions: true + MandatoryBracesLoops: + active: false + MaxChainedCallsOnSameLine: + active: false + maxChainedCalls: 5 + MaxLineLength: + active: true + maxLineLength: 120 + excludePackageStatements: true + excludeImportStatements: true + excludeCommentStatements: false + excludeRawStrings: true + MayBeConst: + active: true + ModifierOrder: + active: true + MultilineLambdaItParameter: + active: false + MultilineRawStringIndentation: + active: false + indentSize: 4 + trimmingMethods: + - 'trimIndent' + - 'trimMargin' + NestedClassesVisibility: + active: true + NewLineAtEndOfFile: + active: true + NoTabs: + active: false + NullableBooleanCheck: + active: false + ObjectLiteralToLambda: + active: true + OptionalAbstractKeyword: + active: true + OptionalUnit: + active: false + PreferToOverPairSyntax: + active: false + ProtectedMemberInFinalClass: + active: true + RedundantExplicitType: + active: false + RedundantHigherOrderMapUsage: + active: true + RedundantVisibilityModifierRule: + active: false + ReturnCount: + active: true + max: 2 + excludedFunctions: + - 'equals' + excludeLabeled: false + excludeReturnFromLambda: true + excludeGuardClauses: false + SafeCast: + active: true + SerialVersionUIDInSerializableClass: + active: true + SpacingBetweenPackageAndImports: + active: false + StringShouldBeRawString: + active: false + maxEscapedCharacterCount: 2 + ignoredCharacters: [ ] + ThrowsCount: + active: true + max: 2 + excludeGuardClauses: false + TrailingWhitespace: + active: false + TrimMultilineRawString: + active: false + trimmingMethods: + - 'trimIndent' + - 'trimMargin' + UnderscoresInNumericLiterals: + active: false + acceptableLength: 4 + allowNonStandardGrouping: false + UnnecessaryAbstractClass: + active: true + UnnecessaryAnnotationUseSiteTarget: + active: false + UnnecessaryApply: + active: true + UnnecessaryBackticks: + active: false + UnnecessaryBracesAroundTrailingLambda: + active: false + UnnecessaryFilter: + active: true + UnnecessaryInheritance: + active: true + UnnecessaryInnerClass: + active: false + UnnecessaryLet: + active: false + UnnecessaryParentheses: + active: false + allowForUnclearPrecedence: false + UntilInsteadOfRangeTo: + active: false + UnusedImports: + active: false + UnusedParameter: + active: true + allowedNames: 'ignored|expected' + UnusedPrivateClass: + active: true + UnusedPrivateMember: + active: true + allowedNames: '' + ignoreAnnotated: [ 'Preview' ] + UnusedPrivateProperty: + active: true + allowedNames: '_|ignored|expected|serialVersionUID' + UseAnyOrNoneInsteadOfFind: + active: true + UseArrayLiteralsInAnnotations: + active: true + UseCheckNotNull: + active: true + UseCheckOrError: + active: true + UseDataClass: + active: false + allowVars: false + UseEmptyCounterpart: + active: false + UseIfEmptyOrIfBlank: + active: false + UseIfInsteadOfWhen: + active: false + ignoreWhenContainingVariableDeclaration: false + UseIsNullOrEmpty: + active: true + UseLet: + active: false + UseOrEmpty: + active: true + UseRequire: + active: true + UseRequireNotNull: + active: true + UseSumOfInsteadOfFlatMapSize: + active: false + UselessCallOnNotNull: + active: true + UtilityClassWithPublicConstructor: + active: true + VarCouldBeVal: + active: true + ignoreLateinitVar: false + WildcardImport: + active: true + excludeImports: + - 'java.util.*' diff --git a/formz/build.gradle.kts b/formz/build.gradle.kts index ad321ae..ad77bfc 100644 --- a/formz/build.gradle.kts +++ b/formz/build.gradle.kts @@ -8,10 +8,16 @@ plugins { android { namespace = "com.nareshchocha.formz" - compileSdk = libs.versions.compileSdk.get().toInt() + compileSdk = + libs.versions.compileSdk + .get() + .toInt() defaultConfig { - minSdk = libs.versions.minSdk.get().toInt() + minSdk = + libs.versions.minSdk + .get() + .toInt() testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } @@ -42,6 +48,8 @@ android { } dependencies { + + testImplementation(libs.junit) } publishing { @@ -59,4 +67,4 @@ publishing { } } } -} \ No newline at end of file +} diff --git a/formz/src/main/java/com/nareshchocha/formz/Formz.kt b/formz/src/main/java/com/nareshchocha/formz/Formz.kt index 31342b9..cf5ae79 100644 --- a/formz/src/main/java/com/nareshchocha/formz/Formz.kt +++ b/formz/src/main/java/com/nareshchocha/formz/Formz.kt @@ -7,7 +7,10 @@ import java.util.Objects */ sealed class ValidationResult { data object Success : ValidationResult() - data class Failure(val error: E) : ValidationResult() + + data class Failure( + val error: E + ) : ValidationResult() } /** @@ -16,8 +19,10 @@ sealed class ValidationResult { * @param T The type of the input's value. * @param E The type of the validation error. */ -abstract class FormzInput(val value: T, val isPure: Boolean) { - +abstract class FormzInput( + val value: T, + val isPure: Boolean +) { // Cache the validation result. Since 'value' is immutable, this is safe. private val validationResult: ValidationResult by lazy { validator(value) } @@ -39,24 +44,20 @@ abstract class FormzInput(val value: T, val isPure: Boolean) { /** * Returns a [ValidationResult.Failure] if validation fails, or `null` if it succeeds. */ - fun error(): ValidationResult.Failure? { - return when (validationResult) { + fun error(): ValidationResult.Failure? = + when (validationResult) { is ValidationResult.Failure -> validationResult as ValidationResult.Failure ValidationResult.Success -> null } - } /** * Returns the error to display. * * If the input is still pure (unmodified), no error is displayed. */ - fun displayError(): E? = - if (isPure) null else error()?.error + fun displayError(): E? = if (isPure) null else error()?.error - override fun hashCode(): Int { - return Objects.hash(value, isPure) - } + override fun hashCode(): Int = Objects.hash(value, isPure) override fun equals(other: Any?): Boolean { if (this === other) return true @@ -68,9 +69,7 @@ abstract class FormzInput(val value: T, val isPure: Boolean) { return true } - override fun toString(): String { - return "FormzInput(value=$value, isPure=$isPure, isValid=${isValid()}, error=${error()})" - } + override fun toString(): String = "FormzInput(value=$value, isPure=$isPure, isValid=${isValid()}, error=${error()})" } /** @@ -80,16 +79,12 @@ object Formz { /** * Returns `true` if all provided inputs are valid. */ - fun validate(inputs: List>): Boolean { - return inputs.all { it.isValid() } - } + fun validate(inputs: List>): Boolean = inputs.all { it.isValid() } /** * Returns `true` if all provided inputs are still pure. */ - fun isPure(inputs: List>): Boolean { - return inputs.all { it.isPure } - } + fun isPure(inputs: List>): Boolean = inputs.all { it.isPure } } /** diff --git a/formz/src/test/java/com/nareshchocha/formz/FormzInputTest.kt b/formz/src/test/java/com/nareshchocha/formz/FormzInputTest.kt new file mode 100644 index 0000000..c26ccd5 --- /dev/null +++ b/formz/src/test/java/com/nareshchocha/formz/FormzInputTest.kt @@ -0,0 +1,276 @@ +package com.nareshchocha.formz + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotEquals +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 + +@RunWith(JUnit4::class) +class FormzInputTest { + private class NonEmptyStringInput( + value: String, + isPure: Boolean = true + ) : FormzInput(value, isPure) { + override fun validator(value: String): ValidationResult = + if (value.isNotEmpty()) ValidationResult.Success else ValidationResult.Failure("Empty") + } + + @Test + fun isValid_returnsTrue_whenInputIsPure() { + val input = NonEmptyStringInput("", isPure = true) + assertTrue(input.isValid()) + } + + @Test + fun isValid_returnsTrue_whenInputIsValidAndDirty() { + val input = NonEmptyStringInput("abc", isPure = false) + assertTrue(input.isValid()) + } + + @Test + fun isValid_returnsFalse_whenInputIsInvalidAndDirty() { + val input = NonEmptyStringInput("", isPure = false) + assertFalse(input.isValid()) + } + + @Test + fun error_returnsNull_whenInputIsValid() { + val input = NonEmptyStringInput("abc", isPure = false) + assertNull(input.error()) + } + + @Test + fun error_returnsFailure_whenInputIsInvalid() { + val input = NonEmptyStringInput("", isPure = false) + val error = input.error() + assertNotNull(error) + assertEquals("Empty", error?.error) + } + + @Test + fun displayError_returnsNull_whenInputIsPure() { + val input = NonEmptyStringInput("", isPure = true) + assertNull(input.displayError()) + } + + @Test + fun displayError_returnsError_whenInputIsInvalidAndDirty() { + val input = NonEmptyStringInput("", isPure = false) + assertEquals("Empty", input.displayError()) + } + + @Test + fun displayError_returnsNull_whenInputIsValidAndDirty() { + val input = NonEmptyStringInput("abc", isPure = false) + assertNull(input.displayError()) + } + + @Test + fun equals_and_hashCode_workCorrectly() { + val input1 = NonEmptyStringInput("abc", isPure = false) + val input2 = NonEmptyStringInput("abc", isPure = false) + val input3 = NonEmptyStringInput("def", isPure = false) + assertEquals(input1, input2) + assertEquals(input1.hashCode(), input2.hashCode()) + assertNotEquals(input1, input3) + } + + @Test + fun isValid_returnsFalse_whenInputIsNull() { + val input = + object : FormzInput(null, isPure = false) { + override fun validator(value: String?): ValidationResult = + if (value.isNullOrEmpty()) ValidationResult.Failure("Null or Empty") else ValidationResult.Success + } + assertFalse(input.isValid()) + } + + @Test + fun error_returnsFailure_whenInputIsNull() { + val input = + object : FormzInput(null, isPure = false) { + override fun validator(value: String?): ValidationResult = + if (value.isNullOrEmpty()) ValidationResult.Failure("Null or Empty") else ValidationResult.Success + } + val error = input.error() + assertNotNull(error) + assertEquals("Null or Empty", error?.error) + } + + @Test + fun displayError_returnsError_whenInputIsNullAndDirty() { + val input = + object : FormzInput(null, isPure = false) { + override fun validator(value: String?): ValidationResult = + if (value.isNullOrEmpty()) ValidationResult.Failure("Null or Empty") else ValidationResult.Success + } + assertEquals("Null or Empty", input.displayError()) + } + + @Test + fun equals_and_hashCode_workCorrectly_withNullValues() { + val input1 = + object : FormzInput(null, isPure = false) { + override fun validator(value: String?): ValidationResult = + if (value.isNullOrEmpty()) ValidationResult.Failure("Null or Empty") else ValidationResult.Success + } + val input2 = + object : FormzInput(null, isPure = false) { + override fun validator(value: String?): ValidationResult = + if (value.isNullOrEmpty()) ValidationResult.Failure("Null or Empty") else ValidationResult.Success + } + assertEquals(input1, input2) + assertEquals(input1.hashCode(), input2.hashCode()) + } + + @Test + fun isValid_returnsTrue_whenInputIsWhitespaceAndConsideredValid() { + val input = + object : FormzInput(" ", isPure = false) { + override fun validator(value: String): ValidationResult = + if (value.isBlank()) ValidationResult.Success else ValidationResult.Failure("Not Blank") + } + assertTrue(input.isValid()) + } + + @Test + fun error_returnsFailure_whenInputIsWhitespaceAndInvalid() { + val input = + object : FormzInput(" ", isPure = false) { + override fun validator(value: String): ValidationResult = + if (value.isBlank()) ValidationResult.Failure("Blank Input") else ValidationResult.Success + } + val error = input.error() + assertNotNull(error) + assertEquals("Blank Input", error?.error) + } + + @Test + fun displayError_returnsError_whenInputIsWhitespaceAndDirty() { + val input = + object : FormzInput(" ", isPure = false) { + override fun validator(value: String): ValidationResult = + if (value.isBlank()) ValidationResult.Failure("Blank Input") else ValidationResult.Success + } + assertEquals("Blank Input", input.displayError()) + } + + @Test + fun isValid_returnsFalse_whenInputIsEmptyString() { + val input = + object : FormzInput("", isPure = false) { + override fun validator(value: String): ValidationResult = + if (value.isEmpty()) ValidationResult.Failure("Empty String") else ValidationResult.Success + } + assertFalse(input.isValid()) + } + + @Test + fun equals_and_hashCode_workCorrectly_withWhitespaceValues() { + val input1 = + object : FormzInput(" ", isPure = false) { + override fun validator(value: String): ValidationResult = + if (value.isBlank()) ValidationResult.Success else ValidationResult.Failure("Not Blank") + } + val input2 = + object : FormzInput(" ", isPure = false) { + override fun validator(value: String): ValidationResult = + if (value.isBlank()) ValidationResult.Success else ValidationResult.Failure("Not Blank") + } + assertEquals(input1, input2) + assertEquals(input1.hashCode(), input2.hashCode()) + } + + @Test + fun isValid_returnsFalse_whenInputExceedsMaxLength() { + val input = + object : FormzInput("a".repeat(101), isPure = false) { + override fun validator(value: String): ValidationResult = + if (value.length > 100) ValidationResult.Failure("Exceeds Max Length") else ValidationResult.Success + } + assertFalse(input.isValid()) + } + + @Test + fun error_returnsFailure_whenInputExceedsMaxLength() { + val input = + object : FormzInput("a".repeat(101), isPure = false) { + override fun validator(value: String): ValidationResult = + if (value.length > 100) ValidationResult.Failure("Exceeds Max Length") else ValidationResult.Success + } + val error = input.error() + assertNotNull(error) + assertEquals("Exceeds Max Length", error?.error) + } + + @Test + fun isValid_returnsFalse_whenInputIsNegativeNumber() { + val input = + object : FormzInput(-1, isPure = false) { + override fun validator(value: Int): ValidationResult = + if (value < 0) ValidationResult.Failure("Negative Number") else ValidationResult.Success + } + assertFalse(input.isValid()) + } + + @Test + fun error_returnsFailure_whenInputIsNegativeNumber() { + val input = + object : FormzInput(-1, isPure = false) { + override fun validator(value: Int): ValidationResult = + if (value < 0) ValidationResult.Failure("Negative Number") else ValidationResult.Success + } + val error = input.error() + assertNotNull(error) + assertEquals("Negative Number", error?.error) + } + + @Test + fun isValid_returnsTrue_whenInputIsBoundaryValue() { + val input = + object : FormzInput(0, isPure = false) { + override fun validator(value: Int): ValidationResult = + if (value >= 0) ValidationResult.Success else ValidationResult.Failure("Invalid Boundary") + } + assertTrue(input.isValid()) + } + + @Test + fun isValid_returnsFalse_whenInputIsSpecialCharacters() { + val input = + object : FormzInput("@#$%", isPure = false) { + override fun validator(value: String): ValidationResult = + if (value.any { it.isLetterOrDigit() }) { + ValidationResult.Success + } else { + ValidationResult.Failure( + "Special Characters" + ) + } + } + assertFalse(input.isValid()) + } + + @Test + fun error_returnsFailure_whenInputIsSpecialCharacters() { + val input = + object : FormzInput("@#$%", isPure = false) { + override fun validator(value: String): ValidationResult = + if (value.any { it.isLetterOrDigit() }) { + ValidationResult.Success + } else { + ValidationResult.Failure( + "Special Characters" + ) + } + } + val error = input.error() + assertNotNull(error) + assertEquals("Special Characters", error?.error) + } +} diff --git a/formz/src/test/java/com/nareshchocha/formz/FormzInterfaceTest.kt b/formz/src/test/java/com/nareshchocha/formz/FormzInterfaceTest.kt new file mode 100644 index 0000000..3baa107 --- /dev/null +++ b/formz/src/test/java/com/nareshchocha/formz/FormzInterfaceTest.kt @@ -0,0 +1,107 @@ +package com.nareshchocha.formz + +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 + +@RunWith(JUnit4::class) +class FormzInterfaceTest { + private class DummyInput( + value: String, + isPure: Boolean + ) : FormzInput(value, isPure) { + override fun validator(value: String): ValidationResult = + if (value == "ok") ValidationResult.Success else ValidationResult.Failure("fail") + } + + private class DummyForm( + val input1: DummyInput, + val input2: DummyInput + ) : FormzInterface { + override val inputs = listOf(input1, input2) + } + + @Test + fun isValid_returnsTrue_whenAllInputsAreValid() { + val form = DummyForm(DummyInput("ok", false), DummyInput("ok", false)) + assertTrue(form.isValid) + assertFalse(form.isNotValid) + } + + @Test + fun isValid_returnsFalse_whenAnyInputIsInvalid() { + val form = DummyForm(DummyInput("ok", false), DummyInput("bad", false)) + assertFalse(form.isValid) + assertTrue(form.isNotValid) + } + + @Test + fun isPure_returnsTrue_whenAllInputsArePure() { + val form = DummyForm(DummyInput("ok", true), DummyInput("ok", true)) + assertTrue(form.isPure) + assertFalse(form.isDirty) + } + + @Test + fun isPure_returnsFalse_whenAnyInputIsDirty() { + val form = DummyForm(DummyInput("ok", true), DummyInput("ok", false)) + assertFalse(form.isPure) + assertTrue(form.isDirty) + } + + @Test + fun isValid_returnsTrue_whenInputsListIsEmpty() { + val form = + object : FormzInterface { + override val inputs = emptyList>() + } + assertTrue(form.isValid) + assertFalse(form.isNotValid) + } + + @Test + fun isPure_returnsTrue_whenInputsListIsEmpty() { + val form = + object : FormzInterface { + override val inputs = emptyList>() + } + assertTrue(form.isPure) + assertFalse(form.isDirty) + } + + @Test + fun isValid_and_isPure_workCorrectly_withMixedInputs() { + val validPure = + object : FormzInput(1, true) { + override fun validator(value: Int) = ValidationResult.Success + } + val invalidDirty = + object : FormzInput(0, false) { + override fun validator(value: Int) = ValidationResult.Failure("fail") + } + val form = + object : FormzInterface { + override val inputs = listOf(validPure, invalidDirty) + } + assertFalse(form.isValid) + assertTrue(form.isNotValid) + assertFalse(form.isPure) + assertTrue(form.isDirty) + } + + @Test + fun isValid_and_isPure_workCorrectly_withDuplicateInputs() { + val input = + object : FormzInput(1, true) { + override fun validator(value: Int) = ValidationResult.Success + } + val form = + object : FormzInterface { + override val inputs = listOf(input, input) + } + assertTrue(form.isValid) + assertTrue(form.isPure) + } +} diff --git a/formz/src/test/java/com/nareshchocha/formz/FormzTest.kt b/formz/src/test/java/com/nareshchocha/formz/FormzTest.kt new file mode 100644 index 0000000..be9a036 --- /dev/null +++ b/formz/src/test/java/com/nareshchocha/formz/FormzTest.kt @@ -0,0 +1,125 @@ +package com.nareshchocha.formz + +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 + +@RunWith(JUnit4::class) +class FormzTest { + private class AlwaysValidInput : FormzInput(0, false) { + override fun validator(value: Int) = ValidationResult.Success + } + + private class AlwaysInvalidInput : FormzInput(0, false) { + override fun validator(value: Int) = ValidationResult.Failure("Invalid") + } + + @Test + fun validate_returnsTrue_whenAllInputsAreValid() { + val inputs = listOf(AlwaysValidInput(), AlwaysValidInput()) + assertTrue(Formz.validate(inputs)) + } + + @Test + fun validate_returnsFalse_whenAnyInputIsInvalid() { + val inputs = listOf(AlwaysValidInput(), AlwaysInvalidInput()) + assertFalse(Formz.validate(inputs)) + } + + @Test + fun isPure_returnsTrue_whenAllInputsArePure() { + val pureInputs = + listOf( + object : FormzInput(0, true) { + override fun validator(value: Int) = ValidationResult.Success + }, + object : FormzInput(1, true) { + override fun validator(value: Int) = ValidationResult.Success + } + ) + assertTrue(Formz.isPure(pureInputs)) + } + + @Test + fun isPure_returnsFalse_whenAnyInputIsDirty() { + val pureInput = + object : FormzInput(0, true) { + override fun validator(value: Int) = ValidationResult.Success + } + val dirtyInput = + object : FormzInput(1, false) { + override fun validator(value: Int) = ValidationResult.Success + } + assertFalse(Formz.isPure(listOf(pureInput, dirtyInput))) + } + + @Test + fun validate_returnsTrue_whenInputsListIsEmpty() { + val inputs = emptyList>() + assertTrue(Formz.validate(inputs)) + } + + @Test + fun validate_returnsFalse_whenAllInputsAreInvalid() { + val inputs = + listOf( + object : FormzInput(0, false) { + override fun validator(value: Int) = ValidationResult.Failure("Invalid") + }, + object : FormzInput(1, false) { + override fun validator(value: Int) = ValidationResult.Failure("Invalid") + } + ) + assertFalse(Formz.validate(inputs)) + } + + @Test + fun isPure_returnsTrue_whenInputsListIsEmpty() { + val inputs = emptyList>() + assertTrue(Formz.isPure(inputs)) + } + + @Test + fun isPure_returnsFalse_whenAllInputsAreDirty() { + val inputs = + listOf( + object : FormzInput(0, false) { + override fun validator(value: Int) = ValidationResult.Success + }, + object : FormzInput(1, false) { + override fun validator(value: Int) = ValidationResult.Success + } + ) + assertFalse(Formz.isPure(inputs)) + } + + @Test + fun validate_handlesMixedValidAndInvalidInputs() { + val inputs = + listOf( + object : FormzInput(0, false) { + override fun validator(value: Int) = ValidationResult.Success + }, + object : FormzInput(1, false) { + override fun validator(value: Int) = ValidationResult.Failure("Invalid") + } + ) + assertFalse(Formz.validate(inputs)) + } + + @Test + fun isPure_handlesMixedPureAndDirtyInputs() { + val inputs = + listOf( + object : FormzInput(0, true) { + override fun validator(value: Int) = ValidationResult.Success + }, + object : FormzInput(1, false) { + override fun validator(value: Int) = ValidationResult.Success + } + ) + assertFalse(Formz.isPure(inputs)) + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index db92e7f..0ce522e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,7 @@ [versions] agp = "8.11.0" kotlin = "2.2.0" +detekt = "1.23.8" compileSdk = "36" targetSdk = "36" minSdk = "21" @@ -51,4 +52,7 @@ android-application = { id = "com.android.application", version.ref = "agp" } android-library = { id = "com.android.library", version.ref = "agp" } jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } +# code style review +arturbosch-detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } +spotless = { id = "com.diffplug.spotless", version = "7.0.4" } diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index 6fad2b9..fb04e63 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -8,12 +8,21 @@ plugins { android { namespace = "com.nareshchocha.sample" - compileSdk = libs.versions.compileSdk.get().toInt() + compileSdk = + libs.versions.compileSdk + .get() + .toInt() defaultConfig { applicationId = "com.nareshchocha.sample" - minSdk = libs.versions.minSdk.get().toInt() - targetSdk = libs.versions.targetSdk.get().toInt() + minSdk = + libs.versions.minSdk + .get() + .toInt() + targetSdk = + libs.versions.targetSdk + .get() + .toInt() versionCode = 1 versionName = "1.0" @@ -51,7 +60,6 @@ dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) - implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.activity.compose) implementation(libs.androidx.ui) @@ -71,4 +79,4 @@ dependencies { androidTestImplementation(libs.androidx.ui.test.junit4) debugImplementation(libs.androidx.ui.tooling) debugImplementation(libs.androidx.ui.test.manifest) -} \ No newline at end of file +} diff --git a/sample/src/androidTest/java/com/nareshchocha/sample/ExampleInstrumentedTest.kt b/sample/src/androidTest/java/com/nareshchocha/sample/ExampleInstrumentedTest.kt index 0b1d6a0..d45b787 100644 --- a/sample/src/androidTest/java/com/nareshchocha/sample/ExampleInstrumentedTest.kt +++ b/sample/src/androidTest/java/com/nareshchocha/sample/ExampleInstrumentedTest.kt @@ -1,13 +1,11 @@ package com.nareshchocha.sample -import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 - +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.assertEquals import org.junit.Test import org.junit.runner.RunWith -import org.junit.Assert.* - /** * Instrumented test, which will execute on an Android device. * @@ -21,4 +19,4 @@ class ExampleInstrumentedTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext assertEquals("com.nareshchocha.formz", appContext.packageName) } -} \ No newline at end of file +} diff --git a/sample/src/main/java/com/nareshchocha/sample/MainActivity.kt b/sample/src/main/java/com/nareshchocha/sample/MainActivity.kt index ebc529e..0d4ffd8 100644 --- a/sample/src/main/java/com/nareshchocha/sample/MainActivity.kt +++ b/sample/src/main/java/com/nareshchocha/sample/MainActivity.kt @@ -94,10 +94,11 @@ fun RootUI() { } ) { innerPadding -> AllComponents( - modifier = Modifier - .fillMaxSize() - .padding(14.dp) - .padding(innerPadding) + modifier = + Modifier + .fillMaxSize() + .padding(14.dp) + .padding(innerPadding) ) } } @@ -118,21 +119,26 @@ fun AllComponents(modifier: Modifier = Modifier) { Text(text = "Test") }, isError = !testInputTextField.isValid(), - errorMassage = testInputTextField.displayError() - ?.getErrorMessage("Test"), - keyboardOptions = KeyboardOptions( - capitalization = KeyboardCapitalization.Words, - keyboardType = KeyboardType.Text, imeAction = ImeAction.Next - ), - - modifier = Modifier.fillMaxWidth(), + errorMassage = + testInputTextField + .displayError() + ?.getErrorMessage("Test"), + keyboardOptions = + KeyboardOptions( + capitalization = KeyboardCapitalization.Words, + keyboardType = KeyboardType.Text, + imeAction = ImeAction.Next + ), + modifier = Modifier.fillMaxWidth() ) PasswordTextField( value = passwordInputTextField.value, isError = !passwordInputTextField.isValid(), - errorMassage = passwordInputTextField.displayError() - ?.getErrorMessage("Password"), + errorMassage = + passwordInputTextField + .displayError() + ?.getErrorMessage("Password"), onValueChange = { println("PasswordTextField= $it") passwordInputTextField = passwordInputTextField.copy(it) @@ -157,11 +163,9 @@ fun AllComponents(modifier: Modifier = Modifier) { ) } } - } } - @Composable private fun PasswordTextField( value: String, @@ -175,20 +179,24 @@ private fun PasswordTextField( var showPassword by remember { mutableStateOf(value = false) } AppOutlinedTextField( - value = value, onValueChange = onValueChange, + value = value, + onValueChange = onValueChange, label = { Text(text = "password") }, isError = isError, errorMassage = errorMassage, - keyboardOptions = KeyboardOptions( - keyboardType = KeyboardType.Password, imeAction = ImeAction.Done - ), - visualTransformation = if (showPassword) { - VisualTransformation.None - } else { - PasswordVisualTransformation() - }, + keyboardOptions = + KeyboardOptions( + keyboardType = KeyboardType.Password, + imeAction = ImeAction.Done + ), + visualTransformation = + if (showPassword) { + VisualTransformation.None + } else { + PasswordVisualTransformation() + }, trailingIcon = { if (showPassword) { IconButton(onClick = { showPassword = false }) { @@ -199,7 +207,8 @@ private fun PasswordTextField( } } else { IconButton( - onClick = { showPassword = true }) { + onClick = { showPassword = true } + ) { Icon( imageVector = Icons.Filled.VisibilityOff, contentDescription = "hide_password" @@ -208,18 +217,18 @@ private fun PasswordTextField( } }, modifier = modifier.fillMaxWidth(), - keyboardActions = KeyboardActions(onDone = { - focusManager.clearFocus() - onClick() - }) + keyboardActions = + KeyboardActions(onDone = { + focusManager.clearFocus() + onClick() + }) ) } - @Preview(showBackground = true) @Composable fun GreetingPreview() { SampleTheme { AllComponents() } -} \ No newline at end of file +} diff --git a/sample/src/main/java/com/nareshchocha/sample/baseComponents/AppOutlinedTextField.kt b/sample/src/main/java/com/nareshchocha/sample/baseComponents/AppOutlinedTextField.kt index 0a58849..d884659 100644 --- a/sample/src/main/java/com/nareshchocha/sample/baseComponents/AppOutlinedTextField.kt +++ b/sample/src/main/java/com/nareshchocha/sample/baseComponents/AppOutlinedTextField.kt @@ -15,7 +15,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.input.VisualTransformation - @Composable fun AppOutlinedTextField( value: String, @@ -38,7 +37,7 @@ fun AppOutlinedTextField( keyboardActions: KeyboardActions = KeyboardActions.Default, singleLine: Boolean = false, maxLines: Int = if (singleLine) 1 else Int.MAX_VALUE, - minLines: Int = 1, + minLines: Int = 1 ) { OutlinedTextField( value = value, @@ -50,30 +49,36 @@ fun AppOutlinedTextField( label = label, placeholder = placeholder, leadingIcon = leadingIcon, - trailingIcon = trailingIcon - ?: if (isError) { - { - Icon(Icons.Filled.Error, "error", tint = MaterialTheme.colorScheme.error) - } - } else null, + trailingIcon = + trailingIcon + ?: if (isError) { + { + Icon(Icons.Filled.Error, "error", tint = MaterialTheme.colorScheme.error) + } + } else { + null + }, prefix = prefix, suffix = suffix, - supportingText = supportingText - ?: if (isError && errorMassage!=null) { - { - Text( - modifier = Modifier.fillMaxWidth(), - text = errorMassage ?: "", - color = MaterialTheme.colorScheme.error - ) - } - } else null, + supportingText = + supportingText + ?: if (isError && errorMassage != null) { + { + Text( + modifier = Modifier.fillMaxWidth(), + text = errorMassage ?: "", + color = MaterialTheme.colorScheme.error + ) + } + } else { + null + }, isError = isError, visualTransformation = visualTransformation, keyboardOptions = keyboardOptions, keyboardActions = keyboardActions, singleLine = singleLine, maxLines = maxLines, - minLines = minLines, + minLines = minLines ) -} \ No newline at end of file +} diff --git a/sample/src/main/java/com/nareshchocha/sample/ui/theme/Color.kt b/sample/src/main/java/com/nareshchocha/sample/ui/theme/Color.kt index b20e463..7462546 100644 --- a/sample/src/main/java/com/nareshchocha/sample/ui/theme/Color.kt +++ b/sample/src/main/java/com/nareshchocha/sample/ui/theme/Color.kt @@ -8,4 +8,4 @@ val Pink80 = Color(0xFFEFB8C8) val Purple40 = Color(0xFF6650a4) val PurpleGrey40 = Color(0xFF625b71) -val Pink40 = Color(0xFF7D5260) \ No newline at end of file +val Pink40 = Color(0xFF7D5260) diff --git a/sample/src/main/java/com/nareshchocha/sample/ui/theme/Theme.kt b/sample/src/main/java/com/nareshchocha/sample/ui/theme/Theme.kt index b6364b6..c38d5e2 100644 --- a/sample/src/main/java/com/nareshchocha/sample/ui/theme/Theme.kt +++ b/sample/src/main/java/com/nareshchocha/sample/ui/theme/Theme.kt @@ -10,17 +10,18 @@ import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext -private val DarkColorScheme = darkColorScheme( - primary = Purple80, - secondary = PurpleGrey80, - tertiary = Pink80 -) - -private val LightColorScheme = lightColorScheme( - primary = Purple40, - secondary = PurpleGrey40, - tertiary = Pink40 +private val DarkColorScheme = + darkColorScheme( + primary = Purple80, + secondary = PurpleGrey80, + tertiary = Pink80 + ) +private val LightColorScheme = + lightColorScheme( + primary = Purple40, + secondary = PurpleGrey40, + tertiary = Pink40 /* Other default colors to override background = Color(0xFFFFFBFE), surface = Color(0xFFFFFBFE), @@ -29,8 +30,8 @@ private val LightColorScheme = lightColorScheme( onTertiary = Color.White, onBackground = Color(0xFF1C1B1F), onSurface = Color(0xFF1C1B1F), - */ -) + */ + ) @Composable fun SampleTheme( @@ -39,19 +40,20 @@ fun SampleTheme( dynamicColor: Boolean = true, content: @Composable () -> Unit ) { - val colorScheme = when { - dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { - val context = LocalContext.current - if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) - } + val colorScheme = + when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } - darkTheme -> DarkColorScheme - else -> LightColorScheme - } + darkTheme -> DarkColorScheme + else -> LightColorScheme + } MaterialTheme( colorScheme = colorScheme, typography = Typography, content = content ) -} \ No newline at end of file +} diff --git a/sample/src/main/java/com/nareshchocha/sample/ui/theme/Type.kt b/sample/src/main/java/com/nareshchocha/sample/ui/theme/Type.kt index 450cb5c..b602826 100644 --- a/sample/src/main/java/com/nareshchocha/sample/ui/theme/Type.kt +++ b/sample/src/main/java/com/nareshchocha/sample/ui/theme/Type.kt @@ -7,14 +7,16 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.sp // Set of Material typography styles to start with -val Typography = Typography( - bodyLarge = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Normal, - fontSize = 16.sp, - lineHeight = 24.sp, - letterSpacing = 0.5.sp - ) +val Typography = + Typography( + bodyLarge = + TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ) /* Other default text styles to override titleLarge = TextStyle( fontFamily = FontFamily.Default, @@ -30,5 +32,5 @@ val Typography = Typography( lineHeight = 16.sp, letterSpacing = 0.5.sp ) - */ -) \ No newline at end of file + */ + ) diff --git a/sample/src/main/java/com/nareshchocha/sample/velidate/AnyNonEmptyInput.kt b/sample/src/main/java/com/nareshchocha/sample/velidate/AnyNonEmptyInput.kt index b74d4fc..380547a 100644 --- a/sample/src/main/java/com/nareshchocha/sample/velidate/AnyNonEmptyInput.kt +++ b/sample/src/main/java/com/nareshchocha/sample/velidate/AnyNonEmptyInput.kt @@ -7,11 +7,11 @@ class AnyNonEmptyInput( value: T, isPure: Boolean = true ) : FormzInput(value, isPure) { - override fun validator(value: T): ValidationResult { - return if (value == null) ValidationResult.Failure(ValidationError.INVALID) else ValidationResult.Success - } + override fun validator(value: T): ValidationResult = + if (value == null) ValidationResult.Failure(ValidationError.INVALID) else ValidationResult.Success - fun copy(value: T, isPure: Boolean = false): AnyNonEmptyInput { - return AnyNonEmptyInput(value, isPure = isPure) - } + fun copy( + value: T, + isPure: Boolean = false + ): AnyNonEmptyInput = AnyNonEmptyInput(value, isPure = isPure) } diff --git a/sample/src/main/java/com/nareshchocha/sample/velidate/BooleanInput.kt b/sample/src/main/java/com/nareshchocha/sample/velidate/BooleanInput.kt index c500d22..d10f6d4 100644 --- a/sample/src/main/java/com/nareshchocha/sample/velidate/BooleanInput.kt +++ b/sample/src/main/java/com/nareshchocha/sample/velidate/BooleanInput.kt @@ -7,11 +7,11 @@ class BooleanInput( value: Boolean = false, isPure: Boolean = true ) : FormzInput(value, isPure) { - override fun validator(value: Boolean): ValidationResult { - return if (value) ValidationResult.Success else ValidationResult.Failure(ValidationError.NOT_SELECTED) - } + override fun validator(value: Boolean): ValidationResult = + if (value) ValidationResult.Success else ValidationResult.Failure(ValidationError.NOT_SELECTED) - fun copy(value: Boolean, isPure: Boolean = false): BooleanInput { - return BooleanInput(value, isPure = isPure) - } + fun copy( + value: Boolean, + isPure: Boolean = false + ): BooleanInput = BooleanInput(value, isPure = isPure) } diff --git a/sample/src/main/java/com/nareshchocha/sample/velidate/NonEmptyInput.kt b/sample/src/main/java/com/nareshchocha/sample/velidate/NonEmptyInput.kt index c59f02f..b80c38c 100644 --- a/sample/src/main/java/com/nareshchocha/sample/velidate/NonEmptyInput.kt +++ b/sample/src/main/java/com/nareshchocha/sample/velidate/NonEmptyInput.kt @@ -7,11 +7,11 @@ class NonEmptyInput( value: String = "", isPure: Boolean = true ) : FormzInput(value, isPure) { - override fun validator(value: String): ValidationResult { - return if (value.isNotBlank()) ValidationResult.Success else ValidationResult.Failure(ValidationError.EMPTY) - } + override fun validator(value: String): ValidationResult = + if (value.isNotBlank()) ValidationResult.Success else ValidationResult.Failure(ValidationError.EMPTY) - fun copy(value: String, isPure: Boolean = false): NonEmptyInput { - return NonEmptyInput(value, isPure = isPure) - } + fun copy( + value: String, + isPure: Boolean = false + ): NonEmptyInput = NonEmptyInput(value, isPure = isPure) } diff --git a/sample/src/main/java/com/nareshchocha/sample/velidate/RegexInput.kt b/sample/src/main/java/com/nareshchocha/sample/velidate/RegexInput.kt index 9ceac93..9dfafd4 100644 --- a/sample/src/main/java/com/nareshchocha/sample/velidate/RegexInput.kt +++ b/sample/src/main/java/com/nareshchocha/sample/velidate/RegexInput.kt @@ -3,35 +3,28 @@ package com.nareshchocha.sample.velidate import com.nareshchocha.formz.FormzInput import com.nareshchocha.formz.ValidationResult - class RegexInput( private val regex: String, private val skipEmpty: Boolean = false, value: String = "", isPure: Boolean = true ) : FormzInput(value, isPure) { - override fun validator(value: String): ValidationResult { - return if (value.isEmpty()) { + override fun validator(value: String): ValidationResult = + if (value.isEmpty()) { if (skipEmpty) ValidationResult.Success else ValidationResult.Failure(ValidationError.EMPTY) } else if (!Regex(regex).matches(value)) { ValidationResult.Failure(ValidationError.INVALID) } else { ValidationResult.Success } - } - fun copy(value: String, isPure: Boolean = false): RegexInput { - return RegexInput(regex, skipEmpty, value, isPure = isPure) - } + fun copy( + value: String, + isPure: Boolean = false + ): RegexInput = RegexInput(regex, skipEmpty, value, isPure = isPure) } - object RegularExpressions { - const val USERNAME = "^[A-Za-z0-9_.-]{3,15}$"; - const val EMAIL = "[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+"; - const val MOBILE_NUMBER = "^\\ d{10}$"; const val PASSWORD = - "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$"; - const val URL = - "((https?:www\\.)|(https?:\\/\\/)|(www\\.))[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9]{1,6}(\\/[-a-zA-Z0-9()@:%_\\+.~#?&\\/=]*)?"; -} \ No newline at end of file + "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$" +} diff --git a/sample/src/main/java/com/nareshchocha/sample/velidate/validation_error.kt b/sample/src/main/java/com/nareshchocha/sample/velidate/ValidationError.kt similarity index 82% rename from sample/src/main/java/com/nareshchocha/sample/velidate/validation_error.kt rename to sample/src/main/java/com/nareshchocha/sample/velidate/ValidationError.kt index 2d8ee8d..1332674 100644 --- a/sample/src/main/java/com/nareshchocha/sample/velidate/validation_error.kt +++ b/sample/src/main/java/com/nareshchocha/sample/velidate/ValidationError.kt @@ -3,12 +3,10 @@ package com.nareshchocha.sample.velidate enum class ValidationError { EMPTY, INVALID, - NOT_SELECTED, + NOT_SELECTED } -fun List.combineErrors(): ValidationError? { - return this.filterNotNull().firstOrNull() -} +fun List.combineErrors(): ValidationError? = this.filterNotNull().firstOrNull() fun ValidationError.getErrorMessage( field: String, @@ -23,4 +21,4 @@ fun ValidationError.getErrorMessage( ValidationError.NOT_SELECTED -> "You must select $field" else -> throw IllegalArgumentException("Unsupported ValidationError type") } -} \ No newline at end of file +} diff --git a/sample/src/test/java/com/nareshchocha/sample/ExampleUnitTest.kt b/sample/src/test/java/com/nareshchocha/sample/ExampleUnitTest.kt index 0348bd6..a9278e7 100644 --- a/sample/src/test/java/com/nareshchocha/sample/ExampleUnitTest.kt +++ b/sample/src/test/java/com/nareshchocha/sample/ExampleUnitTest.kt @@ -1,9 +1,8 @@ package com.nareshchocha.sample +import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.Assert.* - /** * Example local unit test, which will execute on the development machine (host). * @@ -14,4 +13,4 @@ class ExampleUnitTest { fun addition_isCorrect() { assertEquals(4, 2 + 2) } -} \ No newline at end of file +} From 28bcb68bc1f949299f8bd83c85dadaaf2fd74a6d Mon Sep 17 00:00:00 2001 From: naresh chocha Date: Fri, 27 Jun 2025 16:12:47 +0530 Subject: [PATCH 4/5] Refactor: Remove unused text style definitions --- .../com/nareshchocha/sample/ui/theme/Type.kt | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/sample/src/main/java/com/nareshchocha/sample/ui/theme/Type.kt b/sample/src/main/java/com/nareshchocha/sample/ui/theme/Type.kt index b602826..97adab0 100644 --- a/sample/src/main/java/com/nareshchocha/sample/ui/theme/Type.kt +++ b/sample/src/main/java/com/nareshchocha/sample/ui/theme/Type.kt @@ -17,20 +17,4 @@ val Typography = lineHeight = 24.sp, letterSpacing = 0.5.sp ) - /* Other default text styles to override - titleLarge = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Normal, - fontSize = 22.sp, - lineHeight = 28.sp, - letterSpacing = 0.sp - ), - labelSmall = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Medium, - fontSize = 11.sp, - lineHeight = 16.sp, - letterSpacing = 0.5.sp - ) - */ ) From 9e280f87ee64501e1dbf7c0da4a51e6fafda4414 Mon Sep 17 00:00:00 2001 From: naresh chocha Date: Fri, 27 Jun 2025 16:13:09 +0530 Subject: [PATCH 5/5] chore: Add issue templates for bug reports and feature requests --- .github/CODEOWNERS | 1 + .github/CONTRIBUTING.md | 9 ++ .github/FUNDING.yml | 1 + .github/ISSUE_TEMPLATE/bug_report.yml | 29 +++++++ .github/ISSUE_TEMPLATE/config.yml | 5 ++ .github/ISSUE_TEMPLATE/feature_request.yml | 17 ++++ .github/PULL_REQUEST_TEMPLATE.md | 10 +++ .github/workflows/ci.yml | 96 ++++++++++++++++++++++ 8 files changed, 168 insertions(+) create mode 100644 .github/CODEOWNERS create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/ci.yml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..0c28e78 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @ChochaNaresh diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..18a6ebb --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,9 @@ +# Contributing to formz + +We welcome pull requests! Please follow these _guidelines_: + +- Create issues for bugs and features. +- Fork and create feature branches (e.g., `feature/pick-*`). +- Follow existing code style and naming conventions. +- Run tests with `./gradlew test` before submitting a PR. +- Add documentation for any new public APIs. diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..b90eaab --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: ChochaNaresh diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..bacdf0c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,29 @@ +name: Bug Report +description: File a bug report +title: "[Bug]: " +labels: [bug] +assignees: [] + +body: + - type: textarea + attributes: + label: Describe the bug + description: A clear and concise description of what the bug is. + placeholder: The app crashes when... + validations: + required: true + + - type: input + attributes: + label: Library Version + placeholder: e.g. 1.0.0-beta.1 + validations: + required: true + + - type: textarea + attributes: + label: Steps to reproduce + placeholder: | + 1. Import library + 2. Call formz + 3. App crashes diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..93f3451 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Ask a Question + url: https://github.com/ChochaNaresh/Formz/discussions + about: Please ask and answer questions in GitHub Discussions. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..e739ea9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,17 @@ +name: Feature Request +description: Suggest a new feature or improvement +title: "[Feature]: " +labels: [enhancement] +assignees: [] + +body: + - type: textarea + attributes: + label: Feature Description + description: What feature would you like to see? + validations: + required: true + + - type: textarea + attributes: + label: Use case or motivation diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..6e9baf4 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,10 @@ +## ✨ What's Changed + +Describe the changes you made in this PR. + +## ✅ Checklist + +- [ ] I've tested this on a device/emulator +- [ ] I've added tests where applicable +- [ ] I've updated documentation (if needed) +- [ ] This PR follows the [CONTRIBUTING.md](./CONTRIBUTING.md) guidelines diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..f9f5052 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,96 @@ +name: Android CI/CD + +on: + push: + branches: [main, master] + tags: + - '[0-9]*' # matches 1.0.0, 0.1.0-alpha etc. + pull_request: + branches: [main, master] + +permissions: + contents: write # Required to create GitHub Releases + +jobs: + check: + name: Code Style & Formatting + runs-on: ubuntu-latest + + steps: + - name: Checkout source + uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '21' + + - name: Cache Gradle + uses: actions/cache@v3 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: gradle-${{ runner.os }}- + + - name: Make gradlew executable + run: chmod +x ./gradlew + + - name: Run checks + run: ./gradlew formz:spotlessCheck detekt + + - name: Upload Detekt HTML report + uses: actions/upload-artifact@v4 + with: + name: detekt-html-report + path: | + **/build/reports/detekt/detekt.html + build: + name: Build & Test + needs: check + runs-on: ubuntu-latest + + steps: + - name: Checkout source + uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '21' + + - name: Cache Gradle + uses: actions/cache@v3 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: gradle-${{ runner.os }}- + + - name: Make gradlew executable + run: chmod +x ./gradlew + + - name: Run unit tests + run: ./gradlew formz:testDebugUnitTest + + - name: Upload test results + if: always() + uses: actions/upload-artifact@v4 + with: + name: test-results + path: '**/build/test-results/testDebugUnitTest/' + + - name: Build library + run: ./gradlew formz:build + + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + with: + name: build-artifacts + path: | + **/build/outputs/aar/*.aar + **/build/libs/*.jar