domain module
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -18,7 +18,6 @@ class AppGlobal : Application(), ImageLoaderFactory {
|
||||
|
||||
val preferences = PreferenceManager.getDefaultSharedPreferences(this)
|
||||
AppSettings.init(preferences)
|
||||
UserConfig.init(preferences)
|
||||
|
||||
initKoin()
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
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 <T> Iterable<T>.findWithIndex(predicate: (T) -> Boolean): Pair<Int, T>? {
|
||||
val value = firstOrNull(predicate) ?: return null
|
||||
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()
|
||||
}
|
||||
}
|
||||
|
||||
@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.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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
+1
-2
@@ -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
|
||||
+4
-12
@@ -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
|
||||
@@ -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<Interceptor>(named("token_interceptor")) {
|
||||
AccessTokenInterceptor()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
/build
|
||||
@@ -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
-1
@@ -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
|
||||
+2
-1
@@ -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
|
||||
+1
-1
@@ -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
|
||||
+1
-1
@@ -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
|
||||
+1
-1
@@ -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
|
||||
+1
-2
@@ -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
|
||||
+1
-1
@@ -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
|
||||
+3
-3
@@ -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<State<FriendsInfo>> = flow {
|
||||
emit(State.Loading)
|
||||
+6
-3
@@ -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)
|
||||
+4
-3
@@ -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
|
||||
+2
-1
@@ -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
|
||||
+3
-1
@@ -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
|
||||
+2
-1
@@ -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
|
||||
+1
-2
@@ -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
|
||||
+2
-2
@@ -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 {
|
||||
+2
-2
@@ -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
|
||||
+1
-1
@@ -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
|
||||
+2
-1
@@ -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
|
||||
@@ -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
-1
@@ -1,4 +1,4 @@
|
||||
package dev.meloda.fast.auth.login.model
|
||||
package dev.meloda.fast.model
|
||||
|
||||
data class AuthInfo(
|
||||
val userId: Int?,
|
||||
@@ -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<AccessTokenInterceptor>())
|
||||
.addInterceptor(get(named("token_interceptor")) as Interceptor)
|
||||
.addInterceptor(get<VersionInterceptor>())
|
||||
.addInterceptor(get<LanguageInterceptor>())
|
||||
.addInterceptor(get<ChuckerInterceptor>())
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package dev.meloda.fast.common.extensions
|
||||
package dev.meloda.fast.ui.extensions
|
||||
|
||||
import android.os.Bundle
|
||||
import android.os.Parcelable
|
||||
+1
-1
@@ -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
|
||||
@@ -64,7 +64,7 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation(projects.core.data)
|
||||
implementation(projects.core.domain)
|
||||
implementation(projects.core.ui)
|
||||
|
||||
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.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<LoginError?>(null)
|
||||
|
||||
@@ -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
|
||||
|
||||
+4
-4
@@ -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<Login> { backStackEntry ->
|
||||
val viewModel: dev.meloda.fast.auth.login.LoginViewModel =
|
||||
backStackEntry.sharedViewModel<dev.meloda.fast.auth.login.LoginViewModelImpl>(navController = navController)
|
||||
val viewModel: LoginViewModel =
|
||||
backStackEntry.sharedViewModel<LoginViewModelImpl>(navController = navController)
|
||||
|
||||
val validationCode = backStackEntry.getValidationResult()
|
||||
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.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
|
||||
|
||||
@@ -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
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation(projects.core.data)
|
||||
implementation(projects.core.domain)
|
||||
implementation(projects.core.model)
|
||||
implementation(projects.core.ui)
|
||||
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
+3
-3
@@ -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
|
||||
|
||||
+3
-3
@@ -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)
|
||||
}
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+2
-2
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
+4
-4
@@ -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
|
||||
|
||||
+3
-3
@@ -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
|
||||
}
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
+6
-6
@@ -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
|
||||
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -35,3 +35,4 @@ include(":feature:photoviewer")
|
||||
include(":feature:settings")
|
||||
include(":feature:friends")
|
||||
include(":feature:profile")
|
||||
include(":core:domain")
|
||||
|
||||
Reference in New Issue
Block a user