more fixes

This commit is contained in:
2024-07-16 07:43:08 +03:00
parent c8b1d72f08
commit a696425dc8
52 changed files with 113 additions and 251 deletions
@@ -1,6 +1,7 @@
package dev.meloda.fast.presentation package dev.meloda.fast.presentation
import android.Manifest import android.Manifest
import android.annotation.SuppressLint
import android.app.NotificationChannel import android.app.NotificationChannel
import android.app.NotificationManager import android.app.NotificationManager
import android.content.Context import android.content.Context
@@ -18,6 +19,7 @@ import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.graphics.toArgb
@@ -51,6 +53,7 @@ import dev.meloda.fast.ui.R as UiR
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
@SuppressLint("HardwareIds", "InlinedApi")
@OptIn(ExperimentalPermissionsApi::class) @OptIn(ExperimentalPermissionsApi::class)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@@ -155,15 +158,34 @@ class MainActivity : AppCompatActivity() {
} }
} }
val themeConfig = ThemeConfig( val darkMode by userSettings.darkMode.collectAsStateWithLifecycle()
darkMode = isNeedToEnableDarkMode(userSettings.darkMode.value), val dynamicColors by userSettings.enableDynamicColors.collectAsStateWithLifecycle()
dynamicColors = userSettings.enableDynamicColors.value, val amoledDark by userSettings.enableAmoledDark.collectAsStateWithLifecycle()
val enableBlur by userSettings.useBlur.collectAsStateWithLifecycle()
val enableMultiline by userSettings.enableMultiline.collectAsStateWithLifecycle()
val setDarkMode = isNeedToEnableDarkMode(darkMode = darkMode)
val themeConfig by remember(
darkMode,
dynamicColors,
amoledDark,
enableBlur,
enableMultiline,
setDarkMode
) {
mutableStateOf(
ThemeConfig(
darkMode = setDarkMode,
dynamicColors = dynamicColors,
selectedColorScheme = 0, selectedColorScheme = 0,
amoledDark = userSettings.enableAmoledDark.value, amoledDark = amoledDark,
enableBlur = userSettings.useBlur.value, enableBlur = enableBlur,
enableMultiline = userSettings.enableMultiline.value, enableMultiline = enableMultiline,
isDeviceCompact = isDeviceCompact isDeviceCompact = isDeviceCompact
) )
)
}
CompositionLocalProvider(LocalThemeConfig provides themeConfig) { CompositionLocalProvider(LocalThemeConfig provides themeConfig) {
AppTheme( AppTheme(
@@ -1,15 +0,0 @@
package dev.meloda.fast.receiver
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log
class DownloadManagerReceiver : BroadcastReceiver() {
var onReceiveAction: (() -> Unit)? = null
override fun onReceive(context: Context, intent: Intent) {
onReceiveAction?.invoke()
}
}
-4
View File
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
@@ -8,11 +8,9 @@ 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
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asFlow import kotlinx.coroutines.flow.asFlow
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flow
@@ -20,10 +18,6 @@ import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext
import kotlin.time.Duration import kotlin.time.Duration
import kotlin.time.Duration.Companion.seconds import kotlin.time.Duration.Companion.seconds
@@ -98,26 +92,6 @@ fun createTimerFlow(
} }
} }
context(ViewModel)
fun <T> MutableSharedFlow<T>.emitOnMainScope(value: T) = emitOnScope(Dispatchers.Main) { value }
context(ViewModel)
fun <T> MutableSharedFlow<T>.emitOnScope(
coroutineContext: CoroutineContext = EmptyCoroutineContext,
value: () -> T,
) {
viewModelScope.launch(coroutineContext) {
emit(value())
}
}
context(CoroutineScope)
suspend fun <T> MutableSharedFlow<T>.emitWithMain(value: T) {
withContext(Dispatchers.Main) {
emit(value)
}
}
context(ViewModel) context(ViewModel)
fun <T> MutableStateFlow<T>.updateValue(newValue: T) = this.update { newValue } fun <T> MutableStateFlow<T>.updateValue(newValue: T) = this.update { newValue }
@@ -13,11 +13,6 @@ import androidx.core.content.FileProvider
import java.io.File import java.io.File
import java.io.FileOutputStream import java.io.FileOutputStream
private object BuildConfig {
const val DEBUG = true
const val APPLICATION_ID = "dev.meloda.fast"
}
object AndroidUtils { object AndroidUtils {
fun copyText( fun copyText(
@@ -95,7 +90,7 @@ object AndroidUtils {
action = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { action = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
Settings.ACTION_SECURITY_SETTINGS Settings.ACTION_SECURITY_SETTINGS
} else { } else {
data = Uri.parse("package:${BuildConfig.APPLICATION_ID}") data = Uri.parse("package:dev.meloda.fast")
Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES
} }
}) })
@@ -113,7 +108,7 @@ object AndroidUtils {
intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true) intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true)
intent.data = FileProvider.getUriForFile( intent.data = FileProvider.getUriForFile(
context, context,
BuildConfig.APPLICATION_ID + providerPath, "dev.meloda.fast$providerPath",
fileToRead fileToRead
) )
@@ -132,7 +127,7 @@ object AndroidUtils {
} }
val file = existingFile.copyTo(copyToFile) val file = existingFile.copyTo(copyToFile)
FileProvider.getUriForFile(context, "${BuildConfig.APPLICATION_ID}.provider", file) FileProvider.getUriForFile(context, "dev.meloda.fast.provider", file)
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
null null
@@ -150,7 +145,7 @@ object AndroidUtils {
bitmap.compress(Bitmap.CompressFormat.PNG, 90, outputStream) bitmap.compress(Bitmap.CompressFormat.PNG, 90, outputStream)
outputStream.flush() outputStream.flush()
outputStream.close() outputStream.close()
FileProvider.getUriForFile(context, "${BuildConfig.APPLICATION_ID}.fileprovider", file) FileProvider.getUriForFile(context, "dev.meloda.fast.fileprovider", file)
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
null null
@@ -188,7 +183,6 @@ object AndroidUtils {
} }
val chooserIntent = Intent.createChooser(intent, "Share $contentType") val chooserIntent = Intent.createChooser(intent, "Share $contentType")
context.startActivity(chooserIntent) context.startActivity(chooserIntent)
} }
} }
@@ -8,9 +8,9 @@ interface AccountUseCase {
suspend fun setOnline( suspend fun setOnline(
voip: Boolean, voip: Boolean,
accessToken: String accessToken: String
): Flow<State<Unit>> ): Flow<State<Int>>
suspend fun setOffline( suspend fun setOffline(
accessToken: String accessToken: String
): Flow<State<Unit>> ): Flow<State<Int>>
} }
@@ -1,49 +1,30 @@
package dev.meloda.fast.data.api.account package dev.meloda.fast.data.api.account
import dev.meloda.fast.data.State import dev.meloda.fast.data.State
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
// TODO: 05/05/2024, Danil Nikolaev: implement
class AccountUseCaseImpl( class AccountUseCaseImpl(
private val accountRepository: dev.meloda.fast.data.api.account.AccountRepository private val repository: AccountRepository
) : dev.meloda.fast.data.api.account.AccountUseCase { ) : AccountUseCase {
override suspend fun setOnline( override suspend fun setOnline(
voip: Boolean, voip: Boolean,
accessToken: String accessToken: String
): Flow<State<Unit>> = flow { ): Flow<State<Int>> = flow {
// emit(dev.meloda.fast.data.State.Loading) emit(State.Loading)
//
// val newState = accountRepository.setOnline( val newState = repository.setOnline(voip = voip).mapToState()
// params = AccountSetOnlineRequest( emit(newState)
// voip = voip,
// accessToken = accessToken
// )
// ).fold(
// onSuccess = { response -> dev.meloda.fast.data.State.Success(response) },
// onNetworkFailure = { dev.meloda.fast.data.State.Error.ConnectionError },
// onUnknownFailure = { dev.meloda.fast.data.State.UNKNOWN_ERROR },
// onHttpFailure = { result -> result.error.toStateApiError() },
// onApiFailure = { result -> result.error.toStateApiError() }
// )
// emit(newState)
} }
override suspend fun setOffline( override suspend fun setOffline(
accessToken: String accessToken: String
): Flow<dev.meloda.fast.data.State<Unit>> = flow { ): Flow<State<Int>> = flow {
emit(dev.meloda.fast.data.State.Loading) emit(State.Loading)
// val newState = accountRepository.setOffline( val newState = repository.setOffline().mapToState()
// params = AccountSetOfflineRequest(accessToken = accessToken) emit(newState)
// ).fold(
// onSuccess = { response -> dev.meloda.fast.data.State.Success(response) },
// onNetworkFailure = { dev.meloda.fast.data.State.Error.ConnectionError },
// onUnknownFailure = { dev.meloda.fast.data.State.UNKNOWN_ERROR },
// onHttpFailure = { result -> result.error.toStateApiError() },
// onApiFailure = { result -> result.error.toStateApiError() }
// )
// emit(newState)
} }
} }
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
-4
View File
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
@@ -1,4 +1,4 @@
package dev.meloda.fast.model; package dev.meloda.fast.model
enum class ApiEvent(val value: Int) { enum class ApiEvent(val value: Int) {
MESSAGE_SET_FLAGS(2), MESSAGE_SET_FLAGS(2),
@@ -1,4 +1,4 @@
package dev.meloda.fast.model.api; package dev.meloda.fast.model.api
enum class PeerType(val value: String) { enum class PeerType(val value: String) {
USER("user"), USER("user"),
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
@@ -11,5 +11,4 @@ data class ApiResponse<T>(
val isSuccessful get() = error == null && response != null val isSuccessful get() = error == null && response != null
fun requireResponse(): T = requireNotNull(response) fun requireResponse(): T = requireNotNull(response)
fun requireError(): RestApiError = requireNotNull(error)
} }
@@ -1,4 +1,4 @@
package dev.meloda.fast.network; package dev.meloda.fast.network
enum class ValidationType(val value: String) { enum class ValidationType(val value: String) {
APP("2fa_app"), APP("2fa_app"),
@@ -1,4 +1,4 @@
package dev.meloda.fast.network; package dev.meloda.fast.network
enum class VkOAuthErrorType(val value: String) { enum class VkOAuthErrorType(val value: String) {
WRONG_OTP_FORMAT("otp_format_is_incorrect"), WRONG_OTP_FORMAT("otp_format_is_incorrect"),
-4
View File
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
@@ -1,9 +1,9 @@
package com.meloda.fast.auth.login package dev.meloda.fast.auth.login
import androidx.compose.ui.test.assertHasClickAction import androidx.compose.ui.test.assertHasClickAction
import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithTag
import com.meloda.fast.auth.login.presentation.LoginScreen import dev.meloda.fast.auth.login.presentation.LoginScreen
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
@@ -1,9 +1,9 @@
package com.meloda.fast.auth.login package dev.meloda.fast.auth.login
import androidx.compose.ui.test.assertHasClickAction import androidx.compose.ui.test.assertHasClickAction
import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithTag
import com.meloda.fast.auth.login.presentation.LogoScreen import dev.meloda.fast.auth.login.presentation.LogoScreen
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
@@ -1,9 +1,8 @@
package com.meloda.fast.auth.login package dev.meloda.fast.auth.login
import android.util.Log import android.util.Log
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import dev.meloda.fast.auth.login.BuildConfig
import dev.meloda.fast.common.LongPollController import dev.meloda.fast.common.LongPollController
import dev.meloda.fast.common.UserConfig import dev.meloda.fast.common.UserConfig
import dev.meloda.fast.common.VkConstants import dev.meloda.fast.common.VkConstants
@@ -16,16 +15,15 @@ import dev.meloda.fast.data.api.users.UsersUseCase
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.datastore.UserSettings
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 com.meloda.fast.auth.login.model.CaptchaArguments import dev.meloda.fast.auth.login.model.CaptchaArguments
import com.meloda.fast.auth.login.model.LoginError import dev.meloda.fast.auth.login.model.LoginError
import com.meloda.fast.auth.login.model.LoginScreenState import dev.meloda.fast.auth.login.model.LoginScreenState
import com.meloda.fast.auth.login.model.LoginUserBannedArguments import dev.meloda.fast.auth.login.model.LoginUserBannedArguments
import com.meloda.fast.auth.login.model.LoginValidationArguments import dev.meloda.fast.auth.login.model.LoginValidationArguments
import com.meloda.fast.auth.login.model.LoginValidationResult import dev.meloda.fast.auth.login.model.LoginValidationResult
import com.meloda.fast.auth.login.validation.LoginValidator import dev.meloda.fast.auth.login.validation.LoginValidator
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
@@ -72,7 +70,6 @@ class LoginViewModelImpl(
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 userSettings: UserSettings,
private val longPollController: LongPollController private val longPollController: LongPollController
) : ViewModel(), LoginViewModel { ) : ViewModel(), LoginViewModel {
@@ -1,7 +1,7 @@
package com.meloda.fast.auth.login package dev.meloda.fast.auth.login
import dev.meloda.fast.data.State import dev.meloda.fast.data.State
import com.meloda.fast.auth.login.model.AuthInfo import dev.meloda.fast.auth.login.model.AuthInfo
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
interface OAuthUseCase { interface OAuthUseCase {
@@ -1,4 +1,4 @@
package com.meloda.fast.auth.login package dev.meloda.fast.auth.login
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
@@ -6,7 +6,7 @@ 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
import dev.meloda.fast.network.VkOAuthErrorType import dev.meloda.fast.network.VkOAuthErrorType
import com.meloda.fast.auth.login.model.AuthInfo import dev.meloda.fast.auth.login.model.AuthInfo
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flow
@@ -1,10 +1,10 @@
package com.meloda.fast.auth.login.di package dev.meloda.fast.auth.login.di
import com.meloda.fast.auth.login.LoginViewModel import dev.meloda.fast.auth.login.LoginViewModel
import com.meloda.fast.auth.login.LoginViewModelImpl import dev.meloda.fast.auth.login.LoginViewModelImpl
import com.meloda.fast.auth.login.OAuthUseCase import dev.meloda.fast.auth.login.OAuthUseCase
import com.meloda.fast.auth.login.OAuthUseCaseImpl import dev.meloda.fast.auth.login.OAuthUseCaseImpl
import com.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
import org.koin.dsl.bind import org.koin.dsl.bind
@@ -1,4 +1,4 @@
package com.meloda.fast.auth.login.model package dev.meloda.fast.auth.login.model
data class AuthInfo( data class AuthInfo(
val userId: Int?, val userId: Int?,
@@ -1,4 +1,4 @@
package com.meloda.fast.auth.login.model package dev.meloda.fast.auth.login.model
import android.os.Parcelable import android.os.Parcelable
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
@@ -1,8 +0,0 @@
package com.meloda.fast.auth.login.model
data class LoginArguments(val code: String) {
companion object {
val EMPTY: LoginArguments = LoginArguments(code = "")
}
}
@@ -1,4 +1,4 @@
package com.meloda.fast.auth.login.model package dev.meloda.fast.auth.login.model
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
@@ -1,4 +1,4 @@
package com.meloda.fast.auth.login.model package dev.meloda.fast.auth.login.model
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
@@ -1,4 +1,4 @@
package com.meloda.fast.auth.login.model package dev.meloda.fast.auth.login.model
import android.os.Parcelable import android.os.Parcelable
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
@@ -1,4 +1,4 @@
package com.meloda.fast.auth.login.model package dev.meloda.fast.auth.login.model
import android.os.Parcelable import android.os.Parcelable
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
@@ -1,4 +1,4 @@
package com.meloda.fast.auth.login.model package dev.meloda.fast.auth.login.model
sealed class LoginValidationResult { sealed class LoginValidationResult {
@@ -1,17 +1,17 @@
package com.meloda.fast.auth.login.navigation package dev.meloda.fast.auth.login.navigation
import androidx.navigation.NavBackStackEntry 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.common.extensions.navigation.sharedViewModel
import com.meloda.fast.auth.login.LoginViewModel import dev.meloda.fast.auth.login.LoginViewModel
import com.meloda.fast.auth.login.LoginViewModelImpl import dev.meloda.fast.auth.login.LoginViewModelImpl
import com.meloda.fast.auth.login.model.CaptchaArguments import dev.meloda.fast.auth.login.model.CaptchaArguments
import com.meloda.fast.auth.login.model.LoginValidationArguments import dev.meloda.fast.auth.login.model.LoginValidationArguments
import com.meloda.fast.auth.login.model.LoginUserBannedArguments import dev.meloda.fast.auth.login.model.LoginUserBannedArguments
import com.meloda.fast.auth.login.presentation.LoginRoute import dev.meloda.fast.auth.login.presentation.LoginRoute
import com.meloda.fast.auth.login.presentation.LogoRoute import dev.meloda.fast.auth.login.presentation.LogoRoute
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
@@ -1,4 +1,4 @@
package com.meloda.fast.auth.login.presentation package dev.meloda.fast.auth.login.presentation
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeIn
@@ -58,13 +58,13 @@ import dev.meloda.fast.ui.components.TextFieldErrorText
import dev.meloda.fast.ui.theme.LocalThemeConfig import dev.meloda.fast.ui.theme.LocalThemeConfig
import dev.meloda.fast.ui.util.handleEnterKey import dev.meloda.fast.ui.util.handleEnterKey
import dev.meloda.fast.ui.util.handleTabKey import dev.meloda.fast.ui.util.handleTabKey
import com.meloda.fast.auth.login.LoginViewModel import dev.meloda.fast.auth.login.LoginViewModel
import com.meloda.fast.auth.login.LoginViewModelImpl import dev.meloda.fast.auth.login.LoginViewModelImpl
import com.meloda.fast.auth.login.model.CaptchaArguments import dev.meloda.fast.auth.login.model.CaptchaArguments
import com.meloda.fast.auth.login.model.LoginError import dev.meloda.fast.auth.login.model.LoginError
import com.meloda.fast.auth.login.model.LoginScreenState import dev.meloda.fast.auth.login.model.LoginScreenState
import com.meloda.fast.auth.login.model.LoginUserBannedArguments import dev.meloda.fast.auth.login.model.LoginUserBannedArguments
import com.meloda.fast.auth.login.model.LoginValidationArguments import dev.meloda.fast.auth.login.model.LoginValidationArguments
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
@@ -1,4 +1,4 @@
package com.meloda.fast.auth.login.presentation package dev.meloda.fast.auth.login.presentation
import androidx.compose.animation.core.animateDpAsState import androidx.compose.animation.core.animateDpAsState
import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.ExperimentalFoundationApi
@@ -32,8 +32,8 @@ import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import dev.meloda.fast.ui.theme.LocalThemeConfig import dev.meloda.fast.ui.theme.LocalThemeConfig
import com.meloda.fast.auth.login.LoginViewModel import dev.meloda.fast.auth.login.LoginViewModel
import com.meloda.fast.auth.login.LoginViewModelImpl import dev.meloda.fast.auth.login.LoginViewModelImpl
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
@@ -1,8 +1,8 @@
package com.meloda.fast.auth.login.validation package dev.meloda.fast.auth.login.validation
import dev.meloda.fast.common.extensions.addIf import dev.meloda.fast.common.extensions.addIf
import com.meloda.fast.auth.login.model.LoginScreenState import dev.meloda.fast.auth.login.model.LoginScreenState
import com.meloda.fast.auth.login.model.LoginValidationResult import dev.meloda.fast.auth.login.model.LoginValidationResult
class LoginValidator { class LoginValidator {
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
@@ -13,9 +13,9 @@ import dev.meloda.fast.auth.validation.navigation.validationScreen
import dev.meloda.fast.auth.userbanned.model.UserBannedArguments import dev.meloda.fast.auth.userbanned.model.UserBannedArguments
import dev.meloda.fast.auth.userbanned.navigation.navigateToUserBanned import dev.meloda.fast.auth.userbanned.navigation.navigateToUserBanned
import dev.meloda.fast.auth.userbanned.navigation.userBannedRoute import dev.meloda.fast.auth.userbanned.navigation.userBannedRoute
import com.meloda.fast.auth.login.navigation.Logo import dev.meloda.fast.auth.login.navigation.Logo
import com.meloda.fast.auth.login.navigation.loginScreen import dev.meloda.fast.auth.login.navigation.loginScreen
import com.meloda.fast.auth.login.navigation.navigateToLogin import dev.meloda.fast.auth.login.navigation.navigateToLogin
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import java.net.URLEncoder import java.net.URLEncoder
@@ -2,7 +2,7 @@ package dev.meloda.fast.auth
import dev.meloda.fast.auth.captcha.di.captchaModule import dev.meloda.fast.auth.captcha.di.captchaModule
import dev.meloda.fast.auth.validation.di.validationModule import dev.meloda.fast.auth.validation.di.validationModule
import com.meloda.fast.auth.login.di.loginModule import dev.meloda.fast.auth.login.di.loginModule
import org.koin.dsl.module import org.koin.dsl.module
val authModule = module { val authModule = module {
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
@@ -1,5 +0,0 @@
package dev.meloda.fast.friends.model
enum class OnlineState {
OFFLINE, ONLINE, ONLINE_MOBILE
}
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
@@ -48,9 +48,6 @@ import dev.meloda.fast.common.model.UiImage
import dev.meloda.fast.photoviewer.PhotoViewViewModel import dev.meloda.fast.photoviewer.PhotoViewViewModel
import dev.meloda.fast.photoviewer.model.PhotoViewState import dev.meloda.fast.photoviewer.model.PhotoViewState
@OptIn(
ExperimentalFoundationApi::class,
)
@Composable @Composable
fun PhotoViewScreenContent( fun PhotoViewScreenContent(
onBackClick: () -> Unit, onBackClick: () -> Unit,
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
@@ -104,10 +104,10 @@ class SettingsViewModelImpl(
} }
SettingsKeys.KEY_DEBUG_HIDE_DEBUG_LIST -> { SettingsKeys.KEY_DEBUG_HIDE_DEBUG_LIST -> {
val showDebugCategory = AppSettings.Debug.showDebugCategory if (!AppSettings.Debug.showDebugCategory) return
if (!showDebugCategory) return
onSettingsItemChanged(key, false) AppSettings.Debug.showDebugCategory = false
userSettings.onShowDebugCategoryChanged(false)
createSettings() createSettings()
@@ -122,7 +122,8 @@ class SettingsViewModelImpl(
SettingsKeys.KEY_ACTIVITY_SEND_ONLINE_STATUS -> { SettingsKeys.KEY_ACTIVITY_SEND_ONLINE_STATUS -> {
if (AppSettings.Debug.showDebugCategory) return if (AppSettings.Debug.showDebugCategory) return
onSettingsItemChanged(key, true) AppSettings.Debug.showDebugCategory = true
userSettings.onShowDebugCategoryChanged(true)
createSettings() createSettings()
@@ -1,7 +0,0 @@
package dev.meloda.fast.settings.model
import dev.meloda.fast.common.model.UiText
fun interface TitleProvider<T, S : SettingsItem<T>> {
fun provideTitle(item: S): UiText?
}