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
Branches
Tags
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.
Please register or to comment