forked from melod1n/fast-messenger
more fixes
This commit is contained in:
@@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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>
|
|
||||||
@@ -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"),
|
||||||
|
|||||||
@@ -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>
|
|
||||||
+2
-2
@@ -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
|
||||||
|
|
||||||
+2
-2
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -1,4 +1,4 @@
|
|||||||
package com.meloda.fast.auth.login.model
|
package dev.meloda.fast.auth.login.model
|
||||||
|
|
||||||
sealed class LoginValidationResult {
|
sealed class LoginValidationResult {
|
||||||
|
|
||||||
|
|||||||
+8
-8
@@ -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
|
||||||
|
|||||||
+8
-8
@@ -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
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -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
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -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>
|
|
||||||
-3
@@ -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?
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user