From 751417a8b78189e367bbab8945a848f8efa6d195 Mon Sep 17 00:00:00 2001 From: Konstantin Ivanov <54908981+konstantiniiv@users.noreply.github.com> Date: Fri, 23 Feb 2024 15:26:29 +0100 Subject: [PATCH] DROID-2218 Tech | Internal protocol switch (#890) (#912) --- .../OnboardingNetworkSetupDialog.kt | 4 +--- .../signin/OnboardingNetworkSetupScreen.kt | 11 ++++------ .../anytypeio/anytype/core_models/Command.kt | 6 ++++-- .../anytype/core_models/NetworkMode.kt | 3 ++- .../domain/auth/interactor/CreateAccount.kt | 3 ++- .../domain/auth/interactor/SelectAccount.kt | 3 ++- .../anytype/domain/auth/CreateAccountTest.kt | 6 ++++-- .../anytype/domain/auth/StartAccountTest.kt | 21 ++++++++++++------- localization/src/main/res/values/strings.xml | 3 ++- .../middleware/interactor/Middleware.kt | 9 ++++---- .../networkmode/NetworkModeProvider.kt | 19 +++++++++++++++-- .../settings/PreferencesViewModel.kt | 21 ++++++++++++++++--- 12 files changed, 75 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/com/anytypeio/anytype/ui/onboarding/OnboardingNetworkSetupDialog.kt b/app/src/main/java/com/anytypeio/anytype/ui/onboarding/OnboardingNetworkSetupDialog.kt index 0b07f210d1..f47974a1e3 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/onboarding/OnboardingNetworkSetupDialog.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/onboarding/OnboardingNetworkSetupDialog.kt @@ -62,9 +62,7 @@ class OnboardingNetworkSetupDialog : BaseBottomSheetComposeFragment() { onAnytypeNetworkClicked = { vm.proceedWithNetworkMode(NetworkModeConstants.NETWORK_MODE_DEFAULT) }, - onUseYamuxToggled = { - toast("TODO") - } + onUseYamuxToggled = vm::onChangeMultiplexLibrary ) } } diff --git a/app/src/main/java/com/anytypeio/anytype/ui/onboarding/screens/signin/OnboardingNetworkSetupScreen.kt b/app/src/main/java/com/anytypeio/anytype/ui/onboarding/screens/signin/OnboardingNetworkSetupScreen.kt index 8c49b62797..4cd31fd9ba 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/onboarding/screens/signin/OnboardingNetworkSetupScreen.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/onboarding/screens/signin/OnboardingNetworkSetupScreen.kt @@ -13,13 +13,11 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.draw.scale import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource @@ -150,13 +148,13 @@ fun NetworkSetupScreen( color = NetworkSettingDescriptionColor, textPaddingStart = 0.dp ) - UseYamuxCard(onUseYamuxToggled) + UseYamuxCard(config = config, onUseYamuxToggled = onUseYamuxToggled) Spacer(modifier = Modifier.height(24.dp)) } } @Composable -private fun UseYamuxCard(onUseYamuxToggled: () -> Unit) { +private fun UseYamuxCard(config: NetworkModeConfig, onUseYamuxToggled: () -> Unit) { Column( modifier = Modifier .clip(RoundedCornerShape(16.dp)) @@ -172,13 +170,12 @@ private fun UseYamuxCard(onUseYamuxToggled: () -> Unit) { ) ) { Text( - text = stringResource(id = R.string.network_settings_use_), + text = stringResource(id = R.string.settings_use_yamux), style = BodyCalloutRegular, color = NetworkSettingTitleColor, modifier = Modifier.weight(1.0f) ) - // TODO use flag from network config - if (true) { + if (config.useReserveMultiplexLib) { Image( painter = painterResource(id = R.drawable.ic_network_settings_checked), contentDescription = "Check icon" diff --git a/core-models/src/main/java/com/anytypeio/anytype/core_models/Command.kt b/core-models/src/main/java/com/anytypeio/anytype/core_models/Command.kt index 75c69a9bfd..c83b41500a 100644 --- a/core-models/src/main/java/com/anytypeio/anytype/core_models/Command.kt +++ b/core-models/src/main/java/com/anytypeio/anytype/core_models/Command.kt @@ -10,14 +10,16 @@ sealed class Command { val avatarPath: String?, val icon: Int, val networkMode: NetworkMode = NetworkMode.DEFAULT, - val networkConfigFilePath: String? = null + val networkConfigFilePath: String? = null, + val preferYamuxTransport: Boolean? = null ) : Command() data class AccountSelect( val id: String, val path: String, val networkMode: NetworkMode = NetworkMode.DEFAULT, - val networkConfigFilePath: String? = null + val networkConfigFilePath: String? = null, + val preferYamuxTransport: Boolean? = null ) : Command() class UploadFile( diff --git a/core-models/src/main/java/com/anytypeio/anytype/core_models/NetworkMode.kt b/core-models/src/main/java/com/anytypeio/anytype/core_models/NetworkMode.kt index 16f858bf46..72f2da8498 100644 --- a/core-models/src/main/java/com/anytypeio/anytype/core_models/NetworkMode.kt +++ b/core-models/src/main/java/com/anytypeio/anytype/core_models/NetworkMode.kt @@ -7,7 +7,8 @@ enum class NetworkMode { data class NetworkModeConfig( val networkMode: NetworkMode = NetworkMode.DEFAULT, val userFilePath: String? = null, - val storedFilePath: String? = null + val storedFilePath: String? = null, + val useReserveMultiplexLib: Boolean = false ) object NetworkModeConst { diff --git a/domain/src/main/java/com/anytypeio/anytype/domain/auth/interactor/CreateAccount.kt b/domain/src/main/java/com/anytypeio/anytype/domain/auth/interactor/CreateAccount.kt index 7b5c885c13..4f10a45ee0 100644 --- a/domain/src/main/java/com/anytypeio/anytype/domain/auth/interactor/CreateAccount.kt +++ b/domain/src/main/java/com/anytypeio/anytype/domain/auth/interactor/CreateAccount.kt @@ -32,7 +32,8 @@ open class CreateAccount( avatarPath = params.avatarPath, icon = params.iconGradientValue, networkMode = networkMode.networkMode, - networkConfigFilePath = networkMode.storedFilePath + networkConfigFilePath = networkMode.storedFilePath, + preferYamuxTransport = networkMode.useReserveMultiplexLib ) val setup = repository.createAccount(command) with(repository) { diff --git a/domain/src/main/java/com/anytypeio/anytype/domain/auth/interactor/SelectAccount.kt b/domain/src/main/java/com/anytypeio/anytype/domain/auth/interactor/SelectAccount.kt index de7b4c9c79..3488994651 100644 --- a/domain/src/main/java/com/anytypeio/anytype/domain/auth/interactor/SelectAccount.kt +++ b/domain/src/main/java/com/anytypeio/anytype/domain/auth/interactor/SelectAccount.kt @@ -32,7 +32,8 @@ class SelectAccount @Inject constructor( id = params.id, path = params.path, networkMode = networkMode.networkMode, - networkConfigFilePath = networkMode.storedFilePath + networkConfigFilePath = networkMode.storedFilePath, + preferYamuxTransport = networkMode.useReserveMultiplexLib ) val setup = repository.selectAccount(command) with(repository) { diff --git a/domain/src/test/java/com/anytypeio/anytype/domain/auth/CreateAccountTest.kt b/domain/src/test/java/com/anytypeio/anytype/domain/auth/CreateAccountTest.kt index 0c863f15bb..b45a79e750 100644 --- a/domain/src/test/java/com/anytypeio/anytype/domain/auth/CreateAccountTest.kt +++ b/domain/src/test/java/com/anytypeio/anytype/domain/auth/CreateAccountTest.kt @@ -87,7 +87,8 @@ class CreateAccountTest { name = name, avatarPath = path, icon = icon, - networkMode = NetworkMode.DEFAULT + networkMode = NetworkMode.DEFAULT, + preferYamuxTransport = false ) onBlocking { createAccount(command) } doReturn setup } @@ -103,7 +104,8 @@ class CreateAccountTest { name = name, avatarPath = path, icon = icon, - networkMode = NetworkMode.DEFAULT + networkMode = NetworkMode.DEFAULT, + preferYamuxTransport = false ) verify(repo, times(1)).getNetworkMode() verify(repo, times(1)).createAccount(command) diff --git a/domain/src/test/java/com/anytypeio/anytype/domain/auth/StartAccountTest.kt b/domain/src/test/java/com/anytypeio/anytype/domain/auth/StartAccountTest.kt index 33d1475faa..6676588c4a 100644 --- a/domain/src/test/java/com/anytypeio/anytype/domain/auth/StartAccountTest.kt +++ b/domain/src/test/java/com/anytypeio/anytype/domain/auth/StartAccountTest.kt @@ -100,7 +100,8 @@ class StartAccountTest { val command = Command.AccountSelect( id = id, path = path, - networkMode = NetworkMode.DEFAULT + networkMode = NetworkMode.DEFAULT, + preferYamuxTransport = false ) selectAccount(command) } doReturn AccountSetup( @@ -120,7 +121,8 @@ class StartAccountTest { val command = Command.AccountSelect( id = id, path = path, - networkMode = NetworkMode.DEFAULT + networkMode = NetworkMode.DEFAULT, + preferYamuxTransport = false ) verify(repo, times(1)).getNetworkMode() @@ -169,7 +171,8 @@ class StartAccountTest { val command = Command.AccountSelect( id = id, path = path, - networkMode = NetworkMode.DEFAULT + networkMode = NetworkMode.DEFAULT, + preferYamuxTransport = false ) selectAccount(command) } doReturn AccountSetup( @@ -215,7 +218,8 @@ class StartAccountTest { val command = Command.AccountSelect( id = id, path = path, - networkMode = NetworkMode.DEFAULT + networkMode = NetworkMode.DEFAULT, + preferYamuxTransport = false ) selectAccount(command) } doReturn AccountSetup( @@ -261,7 +265,8 @@ class StartAccountTest { val command = Command.AccountSelect( id = id, path = path, - networkMode = NetworkMode.DEFAULT + networkMode = NetworkMode.DEFAULT, + preferYamuxTransport = false ) selectAccount(command) } doReturn AccountSetup( @@ -307,7 +312,8 @@ class StartAccountTest { val command = Command.AccountSelect( id = id, path = path, - networkMode = NetworkMode.LOCAL + networkMode = NetworkMode.LOCAL, + preferYamuxTransport = false ) selectAccount(command) } doReturn AccountSetup( @@ -359,7 +365,8 @@ class StartAccountTest { id = id, path = path, networkMode = NetworkMode.CUSTOM, - networkConfigFilePath = storedFilePath + networkConfigFilePath = storedFilePath, + preferYamuxTransport = false ) selectAccount(command) } doReturn AccountSetup( diff --git a/localization/src/main/res/values/strings.xml b/localization/src/main/res/values/strings.xml index 3bf6c1b179..8bcbccc3a6 100644 --- a/localization/src/main/res/values/strings.xml +++ b/localization/src/main/res/values/strings.xml @@ -1241,6 +1241,8 @@ %1$s days ago %1$s days from now + Use a reserve multiplex library + Kanban view is not available on mobile yet.\nChange view type (Settings -> View) or create a new one to access your data. @@ -1284,7 +1286,6 @@ Anytype network Backup to the network managed by Anytype Local-only - Use Yamux transport for multiplexing Don\'t back up; sync within local network Self-hosted Back up to your self-hosted network diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt index 9308f65ad6..2969d92037 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt @@ -66,9 +66,9 @@ class Middleware @Inject constructor( name = command.name, avatarLocalPath = command.avatarPath, icon = command.icon.toLong(), - networkMode = command.networkMode?.toMiddlewareModel() ?: MNetworkMode.DefaultConfig, - networkCustomConfigFilePath = command.networkConfigFilePath.orEmpty() - + networkMode = command.networkMode.toMiddlewareModel(), + networkCustomConfigFilePath = command.networkConfigFilePath.orEmpty(), + preferYamuxTransport = command.preferYamuxTransport ?: false ) if (BuildConfig.DEBUG) logRequest(request) val response = service.accountCreate(request) @@ -87,7 +87,8 @@ class Middleware @Inject constructor( id = command.id, rootPath = command.path, networkMode = networkMode, - networkCustomConfigFilePath = networkCustomConfigFilePath + networkCustomConfigFilePath = networkCustomConfigFilePath, + preferYamuxTransport = command.preferYamuxTransport ?: false ) if (BuildConfig.DEBUG) logRequest(request) val response = service.accountSelect(request) diff --git a/persistence/src/main/java/com/anytypeio/anytype/persistence/networkmode/NetworkModeProvider.kt b/persistence/src/main/java/com/anytypeio/anytype/persistence/networkmode/NetworkModeProvider.kt index 89c16b059a..de4b0b83e0 100644 --- a/persistence/src/main/java/com/anytypeio/anytype/persistence/networkmode/NetworkModeProvider.kt +++ b/persistence/src/main/java/com/anytypeio/anytype/persistence/networkmode/NetworkModeProvider.kt @@ -9,6 +9,7 @@ import com.anytypeio.anytype.core_models.NetworkModeConstants.NETWORK_MODE_LOCAL import com.anytypeio.anytype.persistence.networkmode.DefaultNetworkModeProvider.NetworkModeConstants.NETWORK_MODE_APP_FILE_PATH_PREF import com.anytypeio.anytype.persistence.networkmode.DefaultNetworkModeProvider.NetworkModeConstants.NETWORK_MODE_PREF import com.anytypeio.anytype.persistence.networkmode.DefaultNetworkModeProvider.NetworkModeConstants.NETWORK_MODE_USER_FILE_PATH_PREF +import com.anytypeio.anytype.persistence.networkmode.DefaultNetworkModeProvider.NetworkModeConstants.USE_RESERVE_MULTIPLEX_LIBRARY_PREF interface NetworkModeProvider { fun set(networkModeConfig: NetworkModeConfig) @@ -36,11 +37,14 @@ class DefaultNetworkModeProvider(private val sharedPreferences: SharedPreference putString(NETWORK_MODE_PREF, modeValue) putString(NETWORK_MODE_USER_FILE_PATH_PREF, userFilePath) putString(NETWORK_MODE_APP_FILE_PATH_PREF, storedFilePath) + putBoolean(USE_RESERVE_MULTIPLEX_LIBRARY_PREF, networkModeConfig.useReserveMultiplexLib) apply() } } override fun get(): NetworkModeConfig { + val useReserveMultiplexLib = sharedPreferences.getBoolean(USE_RESERVE_MULTIPLEX_LIBRARY_PREF, false) + val networkMode = when (sharedPreferences.getString(NETWORK_MODE_PREF, NETWORK_MODE_DEFAULT)) { NETWORK_MODE_DEFAULT -> NetworkMode.DEFAULT @@ -55,9 +59,19 @@ class DefaultNetworkModeProvider(private val sharedPreferences: SharedPreference val storedFilePath = sharedPreferences.getString( NETWORK_MODE_APP_FILE_PATH_PREF, null ) - NetworkModeConfig(networkMode, userFilePath, storedFilePath) + NetworkModeConfig( + networkMode = networkMode, + userFilePath = userFilePath, + storedFilePath = storedFilePath, + useReserveMultiplexLib = useReserveMultiplexLib + ) } else { - NetworkModeConfig(networkMode, null, null) + NetworkModeConfig( + networkMode = networkMode, + userFilePath = null, + storedFilePath = null, + useReserveMultiplexLib = useReserveMultiplexLib + ) } } @@ -69,6 +83,7 @@ class DefaultNetworkModeProvider(private val sharedPreferences: SharedPreference const val NETWORK_MODE_PREF = "pref.network_mode" const val NETWORK_MODE_APP_FILE_PATH_PREF = "pref.network_config_file_path" const val NETWORK_MODE_USER_FILE_PATH_PREF = "pref.network_mode_user_config_file_path" + const val USE_RESERVE_MULTIPLEX_LIBRARY_PREF = "pref.use_reserve_multiplex_library" const val NAMED_NETWORK_MODE_PREFS = "network_mode" } diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/settings/PreferencesViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/settings/PreferencesViewModel.kt index c6e12c94e8..94c2ac65ac 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/settings/PreferencesViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/settings/PreferencesViewModel.kt @@ -31,14 +31,16 @@ class PreferencesViewModel( ) : ViewModel(), PickerListener { val networkModeState = MutableStateFlow(NetworkModeConfig(NetworkMode.DEFAULT, "", "")) + val reserveMultiplexSetting = MutableStateFlow(false) fun onStart() { Timber.d("onStart") viewModelScope.launch { getNetworkMode.async(Unit).fold( - onSuccess = { - networkModeState.value = it - Timber.d("Successfully get network mode on Start: $it") + onSuccess = { config -> + networkModeState.value = config + reserveMultiplexSetting.value = config.useReserveMultiplexLib + Timber.d("Successfully get network mode on Start: $config") }, onFailure = { Timber.e(it, "Failed to get network mode") @@ -102,6 +104,19 @@ class PreferencesViewModel( } } + fun onChangeMultiplexLibrary() { + val newValue = !networkModeState.value.useReserveMultiplexLib + Timber.d("onChangeMultiplexLibrary: $newValue") + viewModelScope.launch { + val mode = networkModeState.value.copy(useReserveMultiplexLib = newValue) + val params = SetNetworkMode.Params(mode) + setNetworkMode.async(params).fold( + onSuccess = { networkModeState.value = mode }, + onFailure = { Timber.e(it, "Failed to update network mode ") } + ) + } + } + override fun onStartCopyFileToCacheDir(uri: Uri) { Timber.d("onStartCopyFileToCacheDir: $uri") copyFileToCache.execute(