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(