domain module

This commit is contained in:
2024-08-11 17:40:13 +03:00
parent 648850f1c8
commit 0500969d81
77 changed files with 282 additions and 267 deletions
+1
View File
@@ -81,6 +81,7 @@ dependencies {
implementation(projects.core.common) implementation(projects.core.common)
implementation(projects.core.ui) implementation(projects.core.ui)
implementation(projects.core.data) implementation(projects.core.data)
implementation(projects.core.domain)
implementation(projects.core.model) implementation(projects.core.model)
implementation(projects.core.datastore) implementation(projects.core.datastore)
@@ -10,12 +10,12 @@ import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.PermissionStatus import com.google.accompanist.permissions.PermissionStatus
import dev.meloda.fast.auth.AuthGraph import dev.meloda.fast.auth.AuthGraph
import dev.meloda.fast.common.LongPollController 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.ifEmpty
import dev.meloda.fast.common.extensions.listenValue import dev.meloda.fast.common.extensions.listenValue
import dev.meloda.fast.common.extensions.setValue import dev.meloda.fast.common.extensions.setValue
import dev.meloda.fast.common.model.LongPollState 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.AppSettings
import dev.meloda.fast.datastore.UserSettings import dev.meloda.fast.datastore.UserSettings
import dev.meloda.fast.model.BaseError import dev.meloda.fast.model.BaseError
@@ -18,7 +18,6 @@ class AppGlobal : Application(), ImageLoaderFactory {
val preferences = PreferenceManager.getDefaultSharedPreferences(this) val preferences = PreferenceManager.getDefaultSharedPreferences(this)
AppSettings.init(preferences) AppSettings.init(preferences)
UserConfig.init(preferences)
initKoin() initKoin()
} }
@@ -4,14 +4,19 @@ import android.content.Context
import android.content.res.Resources import android.content.res.Resources
import android.os.PowerManager import android.os.PowerManager
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import coil.ImageLoader
import dev.meloda.fast.MainViewModelImpl import dev.meloda.fast.MainViewModelImpl
import dev.meloda.fast.auth.captcha.di.captchaModule import dev.meloda.fast.auth.captcha.di.captchaModule
import dev.meloda.fast.auth.login.di.loginModule import dev.meloda.fast.auth.login.di.loginModule
import dev.meloda.fast.auth.validation.di.validationModule import dev.meloda.fast.auth.validation.di.validationModule
import dev.meloda.fast.chatmaterials.di.chatMaterialsModule 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.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.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.friends.di.friendsModule
import dev.meloda.fast.languagepicker.di.languagePickerModule import dev.meloda.fast.languagepicker.di.languagePickerModule
import dev.meloda.fast.messageshistory.di.messagesHistoryModule import dev.meloda.fast.messageshistory.di.messagesHistoryModule
@@ -28,7 +33,7 @@ import org.koin.dsl.bind
import org.koin.dsl.module import org.koin.dsl.module
val applicationModule = module { val applicationModule = module {
includes(dataModule) includes(domainModule)
includes( includes(
loginModule, loginModule,
validationModule, validationModule,
@@ -55,4 +60,13 @@ val applicationModule = module {
viewModelOf(::MainViewModelImpl) { viewModelOf(::MainViewModelImpl) {
qualifier = qualifier("main") qualifier = qualifier("main")
} }
single {
ImageLoader.Builder(get())
.crossfade(true)
.build()
}
singleOf(::LongPollControllerImpl) bind LongPollController::class
singleOf(::ResourceProviderImpl) bind ResourceProvider::class
} }
@@ -36,7 +36,6 @@ import dev.meloda.fast.MainViewModel
import dev.meloda.fast.MainViewModelImpl import dev.meloda.fast.MainViewModelImpl
import dev.meloda.fast.common.AppConstants import dev.meloda.fast.common.AppConstants
import dev.meloda.fast.common.LongPollController import dev.meloda.fast.common.LongPollController
import dev.meloda.fast.common.extensions.isSdkAtLeast
import dev.meloda.fast.common.model.LongPollState import dev.meloda.fast.common.model.LongPollState
import dev.meloda.fast.datastore.AppSettings import dev.meloda.fast.datastore.AppSettings
import dev.meloda.fast.datastore.UserSettings import dev.meloda.fast.datastore.UserSettings
@@ -239,7 +238,7 @@ class MainActivity : AppCompatActivity() {
} }
private fun createNotificationChannels() { 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 noCategoryName = getString(UiR.string.notification_channel_no_category_name)
val noCategoryDescriptionText = val noCategoryDescriptionText =
getString(UiR.string.notification_channel_no_category_description) getString(UiR.string.notification_channel_no_category_description)
@@ -4,9 +4,9 @@ import android.app.Service
import android.content.Intent import android.content.Intent
import android.os.IBinder import android.os.IBinder
import android.util.Log import android.util.Log
import dev.meloda.fast.common.UserConfig
import dev.meloda.fast.common.extensions.createTimerFlow 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 dev.meloda.fast.data.processState
import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@@ -13,12 +13,12 @@ import androidx.core.app.ServiceCompat
import com.conena.nanokt.android.app.stopForegroundCompat import com.conena.nanokt.android.app.stopForegroundCompat
import dev.meloda.fast.common.AppConstants import dev.meloda.fast.common.AppConstants
import dev.meloda.fast.common.LongPollController import dev.meloda.fast.common.LongPollController
import dev.meloda.fast.common.UserConfig
import dev.meloda.fast.common.VkConstants import dev.meloda.fast.common.VkConstants
import dev.meloda.fast.common.extensions.listenValue import dev.meloda.fast.common.extensions.listenValue
import dev.meloda.fast.common.model.LongPollState import dev.meloda.fast.common.model.LongPollState
import dev.meloda.fast.data.LongPollUpdatesParser import dev.meloda.fast.domain.LongPollUpdatesParser
import dev.meloda.fast.data.LongPollUseCase import dev.meloda.fast.domain.LongPollUseCase
import dev.meloda.fast.data.UserConfig
import dev.meloda.fast.data.processState import dev.meloda.fast.data.processState
import dev.meloda.fast.datastore.AppSettings import dev.meloda.fast.datastore.AppSettings
import dev.meloda.fast.model.api.data.LongPollUpdates import dev.meloda.fast.model.api.data.LongPollUpdates
@@ -1,8 +1,8 @@
package dev.meloda.fast.service.longpolling.di package dev.meloda.fast.service.longpolling.di
import dev.meloda.fast.data.LongPollUpdatesParser import dev.meloda.fast.domain.LongPollUpdatesParser
import dev.meloda.fast.data.LongPollUseCase import dev.meloda.fast.domain.LongPollUseCase
import dev.meloda.fast.data.LongPollUseCaseImpl import dev.meloda.fast.domain.LongPollUseCaseImpl
import org.koin.core.module.dsl.singleOf import org.koin.core.module.dsl.singleOf
import org.koin.dsl.bind import org.koin.dsl.bind
import org.koin.dsl.module import org.koin.dsl.module
+4
View File
@@ -58,6 +58,10 @@ gradlePlugin {
id = "fast.android.test" id = "fast.android.test"
implementationClass = "AndroidTestConventionPlugin" implementationClass = "AndroidTestConventionPlugin"
} }
register("koin") {
id = "fast.koin"
implementationClass = "KoinConventionPlugin"
}
register("androidRoom") { register("androidRoom") {
id = "fast.android.room" id = "fast.android.room"
implementationClass = "AndroidRoomConventionPlugin" implementationClass = "AndroidRoomConventionPlugin"
@@ -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<Project> {
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())
}
}
}
}
}
+3 -2
View File
@@ -1,11 +1,12 @@
plugins { plugins {
alias(libs.plugins.android.application) apply false alias(libs.plugins.android.application) apply false
alias(libs.plugins.android.library) 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.parcelize) apply false
alias(libs.plugins.kotlin.serialization) 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.kotlin.jvm) apply false
alias(libs.plugins.compose) apply false
alias(libs.plugins.room) apply false alias(libs.plugins.room) apply false
alias(libs.plugins.ksp) apply false alias(libs.plugins.ksp) apply false
alias(libs.plugins.module.graph) apply true
} }
+4 -18
View File
@@ -1,6 +1,7 @@
plugins { plugins {
alias(libs.plugins.fast.android.library) 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 { android {
@@ -8,23 +9,8 @@ android {
} }
dependencies { dependencies {
implementation(libs.core.ktx) implementation(libs.kotlinx.coroutines.core)
implementation(libs.preference.ktx) implementation(libs.bundles.nanokt)
implementation(libs.lifecycle.viewmodel.ktx) 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)
} }
@@ -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
}
@@ -1,10 +1,5 @@
package dev.meloda.fast.common.extensions 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.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@@ -21,18 +16,6 @@ import kotlinx.coroutines.flow.update
import kotlin.time.Duration import kotlin.time.Duration
import kotlin.time.Duration.Companion.seconds 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 <T> Iterable<T>.findWithIndex(predicate: (T) -> Boolean): Pair<Int, T>? { inline fun <T> Iterable<T>.findWithIndex(predicate: (T) -> Boolean): Pair<Int, T>? {
val value = firstOrNull(predicate) ?: return null val value = firstOrNull(predicate) ?: return null
return indexOf(value).let { index -> if (index == -1) null else index to value } return indexOf(value).let { index -> if (index == -1) null else index to value }
@@ -115,13 +98,3 @@ fun <T> Any.toList(mapper: (old: Any) -> T): List<T> {
else -> emptyList() 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
}
}
@@ -4,14 +4,10 @@ import android.content.ClipData
import android.content.ClipboardManager import android.content.ClipboardManager
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
import android.provider.Settings import android.provider.Settings
import android.widget.Toast import android.widget.Toast
import androidx.core.content.FileProvider
import java.io.File
import java.io.FileOutputStream
object AndroidUtils { object AndroidUtils {
@@ -96,61 +92,61 @@ object AndroidUtils {
}) })
} }
fun getInstallPackageIntent( // fun getInstallPackageIntent(
context: Context, // context: Context,
providerPath: String, // providerPath: String,
fileToRead: File, // fileToRead: File,
): Intent { // ): Intent {
val intent = Intent(Intent.ACTION_VIEW) // 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) // fun getImageToShare(context: Context, existingFile: File): Uri? {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) // val imageFolder = File(context.cacheDir, "images")
intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true) //
intent.data = FileProvider.getUriForFile( // return try {
context, // imageFolder.mkdirs()
"dev.meloda.fast$providerPath", //
fileToRead // 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, bitmap: Bitmap): Uri? {
} // val imageFolder = File(context.cacheDir, "images")
//
fun getImageToShare(context: Context, existingFile: File): Uri? { // return try {
val imageFolder = File(context.cacheDir, "images") // imageFolder.mkdirs()
//
return try { // val file = File(imageFolder, "shared_image.png")
imageFolder.mkdirs() // val outputStream = FileOutputStream(file)
// bitmap.compress(Bitmap.CompressFormat.PNG, 90, outputStream)
val copyToFile = File(imageFolder, "shared_image.png") // outputStream.flush()
if (copyToFile.exists()) { // outputStream.close()
copyToFile.delete() // FileProvider.getUriForFile(context, "dev.meloda.fast.fileprovider", file)
} // } catch (e: Exception) {
// e.printStackTrace()
val file = existingFile.copyTo(copyToFile) // null
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 showShareSheet(context: Context, content: ShareContent) { fun showShareSheet(context: Context, content: ShareContent) {
val intent = Intent(Intent.ACTION_SEND).apply { val intent = Intent(Intent.ACTION_SEND).apply {
+3 -3
View File
@@ -1,5 +1,6 @@
plugins { plugins {
alias(libs.plugins.fast.android.library) alias(libs.plugins.fast.android.library)
// alias(libs.plugins.fast.koin)
} }
android { android {
@@ -13,9 +14,8 @@ dependencies {
api(projects.core.network) api(projects.core.network)
api(projects.core.database) api(projects.core.database)
implementation(libs.koin.android) // TODO: 11/08/2024, Danil Nikolaev: remove?
// TODO: 05/05/2024, Danil Nikolaev: research, maybe remove
implementation(libs.retrofit) implementation(libs.retrofit)
implementation(libs.eithernet) implementation(libs.eithernet)
implementation(libs.koin.android)
} }
@@ -1,7 +1,6 @@
package dev.meloda.fast.network.interceptor package dev.meloda.fast.data
import androidx.core.net.toUri import androidx.core.net.toUri
import dev.meloda.fast.common.UserConfig
import okhttp3.Interceptor import okhttp3.Interceptor
import okhttp3.Response import okhttp3.Response
import java.net.URLEncoder import java.net.URLEncoder
@@ -1,24 +1,16 @@
package dev.meloda.fast.common package dev.meloda.fast.data
import android.content.SharedPreferences import dev.meloda.fast.datastore.AppSettings
import androidx.core.content.edit
import kotlin.properties.Delegates
object UserConfig { object UserConfig {
private const val ARG_CURRENT_USER_ID = "current_user_id" 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 var currentUserId: Int = -1
get() = preferences.getInt(ARG_CURRENT_USER_ID, -1) get() = AppSettings.getInt(ARG_CURRENT_USER_ID, -1)
set(value) { set(value) {
field = value field = value
preferences.edit { putInt(ARG_CURRENT_USER_ID, value) } AppSettings.edit { putInt(ARG_CURRENT_USER_ID, value) }
} }
var userId: Int = -1 var userId: Int = -1
@@ -1,10 +1,8 @@
package dev.meloda.fast.data.di 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.AccountRepository
import dev.meloda.fast.data.api.account.AccountRepositoryImpl 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.audios.AudiosRepository
import dev.meloda.fast.data.api.auth.AuthRepository import dev.meloda.fast.data.api.auth.AuthRepository
import dev.meloda.fast.data.api.auth.AuthRepositoryImpl 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.photos.PhotosRepository
import dev.meloda.fast.data.api.users.UsersRepository import dev.meloda.fast.data.api.users.UsersRepository
import dev.meloda.fast.data.api.users.UsersRepositoryImpl 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.api.videos.VideosRepository
import dev.meloda.fast.data.db.AccountsRepository import dev.meloda.fast.data.db.AccountsRepository
import dev.meloda.fast.data.db.AccountsRepositoryImpl 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.database.di.databaseModule
import dev.meloda.fast.datastore.di.dataStoreModule import dev.meloda.fast.datastore.di.dataStoreModule
import dev.meloda.fast.network.di.networkModule import dev.meloda.fast.network.di.networkModule
import okhttp3.Interceptor
import org.koin.core.module.dsl.singleOf import org.koin.core.module.dsl.singleOf
import org.koin.core.qualifier.named
import org.koin.dsl.bind import org.koin.dsl.bind
import org.koin.dsl.module import org.koin.dsl.module
val dataModule = module { val dataModule = module {
includes( includes(
commonModule,
databaseModule, databaseModule,
dataStoreModule, dataStoreModule,
networkModule, networkModule,
) )
singleOf(::AccountRepositoryImpl) bind AccountRepository::class singleOf(::AccountRepositoryImpl) bind AccountRepository::class
singleOf(::AccountUseCaseImpl) bind AccountUseCase::class
singleOf(::AudiosRepository) singleOf(::AudiosRepository)
@@ -63,12 +58,15 @@ val dataModule = module {
singleOf(::PhotosRepository) singleOf(::PhotosRepository)
singleOf(::UsersRepositoryImpl) bind UsersRepository::class singleOf(::UsersRepositoryImpl) bind UsersRepository::class
singleOf(::UsersUseCaseImpl) bind UsersUseCase::class
singleOf(::VideosRepository) singleOf(::VideosRepository)
singleOf(::AccountsRepositoryImpl) bind AccountsRepository::class singleOf(::AccountsRepositoryImpl) bind AccountsRepository::class
singleOf(::GetCurrentAccountUseCase)
singleOf(::FriendsRepositoryImpl) bind FriendsRepository::class singleOf(::FriendsRepositoryImpl) bind FriendsRepository::class
// TODO: 11/08/2024, Danil Nikolaev: find a better solution
single<Interceptor>(named("token_interceptor")) {
AccessTokenInterceptor()
}
} }
+1
View File
@@ -0,0 +1 @@
/build
+18
View File
@@ -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)
}
@@ -1,4 +1,4 @@
package dev.meloda.fast.data.api.account package dev.meloda.fast.domain
import dev.meloda.fast.data.State import dev.meloda.fast.data.State
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@@ -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.State
import dev.meloda.fast.data.api.account.AccountRepository
import dev.meloda.fast.data.mapToState import dev.meloda.fast.data.mapToState
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flow
@@ -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.State
import dev.meloda.fast.model.api.responses.ValidatePhoneResponse import dev.meloda.fast.model.api.responses.ValidatePhoneResponse
@@ -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.State
import dev.meloda.fast.data.api.auth.AuthRepository import dev.meloda.fast.data.api.auth.AuthRepository
@@ -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.data.State
import dev.meloda.fast.model.api.domain.VkConversation import dev.meloda.fast.model.api.domain.VkConversation
@@ -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.State
import dev.meloda.fast.data.api.conversations.ConversationsRepository 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.data.mapToState
import dev.meloda.fast.model.api.domain.VkConversation import dev.meloda.fast.model.api.domain.VkConversation
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@@ -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.data.State
import dev.meloda.fast.model.FriendsInfo import dev.meloda.fast.model.FriendsInfo
@@ -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.State
import dev.meloda.fast.data.api.friends.FriendsRepository 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.data.mapToState
import dev.meloda.fast.model.FriendsInfo import dev.meloda.fast.model.FriendsInfo
import dev.meloda.fast.model.api.domain.VkUser import dev.meloda.fast.model.api.domain.VkUser
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
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<State<FriendsInfo>> = flow { override fun getAllFriends(count: Int?, offset: Int?): Flow<State<FriendsInfo>> = flow {
emit(State.Loading) emit(State.Loading)
@@ -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 dev.meloda.fast.model.database.AccountEntity
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
class GetCurrentAccountUseCase(private val accountsRepository: AccountsRepository) { class GetCurrentAccountUseCase(
private val accountsRepository: AccountsRepository
) {
suspend operator fun invoke(): AccountEntity? = withContext(Dispatchers.IO) { suspend operator fun invoke(): AccountEntity? = withContext(Dispatchers.IO) {
accountsRepository.getAccountById(UserConfig.currentUserId) accountsRepository.getAccountById(UserConfig.currentUserId)
@@ -1,12 +1,13 @@
package dev.meloda.fast.data package dev.meloda.fast.domain
import android.util.Log import android.util.Log
import dev.meloda.fast.common.UserConfig
import dev.meloda.fast.common.VkConstants import dev.meloda.fast.common.VkConstants
import dev.meloda.fast.common.extensions.asInt import dev.meloda.fast.common.extensions.asInt
import dev.meloda.fast.common.extensions.listenValue import dev.meloda.fast.common.extensions.listenValue
import dev.meloda.fast.common.extensions.toList 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.ApiEvent
import dev.meloda.fast.model.InteractionType import dev.meloda.fast.model.InteractionType
import dev.meloda.fast.model.LongPollEvent import dev.meloda.fast.model.LongPollEvent
@@ -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.LongPollUpdates
import dev.meloda.fast.model.api.data.VkLongPollData import dev.meloda.fast.model.api.data.VkLongPollData
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@@ -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.api.longpoll.LongPollRepository
import dev.meloda.fast.data.mapToState
import dev.meloda.fast.model.api.data.LongPollUpdates import dev.meloda.fast.model.api.data.LongPollUpdates
import dev.meloda.fast.model.api.data.VkLongPollData import dev.meloda.fast.model.api.data.VkLongPollData
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@@ -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.State
import dev.meloda.fast.data.api.messages.MessagesHistoryInfo
import dev.meloda.fast.model.api.domain.VkAttachment import dev.meloda.fast.model.api.domain.VkAttachment
import dev.meloda.fast.model.api.domain.VkAttachmentHistoryMessage import dev.meloda.fast.model.api.domain.VkAttachmentHistoryMessage
import dev.meloda.fast.model.api.domain.VkMessage import dev.meloda.fast.model.api.domain.VkMessage
@@ -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.State
import dev.meloda.fast.data.api.messages.MessagesHistoryInfo import dev.meloda.fast.data.api.messages.MessagesHistoryInfo
import dev.meloda.fast.data.api.messages.MessagesRepository 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.data.mapToState
import dev.meloda.fast.model.api.domain.VkAttachment import dev.meloda.fast.model.api.domain.VkAttachment
import dev.meloda.fast.model.api.domain.VkAttachmentHistoryMessage import dev.meloda.fast.model.api.domain.VkAttachmentHistoryMessage
@@ -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.data.State
import dev.meloda.fast.auth.login.model.AuthInfo import dev.meloda.fast.model.AuthInfo
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
interface OAuthUseCase { interface OAuthUseCase {
@@ -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.State
import dev.meloda.fast.data.api.oauth.OAuthRepository 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.OAuthErrorDomain
import dev.meloda.fast.network.ValidationType import dev.meloda.fast.network.ValidationType
import dev.meloda.fast.network.VkOAuthError import dev.meloda.fast.network.VkOAuthError
@@ -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.data.State
import dev.meloda.fast.model.api.domain.VkUser import dev.meloda.fast.model.api.domain.VkUser
@@ -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.State
import dev.meloda.fast.data.api.users.UsersRepository
import dev.meloda.fast.data.mapToState import dev.meloda.fast.data.mapToState
import dev.meloda.fast.model.api.domain.VkUser import dev.meloda.fast.model.api.domain.VkUser
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@@ -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)
}
@@ -1,4 +1,4 @@
package dev.meloda.fast.auth.login.model package dev.meloda.fast.model
data class AuthInfo( data class AuthInfo(
val userId: Int?, val userId: Int?,
@@ -2,12 +2,14 @@ package dev.meloda.fast.network.di
import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerCollector
import com.chuckerteam.chucker.api.ChuckerInterceptor 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.common.AppConstants
import dev.meloda.fast.network.JsonConverter import dev.meloda.fast.network.JsonConverter
import dev.meloda.fast.network.MoshiConverter import dev.meloda.fast.network.MoshiConverter
import dev.meloda.fast.network.OAuthResultCallFactory import dev.meloda.fast.network.OAuthResultCallFactory
import dev.meloda.fast.network.ResponseConverterFactory 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.LanguageInterceptor
import dev.meloda.fast.network.interceptor.VersionInterceptor import dev.meloda.fast.network.interceptor.VersionInterceptor
import dev.meloda.fast.network.service.account.AccountService 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.photos.PhotosService
import dev.meloda.fast.network.service.users.UsersService import dev.meloda.fast.network.service.users.UsersService
import dev.meloda.fast.network.service.videos.VideosService import dev.meloda.fast.network.service.videos.VideosService
import com.slack.eithernet.ApiResultCallAdapterFactory import okhttp3.Interceptor
import com.slack.eithernet.ApiResultConverterFactory
import com.squareup.moshi.Moshi
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor import okhttp3.logging.HttpLoggingInterceptor
import org.koin.core.module.dsl.singleOf import org.koin.core.module.dsl.singleOf
@@ -41,14 +41,13 @@ val networkModule = module {
singleOf(::MoshiConverter) bind JsonConverter::class singleOf(::MoshiConverter) bind JsonConverter::class
single { ChuckerCollector(get()) } single { ChuckerCollector(get()) }
single { ChuckerInterceptor.Builder(get()).collector(get()).build() } single { ChuckerInterceptor.Builder(get()).collector(get()).build() }
singleOf(::AccessTokenInterceptor)
singleOf(::VersionInterceptor) singleOf(::VersionInterceptor)
singleOf(::LanguageInterceptor) singleOf(::LanguageInterceptor)
single { single {
OkHttpClient.Builder() OkHttpClient.Builder()
.connectTimeout(20, TimeUnit.SECONDS) .connectTimeout(20, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS)
.addInterceptor(get<AccessTokenInterceptor>()) .addInterceptor(get(named("token_interceptor")) as Interceptor)
.addInterceptor(get<VersionInterceptor>()) .addInterceptor(get<VersionInterceptor>())
.addInterceptor(get<LanguageInterceptor>()) .addInterceptor(get<LanguageInterceptor>())
.addInterceptor(get<ChuckerInterceptor>()) .addInterceptor(get<ChuckerInterceptor>())
+6 -1
View File
@@ -1,6 +1,7 @@
plugins { plugins {
alias(libs.plugins.fast.android.library) alias(libs.plugins.fast.android.library)
alias(libs.plugins.fast.android.library.compose) alias(libs.plugins.fast.android.library.compose)
alias(libs.plugins.kotlin.serialization)
} }
android { android {
@@ -8,7 +9,7 @@ android {
} }
dependencies { dependencies {
implementation(projects.core.common) api(projects.core.common)
api(projects.core.model) api(projects.core.model)
implementation(libs.haze) implementation(libs.haze)
@@ -17,5 +18,9 @@ dependencies {
implementation(platform(libs.compose.bom)) implementation(platform(libs.compose.bom))
implementation(libs.bundles.compose) implementation(libs.bundles.compose)
implementation(libs.androidx.navigation.compose)
implementation(libs.kotlin.serialization)
implementation(libs.koin.androidx.compose.navigation)
debugImplementation(libs.compose.ui.tooling) debugImplementation(libs.compose.ui.tooling)
} }
@@ -1,4 +1,4 @@
package dev.meloda.fast.common.extensions package dev.meloda.fast.ui.extensions
import android.os.Bundle import android.os.Bundle
import android.os.Parcelable import android.os.Parcelable
@@ -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.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
+1 -1
View File
@@ -64,7 +64,7 @@ android {
} }
dependencies { dependencies {
implementation(projects.core.data) implementation(projects.core.domain)
implementation(projects.core.ui) implementation(projects.core.ui)
implementation(platform(libs.compose.bom)) implementation(platform(libs.compose.bom))
@@ -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.model.LoginValidationResult
import dev.meloda.fast.auth.login.validation.LoginValidator import dev.meloda.fast.auth.login.validation.LoginValidator
import dev.meloda.fast.common.LongPollController import dev.meloda.fast.common.LongPollController
import dev.meloda.fast.common.UserConfig
import dev.meloda.fast.common.VkConstants import dev.meloda.fast.common.VkConstants
import dev.meloda.fast.common.extensions.listenValue import dev.meloda.fast.common.extensions.listenValue
import dev.meloda.fast.common.extensions.setValue import dev.meloda.fast.common.extensions.setValue
import dev.meloda.fast.common.extensions.updateValue import dev.meloda.fast.common.extensions.updateValue
import dev.meloda.fast.common.model.LongPollState import dev.meloda.fast.common.model.LongPollState
import dev.meloda.fast.data.State 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.db.AccountsRepository
import dev.meloda.fast.data.processState import dev.meloda.fast.data.processState
import dev.meloda.fast.datastore.AppSettings 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.model.database.AccountEntity
import dev.meloda.fast.network.OAuthErrorDomain import dev.meloda.fast.network.OAuthErrorDomain
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@@ -70,12 +71,12 @@ interface LoginViewModel {
} }
class LoginViewModelImpl( class LoginViewModelImpl(
private val oAuthUseCase: dev.meloda.fast.auth.login.OAuthUseCase, private val oAuthUseCase: OAuthUseCase,
private val usersUseCase: UsersUseCase, private val usersUseCase: UsersUseCase,
private val accountsRepository: AccountsRepository, private val accountsRepository: AccountsRepository,
private val loginValidator: LoginValidator, private val loginValidator: LoginValidator,
private val longPollController: LongPollController private val longPollController: LongPollController
) : ViewModel(), dev.meloda.fast.auth.login.LoginViewModel { ) : ViewModel(), LoginViewModel {
override val screenState = MutableStateFlow(LoginScreenState.EMPTY) override val screenState = MutableStateFlow(LoginScreenState.EMPTY)
override val loginError = MutableStateFlow<LoginError?>(null) override val loginError = MutableStateFlow<LoginError?>(null)
@@ -1,9 +1,8 @@
package dev.meloda.fast.auth.login.di 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.LoginViewModelImpl
import dev.meloda.fast.auth.login.OAuthUseCase import dev.meloda.fast.domain.OAuthUseCase
import dev.meloda.fast.auth.login.OAuthUseCaseImpl import dev.meloda.fast.domain.OAuthUseCaseImpl
import dev.meloda.fast.auth.login.validation.LoginValidator import dev.meloda.fast.auth.login.validation.LoginValidator
import org.koin.androidx.viewmodel.dsl.viewModelOf import org.koin.androidx.viewmodel.dsl.viewModelOf
import org.koin.core.module.dsl.singleOf import org.koin.core.module.dsl.singleOf
@@ -4,14 +4,14 @@ import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable 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.LoginViewModel
import dev.meloda.fast.auth.login.LoginViewModelImpl import dev.meloda.fast.auth.login.LoginViewModelImpl
import dev.meloda.fast.auth.login.model.CaptchaArguments 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.LoginUserBannedArguments
import dev.meloda.fast.auth.login.model.LoginValidationArguments
import dev.meloda.fast.auth.login.presentation.LoginRoute import dev.meloda.fast.auth.login.presentation.LoginRoute
import dev.meloda.fast.auth.login.presentation.LogoRoute import dev.meloda.fast.auth.login.presentation.LogoRoute
import dev.meloda.fast.ui.extensions.sharedViewModel
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
@@ -29,8 +29,8 @@ fun NavGraphBuilder.loginScreen(
navController: NavController navController: NavController
) { ) {
composable<Login> { backStackEntry -> composable<Login> { backStackEntry ->
val viewModel: dev.meloda.fast.auth.login.LoginViewModel = val viewModel: LoginViewModel =
backStackEntry.sharedViewModel<dev.meloda.fast.auth.login.LoginViewModelImpl>(navController = navController) backStackEntry.sharedViewModel<LoginViewModelImpl>(navController = navController)
val validationCode = backStackEntry.getValidationResult() val validationCode = backStackEntry.getValidationResult()
val captchaCode = backStackEntry.getCaptchaResult() val captchaCode = backStackEntry.getCaptchaResult()
@@ -12,6 +12,7 @@ import dev.meloda.fast.common.extensions.listenValue
import dev.meloda.fast.common.extensions.setValue import dev.meloda.fast.common.extensions.setValue
import dev.meloda.fast.common.extensions.updateValue import dev.meloda.fast.common.extensions.updateValue
import dev.meloda.fast.data.processState import dev.meloda.fast.data.processState
import dev.meloda.fast.domain.AuthUseCase
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
@@ -1,7 +1,7 @@
package dev.meloda.fast.auth.validation.di package dev.meloda.fast.auth.validation.di
import dev.meloda.fast.auth.validation.AuthUseCase import dev.meloda.fast.domain.AuthUseCase
import dev.meloda.fast.auth.validation.AuthUseCaseImpl import dev.meloda.fast.domain.AuthUseCaseImpl
import dev.meloda.fast.auth.validation.ValidationViewModel import dev.meloda.fast.auth.validation.ValidationViewModel
import dev.meloda.fast.auth.validation.ValidationViewModelImpl import dev.meloda.fast.auth.validation.ValidationViewModelImpl
import dev.meloda.fast.auth.validation.validation.ValidationValidator import dev.meloda.fast.auth.validation.validation.ValidationValidator
@@ -7,7 +7,7 @@ import androidx.navigation.compose.composable
import androidx.navigation.toRoute import androidx.navigation.toRoute
import dev.meloda.fast.auth.validation.model.ValidationArguments import dev.meloda.fast.auth.validation.model.ValidationArguments
import dev.meloda.fast.auth.validation.presentation.ValidationRoute 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 kotlinx.serialization.Serializable
import kotlin.reflect.typeOf import kotlin.reflect.typeOf
+1 -1
View File
@@ -8,7 +8,7 @@ android {
} }
dependencies { dependencies {
implementation(projects.core.data) implementation(projects.core.domain)
implementation(projects.core.model) implementation(projects.core.model)
implementation(projects.core.ui) implementation(projects.core.ui)
@@ -7,8 +7,8 @@ import dev.meloda.fast.chatmaterials.navigation.ChatMaterials
import dev.meloda.fast.chatmaterials.util.asPresentation import dev.meloda.fast.chatmaterials.util.asPresentation
import dev.meloda.fast.common.extensions.listenValue import dev.meloda.fast.common.extensions.listenValue
import dev.meloda.fast.common.extensions.setValue 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.data.processState
import dev.meloda.fast.domain.MessagesUseCase
import dev.meloda.fast.model.BaseError import dev.meloda.fast.model.BaseError
import dev.meloda.fast.model.api.domain.VkAttachmentHistoryMessage import dev.meloda.fast.model.api.domain.VkAttachmentHistoryMessage
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
+2 -4
View File
@@ -9,13 +9,11 @@ android {
dependencies { dependencies {
implementation(projects.core.common) implementation(projects.core.common)
implementation(projects.core.data) implementation(projects.core.domain)
implementation(projects.core.model) implementation(projects.core.model)
implementation(projects.core.ui) implementation(projects.core.ui)
implementation(libs.nanokt.android) implementation(libs.bundles.nanokt)
implementation(libs.nanokt.jvm)
implementation(libs.nanokt)
implementation(libs.koin.android) implementation(libs.koin.android)
implementation(libs.koin.androidx.compose) implementation(libs.koin.androidx.compose)
@@ -14,12 +14,12 @@ import dev.meloda.fast.conversations.model.ConversationsShowOptions
import dev.meloda.fast.conversations.model.UiConversation import dev.meloda.fast.conversations.model.UiConversation
import dev.meloda.fast.conversations.util.asPresentation import dev.meloda.fast.conversations.util.asPresentation
import dev.meloda.fast.conversations.util.extractAvatar import dev.meloda.fast.conversations.util.extractAvatar
import dev.meloda.fast.data.LongPollUpdatesParser
import dev.meloda.fast.data.State 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.data.processState
import dev.meloda.fast.datastore.UserSettings 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.BaseError
import dev.meloda.fast.model.InteractionType import dev.meloda.fast.model.InteractionType
import dev.meloda.fast.model.LongPollEvent import dev.meloda.fast.model.LongPollEvent
@@ -1,14 +1,14 @@
package dev.meloda.fast.conversations.di package dev.meloda.fast.conversations.di
import dev.meloda.fast.conversations.ConversationsViewModelImpl import dev.meloda.fast.conversations.ConversationsViewModelImpl
import dev.meloda.fast.conversations.data.ConversationsUseCaseImpl import dev.meloda.fast.domain.ConversationsUseCaseImpl
import dev.meloda.fast.data.api.conversations.ConversationsUseCase import dev.meloda.fast.domain.ConversationsUseCase
import org.koin.androidx.viewmodel.dsl.viewModelOf import org.koin.androidx.viewmodel.dsl.viewModelOf
import org.koin.core.module.dsl.singleOf import org.koin.core.module.dsl.singleOf
import org.koin.dsl.bind import org.koin.dsl.bind
import org.koin.dsl.module import org.koin.dsl.module
val conversationsModule = module { val conversationsModule = module {
singleOf(::ConversationsUseCaseImpl) bind ConversationsUseCase::class singleOf(::ConversationsUseCaseImpl) bind dev.meloda.fast.domain.ConversationsUseCase::class
viewModelOf(::ConversationsViewModelImpl) viewModelOf(::ConversationsViewModelImpl)
} }
@@ -3,11 +3,11 @@ package dev.meloda.fast.conversations.navigation
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import dev.meloda.fast.common.extensions.navigation.sharedViewModel
import dev.meloda.fast.conversations.ConversationsViewModel import dev.meloda.fast.conversations.ConversationsViewModel
import dev.meloda.fast.conversations.ConversationsViewModelImpl import dev.meloda.fast.conversations.ConversationsViewModelImpl
import dev.meloda.fast.conversations.presentation.ConversationsRoute import dev.meloda.fast.conversations.presentation.ConversationsRoute
import dev.meloda.fast.model.BaseError import dev.meloda.fast.model.BaseError
import dev.meloda.fast.ui.extensions.sharedViewModel
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
@@ -23,10 +23,10 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp 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.ConversationOption
import dev.meloda.fast.conversations.model.ConversationsScreenState import dev.meloda.fast.conversations.model.ConversationsScreenState
import dev.meloda.fast.conversations.model.UiConversation import dev.meloda.fast.conversations.model.UiConversation
import dev.meloda.fast.data.UserConfig
import dev.meloda.fast.ui.theme.LocalBottomPadding import dev.meloda.fast.ui.theme.LocalBottomPadding
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -9,14 +9,14 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.withStyle import androidx.compose.ui.text.withStyle
import com.conena.nanokt.jvm.util.dayOfMonth import com.conena.nanokt.jvm.util.dayOfMonth
import com.conena.nanokt.jvm.util.month 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.UiImage
import dev.meloda.fast.common.model.UiText 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.model.parseString
import dev.meloda.fast.common.util.TimeUtils import dev.meloda.fast.common.util.TimeUtils
import dev.meloda.fast.conversations.model.ActionState import dev.meloda.fast.conversations.model.ActionState
import dev.meloda.fast.conversations.model.UiConversation import dev.meloda.fast.conversations.model.UiConversation
import dev.meloda.fast.data.UserConfig
import dev.meloda.fast.data.VkMemoryCache import dev.meloda.fast.data.VkMemoryCache
import dev.meloda.fast.model.InteractionType import dev.meloda.fast.model.InteractionType
import dev.meloda.fast.model.api.PeerType import dev.meloda.fast.model.api.PeerType
+1 -1
View File
@@ -9,7 +9,7 @@ android {
dependencies { dependencies {
implementation(projects.core.common) implementation(projects.core.common)
implementation(projects.core.data) implementation(projects.core.domain)
implementation(projects.core.model) implementation(projects.core.model)
implementation(projects.core.ui) implementation(projects.core.ui)
@@ -4,7 +4,7 @@ import androidx.lifecycle.ViewModel
import dev.meloda.fast.common.extensions.listenValue import dev.meloda.fast.common.extensions.listenValue
import dev.meloda.fast.common.extensions.setValue import dev.meloda.fast.common.extensions.setValue
import dev.meloda.fast.data.State 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.data.processState
import dev.meloda.fast.datastore.UserSettings import dev.meloda.fast.datastore.UserSettings
import dev.meloda.fast.friends.model.FriendsScreenState import dev.meloda.fast.friends.model.FriendsScreenState
@@ -1,15 +1,15 @@
package dev.meloda.fast.friends.di 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.FriendsViewModelImpl
import dev.meloda.fast.friends.domain.FriendsUseCaseImpl import dev.meloda.fast.domain.FriendsUseCaseImpl
import org.koin.androidx.viewmodel.dsl.viewModelOf import org.koin.androidx.viewmodel.dsl.viewModelOf
import org.koin.core.module.dsl.singleOf import org.koin.core.module.dsl.singleOf
import org.koin.dsl.bind import org.koin.dsl.bind
import org.koin.dsl.module import org.koin.dsl.module
val friendsModule = module { val friendsModule = module {
singleOf(::FriendsUseCaseImpl) bind FriendsUseCase::class singleOf(::FriendsUseCaseImpl) bind dev.meloda.fast.domain.FriendsUseCase::class
viewModelOf(::FriendsViewModelImpl) viewModelOf(::FriendsViewModelImpl)
} }
@@ -3,11 +3,11 @@ package dev.meloda.fast.friends.navigation
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import dev.meloda.fast.common.extensions.navigation.sharedViewModel
import dev.meloda.fast.friends.FriendsViewModel import dev.meloda.fast.friends.FriendsViewModel
import dev.meloda.fast.friends.FriendsViewModelImpl import dev.meloda.fast.friends.FriendsViewModelImpl
import dev.meloda.fast.friends.presentation.FriendsRoute import dev.meloda.fast.friends.presentation.FriendsRoute
import dev.meloda.fast.model.BaseError import dev.meloda.fast.model.BaseError
import dev.meloda.fast.ui.extensions.sharedViewModel
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
+1 -1
View File
@@ -9,7 +9,7 @@ android {
dependencies { dependencies {
implementation(projects.core.common) implementation(projects.core.common)
implementation(projects.core.data) implementation(projects.core.domain)
implementation(projects.core.model) implementation(projects.core.model)
implementation(projects.core.ui) implementation(projects.core.ui)
@@ -9,19 +9,19 @@ import androidx.lifecycle.viewModelScope
import com.conena.nanokt.collections.indexOfFirstOrNull import com.conena.nanokt.collections.indexOfFirstOrNull
import com.conena.nanokt.collections.indexOfOrNull import com.conena.nanokt.collections.indexOfOrNull
import com.conena.nanokt.text.isEmptyOrBlank 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.listenValue
import dev.meloda.fast.common.extensions.setValue import dev.meloda.fast.common.extensions.setValue
import dev.meloda.fast.common.extensions.updateValue import dev.meloda.fast.common.extensions.updateValue
import dev.meloda.fast.common.provider.ResourceProvider 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.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.data.processState
import dev.meloda.fast.datastore.AppSettings import dev.meloda.fast.datastore.AppSettings
import dev.meloda.fast.datastore.SettingsKeys import dev.meloda.fast.datastore.SettingsKeys
import dev.meloda.fast.datastore.UserSettings 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.ActionMode
import dev.meloda.fast.messageshistory.model.MessagesHistoryScreenState import dev.meloda.fast.messageshistory.model.MessagesHistoryScreenState
import dev.meloda.fast.messageshistory.model.UiItem import dev.meloda.fast.messageshistory.model.UiItem
@@ -1,9 +1,9 @@
package dev.meloda.fast.messageshistory.di 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.MessagesHistoryViewModel
import dev.meloda.fast.messageshistory.MessagesHistoryViewModelImpl 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 dev.meloda.fast.messageshistory.validation.MessagesHistoryValidator
import org.koin.androidx.viewmodel.dsl.viewModelOf import org.koin.androidx.viewmodel.dsl.viewModelOf
import org.koin.core.module.dsl.singleOf import org.koin.core.module.dsl.singleOf
@@ -11,7 +11,7 @@ import org.koin.dsl.bind
import org.koin.dsl.module import org.koin.dsl.module
val messagesHistoryModule = module { val messagesHistoryModule = module {
singleOf(::MessagesUseCaseImpl) bind MessagesUseCase::class singleOf(::MessagesUseCaseImpl) bind dev.meloda.fast.domain.MessagesUseCase::class
singleOf(::MessagesHistoryValidator) singleOf(::MessagesHistoryValidator)
viewModelOf(::MessagesHistoryViewModelImpl) bind MessagesHistoryViewModel::class viewModelOf(::MessagesHistoryViewModelImpl) bind MessagesHistoryViewModel::class
} }
@@ -5,10 +5,10 @@ import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.toRoute import androidx.navigation.toRoute
import dev.meloda.fast.common.extensions.customNavType
import dev.meloda.fast.messageshistory.model.MessagesHistoryArguments import dev.meloda.fast.messageshistory.model.MessagesHistoryArguments
import dev.meloda.fast.messageshistory.presentation.MessagesHistoryRoute import dev.meloda.fast.messageshistory.presentation.MessagesHistoryRoute
import dev.meloda.fast.model.BaseError import dev.meloda.fast.model.BaseError
import dev.meloda.fast.ui.extensions.customNavType
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlin.reflect.typeOf import kotlin.reflect.typeOf
@@ -5,12 +5,12 @@ import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.font.FontWeight 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.extensions.orDots
import dev.meloda.fast.common.model.UiImage import dev.meloda.fast.common.model.UiImage
import dev.meloda.fast.common.model.UiText import dev.meloda.fast.common.model.UiText
import dev.meloda.fast.common.model.parseString import dev.meloda.fast.common.model.parseString
import dev.meloda.fast.common.provider.ResourceProvider import dev.meloda.fast.common.provider.ResourceProvider
import dev.meloda.fast.data.UserConfig
import dev.meloda.fast.data.VkMemoryCache import dev.meloda.fast.data.VkMemoryCache
import dev.meloda.fast.messageshistory.model.UiItem import dev.meloda.fast.messageshistory.model.UiItem
import dev.meloda.fast.model.api.PeerType import dev.meloda.fast.model.api.PeerType
@@ -5,9 +5,9 @@ import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.toRoute import androidx.navigation.toRoute
import dev.meloda.fast.common.extensions.customNavType
import dev.meloda.fast.photoviewer.model.PhotoViewArguments import dev.meloda.fast.photoviewer.model.PhotoViewArguments
import dev.meloda.fast.photoviewer.presentation.PhotoViewRoute import dev.meloda.fast.photoviewer.presentation.PhotoViewRoute
import dev.meloda.fast.ui.extensions.customNavType
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import java.net.URLEncoder import java.net.URLEncoder
import kotlin.reflect.typeOf import kotlin.reflect.typeOf
+1 -1
View File
@@ -9,7 +9,7 @@ android {
dependencies { dependencies {
implementation(projects.core.common) implementation(projects.core.common)
implementation(projects.core.data) implementation(projects.core.domain)
implementation(projects.core.model) implementation(projects.core.model)
implementation(projects.core.ui) implementation(projects.core.ui)
@@ -1,13 +1,13 @@
package dev.meloda.fast.profile package dev.meloda.fast.profile
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import dev.meloda.fast.common.UserConfig
import dev.meloda.fast.common.VkConstants import dev.meloda.fast.common.VkConstants
import dev.meloda.fast.common.extensions.listenValue import dev.meloda.fast.common.extensions.listenValue
import dev.meloda.fast.common.extensions.setValue import dev.meloda.fast.common.extensions.setValue
import dev.meloda.fast.data.State 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.data.processState
import dev.meloda.fast.domain.UsersUseCase
import dev.meloda.fast.model.BaseError import dev.meloda.fast.model.BaseError
import dev.meloda.fast.network.VkErrorCode import dev.meloda.fast.network.VkErrorCode
import dev.meloda.fast.profile.model.ProfileScreenState import dev.meloda.fast.profile.model.ProfileScreenState
@@ -3,11 +3,11 @@ package dev.meloda.fast.profile.navigation
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import dev.meloda.fast.common.extensions.navigation.sharedViewModel
import dev.meloda.fast.model.BaseError import dev.meloda.fast.model.BaseError
import dev.meloda.fast.profile.ProfileViewModel import dev.meloda.fast.profile.ProfileViewModel
import dev.meloda.fast.profile.ProfileViewModelImpl import dev.meloda.fast.profile.ProfileViewModelImpl
import dev.meloda.fast.profile.presentation.ProfileRoute import dev.meloda.fast.profile.presentation.ProfileRoute
import dev.meloda.fast.ui.extensions.sharedViewModel
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
@@ -7,13 +7,12 @@ import androidx.core.view.HapticFeedbackConstantsCompat
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import dev.meloda.fast.common.LongPollController 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.findWithIndex
import dev.meloda.fast.common.extensions.isSdkAtLeast
import dev.meloda.fast.common.extensions.setValue import dev.meloda.fast.common.extensions.setValue
import dev.meloda.fast.common.model.DarkMode import dev.meloda.fast.common.model.DarkMode
import dev.meloda.fast.common.model.LongPollState import dev.meloda.fast.common.model.LongPollState
import dev.meloda.fast.common.model.UiText import dev.meloda.fast.common.model.UiText
import dev.meloda.fast.data.UserConfig
import dev.meloda.fast.data.db.AccountsRepository import dev.meloda.fast.data.db.AccountsRepository
import dev.meloda.fast.datastore.AppSettings import dev.meloda.fast.datastore.AppSettings
import dev.meloda.fast.datastore.SettingsKeys import dev.meloda.fast.datastore.SettingsKeys
@@ -330,7 +329,7 @@ class SettingsViewModelImpl(
val appearanceUseDynamicColors = SettingsItem.Switch( val appearanceUseDynamicColors = SettingsItem.Switch(
key = SettingsKeys.KEY_USE_DYNAMIC_COLORS, key = SettingsKeys.KEY_USE_DYNAMIC_COLORS,
title = UiText.Resource(UiR.string.settings_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), text = UiText.Resource(UiR.string.settings_dynamic_colors_description),
defaultValue = SettingsKeys.DEFAULT_VALUE_USE_DYNAMIC_COLORS defaultValue = SettingsKeys.DEFAULT_VALUE_USE_DYNAMIC_COLORS
) )
@@ -30,7 +30,12 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.LayoutDirection
import androidx.lifecycle.compose.collectAsStateWithLifecycle 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.datastore.SettingsKeys
import dev.meloda.fast.settings.HapticType import dev.meloda.fast.settings.HapticType
import dev.meloda.fast.settings.SettingsViewModel 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.ActionInvokeDismiss
import dev.meloda.fast.ui.components.MaterialDialog import dev.meloda.fast.ui.components.MaterialDialog
import dev.meloda.fast.ui.theme.LocalThemeConfig 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 org.koin.androidx.compose.koinViewModel
import dev.meloda.fast.ui.R as UiR import dev.meloda.fast.ui.R as UiR
+3 -1
View File
@@ -36,6 +36,7 @@ appcompat = "1.7.0"
androidx-navigation = "2.8.0-beta07" androidx-navigation = "2.8.0-beta07"
serialization = "1.7.1" serialization = "1.7.1"
rebugger = "1.0.0-rc03" rebugger = "1.0.0-rc03"
moduleGraph = "2.5.0"
[libraries] [libraries]
accompanist-permissions = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanist" } accompanist-permissions = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanist" }
@@ -125,13 +126,14 @@ nanokt = [
[plugins] [plugins]
android-application = { id = "com.android.application", version.ref = "agp" } android-application = { id = "com.android.application", version.ref = "agp" }
android-library = { id = "com.android.library", 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" } 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-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" }
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
room = { id = "androidx.room", version.ref = "room" } room = { id = "androidx.room", version.ref = "room" }
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
module-graph = { id = "com.jraska.module.graph.assertion", version.ref = "moduleGraph" }
#project plugins #project plugins
fast-android-application = { id = "fast.android.application", version = "unspecified" } fast-android-application = { id = "fast.android.application", version = "unspecified" }
+1
View File
@@ -35,3 +35,4 @@ include(":feature:photoviewer")
include(":feature:settings") include(":feature:settings")
include(":feature:friends") include(":feature:friends")
include(":feature:profile") include(":feature:profile")
include(":core:domain")