desktop: enable database operations (#3495)
* desktop: enable database operations * disconnect hosts button * not relaying on dev tools * different logic * different logic 2 * toggle placement
This commit is contained in:
parent
b74e33b958
commit
40e69ae713
@ -430,8 +430,9 @@ object ChatController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
suspend fun getUserChatData(rhId: Long?) {
|
suspend fun getUserChatData(rhId: Long?) {
|
||||||
chatModel.userAddress.value = apiGetUserAddress(rhId)
|
val hasUser = chatModel.currentUser.value != null
|
||||||
chatModel.chatItemTTL.value = getChatItemTTL(rhId)
|
chatModel.userAddress.value = if (hasUser) apiGetUserAddress(rhId) else null
|
||||||
|
chatModel.chatItemTTL.value = if (hasUser) getChatItemTTL(rhId) else ChatItemTTL.None
|
||||||
updatingChatsMutex.withLock {
|
updatingChatsMutex.withLock {
|
||||||
val chats = apiGetChats(rhId)
|
val chats = apiGetChats(rhId)
|
||||||
chatModel.updateChats(chats)
|
chatModel.updateChats(chats)
|
||||||
|
@ -264,7 +264,8 @@ private fun DatabaseKeyField(text: MutableState<String>, enabled: Boolean, onCli
|
|||||||
text,
|
text,
|
||||||
generalGetString(MR.strings.enter_passphrase),
|
generalGetString(MR.strings.enter_passphrase),
|
||||||
isValid = ::validKey,
|
isValid = ::validKey,
|
||||||
keyboardActions = KeyboardActions(onDone = if (enabled) {
|
// Don't enable this on desktop since it interfere with key event listener
|
||||||
|
keyboardActions = KeyboardActions(onDone = if (enabled && appPlatform.isAndroid) {
|
||||||
{ onClick?.invoke() }
|
{ onClick?.invoke() }
|
||||||
} else null
|
} else null
|
||||||
),
|
),
|
||||||
|
@ -4,6 +4,7 @@ import SectionBottomSpacer
|
|||||||
import SectionDividerSpaced
|
import SectionDividerSpaced
|
||||||
import SectionTextFooter
|
import SectionTextFooter
|
||||||
import SectionItemView
|
import SectionItemView
|
||||||
|
import SectionSpacer
|
||||||
import SectionView
|
import SectionView
|
||||||
import androidx.compose.desktop.ui.tooling.preview.Preview
|
import androidx.compose.desktop.ui.tooling.preview.Preview
|
||||||
import androidx.compose.foundation.layout.*
|
import androidx.compose.foundation.layout.*
|
||||||
@ -20,6 +21,7 @@ import androidx.compose.ui.text.*
|
|||||||
import androidx.compose.ui.text.font.FontWeight
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import chat.simplex.common.model.*
|
import chat.simplex.common.model.*
|
||||||
|
import chat.simplex.common.model.ChatModel.controller
|
||||||
import chat.simplex.common.model.ChatModel.updatingChatsMutex
|
import chat.simplex.common.model.ChatModel.updatingChatsMutex
|
||||||
import chat.simplex.common.ui.theme.*
|
import chat.simplex.common.ui.theme.*
|
||||||
import chat.simplex.common.views.helpers.*
|
import chat.simplex.common.views.helpers.*
|
||||||
@ -59,7 +61,9 @@ fun DatabaseView(
|
|||||||
val appFilesCountAndSize = remember { mutableStateOf(directoryFileCountAndSize(appFilesDir.absolutePath)) }
|
val appFilesCountAndSize = remember { mutableStateOf(directoryFileCountAndSize(appFilesDir.absolutePath)) }
|
||||||
val importArchiveLauncher = rememberFileChooserLauncher(true) { to: URI? ->
|
val importArchiveLauncher = rememberFileChooserLauncher(true) { to: URI? ->
|
||||||
if (to != null) {
|
if (to != null) {
|
||||||
importArchiveAlert(m, to, appFilesCountAndSize, progressIndicator)
|
importArchiveAlert(m, to, appFilesCountAndSize, progressIndicator) {
|
||||||
|
startChat(m, chatLastStart, m.chatDbChanged)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
val chatItemTTL = remember { mutableStateOf(m.chatItemTTL.value) }
|
val chatItemTTL = remember { mutableStateOf(m.chatItemTTL.value) }
|
||||||
@ -77,7 +81,6 @@ fun DatabaseView(
|
|||||||
m.chatDbEncrypted.value,
|
m.chatDbEncrypted.value,
|
||||||
m.controller.appPrefs.storeDBPassphrase.state.value,
|
m.controller.appPrefs.storeDBPassphrase.state.value,
|
||||||
m.controller.appPrefs.initialRandomDBPassphrase,
|
m.controller.appPrefs.initialRandomDBPassphrase,
|
||||||
m.controller.appPrefs.developerTools.state.value,
|
|
||||||
importArchiveLauncher,
|
importArchiveLauncher,
|
||||||
chatArchiveName,
|
chatArchiveName,
|
||||||
chatArchiveTime,
|
chatArchiveTime,
|
||||||
@ -100,7 +103,13 @@ fun DatabaseView(
|
|||||||
setCiTTL(m, rhId, chatItemTTL, progressIndicator, appFilesCountAndSize)
|
setCiTTL(m, rhId, chatItemTTL, progressIndicator, appFilesCountAndSize)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
showSettingsModal
|
showSettingsModal,
|
||||||
|
disconnectAllHosts = {
|
||||||
|
val connected = chatModel.remoteHosts.filter { it.sessionState is RemoteHostSessionState.Connected }
|
||||||
|
connected.forEachIndexed { index, h ->
|
||||||
|
controller.stopRemoteHostAndReloadHosts(h, index == connected.lastIndex && chatModel.connectedToRemote())
|
||||||
|
}
|
||||||
|
}
|
||||||
)
|
)
|
||||||
if (progressIndicator.value) {
|
if (progressIndicator.value) {
|
||||||
Box(
|
Box(
|
||||||
@ -129,7 +138,6 @@ fun DatabaseLayout(
|
|||||||
chatDbEncrypted: Boolean?,
|
chatDbEncrypted: Boolean?,
|
||||||
passphraseSaved: Boolean,
|
passphraseSaved: Boolean,
|
||||||
initialRandomDBPassphrase: SharedPreference<Boolean>,
|
initialRandomDBPassphrase: SharedPreference<Boolean>,
|
||||||
developerTools: Boolean,
|
|
||||||
importArchiveLauncher: FileChooserLauncher,
|
importArchiveLauncher: FileChooserLauncher,
|
||||||
chatArchiveName: MutableState<String?>,
|
chatArchiveName: MutableState<String?>,
|
||||||
chatArchiveTime: MutableState<Instant?>,
|
chatArchiveTime: MutableState<Instant?>,
|
||||||
@ -144,36 +152,43 @@ fun DatabaseLayout(
|
|||||||
deleteChatAlert: () -> Unit,
|
deleteChatAlert: () -> Unit,
|
||||||
deleteAppFilesAndMedia: () -> Unit,
|
deleteAppFilesAndMedia: () -> Unit,
|
||||||
onChatItemTTLSelected: (ChatItemTTL) -> Unit,
|
onChatItemTTLSelected: (ChatItemTTL) -> Unit,
|
||||||
showSettingsModal: (@Composable (ChatModel) -> Unit) -> (() -> Unit)
|
showSettingsModal: (@Composable (ChatModel) -> Unit) -> (() -> Unit),
|
||||||
|
disconnectAllHosts: () -> Unit,
|
||||||
) {
|
) {
|
||||||
val stopped = !runChat
|
val stopped = !runChat
|
||||||
val operationsDisabled = !stopped || progressIndicator
|
val operationsDisabled = (!stopped || progressIndicator) && !chatModel.desktopNoUserNoRemote
|
||||||
|
|
||||||
Column(
|
Column(
|
||||||
Modifier.fillMaxWidth().verticalScroll(rememberScrollState()),
|
Modifier.fillMaxWidth().verticalScroll(rememberScrollState()),
|
||||||
) {
|
) {
|
||||||
AppBarTitle(stringResource(MR.strings.your_chat_database))
|
AppBarTitle(stringResource(MR.strings.your_chat_database))
|
||||||
|
|
||||||
SectionView(stringResource(MR.strings.messages_section_title).uppercase()) {
|
if (!chatModel.desktopNoUserNoRemote) {
|
||||||
TtlOptions(chatItemTTL, enabled = rememberUpdatedState(!stopped && !progressIndicator), onChatItemTTLSelected)
|
SectionView(stringResource(MR.strings.messages_section_title).uppercase()) {
|
||||||
}
|
TtlOptions(chatItemTTL, enabled = rememberUpdatedState(!stopped && !progressIndicator), onChatItemTTLSelected)
|
||||||
SectionTextFooter(
|
|
||||||
remember(currentUser?.displayName) {
|
|
||||||
buildAnnotatedString {
|
|
||||||
append(generalGetString(MR.strings.messages_section_description) + " ")
|
|
||||||
withStyle(SpanStyle(fontWeight = FontWeight.Bold)) {
|
|
||||||
append(currentUser?.displayName ?: "")
|
|
||||||
}
|
|
||||||
append(".")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
)
|
SectionTextFooter(
|
||||||
|
remember(currentUser?.displayName) {
|
||||||
if (currentRemoteHost == null) {
|
buildAnnotatedString {
|
||||||
|
append(generalGetString(MR.strings.messages_section_description) + " ")
|
||||||
|
withStyle(SpanStyle(fontWeight = FontWeight.Bold)) {
|
||||||
|
append(currentUser?.displayName ?: "")
|
||||||
|
}
|
||||||
|
append(".")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
SectionDividerSpaced(maxTopPadding = true)
|
SectionDividerSpaced(maxTopPadding = true)
|
||||||
|
}
|
||||||
|
val toggleEnabled = remember { chatModel.remoteHosts }.none { it.sessionState is RemoteHostSessionState.Connected }
|
||||||
|
if (chatModel.localUserCreated.value == true) {
|
||||||
SectionView(stringResource(MR.strings.run_chat_section)) {
|
SectionView(stringResource(MR.strings.run_chat_section)) {
|
||||||
RunChatSetting(runChat, stopped, startChat, stopChatAlert)
|
if (!toggleEnabled) {
|
||||||
|
SectionItemView(disconnectAllHosts) {
|
||||||
|
Text(generalGetString(MR.strings.disconnect_remote_hosts), Modifier.fillMaxWidth(), color = WarningOrange)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RunChatSetting(runChat, stopped, toggleEnabled, startChat, stopChatAlert)
|
||||||
}
|
}
|
||||||
SectionTextFooter(
|
SectionTextFooter(
|
||||||
if (stopped) {
|
if (stopped) {
|
||||||
@ -183,92 +198,96 @@ fun DatabaseLayout(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
SectionDividerSpaced()
|
SectionDividerSpaced()
|
||||||
|
|
||||||
SectionView(stringResource(MR.strings.chat_database_section)) {
|
|
||||||
val unencrypted = chatDbEncrypted == false
|
|
||||||
SettingsActionItem(
|
|
||||||
if (unencrypted) painterResource(MR.images.ic_lock_open_right) else if (useKeyChain) painterResource(MR.images.ic_vpn_key_filled)
|
|
||||||
else painterResource(MR.images.ic_lock),
|
|
||||||
stringResource(MR.strings.database_passphrase),
|
|
||||||
click = showSettingsModal() { DatabaseEncryptionView(it) },
|
|
||||||
iconColor = if (unencrypted || (appPlatform.isDesktop && passphraseSaved)) WarningOrange else MaterialTheme.colors.secondary,
|
|
||||||
disabled = operationsDisabled
|
|
||||||
)
|
|
||||||
if (appPlatform.isDesktop && developerTools) {
|
|
||||||
SettingsActionItem(
|
|
||||||
painterResource(MR.images.ic_folder_open),
|
|
||||||
stringResource(MR.strings.open_database_folder),
|
|
||||||
::desktopOpenDatabaseDir,
|
|
||||||
disabled = operationsDisabled
|
|
||||||
)
|
|
||||||
}
|
|
||||||
SettingsActionItem(
|
|
||||||
painterResource(MR.images.ic_ios_share),
|
|
||||||
stringResource(MR.strings.export_database),
|
|
||||||
click = {
|
|
||||||
if (initialRandomDBPassphrase.get()) {
|
|
||||||
exportProhibitedAlert()
|
|
||||||
} else {
|
|
||||||
exportArchive()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
textColor = MaterialTheme.colors.primary,
|
|
||||||
iconColor = MaterialTheme.colors.primary,
|
|
||||||
disabled = operationsDisabled
|
|
||||||
)
|
|
||||||
SettingsActionItem(
|
|
||||||
painterResource(MR.images.ic_download),
|
|
||||||
stringResource(MR.strings.import_database),
|
|
||||||
{ withApi { importArchiveLauncher.launch("application/zip") } },
|
|
||||||
textColor = Color.Red,
|
|
||||||
iconColor = Color.Red,
|
|
||||||
disabled = operationsDisabled
|
|
||||||
)
|
|
||||||
val chatArchiveNameVal = chatArchiveName.value
|
|
||||||
val chatArchiveTimeVal = chatArchiveTime.value
|
|
||||||
val chatLastStartVal = chatLastStart.value
|
|
||||||
if (chatArchiveNameVal != null && chatArchiveTimeVal != null && chatLastStartVal != null) {
|
|
||||||
val title = chatArchiveTitle(chatArchiveTimeVal, chatLastStartVal)
|
|
||||||
SettingsActionItem(
|
|
||||||
painterResource(MR.images.ic_inventory_2),
|
|
||||||
title,
|
|
||||||
click = showSettingsModal { ChatArchiveView(it, title, chatArchiveNameVal, chatArchiveTimeVal) },
|
|
||||||
disabled = operationsDisabled
|
|
||||||
)
|
|
||||||
}
|
|
||||||
SettingsActionItem(
|
|
||||||
painterResource(MR.images.ic_delete_forever),
|
|
||||||
stringResource(MR.strings.delete_database),
|
|
||||||
deleteChatAlert,
|
|
||||||
textColor = Color.Red,
|
|
||||||
iconColor = Color.Red,
|
|
||||||
disabled = operationsDisabled
|
|
||||||
)
|
|
||||||
}
|
|
||||||
SectionDividerSpaced(maxTopPadding = true)
|
|
||||||
|
|
||||||
SectionView(stringResource(MR.strings.files_and_media_section).uppercase()) {
|
|
||||||
val deleteFilesDisabled = operationsDisabled || appFilesCountAndSize.value.first == 0
|
|
||||||
SectionItemView(
|
|
||||||
deleteAppFilesAndMedia,
|
|
||||||
disabled = deleteFilesDisabled
|
|
||||||
) {
|
|
||||||
Text(
|
|
||||||
stringResource(if (users.size > 1) MR.strings.delete_files_and_media_for_all_users else MR.strings.delete_files_and_media_all),
|
|
||||||
color = if (deleteFilesDisabled) MaterialTheme.colors.secondary else Color.Red
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
val (count, size) = appFilesCountAndSize.value
|
|
||||||
SectionTextFooter(
|
|
||||||
if (count == 0) {
|
|
||||||
stringResource(MR.strings.no_received_app_files)
|
|
||||||
} else {
|
|
||||||
String.format(stringResource(MR.strings.total_files_count_and_size), count, formatBytes(size))
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SectionView(stringResource(MR.strings.chat_database_section)) {
|
||||||
|
if (chatModel.localUserCreated.value != true && !toggleEnabled) {
|
||||||
|
SectionItemView(disconnectAllHosts) {
|
||||||
|
Text(generalGetString(MR.strings.disconnect_remote_hosts), Modifier.fillMaxWidth(), color = WarningOrange)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val unencrypted = chatDbEncrypted == false
|
||||||
|
SettingsActionItem(
|
||||||
|
if (unencrypted) painterResource(MR.images.ic_lock_open_right) else if (useKeyChain) painterResource(MR.images.ic_vpn_key_filled)
|
||||||
|
else painterResource(MR.images.ic_lock),
|
||||||
|
stringResource(MR.strings.database_passphrase),
|
||||||
|
click = showSettingsModal() { DatabaseEncryptionView(it) },
|
||||||
|
iconColor = if (unencrypted || (appPlatform.isDesktop && passphraseSaved)) WarningOrange else MaterialTheme.colors.secondary,
|
||||||
|
disabled = operationsDisabled
|
||||||
|
)
|
||||||
|
if (appPlatform.isDesktop) {
|
||||||
|
SettingsActionItem(
|
||||||
|
painterResource(MR.images.ic_folder_open),
|
||||||
|
stringResource(MR.strings.open_database_folder),
|
||||||
|
::desktopOpenDatabaseDir,
|
||||||
|
disabled = operationsDisabled
|
||||||
|
)
|
||||||
|
}
|
||||||
|
SettingsActionItem(
|
||||||
|
painterResource(MR.images.ic_ios_share),
|
||||||
|
stringResource(MR.strings.export_database),
|
||||||
|
click = {
|
||||||
|
if (initialRandomDBPassphrase.get()) {
|
||||||
|
exportProhibitedAlert()
|
||||||
|
} else {
|
||||||
|
exportArchive()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
textColor = MaterialTheme.colors.primary,
|
||||||
|
iconColor = MaterialTheme.colors.primary,
|
||||||
|
disabled = operationsDisabled
|
||||||
|
)
|
||||||
|
SettingsActionItem(
|
||||||
|
painterResource(MR.images.ic_download),
|
||||||
|
stringResource(MR.strings.import_database),
|
||||||
|
{ withApi { importArchiveLauncher.launch("application/zip") } },
|
||||||
|
textColor = Color.Red,
|
||||||
|
iconColor = Color.Red,
|
||||||
|
disabled = operationsDisabled
|
||||||
|
)
|
||||||
|
val chatArchiveNameVal = chatArchiveName.value
|
||||||
|
val chatArchiveTimeVal = chatArchiveTime.value
|
||||||
|
val chatLastStartVal = chatLastStart.value
|
||||||
|
if (chatArchiveNameVal != null && chatArchiveTimeVal != null && chatLastStartVal != null) {
|
||||||
|
val title = chatArchiveTitle(chatArchiveTimeVal, chatLastStartVal)
|
||||||
|
SettingsActionItem(
|
||||||
|
painterResource(MR.images.ic_inventory_2),
|
||||||
|
title,
|
||||||
|
click = showSettingsModal { ChatArchiveView(it, title, chatArchiveNameVal, chatArchiveTimeVal) },
|
||||||
|
disabled = operationsDisabled
|
||||||
|
)
|
||||||
|
}
|
||||||
|
SettingsActionItem(
|
||||||
|
painterResource(MR.images.ic_delete_forever),
|
||||||
|
stringResource(MR.strings.delete_database),
|
||||||
|
deleteChatAlert,
|
||||||
|
textColor = Color.Red,
|
||||||
|
iconColor = Color.Red,
|
||||||
|
disabled = operationsDisabled
|
||||||
|
)
|
||||||
|
}
|
||||||
|
SectionDividerSpaced(maxTopPadding = true)
|
||||||
|
|
||||||
|
SectionView(stringResource(MR.strings.files_and_media_section).uppercase()) {
|
||||||
|
val deleteFilesDisabled = operationsDisabled || appFilesCountAndSize.value.first == 0
|
||||||
|
SectionItemView(
|
||||||
|
deleteAppFilesAndMedia,
|
||||||
|
disabled = deleteFilesDisabled
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
stringResource(if (users.size > 1) MR.strings.delete_files_and_media_for_all_users else MR.strings.delete_files_and_media_all),
|
||||||
|
color = if (deleteFilesDisabled) MaterialTheme.colors.secondary else Color.Red
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val (count, size) = appFilesCountAndSize.value
|
||||||
|
SectionTextFooter(
|
||||||
|
if (count == 0) {
|
||||||
|
stringResource(MR.strings.no_received_app_files)
|
||||||
|
} else {
|
||||||
|
String.format(stringResource(MR.strings.total_files_count_and_size), count, formatBytes(size))
|
||||||
|
}
|
||||||
|
)
|
||||||
SectionBottomSpacer()
|
SectionBottomSpacer()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -319,6 +338,7 @@ private fun TtlOptions(current: State<ChatItemTTL>, enabled: State<Boolean>, onS
|
|||||||
fun RunChatSetting(
|
fun RunChatSetting(
|
||||||
runChat: Boolean,
|
runChat: Boolean,
|
||||||
stopped: Boolean,
|
stopped: Boolean,
|
||||||
|
enabled: Boolean,
|
||||||
startChat: () -> Unit,
|
startChat: () -> Unit,
|
||||||
stopChatAlert: () -> Unit
|
stopChatAlert: () -> Unit
|
||||||
) {
|
) {
|
||||||
@ -337,6 +357,7 @@ fun RunChatSetting(
|
|||||||
stopChatAlert()
|
stopChatAlert()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
enabled = enabled,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -501,13 +522,14 @@ private fun importArchiveAlert(
|
|||||||
m: ChatModel,
|
m: ChatModel,
|
||||||
importedArchiveURI: URI,
|
importedArchiveURI: URI,
|
||||||
appFilesCountAndSize: MutableState<Pair<Int, Long>>,
|
appFilesCountAndSize: MutableState<Pair<Int, Long>>,
|
||||||
progressIndicator: MutableState<Boolean>
|
progressIndicator: MutableState<Boolean>,
|
||||||
|
startChat: () -> Unit,
|
||||||
) {
|
) {
|
||||||
AlertManager.shared.showAlertDialog(
|
AlertManager.shared.showAlertDialog(
|
||||||
title = generalGetString(MR.strings.import_database_question),
|
title = generalGetString(MR.strings.import_database_question),
|
||||||
text = generalGetString(MR.strings.your_current_chat_database_will_be_deleted_and_replaced_with_the_imported_one),
|
text = generalGetString(MR.strings.your_current_chat_database_will_be_deleted_and_replaced_with_the_imported_one),
|
||||||
confirmText = generalGetString(MR.strings.import_database_confirmation),
|
confirmText = generalGetString(MR.strings.import_database_confirmation),
|
||||||
onConfirm = { importArchive(m, importedArchiveURI, appFilesCountAndSize, progressIndicator) },
|
onConfirm = { importArchive(m, importedArchiveURI, appFilesCountAndSize, progressIndicator, startChat) },
|
||||||
destructive = true,
|
destructive = true,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -516,7 +538,8 @@ private fun importArchive(
|
|||||||
m: ChatModel,
|
m: ChatModel,
|
||||||
importedArchiveURI: URI,
|
importedArchiveURI: URI,
|
||||||
appFilesCountAndSize: MutableState<Pair<Int, Long>>,
|
appFilesCountAndSize: MutableState<Pair<Int, Long>>,
|
||||||
progressIndicator: MutableState<Boolean>
|
progressIndicator: MutableState<Boolean>,
|
||||||
|
startChat: () -> Unit,
|
||||||
) {
|
) {
|
||||||
progressIndicator.value = true
|
progressIndicator.value = true
|
||||||
val archivePath = saveArchiveFromURI(importedArchiveURI)
|
val archivePath = saveArchiveFromURI(importedArchiveURI)
|
||||||
@ -533,6 +556,10 @@ private fun importArchive(
|
|||||||
operationEnded(m, progressIndicator) {
|
operationEnded(m, progressIndicator) {
|
||||||
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.chat_database_imported), text = generalGetString(MR.strings.restart_the_app_to_use_imported_chat_database))
|
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.chat_database_imported), text = generalGetString(MR.strings.restart_the_app_to_use_imported_chat_database))
|
||||||
}
|
}
|
||||||
|
if (chatModel.localUserCreated.value == false) {
|
||||||
|
chatModel.chatRunning.value = false
|
||||||
|
startChat()
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
operationEnded(m, progressIndicator) {
|
operationEnded(m, progressIndicator) {
|
||||||
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.chat_database_imported), text = generalGetString(MR.strings.restart_the_app_to_use_imported_chat_database) + "\n" + generalGetString(MR.strings.non_fatal_errors_occured_during_import))
|
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.chat_database_imported), text = generalGetString(MR.strings.restart_the_app_to_use_imported_chat_database) + "\n" + generalGetString(MR.strings.non_fatal_errors_occured_during_import))
|
||||||
@ -681,7 +708,6 @@ fun PreviewDatabaseLayout() {
|
|||||||
chatDbEncrypted = false,
|
chatDbEncrypted = false,
|
||||||
passphraseSaved = false,
|
passphraseSaved = false,
|
||||||
initialRandomDBPassphrase = SharedPreference({ true }, {}),
|
initialRandomDBPassphrase = SharedPreference({ true }, {}),
|
||||||
developerTools = true,
|
|
||||||
importArchiveLauncher = rememberFileChooserLauncher(true) {},
|
importArchiveLauncher = rememberFileChooserLauncher(true) {},
|
||||||
chatArchiveName = remember { mutableStateOf("dummy_archive") },
|
chatArchiveName = remember { mutableStateOf("dummy_archive") },
|
||||||
chatArchiveTime = remember { mutableStateOf(Clock.System.now()) },
|
chatArchiveTime = remember { mutableStateOf(Clock.System.now()) },
|
||||||
@ -697,6 +723,7 @@ fun PreviewDatabaseLayout() {
|
|||||||
deleteAppFilesAndMedia = {},
|
deleteAppFilesAndMedia = {},
|
||||||
showSettingsModal = { {} },
|
showSettingsModal = { {} },
|
||||||
onChatItemTTLSelected = {},
|
onChatItemTTLSelected = {},
|
||||||
|
disconnectAllHosts = {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -233,6 +233,7 @@ private fun ConnectMobileViewLayout(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
SectionBottomSpacer()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,9 +144,7 @@ fun SettingsLayout(
|
|||||||
SettingsActionItem(painterResource(MR.images.ic_videocam), stringResource(MR.strings.settings_audio_video_calls), showSettingsModal { CallSettingsView(it, showModal) }, disabled = stopped, extraPadding = true)
|
SettingsActionItem(painterResource(MR.images.ic_videocam), stringResource(MR.strings.settings_audio_video_calls), showSettingsModal { CallSettingsView(it, showModal) }, disabled = stopped, extraPadding = true)
|
||||||
SettingsActionItem(painterResource(MR.images.ic_lock), stringResource(MR.strings.privacy_and_security), showSettingsModal { PrivacySettingsView(it, showSettingsModal, setPerformLA) }, disabled = stopped, extraPadding = true)
|
SettingsActionItem(painterResource(MR.images.ic_lock), stringResource(MR.strings.privacy_and_security), showSettingsModal { PrivacySettingsView(it, showSettingsModal, setPerformLA) }, disabled = stopped, extraPadding = true)
|
||||||
SettingsActionItem(painterResource(MR.images.ic_light_mode), stringResource(MR.strings.appearance_settings), showSettingsModal { AppearanceView(it, showSettingsModal) }, extraPadding = true)
|
SettingsActionItem(painterResource(MR.images.ic_light_mode), stringResource(MR.strings.appearance_settings), showSettingsModal { AppearanceView(it, showSettingsModal) }, extraPadding = true)
|
||||||
if (!chatModel.desktopNoUserNoRemote) {
|
DatabaseItem(encrypted, passphraseSaved, showSettingsModal { DatabaseView(it, showSettingsModal) }, stopped)
|
||||||
DatabaseItem(encrypted, passphraseSaved, showSettingsModal { DatabaseView(it, showSettingsModal) }, stopped)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
SectionDividerSpaced()
|
SectionDividerSpaced()
|
||||||
|
|
||||||
|
@ -1660,6 +1660,7 @@
|
|||||||
<string name="unlink_desktop_question">Unlink desktop?</string>
|
<string name="unlink_desktop_question">Unlink desktop?</string>
|
||||||
<string name="unlink_desktop">Unlink</string>
|
<string name="unlink_desktop">Unlink</string>
|
||||||
<string name="disconnect_remote_host">Disconnect</string>
|
<string name="disconnect_remote_host">Disconnect</string>
|
||||||
|
<string name="disconnect_remote_hosts">Disconnect mobiles</string>
|
||||||
<string name="remote_host_was_disconnected_toast"><![CDATA[Mobile <b>%s</b> was disconnected]]></string>
|
<string name="remote_host_was_disconnected_toast"><![CDATA[Mobile <b>%s</b> was disconnected]]></string>
|
||||||
<string name="disconnect_desktop_question">Disconnect desktop?</string>
|
<string name="disconnect_desktop_question">Disconnect desktop?</string>
|
||||||
<string name="only_one_device_can_work_at_the_same_time">Only one device can work at the same time</string>
|
<string name="only_one_device_can_work_at_the_same_time">Only one device can work at the same time</string>
|
||||||
|
Loading…
Reference in New Issue
Block a user