From 0500969d8167764f25a1f149ca9f575c5eb65d9d Mon Sep 17 00:00:00 2001 From: Danil Nikolaev Date: Sun, 11 Aug 2024 17:40:13 +0300 Subject: [PATCH] domain module --- app/build.gradle.kts | 1 + .../kotlin/dev/meloda/fast/MainViewModel.kt | 4 +- .../dev/meloda/fast/common/AppGlobal.kt | 1 - .../fast/common/di/ApplicationModule.kt | 18 ++- .../meloda/fast/presentation/MainActivity.kt | 3 +- .../dev/meloda/fast/service/OnlineService.kt | 4 +- .../service/longpolling/LongPollingService.kt | 6 +- .../service/longpolling/di/LongPollModule.kt | 6 +- build-logic/convention/build.gradle.kts | 4 + .../src/main/kotlin/KoinConventionPlugin.kt | 23 ++++ build.gradle.kts | 5 +- core/common/build.gradle.kts | 22 +--- .../dev/meloda/fast/common/di/CommonModule.kt | 21 ---- .../fast/common/extensions/Extensions.kt | 27 ----- .../meloda/fast/common/util/AndroidUtils.kt | 110 +++++++++--------- core/data/build.gradle.kts | 6 +- .../fast/data}/AccessTokenInterceptor.kt | 3 +- .../dev/meloda/fast/data}/UserConfig.kt | 16 +-- .../dev/meloda/fast/data/di/DataModule.kt | 18 ++- core/domain/.gitignore | 1 + core/domain/build.gradle.kts | 18 +++ .../dev/meloda/fast/domain}/AccountUseCase.kt | 2 +- .../meloda/fast/domain}/AccountUseCaseImpl.kt | 3 +- .../dev/meloda/fast/domain}/AuthUseCase.kt | 2 +- .../meloda/fast/domain}/AuthUseCaseImpl.kt | 2 +- .../fast/domain}/ConversationsUseCase.kt | 2 +- .../fast/domain}/ConversationsUseCaseImpl.kt | 3 +- .../dev/meloda/fast/domain}/FriendsUseCase.kt | 2 +- .../meloda/fast}/domain/FriendsUseCaseImpl.kt | 6 +- .../fast/domain}/GetCurrentAccountUseCase.kt | 9 +- .../fast/domain}/LongPollUpdatesParser.kt | 7 +- .../meloda/fast/domain}/LongPollUseCase.kt | 3 +- .../fast/domain}/LongPollUseCaseImpl.kt | 4 +- .../meloda/fast/domain}/MessagesUseCase.kt | 3 +- .../fast}/domain/MessagesUseCaseImpl.kt | 3 +- .../dev/meloda/fast/domain}/OAuthUseCase.kt | 4 +- .../meloda/fast/domain}/OAuthUseCaseImpl.kt | 4 +- .../dev/meloda/fast/domain}/UsersUseCase.kt | 2 +- .../meloda/fast/domain}/UsersUseCaseImpl.kt | 3 +- .../dev/meloda/fast/domain/di/DomainModule.kt | 19 +++ .../kotlin/dev/meloda/fast}/model/AuthInfo.kt | 2 +- .../meloda/fast/network/di/NetworkModule.kt | 11 +- core/ui/build.gradle.kts | 7 +- .../fast/ui}/extensions/CustomNavType.kt | 2 +- .../fast/ui/extensions/SharedViewModel.kt} | 2 +- feature/auth/build.gradle.kts | 2 +- .../meloda/fast/auth/login/LoginViewModel.kt | 9 +- .../meloda/fast/auth/login/di/LoginModule.kt | 5 +- .../auth/login/navigation/LoginNavigation.kt | 8 +- .../auth/validation/ValidationViewModel.kt | 1 + .../auth/validation/di/ValidationModule.kt | 4 +- .../navigation/ValidationNavigation.kt | 2 +- feature/chatmaterials/build.gradle.kts | 2 +- .../chatmaterials/ChatMaterialsViewModel.kt | 2 +- feature/conversations/build.gradle.kts | 6 +- .../conversations/ConversationsViewModel.kt | 6 +- .../conversations/di/ConversationsModule.kt | 6 +- .../navigation/ConversationsNavigation.kt | 2 +- .../presentation/ConversationsList.kt | 2 +- .../util/ConversationDomainMapper.kt | 4 +- feature/friends/build.gradle.kts | 2 +- .../meloda/fast/friends/FriendsViewModel.kt | 2 +- .../meloda/fast/friends/di/FriendsModule.kt | 6 +- .../friends/navigation/FriendsNavigation.kt | 2 +- feature/messageshistory/build.gradle.kts | 2 +- .../MessagesHistoryViewModel.kt | 8 +- .../di/MessagesHistoryModule.kt | 6 +- .../navigation/MessagesHistoryNavigation.kt | 2 +- .../messageshistory/util/MessageMapper.kt | 2 +- .../navigation/PhotoViewNavigation.kt | 2 +- feature/profile/build.gradle.kts | 2 +- .../meloda/fast/profile/ProfileViewModel.kt | 4 +- .../fast/profile/navigation/ProfileRoute.kt | 2 +- .../meloda/fast/settings/SettingsViewModel.kt | 5 +- .../settings/presentation/SettingsScreen.kt | 12 +- gradle/libs.versions.toml | 4 +- settings.gradle.kts | 1 + 77 files changed, 282 insertions(+), 267 deletions(-) create mode 100644 build-logic/convention/src/main/kotlin/KoinConventionPlugin.kt delete mode 100644 core/common/src/main/kotlin/dev/meloda/fast/common/di/CommonModule.kt rename core/{network/src/main/kotlin/dev/meloda/fast/network/interceptor => data/src/main/kotlin/dev/meloda/fast/data}/AccessTokenInterceptor.kt (88%) rename core/{common/src/main/kotlin/dev/meloda/fast/common => data/src/main/kotlin/dev/meloda/fast/data}/UserConfig.kt (55%) create mode 100644 core/domain/.gitignore create mode 100644 core/domain/build.gradle.kts rename core/{data/src/main/kotlin/dev/meloda/fast/data/api/account => domain/src/main/kotlin/dev/meloda/fast/domain}/AccountUseCase.kt (87%) rename core/{data/src/main/kotlin/dev/meloda/fast/data/api/account => domain/src/main/kotlin/dev/meloda/fast/domain}/AccountUseCaseImpl.kt (88%) rename {feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation => core/domain/src/main/kotlin/dev/meloda/fast/domain}/AuthUseCase.kt (86%) rename {feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation => core/domain/src/main/kotlin/dev/meloda/fast/domain}/AuthUseCaseImpl.kt (93%) rename core/{data/src/main/kotlin/dev/meloda/fast/data/api/conversations => domain/src/main/kotlin/dev/meloda/fast/domain}/ConversationsUseCase.kt (90%) rename {feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/data => core/domain/src/main/kotlin/dev/meloda/fast/domain}/ConversationsUseCaseImpl.kt (97%) rename core/{data/src/main/kotlin/dev/meloda/fast/data/api/friends => domain/src/main/kotlin/dev/meloda/fast/domain}/FriendsUseCase.kt (92%) rename {feature/friends/src/main/kotlin/dev/meloda/fast/friends => core/domain/src/main/kotlin/dev/meloda/fast}/domain/FriendsUseCaseImpl.kt (90%) rename core/{data/src/main/kotlin/dev/meloda/fast/data/db => domain/src/main/kotlin/dev/meloda/fast/domain}/GetCurrentAccountUseCase.kt (57%) rename core/{data/src/main/kotlin/dev/meloda/fast/data => domain/src/main/kotlin/dev/meloda/fast/domain}/LongPollUpdatesParser.kt (98%) rename core/{data/src/main/kotlin/dev/meloda/fast/data => domain/src/main/kotlin/dev/meloda/fast/domain}/LongPollUseCase.kt (88%) rename core/{data/src/main/kotlin/dev/meloda/fast/data => domain/src/main/kotlin/dev/meloda/fast/domain}/LongPollUseCaseImpl.kt (92%) rename core/{data/src/main/kotlin/dev/meloda/fast/data/api/messages => domain/src/main/kotlin/dev/meloda/fast/domain}/MessagesUseCase.kt (92%) rename {feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory => core/domain/src/main/kotlin/dev/meloda/fast}/domain/MessagesUseCaseImpl.kt (96%) rename {feature/auth/src/main/kotlin/dev/meloda/fast/auth/login => core/domain/src/main/kotlin/dev/meloda/fast/domain}/OAuthUseCase.kt (78%) rename {feature/auth/src/main/kotlin/dev/meloda/fast/auth/login => core/domain/src/main/kotlin/dev/meloda/fast/domain}/OAuthUseCaseImpl.kt (98%) rename core/{data/src/main/kotlin/dev/meloda/fast/data/api/users => domain/src/main/kotlin/dev/meloda/fast/domain}/UsersUseCase.kt (91%) rename core/{data/src/main/kotlin/dev/meloda/fast/data/api/users => domain/src/main/kotlin/dev/meloda/fast/domain}/UsersUseCaseImpl.kt (92%) create mode 100644 core/domain/src/main/kotlin/dev/meloda/fast/domain/di/DomainModule.kt rename {feature/auth/src/main/kotlin/dev/meloda/fast/auth/login => core/model/src/main/kotlin/dev/meloda/fast}/model/AuthInfo.kt (72%) rename core/{common/src/main/kotlin/dev/meloda/fast/common => ui/src/main/kotlin/dev/meloda/fast/ui}/extensions/CustomNavType.kt (94%) rename core/{common/src/main/kotlin/dev/meloda/fast/common/extensions/navigation/NavigationExtensions.kt => ui/src/main/kotlin/dev/meloda/fast/ui/extensions/SharedViewModel.kt} (92%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e7308d7f..649a27c3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -81,6 +81,7 @@ dependencies { implementation(projects.core.common) implementation(projects.core.ui) implementation(projects.core.data) + implementation(projects.core.domain) implementation(projects.core.model) implementation(projects.core.datastore) diff --git a/app/src/main/kotlin/dev/meloda/fast/MainViewModel.kt b/app/src/main/kotlin/dev/meloda/fast/MainViewModel.kt index 9a1121ce..4f8ad0c9 100644 --- a/app/src/main/kotlin/dev/meloda/fast/MainViewModel.kt +++ b/app/src/main/kotlin/dev/meloda/fast/MainViewModel.kt @@ -10,12 +10,12 @@ import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.PermissionStatus import dev.meloda.fast.auth.AuthGraph import dev.meloda.fast.common.LongPollController -import dev.meloda.fast.common.UserConfig import dev.meloda.fast.common.extensions.ifEmpty import dev.meloda.fast.common.extensions.listenValue import dev.meloda.fast.common.extensions.setValue import dev.meloda.fast.common.model.LongPollState -import dev.meloda.fast.data.db.GetCurrentAccountUseCase +import dev.meloda.fast.data.UserConfig +import dev.meloda.fast.domain.GetCurrentAccountUseCase import dev.meloda.fast.datastore.AppSettings import dev.meloda.fast.datastore.UserSettings import dev.meloda.fast.model.BaseError diff --git a/app/src/main/kotlin/dev/meloda/fast/common/AppGlobal.kt b/app/src/main/kotlin/dev/meloda/fast/common/AppGlobal.kt index 0d6d8a35..54e294d9 100644 --- a/app/src/main/kotlin/dev/meloda/fast/common/AppGlobal.kt +++ b/app/src/main/kotlin/dev/meloda/fast/common/AppGlobal.kt @@ -18,7 +18,6 @@ class AppGlobal : Application(), ImageLoaderFactory { val preferences = PreferenceManager.getDefaultSharedPreferences(this) AppSettings.init(preferences) - UserConfig.init(preferences) initKoin() } 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 5a25d60c..efb95bb4 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 @@ -4,14 +4,19 @@ import android.content.Context import android.content.res.Resources import android.os.PowerManager import androidx.preference.PreferenceManager +import coil.ImageLoader import dev.meloda.fast.MainViewModelImpl 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.LongPollController +import dev.meloda.fast.common.LongPollControllerImpl import dev.meloda.fast.common.provider.Provider +import dev.meloda.fast.common.provider.ResourceProvider +import dev.meloda.fast.common.provider.ResourceProviderImpl import dev.meloda.fast.conversations.di.conversationsModule -import dev.meloda.fast.data.di.dataModule +import dev.meloda.fast.domain.di.domainModule import dev.meloda.fast.friends.di.friendsModule import dev.meloda.fast.languagepicker.di.languagePickerModule import dev.meloda.fast.messageshistory.di.messagesHistoryModule @@ -28,7 +33,7 @@ import org.koin.dsl.bind import org.koin.dsl.module val applicationModule = module { - includes(dataModule) + includes(domainModule) includes( loginModule, validationModule, @@ -55,4 +60,13 @@ val applicationModule = module { viewModelOf(::MainViewModelImpl) { qualifier = qualifier("main") } + + single { + ImageLoader.Builder(get()) + .crossfade(true) + .build() + } + + singleOf(::LongPollControllerImpl) bind LongPollController::class + singleOf(::ResourceProviderImpl) bind ResourceProvider::class } diff --git a/app/src/main/kotlin/dev/meloda/fast/presentation/MainActivity.kt b/app/src/main/kotlin/dev/meloda/fast/presentation/MainActivity.kt index f4422851..e3161d7b 100644 --- a/app/src/main/kotlin/dev/meloda/fast/presentation/MainActivity.kt +++ b/app/src/main/kotlin/dev/meloda/fast/presentation/MainActivity.kt @@ -36,7 +36,6 @@ import dev.meloda.fast.MainViewModel import dev.meloda.fast.MainViewModelImpl import dev.meloda.fast.common.AppConstants import dev.meloda.fast.common.LongPollController -import dev.meloda.fast.common.extensions.isSdkAtLeast import dev.meloda.fast.common.model.LongPollState import dev.meloda.fast.datastore.AppSettings import dev.meloda.fast.datastore.UserSettings @@ -239,7 +238,7 @@ class MainActivity : AppCompatActivity() { } private fun createNotificationChannels() { - isSdkAtLeast(Build.VERSION_CODES.O) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val noCategoryName = getString(UiR.string.notification_channel_no_category_name) val noCategoryDescriptionText = getString(UiR.string.notification_channel_no_category_description) diff --git a/app/src/main/kotlin/dev/meloda/fast/service/OnlineService.kt b/app/src/main/kotlin/dev/meloda/fast/service/OnlineService.kt index cce7aae2..98556cae 100644 --- a/app/src/main/kotlin/dev/meloda/fast/service/OnlineService.kt +++ b/app/src/main/kotlin/dev/meloda/fast/service/OnlineService.kt @@ -4,9 +4,9 @@ import android.app.Service import android.content.Intent import android.os.IBinder import android.util.Log -import dev.meloda.fast.common.UserConfig import dev.meloda.fast.common.extensions.createTimerFlow -import dev.meloda.fast.data.api.account.AccountUseCase +import dev.meloda.fast.data.UserConfig +import dev.meloda.fast.domain.AccountUseCase import dev.meloda.fast.data.processState import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.CoroutineScope diff --git a/app/src/main/kotlin/dev/meloda/fast/service/longpolling/LongPollingService.kt b/app/src/main/kotlin/dev/meloda/fast/service/longpolling/LongPollingService.kt index 96a4a383..4c4a7889 100644 --- a/app/src/main/kotlin/dev/meloda/fast/service/longpolling/LongPollingService.kt +++ b/app/src/main/kotlin/dev/meloda/fast/service/longpolling/LongPollingService.kt @@ -13,12 +13,12 @@ import androidx.core.app.ServiceCompat import com.conena.nanokt.android.app.stopForegroundCompat import dev.meloda.fast.common.AppConstants import dev.meloda.fast.common.LongPollController -import dev.meloda.fast.common.UserConfig import dev.meloda.fast.common.VkConstants import dev.meloda.fast.common.extensions.listenValue import dev.meloda.fast.common.model.LongPollState -import dev.meloda.fast.data.LongPollUpdatesParser -import dev.meloda.fast.data.LongPollUseCase +import dev.meloda.fast.domain.LongPollUpdatesParser +import dev.meloda.fast.domain.LongPollUseCase +import dev.meloda.fast.data.UserConfig import dev.meloda.fast.data.processState import dev.meloda.fast.datastore.AppSettings import dev.meloda.fast.model.api.data.LongPollUpdates diff --git a/app/src/main/kotlin/dev/meloda/fast/service/longpolling/di/LongPollModule.kt b/app/src/main/kotlin/dev/meloda/fast/service/longpolling/di/LongPollModule.kt index 346580a2..96546c83 100644 --- a/app/src/main/kotlin/dev/meloda/fast/service/longpolling/di/LongPollModule.kt +++ b/app/src/main/kotlin/dev/meloda/fast/service/longpolling/di/LongPollModule.kt @@ -1,8 +1,8 @@ package dev.meloda.fast.service.longpolling.di -import dev.meloda.fast.data.LongPollUpdatesParser -import dev.meloda.fast.data.LongPollUseCase -import dev.meloda.fast.data.LongPollUseCaseImpl +import dev.meloda.fast.domain.LongPollUpdatesParser +import dev.meloda.fast.domain.LongPollUseCase +import dev.meloda.fast.domain.LongPollUseCaseImpl import org.koin.core.module.dsl.singleOf import org.koin.dsl.bind import org.koin.dsl.module diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 4796dcd8..262012c5 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -58,6 +58,10 @@ gradlePlugin { id = "fast.android.test" implementationClass = "AndroidTestConventionPlugin" } + register("koin") { + id = "fast.koin" + implementationClass = "KoinConventionPlugin" + } register("androidRoom") { id = "fast.android.room" implementationClass = "AndroidRoomConventionPlugin" diff --git a/build-logic/convention/src/main/kotlin/KoinConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KoinConventionPlugin.kt new file mode 100644 index 00000000..fcafda39 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/KoinConventionPlugin.kt @@ -0,0 +1,23 @@ +import dev.meloda.fast.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.dependencies + +class KoinConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + pluginManager.apply("com.google.devtools.ksp") + dependencies { + add("implementation", libs.findLibrary("koin.core").get()) + } + + pluginManager.withPlugin("com.android.base") { + dependencies { + add("implementation", libs.findLibrary("koin.android").get()) + add("implementation", libs.findLibrary("koin.androidx.compose").get()) + add("implementation", libs.findLibrary("koin.androidx.compose.navigation").get()) + } + } + } + } +} diff --git a/build.gradle.kts b/build.gradle.kts index 44761e5e..2ed91045 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,11 +1,12 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.android.library) apply false -// alias(libs.plugins.org.jetbrains.kotlin.android) apply false + alias(libs.plugins.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.compose) apply false alias(libs.plugins.room) apply false alias(libs.plugins.ksp) apply false + alias(libs.plugins.module.graph) apply true } diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts index d6cbbc64..08969edd 100644 --- a/core/common/build.gradle.kts +++ b/core/common/build.gradle.kts @@ -1,6 +1,7 @@ plugins { alias(libs.plugins.fast.android.library) - alias(libs.plugins.fast.android.library.compose) +// alias(libs.plugins.fast.jvm.library) +// alias(libs.plugins.fast.koin) } android { @@ -8,23 +9,8 @@ android { } dependencies { - implementation(libs.core.ktx) - implementation(libs.preference.ktx) + implementation(libs.kotlinx.coroutines.core) + implementation(libs.bundles.nanokt) implementation(libs.lifecycle.viewmodel.ktx) - implementation(libs.lifecycle.runtime.ktx) - - implementation(libs.koin.android) - implementation(libs.koin.androidx.compose) - implementation(libs.koin.androidx.compose.navigation) - - implementation(libs.coil.compose) - - implementation(libs.nanokt.jvm) - implementation(libs.nanokt.android) - implementation(libs.nanokt) - - implementation(libs.androidx.navigation.compose) - - implementation(libs.kotlin.serialization) } diff --git a/core/common/src/main/kotlin/dev/meloda/fast/common/di/CommonModule.kt b/core/common/src/main/kotlin/dev/meloda/fast/common/di/CommonModule.kt deleted file mode 100644 index b2509fd8..00000000 --- a/core/common/src/main/kotlin/dev/meloda/fast/common/di/CommonModule.kt +++ /dev/null @@ -1,21 +0,0 @@ -package dev.meloda.fast.common.di - -import coil.ImageLoader -import dev.meloda.fast.common.LongPollController -import dev.meloda.fast.common.LongPollControllerImpl -import dev.meloda.fast.common.provider.ResourceProvider -import dev.meloda.fast.common.provider.ResourceProviderImpl -import org.koin.core.module.dsl.singleOf -import org.koin.dsl.bind -import org.koin.dsl.module - -val commonModule = module { - single { - ImageLoader.Builder(get()) - .crossfade(true) - .build() - } - - singleOf(::LongPollControllerImpl) bind LongPollController::class - singleOf(::ResourceProviderImpl) bind ResourceProvider::class -} diff --git a/core/common/src/main/kotlin/dev/meloda/fast/common/extensions/Extensions.kt b/core/common/src/main/kotlin/dev/meloda/fast/common/extensions/Extensions.kt index a44ac114..627acb51 100644 --- a/core/common/src/main/kotlin/dev/meloda/fast/common/extensions/Extensions.kt +++ b/core/common/src/main/kotlin/dev/meloda/fast/common/extensions/Extensions.kt @@ -1,10 +1,5 @@ package dev.meloda.fast.common.extensions -import android.app.Activity -import android.content.Context -import android.content.Intent -import android.os.Build -import androidx.annotation.ChecksSdkIntAtLeast import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineScope @@ -21,18 +16,6 @@ import kotlinx.coroutines.flow.update import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds -fun Context.restartApp() { - (this as? Activity)?.let { activity -> - activity.finishAffinity() - activity.startActivity( - Intent( - this, - Class.forName("dev.meloda.fast.MainActivity") - ) - ) - } -} - inline fun Iterable.findWithIndex(predicate: (T) -> Boolean): Pair? { val value = firstOrNull(predicate) ?: return null return indexOf(value).let { index -> if (index == -1) null else index to value } @@ -115,13 +98,3 @@ fun Any.toList(mapper: (old: Any) -> T): List { else -> emptyList() } } - -@ChecksSdkIntAtLeast(parameter = 0, lambda = 1) -fun isSdkAtLeast(sdkInt: Int, action: (() -> Unit)? = null): Boolean { - return if (Build.VERSION.SDK_INT >= sdkInt) { - action?.invoke() - true - } else { - false - } -} diff --git a/core/common/src/main/kotlin/dev/meloda/fast/common/util/AndroidUtils.kt b/core/common/src/main/kotlin/dev/meloda/fast/common/util/AndroidUtils.kt index 74fd128e..0f684a77 100644 --- a/core/common/src/main/kotlin/dev/meloda/fast/common/util/AndroidUtils.kt +++ b/core/common/src/main/kotlin/dev/meloda/fast/common/util/AndroidUtils.kt @@ -4,14 +4,10 @@ import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.content.Intent -import android.graphics.Bitmap import android.net.Uri import android.os.Build import android.provider.Settings import android.widget.Toast -import androidx.core.content.FileProvider -import java.io.File -import java.io.FileOutputStream object AndroidUtils { @@ -96,61 +92,61 @@ object AndroidUtils { }) } - fun getInstallPackageIntent( - context: Context, - providerPath: String, - fileToRead: File, - ): Intent { - val intent = Intent(Intent.ACTION_VIEW) +// fun getInstallPackageIntent( +// context: Context, +// providerPath: String, +// fileToRead: File, +// ): Intent { +// val intent = Intent(Intent.ACTION_VIEW) +// +// intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) +// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) +// intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true) +// intent.data = FileProvider.getUriForFile( +// context, +// "dev.meloda.fast$providerPath", +// fileToRead +// ) +// +// return intent +// } - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true) - intent.data = FileProvider.getUriForFile( - context, - "dev.meloda.fast$providerPath", - fileToRead - ) +// fun getImageToShare(context: Context, existingFile: File): Uri? { +// val imageFolder = File(context.cacheDir, "images") +// +// return try { +// imageFolder.mkdirs() +// +// val copyToFile = File(imageFolder, "shared_image.png") +// if (copyToFile.exists()) { +// copyToFile.delete() +// } +// +// val file = existingFile.copyTo(copyToFile) +// FileProvider.getUriForFile(context, "dev.meloda.fast.provider", file) +// } catch (e: Exception) { +// e.printStackTrace() +// null +// } +// } - return intent - } - - fun getImageToShare(context: Context, existingFile: File): Uri? { - val imageFolder = File(context.cacheDir, "images") - - return try { - imageFolder.mkdirs() - - val copyToFile = File(imageFolder, "shared_image.png") - if (copyToFile.exists()) { - copyToFile.delete() - } - - val file = existingFile.copyTo(copyToFile) - FileProvider.getUriForFile(context, "dev.meloda.fast.provider", file) - } catch (e: Exception) { - e.printStackTrace() - null - } - } - - fun getImageToShare(context: Context, bitmap: Bitmap): Uri? { - val imageFolder = File(context.cacheDir, "images") - - return try { - imageFolder.mkdirs() - - val file = File(imageFolder, "shared_image.png") - val outputStream = FileOutputStream(file) - bitmap.compress(Bitmap.CompressFormat.PNG, 90, outputStream) - outputStream.flush() - outputStream.close() - FileProvider.getUriForFile(context, "dev.meloda.fast.fileprovider", file) - } catch (e: Exception) { - e.printStackTrace() - null - } - } +// fun getImageToShare(context: Context, bitmap: Bitmap): Uri? { +// val imageFolder = File(context.cacheDir, "images") +// +// return try { +// imageFolder.mkdirs() +// +// val file = File(imageFolder, "shared_image.png") +// val outputStream = FileOutputStream(file) +// bitmap.compress(Bitmap.CompressFormat.PNG, 90, outputStream) +// outputStream.flush() +// outputStream.close() +// FileProvider.getUriForFile(context, "dev.meloda.fast.fileprovider", file) +// } catch (e: Exception) { +// e.printStackTrace() +// null +// } +// } fun showShareSheet(context: Context, content: ShareContent) { val intent = Intent(Intent.ACTION_SEND).apply { diff --git a/core/data/build.gradle.kts b/core/data/build.gradle.kts index f3fc8d86..cdb4cd65 100644 --- a/core/data/build.gradle.kts +++ b/core/data/build.gradle.kts @@ -1,5 +1,6 @@ plugins { alias(libs.plugins.fast.android.library) +// alias(libs.plugins.fast.koin) } android { @@ -13,9 +14,8 @@ dependencies { api(projects.core.network) api(projects.core.database) - implementation(libs.koin.android) - - // TODO: 05/05/2024, Danil Nikolaev: research, maybe remove + // TODO: 11/08/2024, Danil Nikolaev: remove? implementation(libs.retrofit) implementation(libs.eithernet) + implementation(libs.koin.android) } diff --git a/core/network/src/main/kotlin/dev/meloda/fast/network/interceptor/AccessTokenInterceptor.kt b/core/data/src/main/kotlin/dev/meloda/fast/data/AccessTokenInterceptor.kt similarity index 88% rename from core/network/src/main/kotlin/dev/meloda/fast/network/interceptor/AccessTokenInterceptor.kt rename to core/data/src/main/kotlin/dev/meloda/fast/data/AccessTokenInterceptor.kt index 8d9a7ec5..72045b83 100644 --- a/core/network/src/main/kotlin/dev/meloda/fast/network/interceptor/AccessTokenInterceptor.kt +++ b/core/data/src/main/kotlin/dev/meloda/fast/data/AccessTokenInterceptor.kt @@ -1,7 +1,6 @@ -package dev.meloda.fast.network.interceptor +package dev.meloda.fast.data import androidx.core.net.toUri -import dev.meloda.fast.common.UserConfig import okhttp3.Interceptor import okhttp3.Response import java.net.URLEncoder diff --git a/core/common/src/main/kotlin/dev/meloda/fast/common/UserConfig.kt b/core/data/src/main/kotlin/dev/meloda/fast/data/UserConfig.kt similarity index 55% rename from core/common/src/main/kotlin/dev/meloda/fast/common/UserConfig.kt rename to core/data/src/main/kotlin/dev/meloda/fast/data/UserConfig.kt index c34be6a1..377e32d7 100644 --- a/core/common/src/main/kotlin/dev/meloda/fast/common/UserConfig.kt +++ b/core/data/src/main/kotlin/dev/meloda/fast/data/UserConfig.kt @@ -1,24 +1,16 @@ -package dev.meloda.fast.common +package dev.meloda.fast.data -import android.content.SharedPreferences -import androidx.core.content.edit -import kotlin.properties.Delegates +import dev.meloda.fast.datastore.AppSettings object UserConfig { private const val ARG_CURRENT_USER_ID = "current_user_id" - private var preferences: SharedPreferences by Delegates.notNull() - - fun init(preferences: SharedPreferences) { - this.preferences = preferences - } - var currentUserId: Int = -1 - get() = preferences.getInt(ARG_CURRENT_USER_ID, -1) + get() = AppSettings.getInt(ARG_CURRENT_USER_ID, -1) set(value) { field = value - preferences.edit { putInt(ARG_CURRENT_USER_ID, value) } + AppSettings.edit { putInt(ARG_CURRENT_USER_ID, value) } } var userId: Int = -1 diff --git a/core/data/src/main/kotlin/dev/meloda/fast/data/di/DataModule.kt b/core/data/src/main/kotlin/dev/meloda/fast/data/di/DataModule.kt index f767357e..10e878af 100644 --- a/core/data/src/main/kotlin/dev/meloda/fast/data/di/DataModule.kt +++ b/core/data/src/main/kotlin/dev/meloda/fast/data/di/DataModule.kt @@ -1,10 +1,8 @@ package dev.meloda.fast.data.di -import dev.meloda.fast.common.di.commonModule +import dev.meloda.fast.data.AccessTokenInterceptor import dev.meloda.fast.data.api.account.AccountRepository import dev.meloda.fast.data.api.account.AccountRepositoryImpl -import dev.meloda.fast.data.api.account.AccountUseCase -import dev.meloda.fast.data.api.account.AccountUseCaseImpl import dev.meloda.fast.data.api.audios.AudiosRepository import dev.meloda.fast.data.api.auth.AuthRepository import dev.meloda.fast.data.api.auth.AuthRepositoryImpl @@ -22,29 +20,26 @@ import dev.meloda.fast.data.api.oauth.OAuthRepositoryImpl import dev.meloda.fast.data.api.photos.PhotosRepository import dev.meloda.fast.data.api.users.UsersRepository import dev.meloda.fast.data.api.users.UsersRepositoryImpl -import dev.meloda.fast.data.api.users.UsersUseCase -import dev.meloda.fast.data.api.users.UsersUseCaseImpl import dev.meloda.fast.data.api.videos.VideosRepository import dev.meloda.fast.data.db.AccountsRepository import dev.meloda.fast.data.db.AccountsRepositoryImpl -import dev.meloda.fast.data.db.GetCurrentAccountUseCase import dev.meloda.fast.database.di.databaseModule import dev.meloda.fast.datastore.di.dataStoreModule import dev.meloda.fast.network.di.networkModule +import okhttp3.Interceptor import org.koin.core.module.dsl.singleOf +import org.koin.core.qualifier.named import org.koin.dsl.bind import org.koin.dsl.module val dataModule = module { includes( - commonModule, databaseModule, dataStoreModule, networkModule, ) singleOf(::AccountRepositoryImpl) bind AccountRepository::class - singleOf(::AccountUseCaseImpl) bind AccountUseCase::class singleOf(::AudiosRepository) @@ -63,12 +58,15 @@ val dataModule = module { singleOf(::PhotosRepository) singleOf(::UsersRepositoryImpl) bind UsersRepository::class - singleOf(::UsersUseCaseImpl) bind UsersUseCase::class singleOf(::VideosRepository) singleOf(::AccountsRepositoryImpl) bind AccountsRepository::class - singleOf(::GetCurrentAccountUseCase) singleOf(::FriendsRepositoryImpl) bind FriendsRepository::class + + // TODO: 11/08/2024, Danil Nikolaev: find a better solution + single(named("token_interceptor")) { + AccessTokenInterceptor() + } } diff --git a/core/domain/.gitignore b/core/domain/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/core/domain/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/core/domain/build.gradle.kts b/core/domain/build.gradle.kts new file mode 100644 index 00000000..4352644b --- /dev/null +++ b/core/domain/build.gradle.kts @@ -0,0 +1,18 @@ +plugins { + alias(libs.plugins.fast.android.library) +// alias(libs.plugins.fast.android.koin) +} + +android { + namespace = "dev.meloda.fast.domain" +} + +dependencies { + api(projects.core.data) + api(projects.core.model) + + // TODO: 11/08/2024, Danil Nikolaev: remove? + implementation(libs.kotlinx.coroutines.core) + implementation(libs.koin.core) + implementation(libs.eithernet) +} diff --git a/core/data/src/main/kotlin/dev/meloda/fast/data/api/account/AccountUseCase.kt b/core/domain/src/main/kotlin/dev/meloda/fast/domain/AccountUseCase.kt similarity index 87% rename from core/data/src/main/kotlin/dev/meloda/fast/data/api/account/AccountUseCase.kt rename to core/domain/src/main/kotlin/dev/meloda/fast/domain/AccountUseCase.kt index 5712e1d3..93afe8c5 100644 --- a/core/data/src/main/kotlin/dev/meloda/fast/data/api/account/AccountUseCase.kt +++ b/core/domain/src/main/kotlin/dev/meloda/fast/domain/AccountUseCase.kt @@ -1,4 +1,4 @@ -package dev.meloda.fast.data.api.account +package dev.meloda.fast.domain import dev.meloda.fast.data.State import kotlinx.coroutines.flow.Flow diff --git a/core/data/src/main/kotlin/dev/meloda/fast/data/api/account/AccountUseCaseImpl.kt b/core/domain/src/main/kotlin/dev/meloda/fast/domain/AccountUseCaseImpl.kt similarity index 88% rename from core/data/src/main/kotlin/dev/meloda/fast/data/api/account/AccountUseCaseImpl.kt rename to core/domain/src/main/kotlin/dev/meloda/fast/domain/AccountUseCaseImpl.kt index 6500c6e9..b681a5a5 100644 --- a/core/data/src/main/kotlin/dev/meloda/fast/data/api/account/AccountUseCaseImpl.kt +++ b/core/domain/src/main/kotlin/dev/meloda/fast/domain/AccountUseCaseImpl.kt @@ -1,6 +1,7 @@ -package dev.meloda.fast.data.api.account +package dev.meloda.fast.domain import dev.meloda.fast.data.State +import dev.meloda.fast.data.api.account.AccountRepository import dev.meloda.fast.data.mapToState import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow diff --git a/feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/AuthUseCase.kt b/core/domain/src/main/kotlin/dev/meloda/fast/domain/AuthUseCase.kt similarity index 86% rename from feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/AuthUseCase.kt rename to core/domain/src/main/kotlin/dev/meloda/fast/domain/AuthUseCase.kt index 3e324108..21c3c43a 100644 --- a/feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/AuthUseCase.kt +++ b/core/domain/src/main/kotlin/dev/meloda/fast/domain/AuthUseCase.kt @@ -1,4 +1,4 @@ -package dev.meloda.fast.auth.validation +package dev.meloda.fast.domain import dev.meloda.fast.data.State import dev.meloda.fast.model.api.responses.ValidatePhoneResponse diff --git a/feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/AuthUseCaseImpl.kt b/core/domain/src/main/kotlin/dev/meloda/fast/domain/AuthUseCaseImpl.kt similarity index 93% rename from feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/AuthUseCaseImpl.kt rename to core/domain/src/main/kotlin/dev/meloda/fast/domain/AuthUseCaseImpl.kt index ad0f594e..89676bcb 100644 --- a/feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/AuthUseCaseImpl.kt +++ b/core/domain/src/main/kotlin/dev/meloda/fast/domain/AuthUseCaseImpl.kt @@ -1,4 +1,4 @@ -package dev.meloda.fast.auth.validation +package dev.meloda.fast.domain import dev.meloda.fast.data.State import dev.meloda.fast.data.api.auth.AuthRepository diff --git a/core/data/src/main/kotlin/dev/meloda/fast/data/api/conversations/ConversationsUseCase.kt b/core/domain/src/main/kotlin/dev/meloda/fast/domain/ConversationsUseCase.kt similarity index 90% rename from core/data/src/main/kotlin/dev/meloda/fast/data/api/conversations/ConversationsUseCase.kt rename to core/domain/src/main/kotlin/dev/meloda/fast/domain/ConversationsUseCase.kt index e00c3dde..d8d86b4e 100644 --- a/core/data/src/main/kotlin/dev/meloda/fast/data/api/conversations/ConversationsUseCase.kt +++ b/core/domain/src/main/kotlin/dev/meloda/fast/domain/ConversationsUseCase.kt @@ -1,4 +1,4 @@ -package dev.meloda.fast.data.api.conversations +package dev.meloda.fast.domain import dev.meloda.fast.data.State import dev.meloda.fast.model.api.domain.VkConversation diff --git a/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/data/ConversationsUseCaseImpl.kt b/core/domain/src/main/kotlin/dev/meloda/fast/domain/ConversationsUseCaseImpl.kt similarity index 97% rename from feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/data/ConversationsUseCaseImpl.kt rename to core/domain/src/main/kotlin/dev/meloda/fast/domain/ConversationsUseCaseImpl.kt index fed98919..88c6e70d 100644 --- a/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/data/ConversationsUseCaseImpl.kt +++ b/core/domain/src/main/kotlin/dev/meloda/fast/domain/ConversationsUseCaseImpl.kt @@ -1,8 +1,7 @@ -package dev.meloda.fast.conversations.data +package dev.meloda.fast.domain import dev.meloda.fast.data.State import dev.meloda.fast.data.api.conversations.ConversationsRepository -import dev.meloda.fast.data.api.conversations.ConversationsUseCase import dev.meloda.fast.data.mapToState import dev.meloda.fast.model.api.domain.VkConversation import kotlinx.coroutines.Dispatchers diff --git a/core/data/src/main/kotlin/dev/meloda/fast/data/api/friends/FriendsUseCase.kt b/core/domain/src/main/kotlin/dev/meloda/fast/domain/FriendsUseCase.kt similarity index 92% rename from core/data/src/main/kotlin/dev/meloda/fast/data/api/friends/FriendsUseCase.kt rename to core/domain/src/main/kotlin/dev/meloda/fast/domain/FriendsUseCase.kt index 5da33616..d70c2acb 100644 --- a/core/data/src/main/kotlin/dev/meloda/fast/data/api/friends/FriendsUseCase.kt +++ b/core/domain/src/main/kotlin/dev/meloda/fast/domain/FriendsUseCase.kt @@ -1,4 +1,4 @@ -package dev.meloda.fast.data.api.friends +package dev.meloda.fast.domain import dev.meloda.fast.data.State import dev.meloda.fast.model.FriendsInfo diff --git a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/domain/FriendsUseCaseImpl.kt b/core/domain/src/main/kotlin/dev/meloda/fast/domain/FriendsUseCaseImpl.kt similarity index 90% rename from feature/friends/src/main/kotlin/dev/meloda/fast/friends/domain/FriendsUseCaseImpl.kt rename to core/domain/src/main/kotlin/dev/meloda/fast/domain/FriendsUseCaseImpl.kt index d2b3b715..19d22bf5 100644 --- a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/domain/FriendsUseCaseImpl.kt +++ b/core/domain/src/main/kotlin/dev/meloda/fast/domain/FriendsUseCaseImpl.kt @@ -1,15 +1,15 @@ -package dev.meloda.fast.friends.domain +package dev.meloda.fast.domain import dev.meloda.fast.data.State import dev.meloda.fast.data.api.friends.FriendsRepository -import dev.meloda.fast.data.api.friends.FriendsUseCase import dev.meloda.fast.data.mapToState import dev.meloda.fast.model.FriendsInfo import dev.meloda.fast.model.api.domain.VkUser import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow -class FriendsUseCaseImpl(private val repository: FriendsRepository) : FriendsUseCase { +class FriendsUseCaseImpl(private val repository: FriendsRepository) : + FriendsUseCase { override fun getAllFriends(count: Int?, offset: Int?): Flow> = flow { emit(State.Loading) diff --git a/core/data/src/main/kotlin/dev/meloda/fast/data/db/GetCurrentAccountUseCase.kt b/core/domain/src/main/kotlin/dev/meloda/fast/domain/GetCurrentAccountUseCase.kt similarity index 57% rename from core/data/src/main/kotlin/dev/meloda/fast/data/db/GetCurrentAccountUseCase.kt rename to core/domain/src/main/kotlin/dev/meloda/fast/domain/GetCurrentAccountUseCase.kt index f2add353..b083992b 100644 --- a/core/data/src/main/kotlin/dev/meloda/fast/data/db/GetCurrentAccountUseCase.kt +++ b/core/domain/src/main/kotlin/dev/meloda/fast/domain/GetCurrentAccountUseCase.kt @@ -1,11 +1,14 @@ -package dev.meloda.fast.data.db +package dev.meloda.fast.domain -import dev.meloda.fast.common.UserConfig +import dev.meloda.fast.data.UserConfig +import dev.meloda.fast.data.db.AccountsRepository import dev.meloda.fast.model.database.AccountEntity import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -class GetCurrentAccountUseCase(private val accountsRepository: AccountsRepository) { +class GetCurrentAccountUseCase( + private val accountsRepository: AccountsRepository +) { suspend operator fun invoke(): AccountEntity? = withContext(Dispatchers.IO) { accountsRepository.getAccountById(UserConfig.currentUserId) diff --git a/core/data/src/main/kotlin/dev/meloda/fast/data/LongPollUpdatesParser.kt b/core/domain/src/main/kotlin/dev/meloda/fast/domain/LongPollUpdatesParser.kt similarity index 98% rename from core/data/src/main/kotlin/dev/meloda/fast/data/LongPollUpdatesParser.kt rename to core/domain/src/main/kotlin/dev/meloda/fast/domain/LongPollUpdatesParser.kt index 9e421df5..4a5ab80f 100644 --- a/core/data/src/main/kotlin/dev/meloda/fast/data/LongPollUpdatesParser.kt +++ b/core/domain/src/main/kotlin/dev/meloda/fast/domain/LongPollUpdatesParser.kt @@ -1,12 +1,13 @@ -package dev.meloda.fast.data +package dev.meloda.fast.domain import android.util.Log -import dev.meloda.fast.common.UserConfig import dev.meloda.fast.common.VkConstants import dev.meloda.fast.common.extensions.asInt import dev.meloda.fast.common.extensions.listenValue import dev.meloda.fast.common.extensions.toList -import dev.meloda.fast.data.api.messages.MessagesUseCase +import dev.meloda.fast.data.UserConfig +import dev.meloda.fast.data.VkMemoryCache +import dev.meloda.fast.data.processState import dev.meloda.fast.model.ApiEvent import dev.meloda.fast.model.InteractionType import dev.meloda.fast.model.LongPollEvent diff --git a/core/data/src/main/kotlin/dev/meloda/fast/data/LongPollUseCase.kt b/core/domain/src/main/kotlin/dev/meloda/fast/domain/LongPollUseCase.kt similarity index 88% rename from core/data/src/main/kotlin/dev/meloda/fast/data/LongPollUseCase.kt rename to core/domain/src/main/kotlin/dev/meloda/fast/domain/LongPollUseCase.kt index ecb23679..40e73c22 100644 --- a/core/data/src/main/kotlin/dev/meloda/fast/data/LongPollUseCase.kt +++ b/core/domain/src/main/kotlin/dev/meloda/fast/domain/LongPollUseCase.kt @@ -1,5 +1,6 @@ -package dev.meloda.fast.data +package dev.meloda.fast.domain +import dev.meloda.fast.data.State import dev.meloda.fast.model.api.data.LongPollUpdates import dev.meloda.fast.model.api.data.VkLongPollData import kotlinx.coroutines.flow.Flow diff --git a/core/data/src/main/kotlin/dev/meloda/fast/data/LongPollUseCaseImpl.kt b/core/domain/src/main/kotlin/dev/meloda/fast/domain/LongPollUseCaseImpl.kt similarity index 92% rename from core/data/src/main/kotlin/dev/meloda/fast/data/LongPollUseCaseImpl.kt rename to core/domain/src/main/kotlin/dev/meloda/fast/domain/LongPollUseCaseImpl.kt index f0eacd47..b4ea2a79 100644 --- a/core/data/src/main/kotlin/dev/meloda/fast/data/LongPollUseCaseImpl.kt +++ b/core/domain/src/main/kotlin/dev/meloda/fast/domain/LongPollUseCaseImpl.kt @@ -1,6 +1,8 @@ -package dev.meloda.fast.data +package dev.meloda.fast.domain +import dev.meloda.fast.data.State import dev.meloda.fast.data.api.longpoll.LongPollRepository +import dev.meloda.fast.data.mapToState import dev.meloda.fast.model.api.data.LongPollUpdates import dev.meloda.fast.model.api.data.VkLongPollData import kotlinx.coroutines.flow.Flow diff --git a/core/data/src/main/kotlin/dev/meloda/fast/data/api/messages/MessagesUseCase.kt b/core/domain/src/main/kotlin/dev/meloda/fast/domain/MessagesUseCase.kt similarity index 92% rename from core/data/src/main/kotlin/dev/meloda/fast/data/api/messages/MessagesUseCase.kt rename to core/domain/src/main/kotlin/dev/meloda/fast/domain/MessagesUseCase.kt index 9ec3fc90..84e533c7 100644 --- a/core/data/src/main/kotlin/dev/meloda/fast/data/api/messages/MessagesUseCase.kt +++ b/core/domain/src/main/kotlin/dev/meloda/fast/domain/MessagesUseCase.kt @@ -1,6 +1,7 @@ -package dev.meloda.fast.data.api.messages +package dev.meloda.fast.domain import dev.meloda.fast.data.State +import dev.meloda.fast.data.api.messages.MessagesHistoryInfo import dev.meloda.fast.model.api.domain.VkAttachment import dev.meloda.fast.model.api.domain.VkAttachmentHistoryMessage import dev.meloda.fast.model.api.domain.VkMessage diff --git a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/domain/MessagesUseCaseImpl.kt b/core/domain/src/main/kotlin/dev/meloda/fast/domain/MessagesUseCaseImpl.kt similarity index 96% rename from feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/domain/MessagesUseCaseImpl.kt rename to core/domain/src/main/kotlin/dev/meloda/fast/domain/MessagesUseCaseImpl.kt index 71d649db..9239300e 100644 --- a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/domain/MessagesUseCaseImpl.kt +++ b/core/domain/src/main/kotlin/dev/meloda/fast/domain/MessagesUseCaseImpl.kt @@ -1,9 +1,8 @@ -package dev.meloda.fast.messageshistory.domain +package dev.meloda.fast.domain import dev.meloda.fast.data.State import dev.meloda.fast.data.api.messages.MessagesHistoryInfo import dev.meloda.fast.data.api.messages.MessagesRepository -import dev.meloda.fast.data.api.messages.MessagesUseCase import dev.meloda.fast.data.mapToState import dev.meloda.fast.model.api.domain.VkAttachment import dev.meloda.fast.model.api.domain.VkAttachmentHistoryMessage diff --git a/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/OAuthUseCase.kt b/core/domain/src/main/kotlin/dev/meloda/fast/domain/OAuthUseCase.kt similarity index 78% rename from feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/OAuthUseCase.kt rename to core/domain/src/main/kotlin/dev/meloda/fast/domain/OAuthUseCase.kt index 37d1b282..4f8737ef 100644 --- a/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/OAuthUseCase.kt +++ b/core/domain/src/main/kotlin/dev/meloda/fast/domain/OAuthUseCase.kt @@ -1,7 +1,7 @@ -package dev.meloda.fast.auth.login +package dev.meloda.fast.domain import dev.meloda.fast.data.State -import dev.meloda.fast.auth.login.model.AuthInfo +import dev.meloda.fast.model.AuthInfo import kotlinx.coroutines.flow.Flow interface OAuthUseCase { diff --git a/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/OAuthUseCaseImpl.kt b/core/domain/src/main/kotlin/dev/meloda/fast/domain/OAuthUseCaseImpl.kt similarity index 98% rename from feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/OAuthUseCaseImpl.kt rename to core/domain/src/main/kotlin/dev/meloda/fast/domain/OAuthUseCaseImpl.kt index 9c3342ae..d03f02f2 100644 --- a/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/OAuthUseCaseImpl.kt +++ b/core/domain/src/main/kotlin/dev/meloda/fast/domain/OAuthUseCaseImpl.kt @@ -1,8 +1,8 @@ -package dev.meloda.fast.auth.login +package dev.meloda.fast.domain -import dev.meloda.fast.auth.login.model.AuthInfo import dev.meloda.fast.data.State import dev.meloda.fast.data.api.oauth.OAuthRepository +import dev.meloda.fast.model.AuthInfo import dev.meloda.fast.network.OAuthErrorDomain import dev.meloda.fast.network.ValidationType import dev.meloda.fast.network.VkOAuthError diff --git a/core/data/src/main/kotlin/dev/meloda/fast/data/api/users/UsersUseCase.kt b/core/domain/src/main/kotlin/dev/meloda/fast/domain/UsersUseCase.kt similarity index 91% rename from core/data/src/main/kotlin/dev/meloda/fast/data/api/users/UsersUseCase.kt rename to core/domain/src/main/kotlin/dev/meloda/fast/domain/UsersUseCase.kt index dedd6fd9..297e2dda 100644 --- a/core/data/src/main/kotlin/dev/meloda/fast/data/api/users/UsersUseCase.kt +++ b/core/domain/src/main/kotlin/dev/meloda/fast/domain/UsersUseCase.kt @@ -1,4 +1,4 @@ -package dev.meloda.fast.data.api.users +package dev.meloda.fast.domain import dev.meloda.fast.data.State import dev.meloda.fast.model.api.domain.VkUser diff --git a/core/data/src/main/kotlin/dev/meloda/fast/data/api/users/UsersUseCaseImpl.kt b/core/domain/src/main/kotlin/dev/meloda/fast/domain/UsersUseCaseImpl.kt similarity index 92% rename from core/data/src/main/kotlin/dev/meloda/fast/data/api/users/UsersUseCaseImpl.kt rename to core/domain/src/main/kotlin/dev/meloda/fast/domain/UsersUseCaseImpl.kt index c2d6a0d0..b7d50817 100644 --- a/core/data/src/main/kotlin/dev/meloda/fast/data/api/users/UsersUseCaseImpl.kt +++ b/core/domain/src/main/kotlin/dev/meloda/fast/domain/UsersUseCaseImpl.kt @@ -1,6 +1,7 @@ -package dev.meloda.fast.data.api.users +package dev.meloda.fast.domain import dev.meloda.fast.data.State +import dev.meloda.fast.data.api.users.UsersRepository import dev.meloda.fast.data.mapToState import dev.meloda.fast.model.api.domain.VkUser import kotlinx.coroutines.flow.Flow diff --git a/core/domain/src/main/kotlin/dev/meloda/fast/domain/di/DomainModule.kt b/core/domain/src/main/kotlin/dev/meloda/fast/domain/di/DomainModule.kt new file mode 100644 index 00000000..96e41ca8 --- /dev/null +++ b/core/domain/src/main/kotlin/dev/meloda/fast/domain/di/DomainModule.kt @@ -0,0 +1,19 @@ +package dev.meloda.fast.domain.di + +import dev.meloda.fast.data.di.dataModule +import dev.meloda.fast.domain.AccountUseCase +import dev.meloda.fast.domain.AccountUseCaseImpl +import dev.meloda.fast.domain.GetCurrentAccountUseCase +import dev.meloda.fast.domain.UsersUseCase +import dev.meloda.fast.domain.UsersUseCaseImpl +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.bind +import org.koin.dsl.module + +val domainModule = module { + includes(dataModule) + + singleOf(::UsersUseCaseImpl) bind UsersUseCase::class + singleOf(::AccountUseCaseImpl) bind AccountUseCase::class + singleOf(::GetCurrentAccountUseCase) +} diff --git a/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/model/AuthInfo.kt b/core/model/src/main/kotlin/dev/meloda/fast/model/AuthInfo.kt similarity index 72% rename from feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/model/AuthInfo.kt rename to core/model/src/main/kotlin/dev/meloda/fast/model/AuthInfo.kt index f5503ecb..5afa9ba2 100644 --- a/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/model/AuthInfo.kt +++ b/core/model/src/main/kotlin/dev/meloda/fast/model/AuthInfo.kt @@ -1,4 +1,4 @@ -package dev.meloda.fast.auth.login.model +package dev.meloda.fast.model data class AuthInfo( val userId: Int?, diff --git a/core/network/src/main/kotlin/dev/meloda/fast/network/di/NetworkModule.kt b/core/network/src/main/kotlin/dev/meloda/fast/network/di/NetworkModule.kt index bbed6a8b..51dab6f8 100644 --- a/core/network/src/main/kotlin/dev/meloda/fast/network/di/NetworkModule.kt +++ b/core/network/src/main/kotlin/dev/meloda/fast/network/di/NetworkModule.kt @@ -2,12 +2,14 @@ package dev.meloda.fast.network.di import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerInterceptor +import com.slack.eithernet.ApiResultCallAdapterFactory +import com.slack.eithernet.ApiResultConverterFactory +import com.squareup.moshi.Moshi import dev.meloda.fast.common.AppConstants import dev.meloda.fast.network.JsonConverter import dev.meloda.fast.network.MoshiConverter import dev.meloda.fast.network.OAuthResultCallFactory import dev.meloda.fast.network.ResponseConverterFactory -import dev.meloda.fast.network.interceptor.AccessTokenInterceptor import dev.meloda.fast.network.interceptor.LanguageInterceptor import dev.meloda.fast.network.interceptor.VersionInterceptor import dev.meloda.fast.network.service.account.AccountService @@ -22,9 +24,7 @@ import dev.meloda.fast.network.service.oauth.OAuthService import dev.meloda.fast.network.service.photos.PhotosService import dev.meloda.fast.network.service.users.UsersService import dev.meloda.fast.network.service.videos.VideosService -import com.slack.eithernet.ApiResultCallAdapterFactory -import com.slack.eithernet.ApiResultConverterFactory -import com.squareup.moshi.Moshi +import okhttp3.Interceptor import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import org.koin.core.module.dsl.singleOf @@ -41,14 +41,13 @@ val networkModule = module { singleOf(::MoshiConverter) bind JsonConverter::class single { ChuckerCollector(get()) } single { ChuckerInterceptor.Builder(get()).collector(get()).build() } - singleOf(::AccessTokenInterceptor) singleOf(::VersionInterceptor) singleOf(::LanguageInterceptor) single { OkHttpClient.Builder() .connectTimeout(20, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) - .addInterceptor(get()) + .addInterceptor(get(named("token_interceptor")) as Interceptor) .addInterceptor(get()) .addInterceptor(get()) .addInterceptor(get()) diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts index 52b88a1b..002e8b00 100644 --- a/core/ui/build.gradle.kts +++ b/core/ui/build.gradle.kts @@ -1,6 +1,7 @@ plugins { alias(libs.plugins.fast.android.library) alias(libs.plugins.fast.android.library.compose) + alias(libs.plugins.kotlin.serialization) } android { @@ -8,7 +9,7 @@ android { } dependencies { - implementation(projects.core.common) + api(projects.core.common) api(projects.core.model) implementation(libs.haze) @@ -17,5 +18,9 @@ dependencies { implementation(platform(libs.compose.bom)) implementation(libs.bundles.compose) + implementation(libs.androidx.navigation.compose) + implementation(libs.kotlin.serialization) + implementation(libs.koin.androidx.compose.navigation) + debugImplementation(libs.compose.ui.tooling) } diff --git a/core/common/src/main/kotlin/dev/meloda/fast/common/extensions/CustomNavType.kt b/core/ui/src/main/kotlin/dev/meloda/fast/ui/extensions/CustomNavType.kt similarity index 94% rename from core/common/src/main/kotlin/dev/meloda/fast/common/extensions/CustomNavType.kt rename to core/ui/src/main/kotlin/dev/meloda/fast/ui/extensions/CustomNavType.kt index b2de1833..5b8aa270 100644 --- a/core/common/src/main/kotlin/dev/meloda/fast/common/extensions/CustomNavType.kt +++ b/core/ui/src/main/kotlin/dev/meloda/fast/ui/extensions/CustomNavType.kt @@ -1,4 +1,4 @@ -package dev.meloda.fast.common.extensions +package dev.meloda.fast.ui.extensions import android.os.Bundle import android.os.Parcelable diff --git a/core/common/src/main/kotlin/dev/meloda/fast/common/extensions/navigation/NavigationExtensions.kt b/core/ui/src/main/kotlin/dev/meloda/fast/ui/extensions/SharedViewModel.kt similarity index 92% rename from core/common/src/main/kotlin/dev/meloda/fast/common/extensions/navigation/NavigationExtensions.kt rename to core/ui/src/main/kotlin/dev/meloda/fast/ui/extensions/SharedViewModel.kt index 430460ce..2bfb3f95 100644 --- a/core/common/src/main/kotlin/dev/meloda/fast/common/extensions/navigation/NavigationExtensions.kt +++ b/core/ui/src/main/kotlin/dev/meloda/fast/ui/extensions/SharedViewModel.kt @@ -1,4 +1,4 @@ -package dev.meloda.fast.common.extensions.navigation +package dev.meloda.fast.ui.extensions import androidx.compose.runtime.Composable import androidx.compose.runtime.remember diff --git a/feature/auth/build.gradle.kts b/feature/auth/build.gradle.kts index 392335d0..54d61fcc 100644 --- a/feature/auth/build.gradle.kts +++ b/feature/auth/build.gradle.kts @@ -64,7 +64,7 @@ android { } dependencies { - implementation(projects.core.data) + implementation(projects.core.domain) implementation(projects.core.ui) implementation(platform(libs.compose.bom)) diff --git a/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/LoginViewModel.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/LoginViewModel.kt index 6b182491..321d9b39 100644 --- a/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/LoginViewModel.kt +++ b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/login/LoginViewModel.kt @@ -11,17 +11,18 @@ import dev.meloda.fast.auth.login.model.LoginValidationArguments import dev.meloda.fast.auth.login.model.LoginValidationResult import dev.meloda.fast.auth.login.validation.LoginValidator import dev.meloda.fast.common.LongPollController -import dev.meloda.fast.common.UserConfig import dev.meloda.fast.common.VkConstants import dev.meloda.fast.common.extensions.listenValue import dev.meloda.fast.common.extensions.setValue import dev.meloda.fast.common.extensions.updateValue import dev.meloda.fast.common.model.LongPollState import dev.meloda.fast.data.State -import dev.meloda.fast.data.api.users.UsersUseCase +import dev.meloda.fast.data.UserConfig import dev.meloda.fast.data.db.AccountsRepository import dev.meloda.fast.data.processState import dev.meloda.fast.datastore.AppSettings +import dev.meloda.fast.domain.OAuthUseCase +import dev.meloda.fast.domain.UsersUseCase import dev.meloda.fast.model.database.AccountEntity import dev.meloda.fast.network.OAuthErrorDomain import kotlinx.coroutines.Dispatchers @@ -70,12 +71,12 @@ interface LoginViewModel { } class LoginViewModelImpl( - private val oAuthUseCase: dev.meloda.fast.auth.login.OAuthUseCase, + private val oAuthUseCase: OAuthUseCase, private val usersUseCase: UsersUseCase, private val accountsRepository: AccountsRepository, private val loginValidator: LoginValidator, private val longPollController: LongPollController -) : ViewModel(), dev.meloda.fast.auth.login.LoginViewModel { +) : ViewModel(), LoginViewModel { override val screenState = MutableStateFlow(LoginScreenState.EMPTY) override val loginError = MutableStateFlow(null) diff --git a/feature/auth/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 index 4f6fb7c5..5a149d8a 100644 --- a/feature/auth/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 @@ -1,9 +1,8 @@ package dev.meloda.fast.auth.login.di -import dev.meloda.fast.auth.login.LoginViewModel import dev.meloda.fast.auth.login.LoginViewModelImpl -import dev.meloda.fast.auth.login.OAuthUseCase -import dev.meloda.fast.auth.login.OAuthUseCaseImpl +import dev.meloda.fast.domain.OAuthUseCase +import dev.meloda.fast.domain.OAuthUseCaseImpl import dev.meloda.fast.auth.login.validation.LoginValidator import org.koin.androidx.viewmodel.dsl.viewModelOf import org.koin.core.module.dsl.singleOf diff --git a/feature/auth/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 index c12dfa1b..512aeeea 100644 --- a/feature/auth/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 @@ -4,14 +4,14 @@ import androidx.navigation.NavBackStackEntry import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable -import dev.meloda.fast.common.extensions.navigation.sharedViewModel import dev.meloda.fast.auth.login.LoginViewModel import dev.meloda.fast.auth.login.LoginViewModelImpl import dev.meloda.fast.auth.login.model.CaptchaArguments -import dev.meloda.fast.auth.login.model.LoginValidationArguments import dev.meloda.fast.auth.login.model.LoginUserBannedArguments +import dev.meloda.fast.auth.login.model.LoginValidationArguments import dev.meloda.fast.auth.login.presentation.LoginRoute import dev.meloda.fast.auth.login.presentation.LogoRoute +import dev.meloda.fast.ui.extensions.sharedViewModel import kotlinx.serialization.Serializable @Serializable @@ -29,8 +29,8 @@ fun NavGraphBuilder.loginScreen( navController: NavController ) { composable { backStackEntry -> - val viewModel: dev.meloda.fast.auth.login.LoginViewModel = - backStackEntry.sharedViewModel(navController = navController) + val viewModel: LoginViewModel = + backStackEntry.sharedViewModel(navController = navController) val validationCode = backStackEntry.getValidationResult() val captchaCode = backStackEntry.getCaptchaResult() diff --git a/feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/ValidationViewModel.kt b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/ValidationViewModel.kt index 8388b9f2..ce7e257c 100644 --- a/feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/ValidationViewModel.kt +++ b/feature/auth/src/main/kotlin/dev/meloda/fast/auth/validation/ValidationViewModel.kt @@ -12,6 +12,7 @@ import dev.meloda.fast.common.extensions.listenValue import dev.meloda.fast.common.extensions.setValue import dev.meloda.fast.common.extensions.updateValue import dev.meloda.fast.data.processState +import dev.meloda.fast.domain.AuthUseCase import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow diff --git a/feature/auth/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 index 606f88ca..54280c3b 100644 --- a/feature/auth/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 @@ -1,7 +1,7 @@ package dev.meloda.fast.auth.validation.di -import dev.meloda.fast.auth.validation.AuthUseCase -import dev.meloda.fast.auth.validation.AuthUseCaseImpl +import dev.meloda.fast.domain.AuthUseCase +import dev.meloda.fast.domain.AuthUseCaseImpl import dev.meloda.fast.auth.validation.ValidationViewModel import dev.meloda.fast.auth.validation.ValidationViewModelImpl import dev.meloda.fast.auth.validation.validation.ValidationValidator diff --git a/feature/auth/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 index 8b2144e1..891cbbb8 100644 --- a/feature/auth/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 @@ -7,7 +7,7 @@ import androidx.navigation.compose.composable import androidx.navigation.toRoute import dev.meloda.fast.auth.validation.model.ValidationArguments import dev.meloda.fast.auth.validation.presentation.ValidationRoute -import dev.meloda.fast.common.extensions.customNavType +import dev.meloda.fast.ui.extensions.customNavType import kotlinx.serialization.Serializable import kotlin.reflect.typeOf diff --git a/feature/chatmaterials/build.gradle.kts b/feature/chatmaterials/build.gradle.kts index fd0b610f..784b0f77 100644 --- a/feature/chatmaterials/build.gradle.kts +++ b/feature/chatmaterials/build.gradle.kts @@ -8,7 +8,7 @@ android { } dependencies { - implementation(projects.core.data) + implementation(projects.core.domain) implementation(projects.core.model) implementation(projects.core.ui) diff --git a/feature/chatmaterials/src/main/kotlin/dev/meloda/fast/chatmaterials/ChatMaterialsViewModel.kt b/feature/chatmaterials/src/main/kotlin/dev/meloda/fast/chatmaterials/ChatMaterialsViewModel.kt index 89645518..b3ff3460 100644 --- a/feature/chatmaterials/src/main/kotlin/dev/meloda/fast/chatmaterials/ChatMaterialsViewModel.kt +++ b/feature/chatmaterials/src/main/kotlin/dev/meloda/fast/chatmaterials/ChatMaterialsViewModel.kt @@ -7,8 +7,8 @@ import dev.meloda.fast.chatmaterials.navigation.ChatMaterials import dev.meloda.fast.chatmaterials.util.asPresentation import dev.meloda.fast.common.extensions.listenValue import dev.meloda.fast.common.extensions.setValue -import dev.meloda.fast.data.api.messages.MessagesUseCase import dev.meloda.fast.data.processState +import dev.meloda.fast.domain.MessagesUseCase import dev.meloda.fast.model.BaseError import dev.meloda.fast.model.api.domain.VkAttachmentHistoryMessage import kotlinx.coroutines.flow.MutableStateFlow diff --git a/feature/conversations/build.gradle.kts b/feature/conversations/build.gradle.kts index 32c01c9b..b6195129 100644 --- a/feature/conversations/build.gradle.kts +++ b/feature/conversations/build.gradle.kts @@ -9,13 +9,11 @@ android { dependencies { implementation(projects.core.common) - implementation(projects.core.data) + implementation(projects.core.domain) implementation(projects.core.model) implementation(projects.core.ui) - implementation(libs.nanokt.android) - implementation(libs.nanokt.jvm) - implementation(libs.nanokt) + implementation(libs.bundles.nanokt) implementation(libs.koin.android) implementation(libs.koin.androidx.compose) diff --git a/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/ConversationsViewModel.kt b/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/ConversationsViewModel.kt index 26d6db21..c25506fd 100644 --- a/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/ConversationsViewModel.kt +++ b/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/ConversationsViewModel.kt @@ -14,12 +14,12 @@ import dev.meloda.fast.conversations.model.ConversationsShowOptions import dev.meloda.fast.conversations.model.UiConversation import dev.meloda.fast.conversations.util.asPresentation import dev.meloda.fast.conversations.util.extractAvatar -import dev.meloda.fast.data.LongPollUpdatesParser import dev.meloda.fast.data.State -import dev.meloda.fast.data.api.conversations.ConversationsUseCase -import dev.meloda.fast.data.api.messages.MessagesUseCase import dev.meloda.fast.data.processState import dev.meloda.fast.datastore.UserSettings +import dev.meloda.fast.domain.ConversationsUseCase +import dev.meloda.fast.domain.LongPollUpdatesParser +import dev.meloda.fast.domain.MessagesUseCase import dev.meloda.fast.model.BaseError import dev.meloda.fast.model.InteractionType import dev.meloda.fast.model.LongPollEvent diff --git a/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/di/ConversationsModule.kt b/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/di/ConversationsModule.kt index 5fca2061..b7ac163e 100644 --- a/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/di/ConversationsModule.kt +++ b/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/di/ConversationsModule.kt @@ -1,14 +1,14 @@ package dev.meloda.fast.conversations.di import dev.meloda.fast.conversations.ConversationsViewModelImpl -import dev.meloda.fast.conversations.data.ConversationsUseCaseImpl -import dev.meloda.fast.data.api.conversations.ConversationsUseCase +import dev.meloda.fast.domain.ConversationsUseCaseImpl +import dev.meloda.fast.domain.ConversationsUseCase import org.koin.androidx.viewmodel.dsl.viewModelOf import org.koin.core.module.dsl.singleOf import org.koin.dsl.bind import org.koin.dsl.module val conversationsModule = module { - singleOf(::ConversationsUseCaseImpl) bind ConversationsUseCase::class + singleOf(::ConversationsUseCaseImpl) bind dev.meloda.fast.domain.ConversationsUseCase::class viewModelOf(::ConversationsViewModelImpl) } diff --git a/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/navigation/ConversationsNavigation.kt b/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/navigation/ConversationsNavigation.kt index 69977433..e53b9f73 100644 --- a/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/navigation/ConversationsNavigation.kt +++ b/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/navigation/ConversationsNavigation.kt @@ -3,11 +3,11 @@ package dev.meloda.fast.conversations.navigation import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable -import dev.meloda.fast.common.extensions.navigation.sharedViewModel import dev.meloda.fast.conversations.ConversationsViewModel import dev.meloda.fast.conversations.ConversationsViewModelImpl import dev.meloda.fast.conversations.presentation.ConversationsRoute import dev.meloda.fast.model.BaseError +import dev.meloda.fast.ui.extensions.sharedViewModel import kotlinx.serialization.Serializable @Serializable diff --git a/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/presentation/ConversationsList.kt b/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/presentation/ConversationsList.kt index 15bd9180..44232433 100644 --- a/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/presentation/ConversationsList.kt +++ b/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/presentation/ConversationsList.kt @@ -23,10 +23,10 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import dev.meloda.fast.common.UserConfig import dev.meloda.fast.conversations.model.ConversationOption import dev.meloda.fast.conversations.model.ConversationsScreenState import dev.meloda.fast.conversations.model.UiConversation +import dev.meloda.fast.data.UserConfig import dev.meloda.fast.ui.theme.LocalBottomPadding import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch diff --git a/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/util/ConversationDomainMapper.kt b/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/util/ConversationDomainMapper.kt index f408fb57..d9590c3c 100644 --- a/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/util/ConversationDomainMapper.kt +++ b/feature/conversations/src/main/kotlin/dev/meloda/fast/conversations/util/ConversationDomainMapper.kt @@ -9,14 +9,14 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.withStyle import com.conena.nanokt.jvm.util.dayOfMonth import com.conena.nanokt.jvm.util.month +import dev.meloda.fast.common.extensions.orDots import dev.meloda.fast.common.model.UiImage import dev.meloda.fast.common.model.UiText -import dev.meloda.fast.common.UserConfig -import dev.meloda.fast.common.extensions.orDots import dev.meloda.fast.common.model.parseString import dev.meloda.fast.common.util.TimeUtils import dev.meloda.fast.conversations.model.ActionState import dev.meloda.fast.conversations.model.UiConversation +import dev.meloda.fast.data.UserConfig import dev.meloda.fast.data.VkMemoryCache import dev.meloda.fast.model.InteractionType import dev.meloda.fast.model.api.PeerType diff --git a/feature/friends/build.gradle.kts b/feature/friends/build.gradle.kts index 3878cacb..1dac932d 100644 --- a/feature/friends/build.gradle.kts +++ b/feature/friends/build.gradle.kts @@ -9,7 +9,7 @@ android { dependencies { implementation(projects.core.common) - implementation(projects.core.data) + implementation(projects.core.domain) implementation(projects.core.model) implementation(projects.core.ui) diff --git a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/FriendsViewModel.kt b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/FriendsViewModel.kt index dbbee942..e5464c43 100644 --- a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/FriendsViewModel.kt +++ b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/FriendsViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.ViewModel import dev.meloda.fast.common.extensions.listenValue import dev.meloda.fast.common.extensions.setValue import dev.meloda.fast.data.State -import dev.meloda.fast.data.api.friends.FriendsUseCase +import dev.meloda.fast.domain.FriendsUseCase import dev.meloda.fast.data.processState import dev.meloda.fast.datastore.UserSettings import dev.meloda.fast.friends.model.FriendsScreenState diff --git a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/di/FriendsModule.kt b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/di/FriendsModule.kt index e7b39df1..d3e56173 100644 --- a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/di/FriendsModule.kt +++ b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/di/FriendsModule.kt @@ -1,15 +1,15 @@ package dev.meloda.fast.friends.di -import dev.meloda.fast.data.api.friends.FriendsUseCase +import dev.meloda.fast.domain.FriendsUseCase import dev.meloda.fast.friends.FriendsViewModelImpl -import dev.meloda.fast.friends.domain.FriendsUseCaseImpl +import dev.meloda.fast.domain.FriendsUseCaseImpl import org.koin.androidx.viewmodel.dsl.viewModelOf import org.koin.core.module.dsl.singleOf import org.koin.dsl.bind import org.koin.dsl.module val friendsModule = module { - singleOf(::FriendsUseCaseImpl) bind FriendsUseCase::class + singleOf(::FriendsUseCaseImpl) bind dev.meloda.fast.domain.FriendsUseCase::class viewModelOf(::FriendsViewModelImpl) } diff --git a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/navigation/FriendsNavigation.kt b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/navigation/FriendsNavigation.kt index ca6896a7..261718e1 100644 --- a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/navigation/FriendsNavigation.kt +++ b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/navigation/FriendsNavigation.kt @@ -3,11 +3,11 @@ package dev.meloda.fast.friends.navigation import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable -import dev.meloda.fast.common.extensions.navigation.sharedViewModel import dev.meloda.fast.friends.FriendsViewModel import dev.meloda.fast.friends.FriendsViewModelImpl import dev.meloda.fast.friends.presentation.FriendsRoute import dev.meloda.fast.model.BaseError +import dev.meloda.fast.ui.extensions.sharedViewModel import kotlinx.serialization.Serializable @Serializable diff --git a/feature/messageshistory/build.gradle.kts b/feature/messageshistory/build.gradle.kts index 10c3452f..10122d92 100644 --- a/feature/messageshistory/build.gradle.kts +++ b/feature/messageshistory/build.gradle.kts @@ -9,7 +9,7 @@ android { dependencies { implementation(projects.core.common) - implementation(projects.core.data) + implementation(projects.core.domain) implementation(projects.core.model) implementation(projects.core.ui) diff --git a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryViewModel.kt b/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryViewModel.kt index e236366b..dc9bf628 100644 --- a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryViewModel.kt +++ b/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryViewModel.kt @@ -9,19 +9,19 @@ import androidx.lifecycle.viewModelScope import com.conena.nanokt.collections.indexOfFirstOrNull import com.conena.nanokt.collections.indexOfOrNull import com.conena.nanokt.text.isEmptyOrBlank -import dev.meloda.fast.common.UserConfig import dev.meloda.fast.common.extensions.listenValue import dev.meloda.fast.common.extensions.setValue import dev.meloda.fast.common.extensions.updateValue import dev.meloda.fast.common.provider.ResourceProvider -import dev.meloda.fast.data.LongPollUpdatesParser +import dev.meloda.fast.data.UserConfig import dev.meloda.fast.data.VkMemoryCache -import dev.meloda.fast.data.api.conversations.ConversationsUseCase -import dev.meloda.fast.data.api.messages.MessagesUseCase import dev.meloda.fast.data.processState import dev.meloda.fast.datastore.AppSettings import dev.meloda.fast.datastore.SettingsKeys import dev.meloda.fast.datastore.UserSettings +import dev.meloda.fast.domain.ConversationsUseCase +import dev.meloda.fast.domain.LongPollUpdatesParser +import dev.meloda.fast.domain.MessagesUseCase import dev.meloda.fast.messageshistory.model.ActionMode import dev.meloda.fast.messageshistory.model.MessagesHistoryScreenState import dev.meloda.fast.messageshistory.model.UiItem diff --git a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/di/MessagesHistoryModule.kt b/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/di/MessagesHistoryModule.kt index 91f6acf6..e04ba4d4 100644 --- a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/di/MessagesHistoryModule.kt +++ b/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/di/MessagesHistoryModule.kt @@ -1,9 +1,9 @@ package dev.meloda.fast.messageshistory.di -import dev.meloda.fast.data.api.messages.MessagesUseCase +import dev.meloda.fast.domain.MessagesUseCase import dev.meloda.fast.messageshistory.MessagesHistoryViewModel import dev.meloda.fast.messageshistory.MessagesHistoryViewModelImpl -import dev.meloda.fast.messageshistory.domain.MessagesUseCaseImpl +import dev.meloda.fast.domain.MessagesUseCaseImpl import dev.meloda.fast.messageshistory.validation.MessagesHistoryValidator import org.koin.androidx.viewmodel.dsl.viewModelOf import org.koin.core.module.dsl.singleOf @@ -11,7 +11,7 @@ import org.koin.dsl.bind import org.koin.dsl.module val messagesHistoryModule = module { - singleOf(::MessagesUseCaseImpl) bind MessagesUseCase::class + singleOf(::MessagesUseCaseImpl) bind dev.meloda.fast.domain.MessagesUseCase::class singleOf(::MessagesHistoryValidator) viewModelOf(::MessagesHistoryViewModelImpl) bind MessagesHistoryViewModel::class } diff --git a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/navigation/MessagesHistoryNavigation.kt b/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/navigation/MessagesHistoryNavigation.kt index 913e20e9..4de8bb72 100644 --- a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/navigation/MessagesHistoryNavigation.kt +++ b/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/navigation/MessagesHistoryNavigation.kt @@ -5,10 +5,10 @@ import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable import androidx.navigation.toRoute -import dev.meloda.fast.common.extensions.customNavType import dev.meloda.fast.messageshistory.model.MessagesHistoryArguments import dev.meloda.fast.messageshistory.presentation.MessagesHistoryRoute import dev.meloda.fast.model.BaseError +import dev.meloda.fast.ui.extensions.customNavType import kotlinx.serialization.Serializable import kotlin.reflect.typeOf diff --git a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/util/MessageMapper.kt b/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/util/MessageMapper.kt index 1bb1ebac..233fc3dc 100644 --- a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/util/MessageMapper.kt +++ b/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/util/MessageMapper.kt @@ -5,12 +5,12 @@ import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight -import dev.meloda.fast.common.UserConfig import dev.meloda.fast.common.extensions.orDots import dev.meloda.fast.common.model.UiImage import dev.meloda.fast.common.model.UiText import dev.meloda.fast.common.model.parseString import dev.meloda.fast.common.provider.ResourceProvider +import dev.meloda.fast.data.UserConfig import dev.meloda.fast.data.VkMemoryCache import dev.meloda.fast.messageshistory.model.UiItem import dev.meloda.fast.model.api.PeerType diff --git a/feature/photoviewer/src/main/kotlin/dev/meloda/fast/photoviewer/navigation/PhotoViewNavigation.kt b/feature/photoviewer/src/main/kotlin/dev/meloda/fast/photoviewer/navigation/PhotoViewNavigation.kt index e216e95f..fb769f8a 100644 --- a/feature/photoviewer/src/main/kotlin/dev/meloda/fast/photoviewer/navigation/PhotoViewNavigation.kt +++ b/feature/photoviewer/src/main/kotlin/dev/meloda/fast/photoviewer/navigation/PhotoViewNavigation.kt @@ -5,9 +5,9 @@ import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable import androidx.navigation.toRoute -import dev.meloda.fast.common.extensions.customNavType import dev.meloda.fast.photoviewer.model.PhotoViewArguments import dev.meloda.fast.photoviewer.presentation.PhotoViewRoute +import dev.meloda.fast.ui.extensions.customNavType import kotlinx.serialization.Serializable import java.net.URLEncoder import kotlin.reflect.typeOf diff --git a/feature/profile/build.gradle.kts b/feature/profile/build.gradle.kts index dae3e68e..9fd21c93 100644 --- a/feature/profile/build.gradle.kts +++ b/feature/profile/build.gradle.kts @@ -9,7 +9,7 @@ android { dependencies { implementation(projects.core.common) - implementation(projects.core.data) + implementation(projects.core.domain) implementation(projects.core.model) implementation(projects.core.ui) diff --git a/feature/profile/src/main/kotlin/dev/meloda/fast/profile/ProfileViewModel.kt b/feature/profile/src/main/kotlin/dev/meloda/fast/profile/ProfileViewModel.kt index bb372a07..45bfd335 100644 --- a/feature/profile/src/main/kotlin/dev/meloda/fast/profile/ProfileViewModel.kt +++ b/feature/profile/src/main/kotlin/dev/meloda/fast/profile/ProfileViewModel.kt @@ -1,13 +1,13 @@ package dev.meloda.fast.profile import androidx.lifecycle.ViewModel -import dev.meloda.fast.common.UserConfig import dev.meloda.fast.common.VkConstants import dev.meloda.fast.common.extensions.listenValue import dev.meloda.fast.common.extensions.setValue import dev.meloda.fast.data.State -import dev.meloda.fast.data.api.users.UsersUseCase +import dev.meloda.fast.data.UserConfig import dev.meloda.fast.data.processState +import dev.meloda.fast.domain.UsersUseCase import dev.meloda.fast.model.BaseError import dev.meloda.fast.network.VkErrorCode import dev.meloda.fast.profile.model.ProfileScreenState diff --git a/feature/profile/src/main/kotlin/dev/meloda/fast/profile/navigation/ProfileRoute.kt b/feature/profile/src/main/kotlin/dev/meloda/fast/profile/navigation/ProfileRoute.kt index 97c7e75a..ddb31e89 100644 --- a/feature/profile/src/main/kotlin/dev/meloda/fast/profile/navigation/ProfileRoute.kt +++ b/feature/profile/src/main/kotlin/dev/meloda/fast/profile/navigation/ProfileRoute.kt @@ -3,11 +3,11 @@ package dev.meloda.fast.profile.navigation import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable -import dev.meloda.fast.common.extensions.navigation.sharedViewModel import dev.meloda.fast.model.BaseError import dev.meloda.fast.profile.ProfileViewModel import dev.meloda.fast.profile.ProfileViewModelImpl import dev.meloda.fast.profile.presentation.ProfileRoute +import dev.meloda.fast.ui.extensions.sharedViewModel import kotlinx.serialization.Serializable @Serializable diff --git a/feature/settings/src/main/kotlin/dev/meloda/fast/settings/SettingsViewModel.kt b/feature/settings/src/main/kotlin/dev/meloda/fast/settings/SettingsViewModel.kt index 45275873..0942ac86 100644 --- a/feature/settings/src/main/kotlin/dev/meloda/fast/settings/SettingsViewModel.kt +++ b/feature/settings/src/main/kotlin/dev/meloda/fast/settings/SettingsViewModel.kt @@ -7,13 +7,12 @@ import androidx.core.view.HapticFeedbackConstantsCompat import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dev.meloda.fast.common.LongPollController -import dev.meloda.fast.common.UserConfig import dev.meloda.fast.common.extensions.findWithIndex -import dev.meloda.fast.common.extensions.isSdkAtLeast import dev.meloda.fast.common.extensions.setValue import dev.meloda.fast.common.model.DarkMode import dev.meloda.fast.common.model.LongPollState import dev.meloda.fast.common.model.UiText +import dev.meloda.fast.data.UserConfig import dev.meloda.fast.data.db.AccountsRepository import dev.meloda.fast.datastore.AppSettings import dev.meloda.fast.datastore.SettingsKeys @@ -330,7 +329,7 @@ class SettingsViewModelImpl( val appearanceUseDynamicColors = SettingsItem.Switch( key = SettingsKeys.KEY_USE_DYNAMIC_COLORS, title = UiText.Resource(UiR.string.settings_dynamic_colors), - isVisible = isSdkAtLeast(Build.VERSION_CODES.S), + isVisible = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S, text = UiText.Resource(UiR.string.settings_dynamic_colors_description), defaultValue = SettingsKeys.DEFAULT_VALUE_USE_DYNAMIC_COLORS ) diff --git a/feature/settings/src/main/kotlin/dev/meloda/fast/settings/presentation/SettingsScreen.kt b/feature/settings/src/main/kotlin/dev/meloda/fast/settings/presentation/SettingsScreen.kt index d27c5346..ac48a49f 100644 --- a/feature/settings/src/main/kotlin/dev/meloda/fast/settings/presentation/SettingsScreen.kt +++ b/feature/settings/src/main/kotlin/dev/meloda/fast/settings/presentation/SettingsScreen.kt @@ -30,7 +30,12 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.LayoutDirection import androidx.lifecycle.compose.collectAsStateWithLifecycle -import dev.meloda.fast.common.UserConfig +import dev.chrisbanes.haze.HazeState +import dev.chrisbanes.haze.haze +import dev.chrisbanes.haze.hazeChild +import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi +import dev.chrisbanes.haze.materials.HazeMaterials +import dev.meloda.fast.data.UserConfig import dev.meloda.fast.datastore.SettingsKeys import dev.meloda.fast.settings.HapticType import dev.meloda.fast.settings.SettingsViewModel @@ -45,11 +50,6 @@ import dev.meloda.fast.settings.presentation.item.TitleTextItem import dev.meloda.fast.ui.components.ActionInvokeDismiss import dev.meloda.fast.ui.components.MaterialDialog import dev.meloda.fast.ui.theme.LocalThemeConfig -import dev.chrisbanes.haze.HazeState -import dev.chrisbanes.haze.haze -import dev.chrisbanes.haze.hazeChild -import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi -import dev.chrisbanes.haze.materials.HazeMaterials import org.koin.androidx.compose.koinViewModel import dev.meloda.fast.ui.R as UiR diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bca9ba9a..4f63a627 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -36,6 +36,7 @@ appcompat = "1.7.0" androidx-navigation = "2.8.0-beta07" serialization = "1.7.1" rebugger = "1.0.0-rc03" +moduleGraph = "2.5.0" [libraries] accompanist-permissions = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanist" } @@ -125,13 +126,14 @@ nanokt = [ [plugins] 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-android = { id = "org.jetbrains.kotlin.android", 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" } +module-graph = { id = "com.jraska.module.graph.assertion", version.ref = "moduleGraph" } #project plugins fast-android-application = { id = "fast.android.application", version = "unspecified" } diff --git a/settings.gradle.kts b/settings.gradle.kts index a22f39d6..8f5298d3 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -35,3 +35,4 @@ include(":feature:photoviewer") include(":feature:settings") include(":feature:friends") include(":feature:profile") +include(":core:domain")