Skip to content
Snippets Groups Projects
Verified Commit 5393f2f0 authored by Torsten Grote's avatar Torsten Grote Committed by Sebastian
Browse files

Show basic mailbox status

parent 82b71093
No related branches found
No related tags found
1 merge request!304Initial working Mailbox implementation
......@@ -40,15 +40,15 @@ fun MailboxScreen(viewModel: MailboxViewModel = viewModel()) {
when (val state = viewModel.pairingState.value) {
Unknown -> Loader()
NotSetup -> MailboxSetupScreen(viewModel, false)
is Pairing -> when (val pairingState = state.pairingState) {
is Pairing -> when (state.pairingState) {
is Pending -> MailboxSetupScreen(viewModel, false)
is InvalidQrCode, is MailboxAlreadyPaired, is ConnectionError, is UnexpectedError -> {
MailboxSetupScreen(viewModel, true)
}
is Paired -> UiPlaceholder()
is Paired -> MailboxStatusScreen(viewModel.status.value)
}
OfflineWhenPairing -> MailboxSetupScreen(viewModel, true)
is IsPaired -> UiPlaceholder()
is WasUnpaired -> UiPlaceholder()
is IsPaired -> MailboxStatusScreen(viewModel.status.value)
is WasUnpaired -> UiPlaceholder() // TODO
}
}
/*
* Briar Desktop
* Copyright (C) 2021-2022 The Briar Project
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.briarproject.briar.desktop.mailbox
import androidx.compose.foundation.layout.Arrangement.spacedBy
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.material.OutlinedButton
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.CheckCircle
import androidx.compose.material.icons.filled.Error
import androidx.compose.material.icons.filled.QuestionMark
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment.Companion.CenterHorizontally
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.unit.dp
import org.briarproject.bramble.api.mailbox.MailboxConstants.API_CLIENT_TOO_OLD
import org.briarproject.bramble.api.mailbox.MailboxConstants.CLIENT_SUPPORTS
import org.briarproject.bramble.api.mailbox.MailboxConstants.PROBLEM_MS_SINCE_LAST_SUCCESS
import org.briarproject.bramble.api.mailbox.MailboxStatus
import org.briarproject.bramble.api.mailbox.MailboxVersion
import org.briarproject.briar.desktop.theme.Lime500
import org.briarproject.briar.desktop.theme.Orange500
import org.briarproject.briar.desktop.theme.Red500
import org.briarproject.briar.desktop.utils.InternationalizationUtils.i18n
import org.briarproject.briar.desktop.utils.InternationalizationUtils.i18nF
import org.briarproject.briar.desktop.utils.PreviewUtils.DropDownValues
import org.briarproject.briar.desktop.utils.PreviewUtils.preview
import org.briarproject.briar.desktop.utils.TimeUtils.getFormattedTimestamp
@Suppress("HardCodedStringLiteral")
fun main() = preview(
"status" to DropDownValues(
0,
listOf("error", "problem", "mailbox too old", "briar too old", "ok")
)
) {
val now = System.currentTimeMillis()
val status = when (getStringParameter("status")) {
"error" -> MailboxStatus(now, now - PROBLEM_MS_SINCE_LAST_SUCCESS, 6, CLIENT_SUPPORTS)
"problem" -> MailboxStatus(now, now - 36_000, 1, CLIENT_SUPPORTS)
"mailbox too old" -> MailboxStatus(now, now, 0, listOf(MailboxVersion(0, 0)))
"briar too old" -> MailboxStatus(now, now, 0, listOf(MailboxVersion(42, 0)))
else -> MailboxStatus(now, now - 18_354, 0, CLIENT_SUPPORTS)
}
MailboxStatusScreen(status)
}
@Composable
fun MailboxStatusScreen(status: MailboxStatus?) {
if (status == null) return // not expected to happen (for a noticeable amount of time)
Column(
verticalArrangement = spacedBy(16.dp),
horizontalAlignment = CenterHorizontally,
modifier = Modifier.fillMaxSize().padding(16.dp),
) {
if (status.hasProblem(System.currentTimeMillis())) {
MailboxStatusView(
icon = Icons.Filled.Error,
iconTint = Red500,
title = i18n("mailbox.status.error"),
lastSuccess = status.timeOfLastSuccess,
)
// TODO wizard button
} else if (status.attemptsSinceSuccess > 0) {
MailboxStatusView(
icon = Icons.Filled.QuestionMark,
iconTint = Orange500,
title = i18n("mailbox.status.problem"),
lastSuccess = status.timeOfLastSuccess,
)
} else if (status.mailboxCompatibility < 0) {
MailboxStatusView(
icon = Icons.Filled.Error,
iconTint = Red500,
title = if (status.mailboxCompatibility == API_CLIENT_TOO_OLD) {
i18n("mailbox.status.app_too_old.title")
} else {
i18n("mailbox.status.mailbox_too_old.title")
},
lastSuccess = status.timeOfLastSuccess,
)
Text(
text = if (status.mailboxCompatibility == API_CLIENT_TOO_OLD) {
i18n("mailbox.status.app_too_old.message")
} else {
i18n("mailbox.status.mailbox_too_old.message")
},
)
} else {
MailboxStatusView(
icon = Icons.Filled.CheckCircle,
iconTint = Lime500,
title = i18n("mailbox.status.connected.title"),
lastSuccess = status.timeOfLastSuccess,
)
}
Spacer(modifier = Modifier.weight(1f))
OutlinedButton(
onClick = { /* TODO */ },
) {
Text(
text = i18n("mailbox.status.unlink.button"),
)
}
}
}
@Composable
private fun MailboxStatusView(
icon: ImageVector,
iconTint: Color,
title: String,
lastSuccess: Long,
) {
Icon(
imageVector = icon,
contentDescription = "", // not important, we have a title
tint = iconTint,
)
Text(
text = title,
style = MaterialTheme.typography.h3,
)
val lastSuccessText = if (lastSuccess < 0) {
i18n("never")
} else {
i18nF("mailbox.status.last.connection", getFormattedTimestamp(lastSuccess))
}
Text(
text = lastSuccessText,
style = MaterialTheme.typography.body1,
modifier = Modifier.alpha(0.56f)
)
}
......@@ -261,6 +261,15 @@ mailbox.setup.io_error_description=Ensure that both devices are connected to the
mailbox.setup.assertion_error_description=Please create a bug report if the issue persists.
mailbox.setup.offline_error_title=Offline
mailbox.setup.offline_error_description=Ensure that you are online and try again after a while.
mailbox.status.error=Mailbox is unavailable
mailbox.status.problem=Briar is having trouble connecting to the Mailbox
mailbox.status.app_too_old.title=Briar is too old
mailbox.status.app_too_old.message=Update Briar to the latest version of the app and try again.
mailbox.status.mailbox_too_old.title=Mailbox is too old
mailbox.status.mailbox_too_old.message=Update your Mailbox to the latest version of the app and try again.
mailbox.status.connected.title=Mailbox is running
mailbox.status.unlink.button=Unlink
mailbox.status.last.connection=Last connection: {0}
# Miscellaneous
cancel=Cancel
......@@ -280,6 +289,7 @@ unsupported_feature=Unfortunately, this feature is not yet supported by Briar De
remove=Remove
hide=Hide
search=Search
never=Never
# Compose text edit actions
copy=Copy
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment