diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt index 7fc79e207..a25d4c8e2 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt @@ -14,7 +14,9 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.verticalScroll import androidx.compose.material.AlertDialog import androidx.compose.material.Divider import androidx.compose.material.ExperimentalMaterialApi @@ -240,11 +242,11 @@ fun ListContent( val coroutineScope = rememberCoroutineScope() var backupDialogOpen by remember { mutableStateOf(false) } var checked by remember { mutableStateOf(account.proxy != null) } - val openDialog = remember { mutableStateOf(false) } + var disconnectTorDialog by remember { mutableStateOf(false) } var conectOrbotDialogOpen by remember { mutableStateOf(false) } var proxyPort = remember { mutableStateOf(account.proxyPort.toString()) } - Column(modifier = modifier.fillMaxHeight()) { + Column(modifier = modifier.fillMaxHeight().verticalScroll(rememberScrollState())) { if (accountUser != null) { NavigationRow( title = stringResource(R.string.profile), @@ -278,10 +280,15 @@ fun ListContent( title = stringResource(R.string.backup_keys), icon = R.drawable.ic_key, tint = MaterialTheme.colors.onBackground, - onClick = { backupDialogOpen = true } + onClick = { + coroutineScope.launch { + scaffoldState.drawerState.close() + } + backupDialogOpen = true + } ) - val textTorProxy = if (checked) stringResource(R.string.disconnect_from_your_orbot_setup) else stringResource(R.string.connect_via_tor) + val textTorProxy = if (checked) stringResource(R.string.disconnect_from_your_orbot_setup) else stringResource(R.string.connect_via_tor_short) IconRow( title = textTorProxy, @@ -289,8 +296,11 @@ fun ListContent( tint = MaterialTheme.colors.onBackground, onClick = { if (checked) { - openDialog.value = true + disconnectTorDialog = true } else { + coroutineScope.launch { + scaffoldState.drawerState.close() + } conectOrbotDialogOpen = true } } @@ -315,7 +325,7 @@ fun ListContent( onClose = { conectOrbotDialogOpen = false }, onPost = { conectOrbotDialogOpen = false - openDialog.value = false + disconnectTorDialog = false checked = true enableTor(account, true, proxyPort) }, @@ -323,14 +333,21 @@ fun ListContent( ) } - if (openDialog.value) { + if (disconnectTorDialog) { AlertDialog( - text = { Text(text = stringResource(R.string.do_you_really_want_to_disable_tor)) }, - onDismissRequest = { }, + title = { + Text(text = stringResource(R.string.do_you_really_want_to_disable_tor_title)) + }, + text = { + Text(text = stringResource(R.string.do_you_really_want_to_disable_tor_text)) + }, + onDismissRequest = { + disconnectTorDialog = false + }, confirmButton = { TextButton( onClick = { - openDialog.value = false + disconnectTorDialog = false checked = false enableTor(account, false, proxyPort) } @@ -341,7 +358,7 @@ fun ListContent( dismissButton = { TextButton( onClick = { - openDialog.value = false + disconnectTorDialog = false } ) { Text(text = stringResource(R.string.no)) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteQuickActionMenu.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteQuickActionMenu.kt index e5271bc0f..67517b543 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteQuickActionMenu.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteQuickActionMenu.kt @@ -354,9 +354,7 @@ private fun QuickActionAlertDialog( }, buttons = { Row( - modifier = Modifier - .padding(all = 8.dp) - .fillMaxWidth(), + modifier = Modifier.padding(all = 8.dp).fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween ) { TextButton(onClick = onClickDontShowAgain) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ConnectOrbotDialog.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ConnectOrbotDialog.kt index 53c2ac84e..c7b3a1ebb 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ConnectOrbotDialog.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ConnectOrbotDialog.kt @@ -1,16 +1,17 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn import android.widget.Toast -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.Button +import androidx.compose.material.ButtonDefaults import androidx.compose.material.MaterialTheme import androidx.compose.material.OutlinedTextField import androidx.compose.material.Surface @@ -20,20 +21,21 @@ import androidx.compose.runtime.MutableState import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.input.KeyboardCapitalization import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import com.halilibo.richtext.markdown.Markdown -import com.halilibo.richtext.ui.RichTextStyle import com.halilibo.richtext.ui.material.MaterialRichText -import com.halilibo.richtext.ui.resolveDefaults import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.ui.actions.CloseButton -import com.vitorpamplona.amethyst.ui.actions.PostButton +import com.vitorpamplona.amethyst.ui.components.richTextDefaults import kotlinx.coroutines.launch @Composable @@ -42,14 +44,11 @@ fun ConnectOrbotDialog(onClose: () -> Unit, onPost: () -> Unit, portNumber: Muta val scope = rememberCoroutineScope() Dialog( onDismissRequest = onClose, - properties = DialogProperties(usePlatformDefaultWidth = false) + properties = DialogProperties(usePlatformDefaultWidth = false, decorFitsSystemWindows = false) ) { - Surface(modifier = Modifier.fillMaxSize()) { + Surface() { Column( - modifier = Modifier - .padding(10.dp) - .background(MaterialTheme.colors.background) - .fillMaxSize() + modifier = Modifier.padding(10.dp) ) { Row( horizontalArrangement = Arrangement.SpaceBetween, @@ -62,7 +61,7 @@ fun ConnectOrbotDialog(onClose: () -> Unit, onPost: () -> Unit, portNumber: Muta val toastMessage = stringResource(R.string.invalid_port_number) - PostButton( + UseOrbotButton( onPost = { try { Integer.parseInt(portNumber.value) @@ -74,7 +73,7 @@ fun ConnectOrbotDialog(onClose: () -> Unit, onPost: () -> Unit, portNumber: Muta Toast.LENGTH_LONG ).show() } - return@PostButton + return@UseOrbotButton } onPost() @@ -84,37 +83,70 @@ fun ConnectOrbotDialog(onClose: () -> Unit, onPost: () -> Unit, portNumber: Muta } Column( - modifier = Modifier - .fillMaxSize() - .padding(horizontal = 30.dp) + modifier = Modifier.padding(30.dp) ) { - MaterialRichText( - style = RichTextStyle().resolveDefaults() - ) { - Markdown( - content = stringResource(R.string.connect_through_your_orbot_setup_markdown) + val myMarkDownStyle = richTextDefaults.copy( + stringStyle = richTextDefaults.stringStyle?.copy( + linkStyle = SpanStyle( + textDecoration = TextDecoration.Underline, + color = MaterialTheme.colors.primary + ) ) - } + ) - Spacer(modifier = Modifier.height(10.dp)) - - OutlinedTextField( - value = portNumber.value, - onValueChange = { portNumber.value = it }, - keyboardOptions = KeyboardOptions.Default.copy( - capitalization = KeyboardCapitalization.None, - keyboardType = KeyboardType.Number - ), - label = { Text(text = stringResource(R.string.orbot_socks_port)) }, - placeholder = { - Text( - text = "9050", - color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + Row() { + MaterialRichText( + style = myMarkDownStyle + ) { + Markdown( + content = stringResource(R.string.connect_through_your_orbot_setup_markdown) ) } - ) + } + + Spacer(modifier = Modifier.height(15.dp)) + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Center + ) { + OutlinedTextField( + value = portNumber.value, + onValueChange = { portNumber.value = it }, + keyboardOptions = KeyboardOptions.Default.copy( + capitalization = KeyboardCapitalization.None, + keyboardType = KeyboardType.Number + ), + label = { Text(text = stringResource(R.string.orbot_socks_port)) }, + placeholder = { + Text( + text = "9050", + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) + } + ) + } } } } } } + +@Composable +fun UseOrbotButton(onPost: () -> Unit = {}, isActive: Boolean, modifier: Modifier = Modifier) { + Button( + modifier = modifier, + onClick = { + if (isActive) { + onPost() + } + }, + shape = RoundedCornerShape(20.dp), + colors = ButtonDefaults + .buttonColors( + backgroundColor = if (isActive) MaterialTheme.colors.primary else Color.Gray + ) + ) { + Text(text = stringResource(R.string.use_orbot), color = Color.White) + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c7323b8a1..7818c049f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -296,12 +296,6 @@ Poll authors can\'t vote in their own polls. #zappoll - Connect through your Orbot setup - Do you really want to disconnect from your Orbot setup? - Yes - No - Disconnect from your Orbot setup - Image is the same since the post Image has changed. The author might not have seen the change @@ -361,21 +355,31 @@ Your relays (NIP-95) Files are hosted by your relays. New NIP: check if they support + Tor/Orbot setup + Connect through your Orbot setup + + Disconnect from your Orbot/Tor? + Your data will be immediately transferred in the regular network + Yes + No + Follow List All Follows Global - ## Connect through your Orbot setup + ## Connect through Tor with Orbot \n\n1. Install [Orbot](https://play.google.com/store/apps/details?id=org.torproject.android) \n2. Start Orbot - \n3. In Orbot check the Socks port. By default it uses the port 9050 - \n4. If necessary change the port + \n3. In Orbot, check the Socks port. The default uses 9050 + \n4. If necessary change the port in Orbot \n5. Configure the Socks port in this screen - \n6. Press the post button to use Orbot as a proxy + \n6. Press the Activate button to use Orbot as a proxy Orbot Socks Port Invalid port number + Use Orbot + Disconnect Tor/Orbot DefaultChannelID New notification arrived