Skip to content
Snippets Groups Projects
Verified Commit c4ff6836 authored by Mikolai Gütschow's avatar Mikolai Gütschow
Browse files

UI for answered requests and respond to introductions

parent f2b78afc
Branches
Tags
1 merge request!69Introduction support
...@@ -4,7 +4,9 @@ import androidx.compose.foundation.background ...@@ -4,7 +4,9 @@ import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.IntrinsicSize
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.material.MaterialTheme import androidx.compose.material.MaterialTheme
...@@ -33,6 +35,8 @@ import org.briarproject.briar.desktop.utils.PreviewUtils.preview ...@@ -33,6 +35,8 @@ import org.briarproject.briar.desktop.utils.PreviewUtils.preview
import java.time.Instant import java.time.Instant
fun main() = preview( fun main() = preview(
"canBeOpened" to false,
"answered" to false,
"notice" to "Text of notice message.", "notice" to "Text of notice message.",
"text" to "Short message", "text" to "Short message",
"time" to Instant.now().toEpochMilli(), "time" to Instant.now().toEpochMilli(),
...@@ -43,10 +47,10 @@ fun main() = preview( ...@@ -43,10 +47,10 @@ fun main() = preview(
) { ) {
ConversationRequestItemView( ConversationRequestItemView(
ConversationRequestItem( ConversationRequestItem(
requestedGroupId = null, requestedGroupId = if (getBooleanParameter("canBeOpened")) GroupId(getRandomId()) else null,
requestType = INTRODUCTION, requestType = INTRODUCTION,
sessionId = SessionId(getRandomId()), sessionId = SessionId(getRandomId()),
answered = false, answered = getBooleanParameter("answered"),
notice = getStringParameter("notice"), notice = getStringParameter("notice"),
text = getStringParameter("text"), text = getStringParameter("text"),
id = MessageId(getRandomId()), id = MessageId(getRandomId()),
...@@ -64,8 +68,8 @@ fun main() = preview( ...@@ -64,8 +68,8 @@ fun main() = preview(
@Composable @Composable
fun ConversationRequestItemView( fun ConversationRequestItemView(
m: ConversationRequestItem, m: ConversationRequestItem,
onAccept: () -> Unit = {}, onResponse: (Boolean) -> Unit = {},
onDecline: () -> Unit = {} onOpenRequestedShareable: () -> Unit = {},
) { ) {
val statusAlignment = if (m.isIncoming) Alignment.End else Alignment.Start val statusAlignment = if (m.isIncoming) Alignment.End else Alignment.Start
val textColor = if (m.isIncoming) MaterialTheme.colors.textPrimary else Color.White val textColor = if (m.isIncoming) MaterialTheme.colors.textPrimary else Color.White
...@@ -89,21 +93,34 @@ fun ConversationRequestItemView( ...@@ -89,21 +93,34 @@ fun ConversationRequestItemView(
color = noticeColor, color = noticeColor,
modifier = Modifier.align(Alignment.Start), modifier = Modifier.align(Alignment.Start),
) )
Row(modifier = Modifier.align(statusAlignment)) { Row(modifier = Modifier.align(statusAlignment)) {
TextButton(onDecline) { if (!m.answered) {
TextButton({ onResponse(false) }) {
Text( Text(
i18n("decline").uppercase(), i18n("decline").uppercase(),
fontSize = 16.sp, fontSize = 16.sp,
color = MaterialTheme.colors.buttonTextNegative color = MaterialTheme.colors.buttonTextNegative
) )
} }
TextButton(onAccept) { TextButton({ onResponse(true) }) {
Text( Text(
i18n("accept").uppercase(), i18n("accept").uppercase(),
fontSize = 16.sp, fontSize = 16.sp,
color = MaterialTheme.colors.buttonTextPositive color = MaterialTheme.colors.buttonTextPositive
) )
} }
} else if (m.canBeOpened) {
TextButton(onOpenRequestedShareable) {
Text(
i18n("open").uppercase(),
fontSize = 16.sp,
color = MaterialTheme.colors.buttonTextPositive
)
}
} else {
Spacer(Modifier.height(8.dp))
}
} }
ConversationItemStatusView(m) ConversationItemStatusView(m)
} }
......
...@@ -80,7 +80,11 @@ fun ConversationScreen( ...@@ -80,7 +80,11 @@ fun ConversationScreen(
when (m) { when (m) {
is ConversationMessageItem -> ConversationMessageItemView(m) is ConversationMessageItem -> ConversationMessageItemView(m)
is ConversationNoticeItem -> ConversationNoticeItemView(m) is ConversationNoticeItem -> ConversationNoticeItemView(m)
is ConversationRequestItem -> ConversationRequestItemView(m) is ConversationRequestItem ->
ConversationRequestItemView(
m,
onResponse = { accept -> viewModel.respondToRequest(m, accept) },
)
} }
} }
} }
......
...@@ -28,11 +28,13 @@ import org.briarproject.briar.api.autodelete.UnexpectedTimerException ...@@ -28,11 +28,13 @@ import org.briarproject.briar.api.autodelete.UnexpectedTimerException
import org.briarproject.briar.api.autodelete.event.ConversationMessagesDeletedEvent import org.briarproject.briar.api.autodelete.event.ConversationMessagesDeletedEvent
import org.briarproject.briar.api.conversation.ConversationManager import org.briarproject.briar.api.conversation.ConversationManager
import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent
import org.briarproject.briar.api.introduction.IntroductionManager
import org.briarproject.briar.api.messaging.MessagingManager import org.briarproject.briar.api.messaging.MessagingManager
import org.briarproject.briar.api.messaging.PrivateMessage import org.briarproject.briar.api.messaging.PrivateMessage
import org.briarproject.briar.api.messaging.PrivateMessageFactory import org.briarproject.briar.api.messaging.PrivateMessageFactory
import org.briarproject.briar.api.messaging.PrivateMessageHeader import org.briarproject.briar.api.messaging.PrivateMessageHeader
import org.briarproject.briar.desktop.contact.ContactItem import org.briarproject.briar.desktop.contact.ContactItem
import org.briarproject.briar.desktop.conversation.ConversationRequestItem.RequestType.INTRODUCTION
import org.briarproject.briar.desktop.threading.BriarExecutors import org.briarproject.briar.desktop.threading.BriarExecutors
import org.briarproject.briar.desktop.utils.KLoggerUtils.logDuration import org.briarproject.briar.desktop.utils.KLoggerUtils.logDuration
import org.briarproject.briar.desktop.utils.clearAndAddAll import org.briarproject.briar.desktop.utils.clearAndAddAll
...@@ -49,6 +51,7 @@ constructor( ...@@ -49,6 +51,7 @@ constructor(
private val connectionRegistry: ConnectionRegistry, private val connectionRegistry: ConnectionRegistry,
private val contactManager: ContactManager, private val contactManager: ContactManager,
private val conversationManager: ConversationManager, private val conversationManager: ConversationManager,
private val introductionManager: IntroductionManager,
private val messagingManager: MessagingManager, private val messagingManager: MessagingManager,
private val privateMessageFactory: PrivateMessageFactory, private val privateMessageFactory: PrivateMessageFactory,
briarExecutors: BriarExecutors, briarExecutors: BriarExecutors,
...@@ -190,7 +193,6 @@ constructor( ...@@ -190,7 +193,6 @@ constructor(
LOG.logDuration("Loading message headers", start) LOG.logDuration("Loading message headers", start)
// Sort headers by timestamp in *descending* order // Sort headers by timestamp in *descending* order
val sorted = headers.sortedByDescending { it.timestamp } val sorted = headers.sortedByDescending { it.timestamp }
// todo: use ConversationVisitor to also display Request and Notice Messages
start = LogUtils.now() start = LogUtils.now()
val messages = sorted.map { h -> h.accept(conversationVisitor.value)!! } val messages = sorted.map { h -> h.accept(conversationVisitor.value)!! }
LOG.logDuration("Loading messages", start) LOG.logDuration("Loading messages", start)
...@@ -275,4 +277,18 @@ constructor( ...@@ -275,4 +277,18 @@ constructor(
it.mark(sent, seen) it.mark(sent, seen)
} }
} }
fun respondToRequest(item: ConversationRequestItem, accept: Boolean) {
_messages.replaceIf({ item == it }) {
item.markAnswered()
}
runOnDbThreadWithTransaction(false) { txn ->
when (item.requestType) {
INTRODUCTION ->
introductionManager.respondToIntroduction(txn, _contactId.value!!, item.sessionId, accept)
else ->
throw IllegalArgumentException("Only introduction requests are supported for the time being.")
}
}
}
} }
...@@ -91,6 +91,7 @@ main.help.tor.port.control=Tor Control Port ...@@ -91,6 +91,7 @@ main.help.tor.port.control=Tor Control Port
password=Password password=Password
accept=Accept accept=Accept
decline=Decline decline=Decline
open=Open
unsupported_feature=Unfortunately, this feature is not yet supported by Briar Desktop. unsupported_feature=Unfortunately, this feature is not yet supported by Briar Desktop.
# Registration screen # Registration screen
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment