From 648850f1c8dc369cc1919e6e7966fa0c36d3e4e7 Mon Sep 17 00:00:00 2001 From: Danil Nikolaev Date: Sun, 11 Aug 2024 14:53:32 +0300 Subject: [PATCH] gradle build convention --- .github/workflows/android_dev.yml | 46 -------- .github/workflows/android_master.yml | 4 +- app/build.gradle.kts | 51 +-------- .../fast/common/di/ApplicationModule.kt | 8 +- .../staging/res/mipmap-hdpi/ic_launcher.png | Bin 3284 -> 0 bytes .../staging/res/mipmap-mdpi/ic_launcher.png | Bin 1977 -> 0 bytes .../staging/res/mipmap-xhdpi/ic_launcher.png | Bin 4572 -> 0 bytes .../staging/res/mipmap-xxhdpi/ic_launcher.png | Bin 7245 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 10585 -> 0 bytes .../res/values/ic_launcher_background.xml | 4 - app/src/staging/res/values/strings.xml | 4 - build-logic/convention/build.gradle.kts | 70 +++++++++++++ ...droidApplicationComposeConventionPlugin.kt | 18 ++++ .../AndroidApplicationConventionPlugin.kt | 22 ++++ .../kotlin/AndroidFeatureConventionPlugin.kt | 27 +++++ .../AndroidLibraryComposeConventionPlugin.kt | 18 ++++ .../kotlin/AndroidLibraryConventionPlugin.kt | 36 +++++++ .../kotlin/AndroidRoomConventionPlugin.kt | 31 ++++++ .../kotlin/AndroidTestConventionPlugin.kt | 22 ++++ .../main/kotlin/JvmLibraryConventionPlugin.kt | 14 +++ .../kotlin/dev/meloda/fast/AndroidCompose.kt | 23 ++++ .../meloda/fast/AndroidInstrumentedTests.kt | 19 ++++ .../kotlin/dev/meloda/fast/KotlinAndroid.kt | 62 +++++++++++ .../dev/meloda/fast/ProjectExtensions.kt | 9 ++ build-logic/gradle.properties | 4 + build-logic/settings.gradle.kts | 14 +++ build.gradle.kts | 33 ++---- buildSrc/build.gradle.kts | 7 -- buildSrc/settings.gradle.kts | 1 - buildSrc/src/main/kotlin/Configs.kt | 13 --- core/common/build.gradle.kts | 31 +----- core/data/build.gradle.kts | 23 +--- core/database/build.gradle.kts | 30 +----- core/datastore/build.gradle.kts | 23 +--- core/designsystem/.gitignore | 1 - core/designsystem/build.gradle.kts | 52 ---------- core/model/build.gradle.kts | 27 +---- core/network/build.gradle.kts | 24 +---- core/ui/build.gradle.kts | 28 +---- feature/auth/build.gradle.kts | 64 +++++------- feature/auth/captcha/.gitignore | 1 - feature/auth/captcha/build.gradle.kts | 59 ----------- feature/auth/captcha/consumer-rules.pro | 0 feature/auth/captcha/proguard-rules.pro | 21 ---- feature/auth/login/.gitignore | 1 - feature/auth/login/build.gradle.kts | 98 ------------------ feature/auth/login/consumer-rules.pro | 0 feature/auth/login/proguard-rules.pro | 21 ---- .../meloda/fast/auth/login/LoginScreenTest.kt | 0 .../meloda/fast/auth/login/LogoScreenTest.kt | 0 .../kotlin/dev/meloda/fast/auth/AuthGraph.kt | 12 +-- .../fast/auth/captcha/CaptchaViewModel.kt | 0 .../meloda/fast/auth/captcha/di/CaptchaDI.kt | 0 .../auth/captcha/model/CaptchaScreenState.kt | 0 .../captcha/model/CaptchaValidationResult.kt | 0 .../captcha/navigation/CaptchaNavigation.kt | 0 .../captcha/presentation/CaptchaScreen.kt | 0 .../captcha/validation/CaptchaValidator.kt | 0 .../meloda/fast/auth/login/LoginViewModel.kt | 4 +- .../meloda/fast/auth/login/OAuthUseCase.kt | 0 .../fast/auth/login/OAuthUseCaseImpl.kt | 0 .../meloda/fast/auth/login/di/LoginModule.kt | 2 +- .../meloda/fast/auth/login/model/AuthInfo.kt | 0 .../fast/auth/login/model/CaptchaArguments.kt | 0 .../fast/auth/login/model/LoginError.kt | 0 .../fast/auth/login/model/LoginScreenState.kt | 0 .../login/model/LoginUserBannedArguments.kt | 0 .../login/model/LoginValidationArguments.kt | 0 .../auth/login/model/LoginValidationResult.kt | 0 .../auth/login/navigation/LoginNavigation.kt | 4 +- .../auth/login/presentation/LoginScreen.kt | 2 +- .../auth/login/presentation/LogoScreen.kt | 6 +- .../auth/login/validation/LoginValidator.kt | 0 .../userbanned/model/UserBannedArguments.kt | 0 .../userbanned/model/UserBannedScreenState.kt | 0 .../navigation/UserBannedNavigation.kt | 0 .../presentation/UserBannedScreen.kt | 0 .../fast/auth/validation/AuthUseCase.kt | 0 .../fast/auth/validation/AuthUseCaseImpl.kt | 0 .../auth/validation/ValidationViewModel.kt | 0 .../auth/validation/di/ValidationModule.kt | 0 .../validation/model/ValidationArguments.kt | 0 .../validation/model/ValidationScreenState.kt | 0 .../auth/validation/model/ValidationType.kt | 0 .../model/ValidationValidationResult.kt | 0 .../navigation/ValidationNavigation.kt | 0 .../presentation/ValidationScreen.kt | 0 .../validation/ValidationValidator.kt | 0 feature/auth/userbanned/.gitignore | 1 - feature/auth/userbanned/build.gradle.kts | 62 ----------- feature/auth/validation/.gitignore | 1 - feature/auth/validation/build.gradle.kts | 60 ----------- feature/auth/validation/consumer-rules.pro | 0 feature/auth/validation/proguard-rules.pro | 21 ---- feature/chatmaterials/build.gradle.kts | 35 +------ feature/conversations/build.gradle.kts | 34 +----- feature/friends/build.gradle.kts | 34 +----- feature/friends/consumer-rules.pro | 0 feature/friends/proguard-rules.pro | 21 ---- feature/languagepicker/build.gradle.kts | 35 +------ feature/messageshistory/build.gradle.kts | 35 +------ feature/photoviewer/build.gradle.kts | 35 +------ feature/profile/build.gradle.kts | 36 +------ feature/profile/consumer-rules.pro | 0 feature/profile/proguard-rules.pro | 21 ---- feature/settings/build.gradle.kts | 35 +------ gradle/libs.versions.toml | 40 ++++++- settings.gradle.kts | 6 +- 108 files changed, 517 insertions(+), 1089 deletions(-) delete mode 100644 .github/workflows/android_dev.yml delete mode 100644 app/src/staging/res/mipmap-hdpi/ic_launcher.png delete mode 100644 app/src/staging/res/mipmap-mdpi/ic_launcher.png delete mode 100644 app/src/staging/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 app/src/staging/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 app/src/staging/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 app/src/staging/res/values/ic_launcher_background.xml delete mode 100644 app/src/staging/res/values/strings.xml create mode 100644 build-logic/convention/build.gradle.kts create mode 100644 build-logic/convention/src/main/kotlin/AndroidApplicationComposeConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/AndroidRoomConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/AndroidTestConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/JvmLibraryConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/dev/meloda/fast/AndroidCompose.kt create mode 100644 build-logic/convention/src/main/kotlin/dev/meloda/fast/AndroidInstrumentedTests.kt create mode 100644 build-logic/convention/src/main/kotlin/dev/meloda/fast/KotlinAndroid.kt create mode 100644 build-logic/convention/src/main/kotlin/dev/meloda/fast/ProjectExtensions.kt create mode 100644 build-logic/gradle.properties create mode 100644 build-logic/settings.gradle.kts delete mode 100644 buildSrc/build.gradle.kts delete mode 100644 buildSrc/settings.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/Configs.kt delete mode 100644 core/designsystem/.gitignore delete mode 100644 core/designsystem/build.gradle.kts delete mode 100644 feature/auth/captcha/.gitignore delete mode 100644 feature/auth/captcha/build.gradle.kts delete mode 100644 feature/auth/captcha/consumer-rules.pro delete mode 100644 feature/auth/captcha/proguard-rules.pro delete mode 100644 feature/auth/login/.gitignore delete mode 100644 feature/auth/login/build.gradle.kts delete mode 100644 feature/auth/login/consumer-rules.pro delete mode 100644 feature/auth/login/proguard-rules.pro rename feature/auth/{login => }/src/androidTest/kotlin/dev/meloda/fast/auth/login/LoginScreenTest.kt (100%) rename feature/auth/{login => }/src/androidTest/kotlin/dev/meloda/fast/auth/login/LogoScreenTest.kt (100%) rename feature/auth/{captcha => }/src/main/kotlin/dev/meloda/fast/auth/captcha/CaptchaViewModel.kt (100%) rename feature/auth/{captcha => }/src/main/kotlin/dev/meloda/fast/auth/captcha/di/CaptchaDI.kt (100%) rename feature/auth/{captcha => }/src/main/kotlin/dev/meloda/fast/auth/captcha/model/CaptchaScreenState.kt (100%) rename feature/auth/{captcha => }/src/main/kotlin/dev/meloda/fast/auth/captcha/model/CaptchaValidationResult.kt (100%) rename feature/auth/{captcha => }/src/main/kotlin/dev/meloda/fast/auth/captcha/navigation/CaptchaNavigation.kt (100%) rename feature/auth/{captcha => }/src/main/kotlin/dev/meloda/fast/auth/captcha/presentation/CaptchaScreen.kt (100%) rename feature/auth/{captcha => }/src/main/kotlin/dev/meloda/fast/auth/captcha/validation/CaptchaValidator.kt (100%) rename feature/auth/{login => }/src/main/kotlin/dev/meloda/fast/auth/login/LoginViewModel.kt (99%) rename feature/auth/{login => }/src/main/kotlin/dev/meloda/fast/auth/login/OAuthUseCase.kt (100%) rename feature/auth/{login => }/src/main/kotlin/dev/meloda/fast/auth/login/OAuthUseCaseImpl.kt (100%) rename feature/auth/{login => }/src/main/kotlin/dev/meloda/fast/auth/login/di/LoginModule.kt (85%) rename feature/auth/{login => }/src/main/kotlin/dev/meloda/fast/auth/login/model/AuthInfo.kt (100%) rename feature/auth/{login => }/src/main/kotlin/dev/meloda/fast/auth/login/model/CaptchaArguments.kt (100%) rename feature/auth/{login => }/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginError.kt (100%) rename feature/auth/{login => }/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginScreenState.kt (100%) rename feature/auth/{login => }/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginUserBannedArguments.kt (100%) rename feature/auth/{login => }/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginValidationArguments.kt (100%) rename feature/auth/{login => }/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginValidationResult.kt (100%) rename feature/auth/{login => }/src/main/kotlin/dev/meloda/fast/auth/login/navigation/LoginNavigation.kt (91%) rename feature/auth/{login => }/src/main/kotlin/dev/meloda/fast/auth/login/presentation/LoginScreen.kt (99%) rename feature/auth/{login => }/src/main/kotlin/dev/meloda/fast/auth/login/presentation/LogoScreen.kt (97%) rename feature/auth/{login => }/src/main/kotlin/dev/meloda/fast/auth/login/validation/LoginValidator.kt (100%) rename feature/auth/{userbanned => }/src/main/kotlin/dev/meloda/fast/auth/userbanned/model/UserBannedArguments.kt (100%) rename feature/auth/{userbanned => }/src/main/kotlin/dev/meloda/fast/auth/userbanned/model/UserBannedScreenState.kt (100%) rename feature/auth/{userbanned => }/src/main/kotlin/dev/meloda/fast/auth/userbanned/navigation/UserBannedNavigation.kt (100%) rename feature/auth/{userbanned => }/src/main/kotlin/dev/meloda/fast/auth/userbanned/presentation/UserBannedScreen.kt (100%) rename feature/auth/{validation => }/src/main/kotlin/dev/meloda/fast/auth/validation/AuthUseCase.kt (100%) rename feature/auth/{validation => }/src/main/kotlin/dev/meloda/fast/auth/validation/AuthUseCaseImpl.kt (100%) rename feature/auth/{validation => }/src/main/kotlin/dev/meloda/fast/auth/validation/ValidationViewModel.kt (100%) rename feature/auth/{validation => }/src/main/kotlin/dev/meloda/fast/auth/validation/di/ValidationModule.kt (100%) rename feature/auth/{validation => }/src/main/kotlin/dev/meloda/fast/auth/validation/model/ValidationArguments.kt (100%) rename feature/auth/{validation => }/src/main/kotlin/dev/meloda/fast/auth/validation/model/ValidationScreenState.kt (100%) rename feature/auth/{validation => }/src/main/kotlin/dev/meloda/fast/auth/validation/model/ValidationType.kt (100%) rename feature/auth/{validation => }/src/main/kotlin/dev/meloda/fast/auth/validation/model/ValidationValidationResult.kt (100%) rename feature/auth/{validation => }/src/main/kotlin/dev/meloda/fast/auth/validation/navigation/ValidationNavigation.kt (100%) rename feature/auth/{validation => }/src/main/kotlin/dev/meloda/fast/auth/validation/presentation/ValidationScreen.kt (100%) rename feature/auth/{validation => }/src/main/kotlin/dev/meloda/fast/auth/validation/validation/ValidationValidator.kt (100%) delete mode 100644 feature/auth/userbanned/.gitignore delete mode 100644 feature/auth/userbanned/build.gradle.kts delete mode 100644 feature/auth/validation/.gitignore delete mode 100644 feature/auth/validation/build.gradle.kts delete mode 100644 feature/auth/validation/consumer-rules.pro delete mode 100644 feature/auth/validation/proguard-rules.pro delete mode 100644 feature/friends/consumer-rules.pro delete mode 100644 feature/friends/proguard-rules.pro delete mode 100644 feature/profile/consumer-rules.pro delete mode 100644 feature/profile/proguard-rules.pro diff --git a/.github/workflows/android_dev.yml b/.github/workflows/android_dev.yml deleted file mode 100644 index b42b223e..00000000 --- a/.github/workflows/android_dev.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: Android CI - -on: - push: - branches: [ "dev" ] - -env: - KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} - RELEASE_SIGN_KEY_ALIAS: ${{ secrets.RELEASE_SIGN_KEY_ALIAS }} - RELEASE_SIGN_KEY_PASSWORD: ${{ secrets.RELEASE_SIGN_KEY_PASSWORD }} - -jobs: - build_apk_aab: - runs-on: ubuntu-latest - name: Build artifacts - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: set up JDK 17 - uses: actions/setup-java@v4 - with: - java-version: '17' - distribution: 'temurin' - cache: gradle - - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - - name: Build and sign debug APKs - run: ./gradlew assembleDebug - - - name: Upload debug APK - uses: actions/upload-artifact@v4 - with: - name: app-debug.apk - path: app/build/outputs/apk/amethyst/debug/app-amethyst-debug.apk - - - name: Build and sign release APKs - run: ./gradlew assembleRelease - - - name: Upload release APK - uses: actions/upload-artifact@v4 - with: - name: app-release.apk - path: app/build/outputs/apk/amethyst/release/app-amethyst-release.apk diff --git a/.github/workflows/android_master.yml b/.github/workflows/android_master.yml index e2f588c6..254f13b9 100644 --- a/.github/workflows/android_master.yml +++ b/.github/workflows/android_master.yml @@ -34,7 +34,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: app-debug.apk - path: app/build/outputs/apk/amethyst/debug/app-amethyst-debug.apk + path: app/build/outputs/apk/debug/app-debug.apk - name: Build and sign release APKs run: ./gradlew assembleRelease @@ -43,4 +43,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: app-release.apk - path: app/build/outputs/apk/amethyst/release/app-amethyst-release.apk + path: app/build/outputs/apk/release/app-release.apk diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6464dbbf..e7308d7f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,26 +1,19 @@ import java.util.Properties plugins { - alias(libs.plugins.com.android.application) - alias(libs.plugins.org.jetbrains.kotlin.android) - alias(libs.plugins.org.jetbrains.kotlin.plugin.parcelize) - alias(libs.plugins.com.google.devtools.ksp) - alias(libs.plugins.kotlin.compose.compiler) + alias(libs.plugins.fast.android.application) + alias(libs.plugins.fast.android.application.compose) alias(libs.plugins.kotlin.serialization) } android { namespace = "dev.meloda.fast" - compileSdk = Configs.compileSdk defaultConfig { applicationId = "dev.meloda.fast" - minSdk = Configs.minSdk - targetSdk = Configs.targetSdk - versionCode = Configs.appCode - versionName = Configs.appName - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + versionCode = 4 + versionName = "0.1.1" } signingConfigs { @@ -63,40 +56,6 @@ android { "proguard-rules.pro" ) } - - // TODO: 15/05/2024, Danil Nikolaev: add to other modules with build convention - register("staging") { - initWith(getByName("release")) - applicationIdSuffix = ".staging" - } - } - - val flavorDimension = "variant" - flavorDimensions += flavorDimension - - productFlavors { - register("amethyst") { - dimension = flavorDimension - isDefault = true - } - } - - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - - kotlinOptions { - jvmTarget = Configs.java.toString() - freeCompilerArgs = listOf("-opt-in=kotlin.RequiresOptIn", "-Xcontext-receivers") - } - - buildFeatures { - compose = true - } - - composeOptions { - useLiveLiterals = true } packaging { @@ -108,6 +67,7 @@ android { dependencies { implementation(projects.feature.auth) + implementation(projects.feature.chatmaterials) implementation(projects.feature.conversations) implementation(projects.feature.languagepicker) @@ -120,7 +80,6 @@ dependencies { implementation(projects.core.common) implementation(projects.core.ui) - implementation(projects.core.designsystem) implementation(projects.core.data) implementation(projects.core.model) implementation(projects.core.datastore) diff --git a/app/src/main/kotlin/dev/meloda/fast/common/di/ApplicationModule.kt b/app/src/main/kotlin/dev/meloda/fast/common/di/ApplicationModule.kt index 4cbcb03f..5a25d60c 100644 --- a/app/src/main/kotlin/dev/meloda/fast/common/di/ApplicationModule.kt +++ b/app/src/main/kotlin/dev/meloda/fast/common/di/ApplicationModule.kt @@ -5,7 +5,9 @@ import android.content.res.Resources import android.os.PowerManager import androidx.preference.PreferenceManager import dev.meloda.fast.MainViewModelImpl -import dev.meloda.fast.auth.authModule +import dev.meloda.fast.auth.captcha.di.captchaModule +import dev.meloda.fast.auth.login.di.loginModule +import dev.meloda.fast.auth.validation.di.validationModule import dev.meloda.fast.chatmaterials.di.chatMaterialsModule import dev.meloda.fast.common.provider.Provider import dev.meloda.fast.conversations.di.conversationsModule @@ -28,7 +30,9 @@ import org.koin.dsl.module val applicationModule = module { includes(dataModule) includes( - authModule, + loginModule, + validationModule, + captchaModule, conversationsModule, settingsModule, messagesHistoryModule, diff --git a/app/src/staging/res/mipmap-hdpi/ic_launcher.png b/app/src/staging/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 198f18ea30034e91156bcb4c68ae90d0b07636d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3284 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 SU77{}0000GHjVYDwbj@ojkT#g)g~s|rbXH& z)&?x4ZA`6ggRxrTQAE4~9_+G6jaEQg51LjYFn!;fdBg0R0d|JPKl!r5&j0@R{qOz% z|Bl7aZ@?n@+wJ0m%dNEm_~hU6;;Ae8^Y8DQZ1fW!NKQU9g#R95Pd*n|XlT7XSUAi5~GKf_rMA&Hb#y=H5}5==#lJbGZmw9YW(x3OtkVq<2Jz=%S6< z#(i-FQ_r3;q6N05B0{XPz}DFAur-PWHkSdQ4cayp6~(kXq}PWJMT&Fw>=4{5^KGsM z57L6G+mYz%@&?dVJ40;|n=B`!8TL_rs1vg&>5`3%S~Vk1!lNtS=Ddeb?Fjb`y|xaU zvl@Nq^=(Sj21x9#CFo?GlMtZKzCmLra|C^mL0YTF!H}pMk}3a`jXFk+4*{Qm*rc}Q zza7HG9eP~65_L6j2(B`a#|Y8*O(@V@FyKT_@)QWpVoF|R)CksP zHH%+tY898KG-=-T1@&O%Ce)Ys$xe8c*sR7E*qm#WkvBnp*?hP7-Dfu_%0IcTdEXzD zeg&s!x1L(3=GLpQ8eEXjASelIGHgn>wJ8n&{CjUeXPyjVzHqTKJNDR2HAju8<33+- zR>Ocgsf^%*7p{1aH|qevIM@@;)DUWvqwb2$riYMU!9vGOwOKmPEq+_#Nq!&>&;=4} zhR`5p#UEd-=BfzuXu0*zkwmdUYHY5~mu>e99RLpTdd5K32{Nd5>uKl0(9%cLoT)I6 z@)GKbl+o81=^yW{(uNLDS#eXNYZTHfTof~74lPx4_EVRpJmEqml+DJzUg%U5-w;n! zwQF>Zf^o`M)|z4ka@)fKthmheOrB-tmb8w5;0PWL>ChPmA1b z0cXmcl_h(^*`;*5U?Oo}&HY0|9{6F`UzEHr9FWl1jWBvD=D;d&rrg;KCwNG63zjXyS$a~&xrncHC4n`!o+rh2Tz#C=9jK&+Vly^ ziEJejFNpKQzj_&*J+=}vLbt||M7|AWGn+XcJYhB3u6Ahj`-On`cjIJsCqDSKBvte% z+v&h8>xqL+jEI_qW1G~_+>w%jCk|X`x~tLi4$_e_Gw!Hs)bQ|N zHD^U+kA|m2maV6=KoVvkv%r(@?CcU(rW(88qVOF3x4=cmpN&ryn>)xIF=acE1Y!Yew0#Vb2s(*@;o}!gs!pnv3Z}3DYs&C$3-XP#kz}zIXe54@hORJ2$ajoI9;} z3pnY9j#f~b?3kj7X_h@@ID-;Hxa2bA#0nDc*zmov+AhLXpLmWeC!Gh+7FO0&_ZcEs34u(Z-kKk^Y9umzhLF_pEE6P7v97y2|D zHoc4JZ?SBI6SxV8m=m`Boy^!OC#D*NFzpmLaCie*A8la+wq}QIdzaXbL?2RLUM8#& zk!vtQYJ5PzsJNui&Fj;n_f=(EYj0r$r4<|w(b?f39~+4dR#m(8O3wqO&s z`>pc>7tvqtWCX!Df@xF6rl-#e+xli|WJP(#^!?R~UlIL5!fvS;D(4BC9sK{p!!q!U?*gEMla%EAz~lUX6bf^1B-qF+00000 LNkvXXu0mjfSp(H~ diff --git a/app/src/staging/res/mipmap-xhdpi/ic_launcher.png b/app/src/staging/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 37a31bb61188180dae9f837eb8827abdfcaa037c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4572 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 - - #5B37DD - diff --git a/app/src/staging/res/values/strings.xml b/app/src/staging/res/values/strings.xml deleted file mode 100644 index aef1013b..00000000 --- a/app/src/staging/res/values/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - Fast Staging - diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts new file mode 100644 index 00000000..4796dcd8 --- /dev/null +++ b/build-logic/convention/build.gradle.kts @@ -0,0 +1,70 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + `kotlin-dsl` +} + +group = "dev.meloda.fast.buildlogic" + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +kotlin { + compilerOptions { + jvmTarget = JvmTarget.JVM_17 + } +} + +dependencies { + compileOnly(libs.kotlin.gradlePlugin) + compileOnly(libs.android.gradlePlugin) + compileOnly(libs.compose.gradlePlugin) + compileOnly(libs.ksp.gradlePlugin) + compileOnly(libs.room.gradlePlugin) +} + +tasks { + validatePlugins { + enableStricterValidation = true + failOnWarning = true + } +} + +gradlePlugin { + plugins { + register("androidApplicationCompose") { + id = "fast.android.application.compose" + implementationClass = "AndroidApplicationComposeConventionPlugin" + } + register("androidApplication") { + id = "fast.android.application" + implementationClass = "AndroidApplicationConventionPlugin" + } + register("androidLibraryCompose") { + id = "fast.android.library.compose" + implementationClass = "AndroidLibraryComposeConventionPlugin" + } + register("androidLibrary") { + id = "fast.android.library" + implementationClass = "AndroidLibraryConventionPlugin" + } + register("androidFeature") { + id = "fast.android.feature" + implementationClass = "AndroidFeatureConventionPlugin" + } + register("androidTest") { + id = "fast.android.test" + implementationClass = "AndroidTestConventionPlugin" + } + register("androidRoom") { + id = "fast.android.room" + implementationClass = "AndroidRoomConventionPlugin" + } + register("jvmLibrary") { + id = "fast.jvm.library" + implementationClass = "JvmLibraryConventionPlugin" + } + } +} diff --git a/build-logic/convention/src/main/kotlin/AndroidApplicationComposeConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidApplicationComposeConventionPlugin.kt new file mode 100644 index 00000000..1ad0d7fc --- /dev/null +++ b/build-logic/convention/src/main/kotlin/AndroidApplicationComposeConventionPlugin.kt @@ -0,0 +1,18 @@ +import com.android.build.api.dsl.ApplicationExtension +import dev.meloda.fast.configureAndroidCompose +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.getByType + +class AndroidApplicationComposeConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + apply(plugin = "com.android.application") + apply(plugin = "org.jetbrains.kotlin.plugin.compose") + + val extension = extensions.getByType() + configureAndroidCompose(extension) + } + } +} diff --git a/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt new file mode 100644 index 00000000..62a7b7fb --- /dev/null +++ b/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt @@ -0,0 +1,22 @@ +import com.android.build.api.dsl.ApplicationExtension +import dev.meloda.fast.configureKotlinAndroid +import dev.meloda.fast.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure + +class AndroidApplicationConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + with(pluginManager) { + apply("com.android.application") + apply("org.jetbrains.kotlin.android") + } + + extensions.configure { + configureKotlinAndroid(this) + defaultConfig.targetSdk = libs.findVersion("targetSdk").get().toString().toInt() + } + } + } +} diff --git a/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt new file mode 100644 index 00000000..d11e15fc --- /dev/null +++ b/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt @@ -0,0 +1,27 @@ +import dev.meloda.fast.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.kotlin + +class AndroidFeatureConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + pluginManager.apply { + apply("fast.android.library") + } + + dependencies { + add("implementation", project(":core:common")) + add("implementation", project(":core:data")) + add("implementation", project(":core:model")) + add("implementation", project(":core:ui")) + + add("testImplementation", kotlin("test")) + add("androidTestImplementation", kotlin("test")) + + add("implementation", libs.findBundle("nanokt").get()) + } + } + } +} diff --git a/build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt new file mode 100644 index 00000000..a71f64dd --- /dev/null +++ b/build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt @@ -0,0 +1,18 @@ +import com.android.build.gradle.LibraryExtension +import dev.meloda.fast.configureAndroidCompose +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.getByType + +class AndroidLibraryComposeConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + apply(plugin = "com.android.library") + apply(plugin = "org.jetbrains.kotlin.plugin.compose") + + val extension = extensions.getByType() + configureAndroidCompose(extension) + } + } +} diff --git a/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt new file mode 100644 index 00000000..5d6e3c27 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt @@ -0,0 +1,36 @@ +import com.android.build.api.variant.LibraryAndroidComponentsExtension +import com.android.build.gradle.LibraryExtension +import dev.meloda.fast.configureKotlinAndroid +import dev.meloda.fast.disableUnnecessaryAndroidTests +import dev.meloda.fast.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.kotlin + +class AndroidLibraryConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + with(pluginManager) { + apply("com.android.library") + apply("org.jetbrains.kotlin.android") + apply("org.jetbrains.kotlin.plugin.parcelize") + apply("org.jetbrains.kotlin.plugin.serialization") + } + + extensions.configure { + configureKotlinAndroid(this) + defaultConfig.targetSdk = libs.findVersion("targetSdk").get().toString().toInt() + defaultConfig.testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + extensions.configure { + disableUnnecessaryAndroidTests(target) + } + dependencies { + add("androidTestImplementation", kotlin("test")) + add("testImplementation", kotlin("test")) + } + } + } +} diff --git a/build-logic/convention/src/main/kotlin/AndroidRoomConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidRoomConventionPlugin.kt new file mode 100644 index 00000000..3c97102b --- /dev/null +++ b/build-logic/convention/src/main/kotlin/AndroidRoomConventionPlugin.kt @@ -0,0 +1,31 @@ +import androidx.room.gradle.RoomExtension +import com.google.devtools.ksp.gradle.KspExtension +import dev.meloda.fast.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.dependencies + +class AndroidRoomConventionPlugin : Plugin { + + override fun apply(target: Project) { + with(target) { + pluginManager.apply("androidx.room") + pluginManager.apply("com.google.devtools.ksp") + + extensions.configure { + arg("room.generateKotlin", "true") + } + + extensions.configure { + schemaDirectory("$projectDir/schemas") + } + + dependencies { + add("implementation", libs.findLibrary("room.runtime").get()) + add("implementation", libs.findLibrary("room.ktx").get()) + add("ksp", libs.findLibrary("room.compiler").get()) + } + } + } +} diff --git a/build-logic/convention/src/main/kotlin/AndroidTestConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidTestConventionPlugin.kt new file mode 100644 index 00000000..d032c87c --- /dev/null +++ b/build-logic/convention/src/main/kotlin/AndroidTestConventionPlugin.kt @@ -0,0 +1,22 @@ +import com.android.build.gradle.TestExtension +import dev.meloda.fast.configureKotlinAndroid +import dev.meloda.fast.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure + +class AndroidTestConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + with(pluginManager) { + apply("com.android.test") + apply("org.jetbrains.kotlin.android") + } + + extensions.configure { + configureKotlinAndroid(this) + defaultConfig.targetSdk = libs.findVersion("targetSdk").get().toString().toInt() + } + } + } +} diff --git a/build-logic/convention/src/main/kotlin/JvmLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/JvmLibraryConventionPlugin.kt new file mode 100644 index 00000000..c847650b --- /dev/null +++ b/build-logic/convention/src/main/kotlin/JvmLibraryConventionPlugin.kt @@ -0,0 +1,14 @@ +import dev.meloda.fast.configureKotlinJvm +import org.gradle.api.Plugin +import org.gradle.api.Project + +class JvmLibraryConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + with(pluginManager) { + apply("org.jetbrains.kotlin.jvm") + } + configureKotlinJvm() + } + } +} diff --git a/build-logic/convention/src/main/kotlin/dev/meloda/fast/AndroidCompose.kt b/build-logic/convention/src/main/kotlin/dev/meloda/fast/AndroidCompose.kt new file mode 100644 index 00000000..204fee29 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/dev/meloda/fast/AndroidCompose.kt @@ -0,0 +1,23 @@ +package dev.meloda.fast + +import com.android.build.api.dsl.CommonExtension +import org.gradle.api.Project +import org.gradle.kotlin.dsl.dependencies + +internal fun Project.configureAndroidCompose( + commonExtension: CommonExtension<*, *, *, *, *, *>, +) { + commonExtension.apply { + buildFeatures { + compose = true + } + + dependencies { + val bom = libs.findLibrary("compose-bom").get() + add("implementation", platform(bom)) + add("androidTestImplementation", platform(bom)) + add("implementation", libs.findLibrary("compose-ui-tooling-preview").get()) + add("debugImplementation", libs.findLibrary("compose-ui-tooling").get()) + } + } +} diff --git a/build-logic/convention/src/main/kotlin/dev/meloda/fast/AndroidInstrumentedTests.kt b/build-logic/convention/src/main/kotlin/dev/meloda/fast/AndroidInstrumentedTests.kt new file mode 100644 index 00000000..b9212954 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/dev/meloda/fast/AndroidInstrumentedTests.kt @@ -0,0 +1,19 @@ +package dev.meloda.fast + +import com.android.build.api.variant.LibraryAndroidComponentsExtension +import org.gradle.api.Project + +/** + * Disable unnecessary Android instrumented tests for the [project] if there is no `androidTest` folder. + * Otherwise, these projects would be compiled, packaged, installed and ran only to end-up with the following message: + * + * > Starting 0 tests on AVD + * + * Note: this could be improved by checking other potential sourceSets based on buildTypes and flavors. + */ +internal fun LibraryAndroidComponentsExtension.disableUnnecessaryAndroidTests( + project: Project, +) = beforeVariants { + it.enableAndroidTest = it.enableAndroidTest + && project.projectDir.resolve("src/androidTest").exists() +} diff --git a/build-logic/convention/src/main/kotlin/dev/meloda/fast/KotlinAndroid.kt b/build-logic/convention/src/main/kotlin/dev/meloda/fast/KotlinAndroid.kt new file mode 100644 index 00000000..20e36b56 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/dev/meloda/fast/KotlinAndroid.kt @@ -0,0 +1,62 @@ +package dev.meloda.fast + +import com.android.build.api.dsl.CommonExtension +import org.gradle.api.JavaVersion +import org.gradle.api.Project +import org.gradle.api.plugins.JavaPluginExtension +import org.gradle.kotlin.dsl.assign +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.provideDelegate +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension +import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension +import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtension + +internal fun Project.configureKotlinAndroid( + commonExtension: CommonExtension<*, *, *, *, *, *>, +) { + commonExtension.apply { + compileSdk = libs.findVersion("compileSdk").get().toString().toInt() + + defaultConfig { + minSdk = libs.findVersion("minSdk").get().toString().toInt() + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + } + + configureKotlin() +} + +internal fun Project.configureKotlinJvm() { + extensions.configure { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + configureKotlin() +} + +private inline fun Project.configureKotlin() = configure { + // Treat all Kotlin warnings as errors (disabled by default) + // Override by setting warningsAsErrors=true in your ~/.gradle/gradle.properties + val warningsAsErrors: String? by project + when (this) { + is KotlinAndroidProjectExtension -> compilerOptions + is KotlinJvmProjectExtension -> compilerOptions + else -> TODO("Unsupported project extension $this ${T::class}") + }.apply { + jvmTarget = JvmTarget.JVM_17 + allWarningsAsErrors = warningsAsErrors.toBoolean() + freeCompilerArgs.addAll( + "-opt-in=kotlin.RequiresOptIn", + // Enable experimental coroutines APIs, including Flow + "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", + "-opt-in=kotlinx.coroutines.FlowPreview", + "-Xcontext-receivers" + ) + } +} diff --git a/build-logic/convention/src/main/kotlin/dev/meloda/fast/ProjectExtensions.kt b/build-logic/convention/src/main/kotlin/dev/meloda/fast/ProjectExtensions.kt new file mode 100644 index 00000000..6775041d --- /dev/null +++ b/build-logic/convention/src/main/kotlin/dev/meloda/fast/ProjectExtensions.kt @@ -0,0 +1,9 @@ +package dev.meloda.fast + +import org.gradle.api.Project +import org.gradle.api.artifacts.VersionCatalog +import org.gradle.api.artifacts.VersionCatalogsExtension +import org.gradle.kotlin.dsl.getByType + +val Project.libs + get(): VersionCatalog = extensions.getByType().named("libs") diff --git a/build-logic/gradle.properties b/build-logic/gradle.properties new file mode 100644 index 00000000..1c9073eb --- /dev/null +++ b/build-logic/gradle.properties @@ -0,0 +1,4 @@ +# Gradle properties are not passed to included builds https://github.com/gradle/gradle/issues/2534 +org.gradle.parallel=true +org.gradle.caching=true +org.gradle.configureondemand=true diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts new file mode 100644 index 00000000..2907fbfb --- /dev/null +++ b/build-logic/settings.gradle.kts @@ -0,0 +1,14 @@ +dependencyResolutionManagement { + repositories { + google() + mavenCentral() + } + versionCatalogs { + create("libs") { + from(files("../gradle/libs.versions.toml")) + } + } +} + +rootProject.name = "build-logic" +include(":convention") diff --git a/build.gradle.kts b/build.gradle.kts index 31f5fa8b..44761e5e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,28 +1,11 @@ -import dev.iurysouza.modulegraph.Theme - plugins { - alias(libs.plugins.com.android.application) apply false - alias(libs.plugins.org.jetbrains.kotlin.android) apply false - alias(libs.plugins.org.jetbrains.kotlin.plugin.parcelize) apply false + alias(libs.plugins.android.application) apply false alias(libs.plugins.android.library) apply false - - id("dev.iurysouza.modulegraph") version "0.10.0" -} - -moduleGraphConfig { - readmePath.set("${rootDir}/README.md") - heading.set("### Module Graph") - theme.set( - Theme.BASE( - mapOf( - "primaryTextColor" to "#fff", - "primaryColor" to "#5a4f7c", - "primaryBorderColor" to "#5a4f7c", - "lineColor" to "#f5a623", - "tertiaryColor" to "#40375c", - "fontSize" to "12px", - ), - focusColor = "#FA8140" - ), - ) +// alias(libs.plugins.org.jetbrains.kotlin.android) apply false + alias(libs.plugins.kotlin.parcelize) apply false + alias(libs.plugins.kotlin.serialization) apply false + alias(libs.plugins.compose) apply false + alias(libs.plugins.kotlin.jvm) apply false + alias(libs.plugins.room) apply false + alias(libs.plugins.ksp) apply false } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts deleted file mode 100644 index b6413e30..00000000 --- a/buildSrc/build.gradle.kts +++ /dev/null @@ -1,7 +0,0 @@ -plugins { - `kotlin-dsl` -} - -repositories { - mavenCentral() -} diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts deleted file mode 100644 index 29744ec1..00000000 --- a/buildSrc/settings.gradle.kts +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = "buildSrc" diff --git a/buildSrc/src/main/kotlin/Configs.kt b/buildSrc/src/main/kotlin/Configs.kt deleted file mode 100644 index 5fce0f04..00000000 --- a/buildSrc/src/main/kotlin/Configs.kt +++ /dev/null @@ -1,13 +0,0 @@ -import org.gradle.api.JavaVersion - -object Configs { - - const val appCode = 4 - const val appName = "0.1.1" - - const val compileSdk = 35 - const val minSdk = 24 - const val targetSdk = 35 - - val java = JavaVersion.VERSION_17 -} diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts index 9798f5f9..d6cbbc64 100644 --- a/core/common/build.gradle.kts +++ b/core/common/build.gradle.kts @@ -1,37 +1,10 @@ plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) - alias(libs.plugins.kotlin.serialization) - alias(libs.plugins.org.jetbrains.kotlin.plugin.parcelize) - alias(libs.plugins.kotlin.compose.compiler) + alias(libs.plugins.fast.android.library) + alias(libs.plugins.fast.android.library.compose) } -group = "dev.meloda.fast.common" - android { namespace = "dev.meloda.fast.common" - compileSdk = Configs.compileSdk - - defaultConfig { - minSdk = Configs.minSdk - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - freeCompilerArgs = listOf("-opt-in=kotlin.RequiresOptIn", "-Xcontext-receivers") - } - buildFeatures { - compose = true - } } dependencies { diff --git a/core/data/build.gradle.kts b/core/data/build.gradle.kts index bf997504..f3fc8d86 100644 --- a/core/data/build.gradle.kts +++ b/core/data/build.gradle.kts @@ -1,30 +1,9 @@ plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) + alias(libs.plugins.fast.android.library) } -group = "dev.meloda.fast.data" - android { namespace = "dev.meloda.fast.data" - compileSdk = Configs.compileSdk - - defaultConfig { - minSdk = Configs.minSdk - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - } } dependencies { diff --git a/core/database/build.gradle.kts b/core/database/build.gradle.kts index cd6634f3..4c7cc896 100644 --- a/core/database/build.gradle.kts +++ b/core/database/build.gradle.kts @@ -1,36 +1,10 @@ plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) - alias(libs.plugins.com.google.devtools.ksp) + alias(libs.plugins.fast.android.library) + alias(libs.plugins.fast.android.room) } -group = "dev.meloda.fast.database" - android { namespace = "dev.meloda.fast.database" - compileSdk = Configs.compileSdk - - defaultConfig { - minSdk = Configs.minSdk - } - - ksp { - arg("room.schemaLocation", "$projectDir/schemas") - arg("room.generateKotlin", "true") - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - } } dependencies { diff --git a/core/datastore/build.gradle.kts b/core/datastore/build.gradle.kts index 8c7785f3..64899285 100644 --- a/core/datastore/build.gradle.kts +++ b/core/datastore/build.gradle.kts @@ -1,30 +1,9 @@ plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) + alias(libs.plugins.fast.android.library) } -group = "dev.meloda.fast.datastore" - android { namespace = "dev.meloda.fast.datastore" - compileSdk = Configs.compileSdk - - defaultConfig { - minSdk = Configs.minSdk - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - } } dependencies { diff --git a/core/designsystem/.gitignore b/core/designsystem/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/core/designsystem/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/core/designsystem/build.gradle.kts b/core/designsystem/build.gradle.kts deleted file mode 100644 index 544dd601..00000000 --- a/core/designsystem/build.gradle.kts +++ /dev/null @@ -1,52 +0,0 @@ -plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) - alias(libs.plugins.kotlin.compose.compiler) -} - -group = "dev.meloda.fast.designsystem" - -android { - namespace = "dev.meloda.fast.designsystem" - - compileSdk = Configs.compileSdk - - defaultConfig { - minSdk = Configs.minSdk - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - } - buildFeatures { - compose = true - } - composeOptions { - useLiveLiterals = true - } -} - -dependencies { - implementation(projects.core.common) - implementation(projects.core.datastore) - implementation(projects.core.ui) - - implementation(libs.appcompat) - - implementation(platform(libs.compose.bom)) - implementation(libs.bundles.compose) - - implementation(libs.haze) - implementation(libs.haze.materials) - - debugImplementation(libs.compose.ui.tooling) -} diff --git a/core/model/build.gradle.kts b/core/model/build.gradle.kts index a0cdea44..3c8a9297 100644 --- a/core/model/build.gradle.kts +++ b/core/model/build.gradle.kts @@ -1,31 +1,10 @@ plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) - alias(libs.plugins.com.google.devtools.ksp) + alias(libs.plugins.fast.android.library) + alias(libs.plugins.ksp) } -group = "dev.meloda.fast.model" - android { - namespace = "dev.meloda.fast.model" - compileSdk = Configs.compileSdk - - defaultConfig { - minSdk = Configs.minSdk - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - } + namespace = "dev.meloda.fast.datastore" } dependencies { diff --git a/core/network/build.gradle.kts b/core/network/build.gradle.kts index 88f63b3e..167d47b7 100644 --- a/core/network/build.gradle.kts +++ b/core/network/build.gradle.kts @@ -1,31 +1,11 @@ plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) - alias(libs.plugins.com.google.devtools.ksp) + alias(libs.plugins.fast.android.library) + alias(libs.plugins.ksp) } -group = "dev.meloda.fast.network" - android { namespace = "dev.meloda.fast.network" - compileSdk = Configs.compileSdk - defaultConfig { - minSdk = Configs.minSdk - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - } buildFeatures { buildConfig = true } diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts index a1dea308..52b88a1b 100644 --- a/core/ui/build.gradle.kts +++ b/core/ui/build.gradle.kts @@ -1,34 +1,10 @@ plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) - alias(libs.plugins.kotlin.compose.compiler) + alias(libs.plugins.fast.android.library) + alias(libs.plugins.fast.android.library.compose) } -group = "dev.meloda.fast.ui" - android { namespace = "dev.meloda.fast.ui" - compileSdk = Configs.compileSdk - - defaultConfig { - minSdk = Configs.minSdk - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - } - buildFeatures { - compose = true - } } dependencies { diff --git a/feature/auth/build.gradle.kts b/feature/auth/build.gradle.kts index 133f68a4..392335d0 100644 --- a/feature/auth/build.gradle.kts +++ b/feature/auth/build.gradle.kts @@ -4,21 +4,18 @@ import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties val sdkPackage: String = getLocalProperty("sdkPackage", "\"\"") val sdkFingerprint: String = getLocalProperty("sdkFingerprint", "\"\"") +val debugUserId: String = getLocalProperty("userId", "\"0\"") +val debugAccessToken: String = getLocalProperty("accessToken", "\"\"") + fun getLocalProperty(key: String, defValue: String): String { return gradleLocalProperties(rootDir, providers).getProperty(key, defValue) } plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) - alias(libs.plugins.com.google.devtools.ksp) - alias(libs.plugins.kotlin.compose.compiler) - alias(libs.plugins.org.jetbrains.kotlin.plugin.parcelize) - alias(libs.plugins.kotlin.serialization) + alias(libs.plugins.fast.android.feature) + alias(libs.plugins.fast.android.library.compose) } -group = "dev.meloda.fast.auth" - androidComponents { onVariants { variant -> variant.buildConfigFields.apply { @@ -38,55 +35,50 @@ androidComponents { comment = "sdkFingerprint for VK" ) ) + put( + "debugUserId", + BuildConfigField( + type = "String", + value = debugUserId, + comment = "user id for debugging purposes" + ) + ) + put( + "debugAccessToken", + BuildConfigField( + type = "String", + value = debugAccessToken, + comment = "access token for debugging purposes" + ) + ) } } } android { namespace = "dev.meloda.fast.auth" - compileSdk = Configs.compileSdk - defaultConfig { - minSdk = Configs.minSdk - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - freeCompilerArgs = listOf("-opt-in=kotlin.RequiresOptIn", "-Xcontext-receivers") - } buildFeatures { - compose = true buildConfig = true } - - composeOptions { - useLiveLiterals = true - } } dependencies { implementation(projects.core.data) implementation(projects.core.ui) - implementation(projects.feature.conversations) + implementation(platform(libs.compose.bom)) + implementation(libs.bundles.compose) - implementation(projects.feature.auth.login) - implementation(projects.feature.auth.captcha) - implementation(projects.feature.auth.validation) - implementation(projects.feature.auth.userbanned) + implementation(libs.coil.compose) implementation(libs.koin.androidx.compose) implementation(libs.koin.android) implementation(libs.androidx.navigation.compose) implementation(libs.kotlin.serialization) + + implementation(libs.eithernet) + + androidTestImplementation(libs.bundles.compose.ui.test) } diff --git a/feature/auth/captcha/.gitignore b/feature/auth/captcha/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/feature/auth/captcha/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/feature/auth/captcha/build.gradle.kts b/feature/auth/captcha/build.gradle.kts deleted file mode 100644 index cb58c0e6..00000000 --- a/feature/auth/captcha/build.gradle.kts +++ /dev/null @@ -1,59 +0,0 @@ -plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) - alias(libs.plugins.kotlin.compose.compiler) - alias(libs.plugins.org.jetbrains.kotlin.plugin.parcelize) - alias(libs.plugins.kotlin.serialization) -} - -android { - namespace = "dev.meloda.fast.captcha" - compileSdk = Configs.compileSdk - - defaultConfig { - minSdk = Configs.minSdk - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - freeCompilerArgs = listOf("-opt-in=kotlin.RequiresOptIn", "-Xcontext-receivers") - } - buildFeatures { - compose = true - buildConfig = true - } - - composeOptions { - useLiveLiterals = true - } -} - -dependencies { - implementation(projects.core.data) - implementation(projects.core.ui) - - implementation(libs.nanokt.android) - implementation(libs.nanokt.jvm) - implementation(libs.nanokt) - - implementation(libs.koin.android) - implementation(libs.koin.androidx.compose) - - implementation(platform(libs.compose.bom)) - implementation(libs.bundles.compose) - - implementation(libs.coil.compose) - - implementation(libs.eithernet) - implementation(libs.androidx.navigation.compose) - implementation(libs.kotlin.serialization) -} diff --git a/feature/auth/captcha/consumer-rules.pro b/feature/auth/captcha/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/feature/auth/captcha/proguard-rules.pro b/feature/auth/captcha/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/feature/auth/captcha/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/feature/auth/login/.gitignore b/feature/auth/login/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/feature/auth/login/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/feature/auth/login/build.gradle.kts b/feature/auth/login/build.gradle.kts deleted file mode 100644 index 898eca6c..00000000 --- a/feature/auth/login/build.gradle.kts +++ /dev/null @@ -1,98 +0,0 @@ -import com.android.build.api.variant.BuildConfigField -import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties - -val debugUserId: String = getLocalProperty("userId", "\"0\"") -val debugAccessToken: String = getLocalProperty("accessToken", "\"\"") - -fun getLocalProperty(key: String, defValue: String): String { - return gradleLocalProperties(rootDir, providers).getProperty(key, defValue) -} - -plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) - alias(libs.plugins.kotlin.compose.compiler) - alias(libs.plugins.org.jetbrains.kotlin.plugin.parcelize) - alias(libs.plugins.kotlin.serialization) -} - -androidComponents { - onVariants { variant -> - variant.buildConfigFields.apply { - put( - "debugUserId", - BuildConfigField( - type = "String", - value = debugUserId, - comment = "user id for debugging purposes" - ) - ) - put( - "debugAccessToken", - BuildConfigField( - type = "String", - value = debugAccessToken, - comment = "access token for debugging purposes" - ) - ) - } - } -} - -android { - namespace = "dev.meloda.fast.auth.login" - compileSdk = Configs.compileSdk - - defaultConfig { - minSdk = Configs.minSdk - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - freeCompilerArgs = listOf("-opt-in=kotlin.RequiresOptIn", "-Xcontext-receivers") - } - buildFeatures { - compose = true - buildConfig = true - } - - composeOptions { - useLiveLiterals = true - } -} - -dependencies { - implementation(projects.core.data) - implementation(projects.core.ui) - - implementation(libs.nanokt.android) - implementation(libs.nanokt.jvm) - implementation(libs.nanokt) - - implementation(libs.koin.android) - implementation(libs.koin.androidx.compose) - - implementation(platform(libs.compose.bom)) - implementation(libs.bundles.compose) - - implementation(libs.coil.compose) - - implementation(libs.eithernet) - implementation(libs.androidx.navigation.compose) - implementation(libs.kotlin.serialization) - - implementation(libs.rebugger) - - androidTestImplementation(libs.bundles.compose.ui.test) -} diff --git a/feature/auth/login/consumer-rules.pro b/feature/auth/login/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/feature/auth/login/proguard-rules.pro b/feature/auth/login/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/feature/auth/login/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/feature/auth/login/src/androidTest/kotlin/dev/meloda/fast/auth/login/LoginScreenTest.kt b/feature/auth/src/androidTest/kotlin/dev/meloda/fast/auth/login/LoginScreenTest.kt similarity index 100% rename from feature/auth/login/src/androidTest/kotlin/dev/meloda/fast/auth/login/LoginScreenTest.kt rename to feature/auth/src/androidTest/kotlin/dev/meloda/fast/auth/login/LoginScreenTest.kt diff --git a/feature/auth/login/src/androidTest/kotlin/dev/meloda/fast/auth/login/LogoScreenTest.kt b/feature/auth/src/androidTest/kotlin/dev/meloda/fast/auth/login/LogoScreenTest.kt similarity index 100% rename from feature/auth/login/src/androidTest/kotlin/dev/meloda/fast/auth/login/LogoScreenTest.kt rename to feature/auth/src/androidTest/kotlin/dev/meloda/fast/auth/login/LogoScreenTest.kt diff --git a/feature/auth/src/main/kotlin/dev/meloda/fast/auth/AuthGraph.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/AuthGraph.kt index cfc4e43a..308c3bf1 100644 --- a/feature/auth/src/main/kotlin/dev/meloda/fast/auth/AuthGraph.kt +++ b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/AuthGraph.kt @@ -6,16 +6,16 @@ import androidx.navigation.navigation import dev.meloda.fast.auth.captcha.navigation.captchaScreen import dev.meloda.fast.auth.captcha.navigation.navigateToCaptcha import dev.meloda.fast.auth.captcha.navigation.setCaptchaResult +import dev.meloda.fast.auth.login.navigation.Logo +import dev.meloda.fast.auth.login.navigation.loginScreen +import dev.meloda.fast.auth.login.navigation.navigateToLogin +import dev.meloda.fast.auth.userbanned.model.UserBannedArguments +import dev.meloda.fast.auth.userbanned.navigation.navigateToUserBanned +import dev.meloda.fast.auth.userbanned.navigation.userBannedRoute import dev.meloda.fast.auth.validation.model.ValidationArguments import dev.meloda.fast.auth.validation.navigation.navigateToValidation import dev.meloda.fast.auth.validation.navigation.setValidationResult import dev.meloda.fast.auth.validation.navigation.validationScreen -import dev.meloda.fast.auth.userbanned.model.UserBannedArguments -import dev.meloda.fast.auth.userbanned.navigation.navigateToUserBanned -import dev.meloda.fast.auth.userbanned.navigation.userBannedRoute -import dev.meloda.fast.auth.login.navigation.Logo -import dev.meloda.fast.auth.login.navigation.loginScreen -import dev.meloda.fast.auth.login.navigation.navigateToLogin import kotlinx.serialization.Serializable import java.net.URLEncoder diff --git a/feature/auth/captcha/src/main/kotlin/dev/meloda/fast/auth/captcha/CaptchaViewModel.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/captcha/CaptchaViewModel.kt similarity index 100% rename from feature/auth/captcha/src/main/kotlin/dev/meloda/fast/auth/captcha/CaptchaViewModel.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/captcha/CaptchaViewModel.kt diff --git a/feature/auth/captcha/src/main/kotlin/dev/meloda/fast/auth/captcha/di/CaptchaDI.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/captcha/di/CaptchaDI.kt similarity index 100% rename from feature/auth/captcha/src/main/kotlin/dev/meloda/fast/auth/captcha/di/CaptchaDI.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/captcha/di/CaptchaDI.kt diff --git a/feature/auth/captcha/src/main/kotlin/dev/meloda/fast/auth/captcha/model/CaptchaScreenState.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/captcha/model/CaptchaScreenState.kt similarity index 100% rename from feature/auth/captcha/src/main/kotlin/dev/meloda/fast/auth/captcha/model/CaptchaScreenState.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/captcha/model/CaptchaScreenState.kt diff --git a/feature/auth/captcha/src/main/kotlin/dev/meloda/fast/auth/captcha/model/CaptchaValidationResult.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/captcha/model/CaptchaValidationResult.kt similarity index 100% rename from feature/auth/captcha/src/main/kotlin/dev/meloda/fast/auth/captcha/model/CaptchaValidationResult.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/captcha/model/CaptchaValidationResult.kt diff --git a/feature/auth/captcha/src/main/kotlin/dev/meloda/fast/auth/captcha/navigation/CaptchaNavigation.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/captcha/navigation/CaptchaNavigation.kt similarity index 100% rename from feature/auth/captcha/src/main/kotlin/dev/meloda/fast/auth/captcha/navigation/CaptchaNavigation.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/captcha/navigation/CaptchaNavigation.kt diff --git a/feature/auth/captcha/src/main/kotlin/dev/meloda/fast/auth/captcha/presentation/CaptchaScreen.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/captcha/presentation/CaptchaScreen.kt similarity index 100% rename from feature/auth/captcha/src/main/kotlin/dev/meloda/fast/auth/captcha/presentation/CaptchaScreen.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/captcha/presentation/CaptchaScreen.kt diff --git a/feature/auth/captcha/src/main/kotlin/dev/meloda/fast/auth/captcha/validation/CaptchaValidator.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/captcha/validation/CaptchaValidator.kt similarity index 100% rename from feature/auth/captcha/src/main/kotlin/dev/meloda/fast/auth/captcha/validation/CaptchaValidator.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/captcha/validation/CaptchaValidator.kt diff --git a/feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/LoginViewModel.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/LoginViewModel.kt similarity index 99% rename from feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/LoginViewModel.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/LoginViewModel.kt index d932a99d..6b182491 100644 --- a/feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/LoginViewModel.kt +++ b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/LoginViewModel.kt @@ -70,12 +70,12 @@ interface LoginViewModel { } class LoginViewModelImpl( - private val oAuthUseCase: OAuthUseCase, + private val oAuthUseCase: dev.meloda.fast.auth.login.OAuthUseCase, private val usersUseCase: UsersUseCase, private val accountsRepository: AccountsRepository, private val loginValidator: LoginValidator, private val longPollController: LongPollController -) : ViewModel(), LoginViewModel { +) : ViewModel(), dev.meloda.fast.auth.login.LoginViewModel { override val screenState = MutableStateFlow(LoginScreenState.EMPTY) override val loginError = MutableStateFlow(null) diff --git a/feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/OAuthUseCase.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/OAuthUseCase.kt similarity index 100% rename from feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/OAuthUseCase.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/OAuthUseCase.kt diff --git a/feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/OAuthUseCaseImpl.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/OAuthUseCaseImpl.kt similarity index 100% rename from feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/OAuthUseCaseImpl.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/OAuthUseCaseImpl.kt diff --git a/feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/di/LoginModule.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/di/LoginModule.kt similarity index 85% rename from feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/di/LoginModule.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/di/LoginModule.kt index e218dba1..4f6fb7c5 100644 --- a/feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/di/LoginModule.kt +++ b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/di/LoginModule.kt @@ -12,6 +12,6 @@ import org.koin.dsl.module val loginModule = module { singleOf(::LoginValidator) - viewModelOf(::LoginViewModelImpl) bind LoginViewModel::class + viewModelOf(::LoginViewModelImpl) bind dev.meloda.fast.auth.login.LoginViewModel::class singleOf(::OAuthUseCaseImpl) bind OAuthUseCase::class } diff --git a/feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/model/AuthInfo.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/model/AuthInfo.kt similarity index 100% rename from feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/model/AuthInfo.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/model/AuthInfo.kt diff --git a/feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/model/CaptchaArguments.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/model/CaptchaArguments.kt similarity index 100% rename from feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/model/CaptchaArguments.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/model/CaptchaArguments.kt diff --git a/feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginError.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginError.kt similarity index 100% rename from feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginError.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginError.kt diff --git a/feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginScreenState.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginScreenState.kt similarity index 100% rename from feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginScreenState.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginScreenState.kt diff --git a/feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginUserBannedArguments.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginUserBannedArguments.kt similarity index 100% rename from feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginUserBannedArguments.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginUserBannedArguments.kt diff --git a/feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginValidationArguments.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginValidationArguments.kt similarity index 100% rename from feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginValidationArguments.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginValidationArguments.kt diff --git a/feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginValidationResult.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginValidationResult.kt similarity index 100% rename from feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginValidationResult.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/model/LoginValidationResult.kt diff --git a/feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/navigation/LoginNavigation.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/navigation/LoginNavigation.kt similarity index 91% rename from feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/navigation/LoginNavigation.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/navigation/LoginNavigation.kt index ca06c374..c12dfa1b 100644 --- a/feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/navigation/LoginNavigation.kt +++ b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/navigation/LoginNavigation.kt @@ -29,8 +29,8 @@ fun NavGraphBuilder.loginScreen( navController: NavController ) { composable { backStackEntry -> - val viewModel: LoginViewModel = - backStackEntry.sharedViewModel(navController = navController) + val viewModel: dev.meloda.fast.auth.login.LoginViewModel = + backStackEntry.sharedViewModel(navController = navController) val validationCode = backStackEntry.getValidationResult() val captchaCode = backStackEntry.getCaptchaResult() diff --git a/feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/presentation/LoginScreen.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/presentation/LoginScreen.kt similarity index 99% rename from feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/presentation/LoginScreen.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/presentation/LoginScreen.kt index 5a240d00..b004f221 100644 --- a/feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/presentation/LoginScreen.kt +++ b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/presentation/LoginScreen.kt @@ -76,7 +76,7 @@ fun LoginRoute( onNavigateToValidation: (LoginValidationArguments) -> Unit, validationCode: String?, captchaCode: String?, - viewModel: LoginViewModel = koinViewModel() + viewModel: dev.meloda.fast.auth.login.LoginViewModel = koinViewModel() ) { val screenState by viewModel.screenState.collectAsStateWithLifecycle() val isNeedToOpenMain by viewModel.isNeedToOpenMain.collectAsStateWithLifecycle() diff --git a/feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/presentation/LogoScreen.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/presentation/LogoScreen.kt similarity index 97% rename from feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/presentation/LogoScreen.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/presentation/LogoScreen.kt index d56b25ae..9c1fc3fb 100644 --- a/feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/presentation/LogoScreen.kt +++ b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/presentation/LogoScreen.kt @@ -40,9 +40,7 @@ import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle -import dev.meloda.fast.auth.login.BuildConfig -import dev.meloda.fast.auth.login.LoginViewModel -import dev.meloda.fast.auth.login.LoginViewModelImpl +import dev.meloda.fast.auth.BuildConfig import dev.meloda.fast.ui.components.ActionInvokeDismiss import dev.meloda.fast.ui.components.MaterialDialog import dev.meloda.fast.ui.theme.LocalSizeConfig @@ -53,7 +51,7 @@ import dev.meloda.fast.ui.R as UiR fun LogoRoute( onNavigateToMain: () -> Unit, onGoNextButtonClicked: () -> Unit, - viewModel: LoginViewModel = koinViewModel() + viewModel: dev.meloda.fast.auth.login.LoginViewModel = koinViewModel() ) { val screenState by viewModel.screenState.collectAsStateWithLifecycle() val isNeedToOpenMain by viewModel.isNeedToOpenMain.collectAsStateWithLifecycle() diff --git a/feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/validation/LoginValidator.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/validation/LoginValidator.kt similarity index 100% rename from feature/auth/login/src/main/kotlin/dev/meloda/fast/auth/login/validation/LoginValidator.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/validation/LoginValidator.kt diff --git a/feature/auth/userbanned/src/main/kotlin/dev/meloda/fast/auth/userbanned/model/UserBannedArguments.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/userbanned/model/UserBannedArguments.kt similarity index 100% rename from feature/auth/userbanned/src/main/kotlin/dev/meloda/fast/auth/userbanned/model/UserBannedArguments.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/userbanned/model/UserBannedArguments.kt diff --git a/feature/auth/userbanned/src/main/kotlin/dev/meloda/fast/auth/userbanned/model/UserBannedScreenState.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/userbanned/model/UserBannedScreenState.kt similarity index 100% rename from feature/auth/userbanned/src/main/kotlin/dev/meloda/fast/auth/userbanned/model/UserBannedScreenState.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/userbanned/model/UserBannedScreenState.kt diff --git a/feature/auth/userbanned/src/main/kotlin/dev/meloda/fast/auth/userbanned/navigation/UserBannedNavigation.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/userbanned/navigation/UserBannedNavigation.kt similarity index 100% rename from feature/auth/userbanned/src/main/kotlin/dev/meloda/fast/auth/userbanned/navigation/UserBannedNavigation.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/userbanned/navigation/UserBannedNavigation.kt diff --git a/feature/auth/userbanned/src/main/kotlin/dev/meloda/fast/auth/userbanned/presentation/UserBannedScreen.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/userbanned/presentation/UserBannedScreen.kt similarity index 100% rename from feature/auth/userbanned/src/main/kotlin/dev/meloda/fast/auth/userbanned/presentation/UserBannedScreen.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/userbanned/presentation/UserBannedScreen.kt diff --git a/feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/AuthUseCase.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/AuthUseCase.kt similarity index 100% rename from feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/AuthUseCase.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/AuthUseCase.kt diff --git a/feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/AuthUseCaseImpl.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/AuthUseCaseImpl.kt similarity index 100% rename from feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/AuthUseCaseImpl.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/AuthUseCaseImpl.kt diff --git a/feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/ValidationViewModel.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/ValidationViewModel.kt similarity index 100% rename from feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/ValidationViewModel.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/ValidationViewModel.kt diff --git a/feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/di/ValidationModule.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/di/ValidationModule.kt similarity index 100% rename from feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/di/ValidationModule.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/di/ValidationModule.kt diff --git a/feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/model/ValidationArguments.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/model/ValidationArguments.kt similarity index 100% rename from feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/model/ValidationArguments.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/model/ValidationArguments.kt diff --git a/feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/model/ValidationScreenState.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/model/ValidationScreenState.kt similarity index 100% rename from feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/model/ValidationScreenState.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/model/ValidationScreenState.kt diff --git a/feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/model/ValidationType.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/model/ValidationType.kt similarity index 100% rename from feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/model/ValidationType.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/model/ValidationType.kt diff --git a/feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/model/ValidationValidationResult.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/model/ValidationValidationResult.kt similarity index 100% rename from feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/model/ValidationValidationResult.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/model/ValidationValidationResult.kt diff --git a/feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/navigation/ValidationNavigation.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/navigation/ValidationNavigation.kt similarity index 100% rename from feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/navigation/ValidationNavigation.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/navigation/ValidationNavigation.kt diff --git a/feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/presentation/ValidationScreen.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/presentation/ValidationScreen.kt similarity index 100% rename from feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/presentation/ValidationScreen.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/presentation/ValidationScreen.kt diff --git a/feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/validation/ValidationValidator.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/validation/ValidationValidator.kt similarity index 100% rename from feature/auth/validation/src/main/kotlin/dev/meloda/fast/auth/validation/validation/ValidationValidator.kt rename to feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/validation/ValidationValidator.kt diff --git a/feature/auth/userbanned/.gitignore b/feature/auth/userbanned/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/feature/auth/userbanned/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/feature/auth/userbanned/build.gradle.kts b/feature/auth/userbanned/build.gradle.kts deleted file mode 100644 index 069d2533..00000000 --- a/feature/auth/userbanned/build.gradle.kts +++ /dev/null @@ -1,62 +0,0 @@ -plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) - alias(libs.plugins.com.google.devtools.ksp) - alias(libs.plugins.kotlin.compose.compiler) - alias(libs.plugins.kotlin.serialization) - alias(libs.plugins.org.jetbrains.kotlin.plugin.parcelize) -} - -group = "dev.meloda.fast.auth.userbanned" - -android { - namespace = "dev.meloda.fast.auth.userbanned" - compileSdk = Configs.compileSdk - - defaultConfig { - minSdk = Configs.minSdk - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - freeCompilerArgs = listOf("-opt-in=kotlin.RequiresOptIn", "-Xcontext-receivers") - } - buildFeatures { - compose = true - } - - composeOptions { - useLiveLiterals = true - } -} - -dependencies { - implementation(projects.core.data) - implementation(projects.core.model) - implementation(projects.core.ui) - - implementation(libs.nanokt.android) - implementation(libs.nanokt.jvm) - implementation(libs.nanokt) - - implementation(libs.koin.android) - implementation(libs.koin.androidx.compose) - - implementation(platform(libs.compose.bom)) - implementation(libs.bundles.compose) - - implementation(libs.coil.compose) - implementation(libs.androidx.navigation.compose) - implementation(libs.kotlin.serialization) - - debugImplementation(libs.compose.ui.tooling) -} diff --git a/feature/auth/validation/.gitignore b/feature/auth/validation/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/feature/auth/validation/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/feature/auth/validation/build.gradle.kts b/feature/auth/validation/build.gradle.kts deleted file mode 100644 index 358189b9..00000000 --- a/feature/auth/validation/build.gradle.kts +++ /dev/null @@ -1,60 +0,0 @@ -plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) - alias(libs.plugins.kotlin.compose.compiler) - alias(libs.plugins.org.jetbrains.kotlin.plugin.parcelize) - alias(libs.plugins.kotlin.serialization) -} - -android { - namespace = "dev.meloda.fast.validation" - compileSdk = Configs.compileSdk - - defaultConfig { - minSdk = Configs.minSdk - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - freeCompilerArgs = listOf("-opt-in=kotlin.RequiresOptIn", "-Xcontext-receivers") - } - buildFeatures { - compose = true - buildConfig = true - } - - composeOptions { - useLiveLiterals = true - } -} - -dependencies { - implementation(projects.core.common) - implementation(projects.core.data) - implementation(projects.core.ui) - - implementation(libs.nanokt.android) - implementation(libs.nanokt.jvm) - implementation(libs.nanokt) - - implementation(libs.koin.android) - implementation(libs.koin.androidx.compose) - - implementation(platform(libs.compose.bom)) - implementation(libs.bundles.compose) - - implementation(libs.coil.compose) - - implementation(libs.eithernet) - implementation(libs.androidx.navigation.compose) - implementation(libs.kotlin.serialization) -} diff --git a/feature/auth/validation/consumer-rules.pro b/feature/auth/validation/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/feature/auth/validation/proguard-rules.pro b/feature/auth/validation/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/feature/auth/validation/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/feature/chatmaterials/build.gradle.kts b/feature/chatmaterials/build.gradle.kts index 373ece5e..fd0b610f 100644 --- a/feature/chatmaterials/build.gradle.kts +++ b/feature/chatmaterials/build.gradle.kts @@ -1,41 +1,10 @@ plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) - alias(libs.plugins.kotlin.compose.compiler) - alias(libs.plugins.kotlin.serialization) - alias(libs.plugins.org.jetbrains.kotlin.plugin.parcelize) + alias(libs.plugins.fast.android.feature) + alias(libs.plugins.fast.android.library.compose) } -group = "dev.meloda.fast.chatmaterials" - android { namespace = "dev.meloda.fast.chatmaterials" - compileSdk = Configs.compileSdk - - defaultConfig { - minSdk = Configs.minSdk - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - freeCompilerArgs = listOf("-opt-in=kotlin.RequiresOptIn", "-Xcontext-receivers") - } - buildFeatures { - compose = true - } - - composeOptions { - useLiveLiterals = true - } } dependencies { diff --git a/feature/conversations/build.gradle.kts b/feature/conversations/build.gradle.kts index 7a91338a..32c01c9b 100644 --- a/feature/conversations/build.gradle.kts +++ b/feature/conversations/build.gradle.kts @@ -1,40 +1,10 @@ plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) - alias(libs.plugins.com.google.devtools.ksp) - alias(libs.plugins.kotlin.compose.compiler) - alias(libs.plugins.kotlin.serialization) + alias(libs.plugins.fast.android.feature) + alias(libs.plugins.fast.android.library.compose) } -group = "dev.meloda.fast.conversations" - android { namespace = "dev.meloda.fast.conversations" - compileSdk = Configs.compileSdk - - defaultConfig { - minSdk = Configs.minSdk - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - freeCompilerArgs = listOf("-opt-in=kotlin.RequiresOptIn", "-Xcontext-receivers") - } - buildFeatures { - compose = true - } - composeOptions { - useLiveLiterals = true - } } dependencies { diff --git a/feature/friends/build.gradle.kts b/feature/friends/build.gradle.kts index 5c12a2b5..3878cacb 100644 --- a/feature/friends/build.gradle.kts +++ b/feature/friends/build.gradle.kts @@ -1,40 +1,10 @@ plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) - alias(libs.plugins.com.google.devtools.ksp) - alias(libs.plugins.kotlin.compose.compiler) - alias(libs.plugins.kotlin.serialization) + alias(libs.plugins.fast.android.feature) + alias(libs.plugins.fast.android.library.compose) } -group = "dev.meloda.fast.friends" - android { namespace = "dev.meloda.fast.friends" - compileSdk = Configs.compileSdk - - defaultConfig { - minSdk = Configs.minSdk - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - freeCompilerArgs = listOf("-opt-in=kotlin.RequiresOptIn", "-Xcontext-receivers") - } - buildFeatures { - compose = true - } - composeOptions { - useLiveLiterals = true - } } dependencies { diff --git a/feature/friends/consumer-rules.pro b/feature/friends/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/feature/friends/proguard-rules.pro b/feature/friends/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/feature/friends/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/feature/languagepicker/build.gradle.kts b/feature/languagepicker/build.gradle.kts index 6f093e39..51c5fa4a 100644 --- a/feature/languagepicker/build.gradle.kts +++ b/feature/languagepicker/build.gradle.kts @@ -1,41 +1,10 @@ plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) - alias(libs.plugins.com.google.devtools.ksp) - alias(libs.plugins.kotlin.compose.compiler) - alias(libs.plugins.kotlin.serialization) + alias(libs.plugins.fast.android.feature) + alias(libs.plugins.fast.android.library.compose) } -group = "dev.meloda.fast.languagepicker" - android { namespace = "dev.meloda.fast.languagepicker" - compileSdk = Configs.compileSdk - - defaultConfig { - minSdk = Configs.minSdk - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - freeCompilerArgs = listOf("-opt-in=kotlin.RequiresOptIn", "-Xcontext-receivers") - } - buildFeatures { - compose = true - } - - composeOptions { - useLiveLiterals = true - } } dependencies { diff --git a/feature/messageshistory/build.gradle.kts b/feature/messageshistory/build.gradle.kts index cd5387f7..10c3452f 100644 --- a/feature/messageshistory/build.gradle.kts +++ b/feature/messageshistory/build.gradle.kts @@ -1,41 +1,10 @@ plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) - alias(libs.plugins.kotlin.compose.compiler) - alias(libs.plugins.kotlin.serialization) - alias(libs.plugins.org.jetbrains.kotlin.plugin.parcelize) + alias(libs.plugins.fast.android.feature) + alias(libs.plugins.fast.android.library.compose) } -group = "dev.meloda.fast.messageshistory" - android { namespace = "dev.meloda.fast.messageshistory" - compileSdk = Configs.compileSdk - - defaultConfig { - minSdk = Configs.minSdk - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - freeCompilerArgs = listOf("-opt-in=kotlin.RequiresOptIn", "-Xcontext-receivers") - } - buildFeatures { - compose = true - } - - composeOptions { - useLiveLiterals = true - } } dependencies { diff --git a/feature/photoviewer/build.gradle.kts b/feature/photoviewer/build.gradle.kts index 94f6c362..637d6ee7 100644 --- a/feature/photoviewer/build.gradle.kts +++ b/feature/photoviewer/build.gradle.kts @@ -1,41 +1,10 @@ plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) - alias(libs.plugins.kotlin.compose.compiler) - alias(libs.plugins.org.jetbrains.kotlin.plugin.parcelize) - alias(libs.plugins.kotlin.serialization) + alias(libs.plugins.fast.android.feature) + alias(libs.plugins.fast.android.library.compose) } -group = "dev.meloda.fast.photoviewer" - android { namespace = "dev.meloda.fast.photoviewer" - compileSdk = Configs.compileSdk - - defaultConfig { - minSdk = Configs.minSdk - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - freeCompilerArgs = listOf("-opt-in=kotlin.RequiresOptIn", "-Xcontext-receivers") - } - buildFeatures { - compose = true - } - - composeOptions { - useLiveLiterals = true - } } dependencies { diff --git a/feature/profile/build.gradle.kts b/feature/profile/build.gradle.kts index eda651a9..dae3e68e 100644 --- a/feature/profile/build.gradle.kts +++ b/feature/profile/build.gradle.kts @@ -1,42 +1,10 @@ plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) - alias(libs.plugins.com.google.devtools.ksp) - alias(libs.plugins.kotlin.compose.compiler) - alias(libs.plugins.kotlin.serialization) + alias(libs.plugins.fast.android.feature) + alias(libs.plugins.fast.android.library.compose) } -group = "dev.meloda.fast.profile" - android { namespace = "dev.meloda.fast.profile" - compileSdk = Configs.compileSdk - - defaultConfig { - minSdk = Configs.minSdk - - consumerProguardFiles("consumer-rules.pro") - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - freeCompilerArgs = listOf("-opt-in=kotlin.RequiresOptIn", "-Xcontext-receivers") - } - buildFeatures { - compose = true - } - composeOptions { - useLiveLiterals = true - } } dependencies { diff --git a/feature/profile/consumer-rules.pro b/feature/profile/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/feature/profile/proguard-rules.pro b/feature/profile/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/feature/profile/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/feature/settings/build.gradle.kts b/feature/settings/build.gradle.kts index 91e0571a..1a76347c 100644 --- a/feature/settings/build.gradle.kts +++ b/feature/settings/build.gradle.kts @@ -1,41 +1,10 @@ plugins { - alias(libs.plugins.android.library) - alias(libs.plugins.org.jetbrains.kotlin.android) - alias(libs.plugins.com.google.devtools.ksp) - alias(libs.plugins.kotlin.compose.compiler) - alias(libs.plugins.kotlin.serialization) + alias(libs.plugins.fast.android.feature) + alias(libs.plugins.fast.android.library.compose) } -group = "dev.meloda.fast.settings" - android { namespace = "dev.meloda.fast.settings" - compileSdk = Configs.compileSdk - - defaultConfig { - minSdk = Configs.minSdk - } - - buildTypes { - release { - isMinifyEnabled = false - } - } - compileOptions { - sourceCompatibility = Configs.java - targetCompatibility = Configs.java - } - kotlinOptions { - jvmTarget = Configs.java.toString() - freeCompilerArgs = listOf("-opt-in=kotlin.RequiresOptIn", "-Xcontext-receivers") - } - buildFeatures { - compose = true - } - - composeOptions { - useLiveLiterals = true - } } dependencies { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 41912b63..bca9ba9a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,4 +1,10 @@ [versions] +minSdk = "24" +targetSdk = "35" +compileSdk = "35" +versionCode = "4" +versionName = "0.1.1" + agp = "8.5.2" converterMoshi = "2.11.0" eithernet = "1.9.0" @@ -91,6 +97,13 @@ koin-android-test = { module = "io.insert-koin:koin-android-test", version.ref = koin-androidx-compose = { module = "io.insert-koin:koin-androidx-compose", version.ref = "koin" } koin-androidx-compose-navigation = { module = "io.insert-koin:koin-androidx-compose-navigation", version.ref = "koin" } +# build-logic dependencies +android-gradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "agp" } +compose-gradlePlugin = { module = "org.jetbrains.kotlin:compose-compiler-gradle-plugin", version.ref = "kotlin" } +kotlin-gradlePlugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" } +ksp-gradlePlugin = { group = "com.google.devtools.ksp", name = "com.google.devtools.ksp.gradle.plugin", version.ref = "ksp" } +room-gradlePlugin = { group = "androidx.room", name = "room-gradle-plugin", version.ref = "room" } + [bundles] compose = [ "compose-material3", @@ -103,12 +116,29 @@ compose = [ "compose-runtime-saveable" ] compose-ui-test = ["compose-ui-test-junit4", "compose-ui-test-manifest"] +nanokt = [ + "nanokt", + "nanokt-android", + "nanokt-jvm" +] [plugins] -com-android-application = { id = "com.android.application", version.ref = "agp" } -org-jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } -kotlin-compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } -com-google-devtools-ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } -org-jetbrains-kotlin-plugin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } +android-application = { id = "com.android.application", version.ref = "agp" } android-library = { id = "com.android.library", version.ref = "agp" } +org-jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } +kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } +kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } +room = { id = "androidx.room", version.ref = "room" } +ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } + +#project plugins +fast-android-application = { id = "fast.android.application", version = "unspecified" } +fast-android-application-compose = { id = "fast.android.application.compose", version = "unspecified" } +fast-android-feature = { id = "fast.android.feature", version = "unspecified" } +fast-android-library = { id = "fast.android.library", version = "unspecified" } +fast-android-library-compose = { id = "fast.android.library.compose", version = "unspecified" } +fast-android-room = { id = "fast.android.room", version = "unspecified" } +fast-android-test = { id = "fast.android.test", version = "unspecified" } +fast-jvm-library = { id = "fast.jvm.library", version = "unspecified" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 5bf2267c..a22f39d6 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,6 +1,7 @@ enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") pluginManagement { + includeBuild("build-logic") repositories { google() mavenCentral() @@ -22,7 +23,6 @@ include(":core:network") include(":core:data") include(":core:database") include(":core:datastore") -include(":core:designsystem") include(":core:ui") include(":core:common") include(":core:model") @@ -33,9 +33,5 @@ include(":feature:chatmaterials") include(":feature:languagepicker") include(":feature:photoviewer") include(":feature:settings") -include(":feature:auth:login") -include(":feature:auth:validation") -include(":feature:auth:captcha") -include(":feature:auth:userbanned") include(":feature:friends") include(":feature:profile")