From ad2eabf3868acdb1c9bf3fd5b03e2c5a2ae9c213 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Mon, 3 Apr 2023 13:49:08 -0300 Subject: [PATCH 001/171] add qrcode scanner to login page --- .../ui/screen/loggedOff/LoginScreen.kt | 42 ++++++++++++++----- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt index d78673f7f4..132c997d0f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt @@ -36,6 +36,7 @@ import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.ui.qrcode.SimpleQrCodeScanner import com.vitorpamplona.amethyst.ui.screen.AccountStateViewModel import java.util.* @@ -51,6 +52,9 @@ fun LoginPage( var termsAcceptanceIsRequired by remember { mutableStateOf("") } val uri = LocalUriHandler.current val context = LocalContext.current + var dialogOpen by remember { + mutableStateOf(false) + } Column( modifier = Modifier @@ -117,17 +121,35 @@ fun LoginPage( ) }, trailingIcon = { - IconButton(onClick = { showPassword = !showPassword }) { - Icon( - imageVector = if (showPassword) Icons.Outlined.VisibilityOff else Icons.Outlined.Visibility, - contentDescription = if (showPassword) { - stringResource(R.string.show_password) - } else { - stringResource( - R.string.hide_password - ) + Row { + IconButton(onClick = { showPassword = !showPassword }) { + Icon( + imageVector = if (showPassword) Icons.Outlined.VisibilityOff else Icons.Outlined.Visibility, + contentDescription = if (showPassword) { + stringResource(R.string.show_password) + } else { + stringResource( + R.string.hide_password + ) + } + ) + } + if (dialogOpen) { + SimpleQrCodeScanner { + dialogOpen = false + if (!it.isNullOrEmpty()) { + key.value = TextFieldValue(it) + } } - ) + } + IconButton(onClick = { dialogOpen = true }) { + Icon( + painter = painterResource(R.drawable.ic_qrcode), + null, + modifier = Modifier.size(24.dp), + tint = MaterialTheme.colors.primary + ) + } } }, visualTransformation = if (showPassword) VisualTransformation.None else PasswordVisualTransformation(), From 2ae54b544f340252e82f2c8d48cd65f05e5cc3fa Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Thu, 20 Apr 2023 08:12:26 -0300 Subject: [PATCH 002/171] wip: add tor socks support --- .../amethyst/LocalPreferences.kt | 6 +++- .../vitorpamplona/amethyst/model/Account.kt | 10 +++--- .../amethyst/service/relays/Client.kt | 2 +- .../amethyst/service/relays/Constants.kt | 2 +- .../amethyst/service/relays/Relay.kt | 8 ++++- .../amethyst/ui/navigation/DrawerContent.kt | 32 +++++++++++++++++-- 6 files changed, 49 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt index c2c21bb244..d45180dee7 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt @@ -46,6 +46,7 @@ private object PrefKeys { const val LATEST_CONTACT_LIST = "latestContactList" const val HIDE_DELETE_REQUEST_DIALOG = "hide_delete_request_dialog" const val HIDE_BLOCK_ALERT_DIALOG = "hide_block_alert_dialog" + const val USE_PROXY = "use_proxy" val LAST_READ: (String) -> String = { route -> "last_read_route_$route" } } @@ -195,6 +196,7 @@ object LocalPreferences { putString(PrefKeys.LATEST_CONTACT_LIST, Event.gson.toJson(account.backupContactList)) putBoolean(PrefKeys.HIDE_DELETE_REQUEST_DIALOG, account.hideDeleteRequestDialog) putBoolean(PrefKeys.HIDE_BLOCK_ALERT_DIALOG, account.hideBlockAlertDialog) + putBoolean(PrefKeys.USE_PROXY, account.useProxy) }.apply() } @@ -250,6 +252,7 @@ object LocalPreferences { val hideDeleteRequestDialog = getBoolean(PrefKeys.HIDE_DELETE_REQUEST_DIALOG, false) val hideBlockAlertDialog = getBoolean(PrefKeys.HIDE_BLOCK_ALERT_DIALOG, false) + val useProxy = getBoolean(PrefKeys.USE_PROXY, false) val a = Account( Persona(privKey = privKey?.toByteArray(), pubKey = pubKey.toByteArray()), @@ -263,7 +266,8 @@ object LocalPreferences { zapPaymentRequestServer, hideDeleteRequestDialog, hideBlockAlertDialog, - latestContactList + latestContactList, + useProxy ) return a diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index 5a36d72975..c5d0aa081a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -45,7 +45,8 @@ class Account( var zapPaymentRequest: Nip47URI? = null, var hideDeleteRequestDialog: Boolean = false, var hideBlockAlertDialog: Boolean = false, - var backupContactList: ContactListEvent? = null + var backupContactList: ContactListEvent? = null, + var useProxy: Boolean = false ) { var transientHiddenUsers: Set = setOf() @@ -692,7 +693,7 @@ class Account( fun activeRelays(): Array? { var usersRelayList = userProfile().latestContactList?.relays()?.map { val localFeedTypes = localRelays.firstOrNull() { localRelay -> localRelay.url == it.key }?.feedTypes ?: FeedType.values().toSet() - Relay(it.key, it.value.read, it.value.write, localFeedTypes) + Relay(it.key, it.value.read, it.value.write, localFeedTypes, useProxy) } ?: return null // Ugly, but forces nostr.band as the only search-supporting relay today. @@ -702,7 +703,8 @@ class Account( Constants.forcedRelayForSearch.url, Constants.forcedRelayForSearch.read, Constants.forcedRelayForSearch.write, - Constants.forcedRelayForSearch.feedTypes + Constants.forcedRelayForSearch.feedTypes, + useProxy ) } @@ -711,7 +713,7 @@ class Account( fun convertLocalRelays(): Array { return localRelays.map { - Relay(it.url, it.read, it.write, it.feedTypes) + Relay(it.url, it.read, it.write, it.feedTypes, useProxy) }.toTypedArray() } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt index 6f841deb65..602c4f3473 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt @@ -76,7 +76,7 @@ object Client : RelayPool.Listener { } } else { /** temporary connection */ - Relay(relay, false, true, emptySet()).requestAndWatch() { + Relay(relay, false, true, emptySet(), false).requestAndWatch() { it.send(signedEvent) it.disconnect() } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Constants.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Constants.kt index a167a2d99f..5e947a967c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Constants.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Constants.kt @@ -10,7 +10,7 @@ object Constants { fun convertDefaultRelays(): Array { return defaultRelays.map { - Relay(it.url, it.read, it.write, it.feedTypes) + Relay(it.url, it.read, it.write, it.feedTypes, false) }.toTypedArray() } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt index 87407844b2..def4096cdd 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt @@ -10,6 +10,8 @@ import okhttp3.Request import okhttp3.Response import okhttp3.WebSocket import okhttp3.WebSocketListener +import java.net.InetSocketAddress +import java.net.Proxy import java.util.Date enum class FeedType { @@ -20,9 +22,13 @@ class Relay( var url: String, var read: Boolean = true, var write: Boolean = true, - var activeTypes: Set = FeedType.values().toSet() + var activeTypes: Set = FeedType.values().toSet(), + useProxy: Boolean ) { + private var proxy = if (useProxy) Proxy(Proxy.Type.SOCKS, InetSocketAddress("127.0.0.1", 9050)) else null + private val httpClient = OkHttpClient.Builder() + .proxy(proxy) .followRedirects(true) .followSslRedirects(true) .build() 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 defddc0c90..824eb87b1b 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 @@ -46,6 +46,7 @@ import androidx.navigation.NavHostController import coil.compose.AsyncImage import com.vitorpamplona.amethyst.BuildConfig import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.ServiceManager import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.ui.components.ResizeImage @@ -100,7 +101,12 @@ fun DrawerContent( } @Composable -fun ProfileContent(baseAccountUser: User, modifier: Modifier = Modifier, scaffoldState: ScaffoldState, navController: NavController) { +fun ProfileContent( + baseAccountUser: User, + modifier: Modifier = Modifier, + scaffoldState: ScaffoldState, + navController: NavController +) { val coroutineScope = rememberCoroutineScope() val accountUserState by baseAccountUser.live().metadata.observeAsState() @@ -197,11 +203,17 @@ fun ProfileContent(baseAccountUser: User, modifier: Modifier = Modifier, scaffol }) ) { Row() { - Text("${accountUserFollows.cachedFollowCount() ?: "--"}", fontWeight = FontWeight.Bold) + Text( + "${accountUserFollows.cachedFollowCount() ?: "--"}", + fontWeight = FontWeight.Bold + ) Text(stringResource(R.string.following)) } Row(modifier = Modifier.padding(start = 10.dp)) { - Text("${accountUserFollows.cachedFollowerCount() ?: "--"}", fontWeight = FontWeight.Bold) + Text( + "${accountUserFollows.cachedFollowerCount() ?: "--"}", + fontWeight = FontWeight.Bold + ) Text(stringResource(R.string.followers)) } } @@ -221,6 +233,7 @@ fun ListContent( ) { val coroutineScope = rememberCoroutineScope() var backupDialogOpen by remember { mutableStateOf(false) } + var checked by remember { mutableStateOf(account.useProxy) } Column(modifier = modifier.fillMaxHeight()) { if (accountUser != null) { @@ -259,6 +272,19 @@ fun ListContent( onClick = { backupDialogOpen = true } ) + IconRow( + title = "Enable Tor", + icon = R.drawable.ic_topics, + tint = MaterialTheme.colors.onBackground, + onClick = { + checked = !checked + println("changed tor to $checked") + account.useProxy = checked + ServiceManager.pause() + ServiceManager.start() + } + ) + Spacer(modifier = Modifier.weight(1f)) IconRow( From cf8747b19fc11e524561f0e13bd654a7c9550c3d Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Thu, 20 Apr 2023 15:30:04 -0300 Subject: [PATCH 003/171] add a checkbox to use tor in the login screen, set the proxy in the account model construction --- .../vitorpamplona/amethyst/LocalPreferences.kt | 8 ++++++-- .../vitorpamplona/amethyst/model/Account.kt | 9 +++++---- .../amethyst/service/relays/Client.kt | 3 ++- .../amethyst/service/relays/Constants.kt | 3 ++- .../amethyst/service/relays/Relay.kt | 5 +---- .../amethyst/ui/navigation/DrawerContent.kt | 6 ++++-- .../ui/screen/AccountStateViewModel.kt | 18 +++++++++++------- .../ui/screen/loggedOff/LoginScreen.kt | 16 +++++++++++++--- 8 files changed, 44 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt index d45180dee7..40b6d817ea 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt @@ -17,6 +17,8 @@ import nostr.postr.Persona import nostr.postr.toHex import nostr.postr.toNpub import java.io.File +import java.net.InetSocketAddress +import java.net.Proxy import java.util.Locale // Release mode (!BuildConfig.DEBUG) always uses encrypted preferences @@ -196,7 +198,8 @@ object LocalPreferences { putString(PrefKeys.LATEST_CONTACT_LIST, Event.gson.toJson(account.backupContactList)) putBoolean(PrefKeys.HIDE_DELETE_REQUEST_DIALOG, account.hideDeleteRequestDialog) putBoolean(PrefKeys.HIDE_BLOCK_ALERT_DIALOG, account.hideBlockAlertDialog) - putBoolean(PrefKeys.USE_PROXY, account.useProxy) + println(account.proxy != null) + putBoolean(PrefKeys.USE_PROXY, account.proxy != null) }.apply() } @@ -253,6 +256,7 @@ object LocalPreferences { val hideDeleteRequestDialog = getBoolean(PrefKeys.HIDE_DELETE_REQUEST_DIALOG, false) val hideBlockAlertDialog = getBoolean(PrefKeys.HIDE_BLOCK_ALERT_DIALOG, false) val useProxy = getBoolean(PrefKeys.USE_PROXY, false) + var proxy = if (useProxy) Proxy(Proxy.Type.SOCKS, InetSocketAddress("127.0.0.1", 9050)) else null val a = Account( Persona(privKey = privKey?.toByteArray(), pubKey = pubKey.toByteArray()), @@ -267,7 +271,7 @@ object LocalPreferences { hideDeleteRequestDialog, hideBlockAlertDialog, latestContactList, - useProxy + proxy ) return a diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index c5d0aa081a..fadefa7902 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -16,6 +16,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import nostr.postr.Persona +import java.net.Proxy import java.util.Locale val DefaultChannels = setOf( @@ -46,7 +47,7 @@ class Account( var hideDeleteRequestDialog: Boolean = false, var hideBlockAlertDialog: Boolean = false, var backupContactList: ContactListEvent? = null, - var useProxy: Boolean = false + var proxy: Proxy? ) { var transientHiddenUsers: Set = setOf() @@ -693,7 +694,7 @@ class Account( fun activeRelays(): Array? { var usersRelayList = userProfile().latestContactList?.relays()?.map { val localFeedTypes = localRelays.firstOrNull() { localRelay -> localRelay.url == it.key }?.feedTypes ?: FeedType.values().toSet() - Relay(it.key, it.value.read, it.value.write, localFeedTypes, useProxy) + Relay(it.key, it.value.read, it.value.write, localFeedTypes, proxy) } ?: return null // Ugly, but forces nostr.band as the only search-supporting relay today. @@ -704,7 +705,7 @@ class Account( Constants.forcedRelayForSearch.read, Constants.forcedRelayForSearch.write, Constants.forcedRelayForSearch.feedTypes, - useProxy + proxy ) } @@ -713,7 +714,7 @@ class Account( fun convertLocalRelays(): Array { return localRelays.map { - Relay(it.url, it.read, it.write, it.feedTypes, useProxy) + Relay(it.url, it.read, it.write, it.feedTypes, proxy) }.toTypedArray() } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt index 602c4f3473..b1ef135a9b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt @@ -76,7 +76,8 @@ object Client : RelayPool.Listener { } } else { /** temporary connection */ - Relay(relay, false, true, emptySet(), false).requestAndWatch() { + /** TODO: set the proxy for this temporary connection */ + Relay(relay, false, true, emptySet(), null).requestAndWatch() { it.send(signedEvent) it.disconnect() } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Constants.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Constants.kt index 5e947a967c..9f5477687a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Constants.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Constants.kt @@ -10,7 +10,8 @@ object Constants { fun convertDefaultRelays(): Array { return defaultRelays.map { - Relay(it.url, it.read, it.write, it.feedTypes, false) + /** TODO: set the proxy */ + Relay(it.url, it.read, it.write, it.feedTypes, null) }.toTypedArray() } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt index def4096cdd..1084f21c95 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt @@ -10,7 +10,6 @@ import okhttp3.Request import okhttp3.Response import okhttp3.WebSocket import okhttp3.WebSocketListener -import java.net.InetSocketAddress import java.net.Proxy import java.util.Date @@ -23,10 +22,8 @@ class Relay( var read: Boolean = true, var write: Boolean = true, var activeTypes: Set = FeedType.values().toSet(), - useProxy: Boolean + proxy: Proxy? ) { - private var proxy = if (useProxy) Proxy(Proxy.Type.SOCKS, InetSocketAddress("127.0.0.1", 9050)) else null - private val httpClient = OkHttpClient.Builder() .proxy(proxy) .followRedirects(true) 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 824eb87b1b..36e1ac835f 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 @@ -54,6 +54,8 @@ import com.vitorpamplona.amethyst.ui.components.RobohashAsyncImageProxy import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountBackupDialog import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import kotlinx.coroutines.launch +import java.net.InetSocketAddress +import java.net.Proxy @OptIn(ExperimentalMaterialApi::class) @Composable @@ -233,7 +235,7 @@ fun ListContent( ) { val coroutineScope = rememberCoroutineScope() var backupDialogOpen by remember { mutableStateOf(false) } - var checked by remember { mutableStateOf(account.useProxy) } + var checked by remember { mutableStateOf(account.proxy != null) } Column(modifier = modifier.fillMaxHeight()) { if (accountUser != null) { @@ -279,7 +281,7 @@ fun ListContent( onClick = { checked = !checked println("changed tor to $checked") - account.useProxy = checked + account.proxy = if (checked) Proxy(Proxy.Type.SOCKS, InetSocketAddress("127.0.0.1", 9050)) else null ServiceManager.pause() ServiceManager.start() } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt index 0118af4591..d6872f808c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt @@ -18,6 +18,8 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import nostr.postr.Persona import nostr.postr.bechToBytes +import java.net.InetSocketAddress +import java.net.Proxy import java.util.regex.Pattern class AccountStateViewModel() : ViewModel() { @@ -39,21 +41,22 @@ class AccountStateViewModel() : ViewModel() { } } - fun startUI(key: String) { + fun startUI(key: String, useProxy: Boolean) { val pattern = Pattern.compile(".+@.+\\.[a-z]+") val parsed = Nip19.uriToRoute(key) val pubKeyParsed = parsed?.hex?.toByteArray() + var proxy = if (useProxy) Proxy(Proxy.Type.SOCKS, InetSocketAddress("127.0.0.1", 9050)) else null val account = if (key.startsWith("nsec")) { - Account(Persona(privKey = key.bechToBytes())) + Account(Persona(privKey = key.bechToBytes()), proxy = proxy) } else if (pubKeyParsed != null) { - Account(Persona(pubKey = pubKeyParsed)) + Account(Persona(pubKey = pubKeyParsed), proxy = proxy) } else if (pattern.matcher(key).matches()) { // Evaluate NIP-5 - Account(Persona()) + Account(Persona(), proxy = proxy) } else { - Account(Persona(Hex.decode(key))) + Account(Persona(Hex.decode(key)), proxy = proxy) } LocalPreferences.updatePrefsForLogin(account) @@ -66,8 +69,9 @@ class AccountStateViewModel() : ViewModel() { tryLoginExistingAccount() } - fun newKey() { - val account = Account(Persona()) + fun newKey(useProxy: Boolean) { + var proxy = if (useProxy) Proxy(Proxy.Type.SOCKS, InetSocketAddress("127.0.0.1", 9050)) else null + val account = Account(Persona(), proxy = proxy) // saves to local preferences LocalPreferences.updatePrefsForLogin(account) startUI(account) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt index ec45c3aff3..6533d1c906 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt @@ -55,6 +55,7 @@ fun LoginPage( var dialogOpen by remember { mutableStateOf(false) } + val useProxy = remember { mutableStateOf(false) } Column( modifier = Modifier @@ -158,7 +159,7 @@ fun LoginPage( keyboardActions = KeyboardActions( onGo = { try { - accountViewModel.startUI(key.value.text) + accountViewModel.startUI(key.value.text, useProxy.value) } catch (e: Exception) { errorMessage = context.getString(R.string.invalid_key) } @@ -221,6 +222,15 @@ fun LoginPage( } } + Row(verticalAlignment = Alignment.CenterVertically) { + Checkbox( + checked = useProxy.value, + onCheckedChange = { useProxy.value = it } + ) + + Text("Enable Tor") + } + Spacer(modifier = Modifier.height(20.dp)) Box(modifier = Modifier.padding(40.dp, 0.dp, 40.dp, 0.dp)) { @@ -237,7 +247,7 @@ fun LoginPage( if (acceptedTerms.value && key.value.text.isNotBlank()) { try { - accountViewModel.startUI(key.value.text) + accountViewModel.startUI(key.value.text, useProxy.value) } catch (e: Exception) { errorMessage = context.getString(R.string.invalid_key) } @@ -265,7 +275,7 @@ fun LoginPage( .fillMaxWidth(), onClick = { if (acceptedTerms.value) { - accountViewModel.newKey() + accountViewModel.newKey(useProxy.value) } else { termsAcceptanceIsRequired = context.getString(R.string.acceptance_of_terms_is_required) From ad420da6dec4846539b3a4cbfff48a48a05d0c63 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Mon, 24 Apr 2023 16:37:00 -0300 Subject: [PATCH 004/171] added tor icon --- .../java/com/vitorpamplona/amethyst/service/relays/Relay.kt | 4 ++++ .../vitorpamplona/amethyst/ui/navigation/DrawerContent.kt | 6 ++++-- app/src/main/res/drawable/ic_tor.xml | 4 ++++ 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/drawable/ic_tor.xml diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt index 1084f21c95..8408e985ad 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt @@ -24,6 +24,10 @@ class Relay( var activeTypes: Set = FeedType.values().toSet(), proxy: Proxy? ) { + init { + println("Tor: ${proxy != null} url: $url") + } + private val httpClient = OkHttpClient.Builder() .proxy(proxy) .followRedirects(true) 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 36e1ac835f..3126cc4ab1 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 @@ -274,9 +274,11 @@ fun ListContent( onClick = { backupDialogOpen = true } ) + var textTorProxy = if (checked) "Disable" else "Enable" + IconRow( - title = "Enable Tor", - icon = R.drawable.ic_topics, + title = "$textTorProxy Tor", + icon = R.drawable.ic_tor, tint = MaterialTheme.colors.onBackground, onClick = { checked = !checked diff --git a/app/src/main/res/drawable/ic_tor.xml b/app/src/main/res/drawable/ic_tor.xml new file mode 100644 index 0000000000..bafee0c19c --- /dev/null +++ b/app/src/main/res/drawable/ic_tor.xml @@ -0,0 +1,4 @@ + + + From 9f3d6a75e6d4a88d14a7252e4c3545ccc863820e Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Wed, 26 Apr 2023 08:42:49 -0300 Subject: [PATCH 005/171] add proxy to all http clients --- .../amethyst/service/Nip05Verifier.kt | 5 +++-- .../service/lnurl/LightningAddressResolver.kt | 5 +++-- .../amethyst/ui/actions/ImageSaver.kt | 6 ++++-- .../amethyst/ui/actions/ImageUploader.kt | 6 ++++-- .../amethyst/ui/actions/NewPostViewModel.kt | 3 ++- .../ui/actions/NewUserMetadataViewModel.kt | 3 ++- .../amethyst/ui/actions/SaveToGallery.kt | 6 ++++-- .../ui/components/ExpandableRichTextViewer.kt | 7 +++++-- .../amethyst/ui/components/InvoiceRequest.kt | 2 +- .../amethyst/ui/components/RichTextViewer.kt | 8 +++++--- .../amethyst/ui/components/ZoomableImageView.kt | 9 +++++---- .../amethyst/ui/note/ChatroomMessageCompose.kt | 6 ++++-- .../ui/note/NIP05VerificationDisplay.kt | 17 +++++++++-------- .../amethyst/ui/note/NoteCompose.kt | 11 +++++++---- .../vitorpamplona/amethyst/ui/note/PollNote.kt | 10 +++++++--- .../amethyst/ui/screen/ThreadFeedView.kt | 8 +++++--- .../ui/screen/loggedIn/AccountViewModel.kt | 2 +- .../ui/screen/loggedIn/ChatroomScreen.kt | 7 ++++--- .../ui/screen/loggedIn/ProfileScreen.kt | 14 ++++++++------ .../ui/components/TranslatableRichTextViewer.kt | 7 +++++-- 20 files changed, 88 insertions(+), 54 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/Nip05Verifier.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/Nip05Verifier.kt index 2a0ee3240d..fd86dc1eb8 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/Nip05Verifier.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/Nip05Verifier.kt @@ -12,9 +12,10 @@ import okhttp3.Callback import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response +import java.net.Proxy -class Nip05Verifier { - val client = OkHttpClient.Builder().build() +class Nip05Verifier(proxy: Proxy?) { + val client = OkHttpClient.Builder().proxy(proxy).build() fun assembleUrl(nip05address: String): String? { val parts = nip05address.trim().split("@") diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/lnurl/LightningAddressResolver.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/lnurl/LightningAddressResolver.kt index a9459b21c9..26e68d2055 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/lnurl/LightningAddressResolver.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/lnurl/LightningAddressResolver.kt @@ -14,10 +14,11 @@ import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import java.math.BigDecimal +import java.net.Proxy import java.net.URLEncoder -class LightningAddressResolver { - val client = OkHttpClient.Builder().build() +class LightningAddressResolver(proxy: Proxy?) { + val client = OkHttpClient.Builder().proxy(proxy).build() fun assembleUrl(lnaddress: String): String? { val parts = lnaddress.split("@") diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageSaver.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageSaver.kt index 485f21062f..ca8727c1df 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageSaver.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageSaver.kt @@ -14,6 +14,7 @@ import okio.BufferedSource import okio.IOException import okio.sink import java.io.File +import java.net.Proxy object ImageSaver { /** @@ -26,9 +27,10 @@ object ImageSaver { url: String, context: Context, onSuccess: () -> Any?, - onError: (Throwable) -> Any? + onError: (Throwable) -> Any?, + proxy: Proxy? ) { - val client = OkHttpClient.Builder().build() + val client = OkHttpClient.Builder().proxy(proxy).build() val request = Request.Builder() .header("User-Agent", "Amethyst/${BuildConfig.VERSION_NAME}") diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageUploader.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageUploader.kt index 574fef2b1e..6ecddfeb0e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageUploader.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageUploader.kt @@ -9,6 +9,7 @@ import okhttp3.MediaType.Companion.toMediaType import okio.BufferedSink import okio.source import java.io.IOException +import java.net.Proxy import java.util.* object ImageUploader { @@ -16,14 +17,15 @@ object ImageUploader { uri: Uri, contentResolver: ContentResolver, onSuccess: (String) -> Unit, - onError: (Throwable) -> Unit + onError: (Throwable) -> Unit, + proxy: Proxy? ) { val contentType = contentResolver.getType(uri) val category = contentType?.toMediaType()?.toString()?.split("/")?.get(0) ?: "image" val url = if (category == "image") "https://api.imgur.com/3/image" else "https://api.imgur.com/3/upload" - val client = OkHttpClient.Builder().build() + val client = OkHttpClient.Builder().proxy(proxy).build() val requestBody: RequestBody = MultipartBody.Builder() .setType(MultipartBody.FORM) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt index 8be28a4913..97ed777a1b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt @@ -124,7 +124,8 @@ open class NewPostViewModel : ViewModel() { viewModelScope.launch { imageUploadingError.emit("Failed to upload the image / video") } - } + }, + account!!.proxy ) } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataViewModel.kt index e6a9bf2e04..7fd7a25af0 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataViewModel.kt @@ -180,7 +180,8 @@ class NewUserMetadataViewModel : ViewModel() { viewModelScope.launch { imageUploadingError.emit("Failed to upload the image / video") } - } + }, + account.proxy ) } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/SaveToGallery.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/SaveToGallery.kt index e8dbca2cfc..a757506bcf 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/SaveToGallery.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/SaveToGallery.kt @@ -18,6 +18,7 @@ import com.google.accompanist.permissions.isGranted import com.google.accompanist.permissions.rememberPermissionState import com.vitorpamplona.amethyst.R import kotlinx.coroutines.launch +import java.net.Proxy /** * A button to save the remote image to the gallery. @@ -27,7 +28,7 @@ import kotlinx.coroutines.launch */ @OptIn(ExperimentalPermissionsApi::class) @Composable -fun SaveToGallery(url: String) { +fun SaveToGallery(url: String, proxy: Proxy?) { val localContext = LocalContext.current val scope = rememberCoroutineScope() @@ -54,7 +55,8 @@ fun SaveToGallery(url: String) { ) .show() } - } + }, + proxy = proxy ) } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt index 3b62e83bdd..37c4689bf9 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt @@ -27,6 +27,7 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavController import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel +import java.net.Proxy const val SHORT_TEXT_LENGTH = 350 @@ -38,7 +39,8 @@ fun ExpandableRichTextViewer( tags: List>?, backgroundColor: Color, accountViewModel: AccountViewModel, - navController: NavController + navController: NavController, + proxy: Proxy? ) { var showFullText by remember { mutableStateOf(false) } @@ -62,7 +64,8 @@ fun ExpandableRichTextViewer( tags, backgroundColor, accountViewModel, - navController + navController, + proxy ) if (content.length > whereToCut && !showFullText) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/InvoiceRequest.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/InvoiceRequest.kt index 06e38c773c..13bb710692 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/InvoiceRequest.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/InvoiceRequest.kt @@ -138,7 +138,7 @@ fun InvoiceRequest( onClick = { val zapRequest = account.createZapRequestFor(toUserPubKeyHex, message, LnZapEvent.ZapType.PUBLIC) - LightningAddressResolver().lnAddressInvoice( + LightningAddressResolver(account.proxy).lnAddressInvoice( lud16, amount * 1000, message, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt index 474a1fea70..edc78229cd 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt @@ -43,6 +43,7 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.net.MalformedURLException +import java.net.Proxy import java.net.URISyntaxException import java.net.URL import java.util.regex.Pattern @@ -80,7 +81,8 @@ fun RichTextViewer( tags: List>?, backgroundColor: Color, accountViewModel: AccountViewModel, - navController: NavController + navController: NavController, + proxy: Proxy? ) { Column(modifier = modifier) { if (content.startsWith("# ") || @@ -159,9 +161,9 @@ fun RichTextViewer( if (isValidURL(word)) { val removedParamsFromUrl = word.split("?")[0].lowercase() if (imageExtensions.any { removedParamsFromUrl.endsWith(it) }) { - ZoomableImageView(word, imagesForPager) + ZoomableImageView(word, imagesForPager, proxy) } else if (videoExtensions.any { removedParamsFromUrl.endsWith(it) }) { - ZoomableImageView(word, imagesForPager) + ZoomableImageView(word, imagesForPager, proxy) } else { UrlPreview(word, "$word ") } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableImageView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableImageView.kt index e547da6bd5..2fa6a5c14c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableImageView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableImageView.kt @@ -46,10 +46,11 @@ import com.vitorpamplona.amethyst.ui.actions.LoadingAnimation import com.vitorpamplona.amethyst.ui.actions.SaveToGallery import net.engawapg.lib.zoomable.rememberZoomState import net.engawapg.lib.zoomable.zoomable +import java.net.Proxy @Composable @OptIn(ExperimentalFoundationApi::class) -fun ZoomableImageView(word: String, images: List = listOf(word)) { +fun ZoomableImageView(word: String, images: List = listOf(word), proxy: Proxy?) { val clipboardManager = LocalClipboardManager.current // store the dialog open or close state @@ -126,13 +127,13 @@ fun ZoomableImageView(word: String, images: List = listOf(word)) { } if (dialogOpen) { - ZoomableImageDialog(word, images, onDismiss = { dialogOpen = false }) + ZoomableImageDialog(word, images, onDismiss = { dialogOpen = false }, proxy) } } @OptIn(ExperimentalPagerApi::class) @Composable -fun ZoomableImageDialog(imageUrl: String, allImages: List = listOf(imageUrl), onDismiss: () -> Unit) { +fun ZoomableImageDialog(imageUrl: String, allImages: List = listOf(imageUrl), onDismiss: () -> Unit, proxy: Proxy?) { Dialog( onDismissRequest = onDismiss, properties = DialogProperties(usePlatformDefaultWidth = false) @@ -150,7 +151,7 @@ fun ZoomableImageDialog(imageUrl: String, allImages: List = listOf(image ) { CloseButton(onCancel = onDismiss) - SaveToGallery(url = allImages[pagerState.currentPage]) + SaveToGallery(url = allImages[pagerState.currentPage], proxy) } if (allImages.size > 1) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt index bee9980155..6aa2e5cb5c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt @@ -290,7 +290,8 @@ fun ChatroomMessageCompose( note.event?.tags(), backgroundBubbleColor, accountViewModel, - navController + navController, + account.proxy ) } else { TranslatableRichTextViewer( @@ -300,7 +301,8 @@ fun ChatroomMessageCompose( note.event?.tags(), backgroundBubbleColor, accountViewModel, - navController + navController, + account.proxy ) } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt index cebfe1fdde..bb13426608 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt @@ -35,10 +35,11 @@ import com.vitorpamplona.amethyst.service.Nip05Verifier import com.vitorpamplona.amethyst.ui.theme.Nip05 import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import java.net.Proxy import java.util.Date @Composable -fun nip05VerificationAsAState(user: UserMetadata, pubkeyHex: String): State { +fun nip05VerificationAsAState(user: UserMetadata, pubkeyHex: String, proxy: Proxy?): State { var nip05Verified = remember { mutableStateOf(null) } LaunchedEffect(key1 = user) { @@ -48,7 +49,7 @@ fun nip05VerificationAsAState(user: UserMetadata, pubkeyHex: String): State (now - 60 * 60)) { // 1hour nip05Verified.value = user.nip05Verified } else { - Nip05Verifier().verifyNip05( + Nip05Verifier(proxy).verifyNip05( nip05, onSuccess = { // Marks user as verified @@ -77,18 +78,18 @@ fun nip05VerificationAsAState(user: UserMetadata, pubkeyHex: String): State if (nip05.split("@").size == 2) { - val nip05Verified by nip05VerificationAsAState(user.info!!, user.pubkeyHex) + val nip05Verified by nip05VerificationAsAState(user.info!!, user.pubkeyHex, proxy) Row(verticalAlignment = Alignment.CenterVertically) { if (nip05Verified == null) { Icon( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index 8400d174b3..ccabb83488 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -353,7 +353,7 @@ fun NoteComposeInner( if (note.author != null && !makeItShort && !isQuotedNote) { Row(verticalAlignment = Alignment.CenterVertically) { - ObserveDisplayNip05Status(note.author!!, Modifier.weight(1f)) + ObserveDisplayNip05Status(note.author!!, Modifier.weight(1f), account.proxy) val baseReward = noteEvent.getReward() if (baseReward != null) { @@ -509,7 +509,8 @@ fun NoteComposeInner( noteEvent.tags(), backgroundColor, accountViewModel, - navController + navController, + account.proxy ) if (!makeItShort) { @@ -539,7 +540,8 @@ fun NoteComposeInner( noteEvent.tags(), backgroundColor, accountViewModel, - navController + navController, + account.proxy ) DisplayUncitedHashtags(noteEvent.hashtags(), eventContent, navController) @@ -551,7 +553,8 @@ fun NoteComposeInner( canPreview = canPreview && !makeItShort, backgroundColor, accountViewModel, - navController + navController, + account.proxy ) } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNote.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNote.kt index 26e83cf916..b95afb0d5f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNote.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNote.kt @@ -37,6 +37,7 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.theme.BitcoinOrange import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import java.net.Proxy import java.util.* import kotlin.math.roundToInt @@ -46,7 +47,8 @@ fun PollNote( canPreview: Boolean, backgroundColor: Color, accountViewModel: AccountViewModel, - navController: NavController + navController: NavController, + proxy: Proxy? ) { val zapsState by baseNote.live().zaps.observeAsState() val zappedNote = zapsState?.note ?: return @@ -111,7 +113,8 @@ fun PollNote( pollViewModel.pollEvent?.tags(), backgroundColor, accountViewModel, - navController + navController, + proxy ) } } @@ -144,7 +147,8 @@ fun PollNote( pollViewModel.pollEvent?.tags(), backgroundColor, accountViewModel, - navController + navController, + proxy ) } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt index 26d0448be4..e161b20035 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt @@ -282,7 +282,7 @@ fun NoteMaster( } Row(verticalAlignment = Alignment.CenterVertically) { - ObserveDisplayNip05Status(baseNote, Modifier.weight(1f)) + ObserveDisplayNip05Status(baseNote, Modifier.weight(1f), account.proxy) val baseReward = noteEvent.getReward() if (baseReward != null) { @@ -362,7 +362,8 @@ fun NoteMaster( note.event?.tags(), MaterialTheme.colors.background, accountViewModel, - navController + navController, + account.proxy ) DisplayUncitedHashtags(noteEvent.hashtags(), eventContent, navController) @@ -373,7 +374,8 @@ fun NoteMaster( canPreview, backgroundColor, accountViewModel, - navController + navController, + account.proxy ) } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt index c88352b6c7..22fffb0647 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt @@ -72,7 +72,7 @@ class AccountViewModel(private val account: Account) : ViewModel() { onProgress(0.10f) - LightningAddressResolver().lnAddressInvoice( + LightningAddressResolver(account.proxy).lnAddressInvoice( lud16, amount, message, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt index 0f26c18bcd..a1ac447147 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt @@ -59,6 +59,7 @@ import com.vitorpamplona.amethyst.ui.note.UserPicture import com.vitorpamplona.amethyst.ui.note.UsernameDisplay import com.vitorpamplona.amethyst.ui.screen.ChatroomFeedView import com.vitorpamplona.amethyst.ui.screen.NostrChatRoomFeedViewModel +import java.net.Proxy @Composable fun ChatroomScreen(userId: String?, accountViewModel: AccountViewModel, navController: NavController) { @@ -104,7 +105,7 @@ fun ChatroomScreen(userId: String?, accountViewModel: AccountViewModel, navContr Column(Modifier.fillMaxHeight()) { NostrChatroomDataSource.withUser?.let { - ChatroomHeader(it, account.userProfile(), navController = navController) + ChatroomHeader(it, account.userProfile(), navController = navController, account.proxy) } Column( @@ -206,7 +207,7 @@ fun ChatroomScreen(userId: String?, accountViewModel: AccountViewModel, navContr } @Composable -fun ChatroomHeader(baseUser: User, accountUser: User, navController: NavController) { +fun ChatroomHeader(baseUser: User, accountUser: User, navController: NavController, proxy: Proxy?) { Column( modifier = Modifier.clickable( onClick = { navController.navigate("User/${baseUser.pubkeyHex}") } @@ -226,7 +227,7 @@ fun ChatroomHeader(baseUser: User, accountUser: User, navController: NavControll } Row(verticalAlignment = Alignment.CenterVertically) { - ObserveDisplayNip05Status(baseUser) + ObserveDisplayNip05Status(baseUser, proxy = proxy) } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt index 6c832ceac1..46623a0efc 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt @@ -1,6 +1,7 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn import android.content.Intent +import java.net.Proxy import android.net.Uri import androidx.compose.foundation.* import androidx.compose.foundation.gestures.scrollBy @@ -308,7 +309,7 @@ private fun ProfileHeader( val clipboardManager = LocalClipboardManager.current Box { - DrawBanner(baseUser) + DrawBanner(baseUser, account.proxy) Box( modifier = Modifier @@ -410,7 +411,7 @@ private fun ProfileHeader( } if (zoomImageDialogOpen) { - ZoomableImageDialog(baseUser.profilePicture()!!, onDismiss = { zoomImageDialogOpen = false }) + ZoomableImageDialog(baseUser.profilePicture()!!, onDismiss = { zoomImageDialogOpen = false }, proxy = account.proxy) } } @@ -514,7 +515,7 @@ private fun DrawAdditionalInfo(baseUser: User, account: Account, accountViewMode } } - DisplayNip05ProfileStatus(user) + DisplayNip05ProfileStatus(user, account.proxy) val website = user.info?.website if (!website.isNullOrEmpty()) { @@ -616,7 +617,8 @@ private fun DrawAdditionalInfo(baseUser: User, account: Account, accountViewMode tags = null, backgroundColor = MaterialTheme.colors.background, accountViewModel = accountViewModel, - navController = navController + navController = navController, + proxy = account.proxy ) } } @@ -686,7 +688,7 @@ fun BadgeThumb( @OptIn(ExperimentalFoundationApi::class) @Composable -private fun DrawBanner(baseUser: User) { +private fun DrawBanner(baseUser: User, proxy: Proxy?) { val userState by baseUser.live().metadata.observeAsState() val user = userState?.user ?: return @@ -712,7 +714,7 @@ private fun DrawBanner(baseUser: User) { ) if (zoomImageDialogOpen) { - ZoomableImageDialog(imageUrl = banner, onDismiss = { zoomImageDialogOpen = false }) + ZoomableImageDialog(imageUrl = banner, onDismiss = { zoomImageDialogOpen = false }, proxy = proxy) } } else { Image( diff --git a/app/src/play/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt b/app/src/play/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt index 8100a3e9b1..e30a5f41e7 100644 --- a/app/src/play/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt +++ b/app/src/play/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt @@ -35,6 +35,7 @@ import com.vitorpamplona.amethyst.service.lang.ResultOrError import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import java.net.Proxy import java.util.Locale @Composable @@ -45,7 +46,8 @@ fun TranslatableRichTextViewer( tags: List>?, backgroundColor: Color, accountViewModel: AccountViewModel, - navController: NavController + navController: NavController, + proxy: Proxy? ) { val translatedTextState = remember { mutableStateOf(ResultOrError(content, null, null, null)) @@ -87,7 +89,8 @@ fun TranslatableRichTextViewer( tags, backgroundColor, accountViewModel, - navController + navController, + proxy ) val target = translatedTextState.value.targetLang From 4f8d33d850acfa738bfd48bf06d93ee403d92fb2 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Wed, 26 Apr 2023 08:51:58 -0300 Subject: [PATCH 006/171] fix build --- .../amethyst/ui/components/TranslatableRichTextViewer.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/fdroid/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt b/app/src/fdroid/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt index 5f4659d445..a64a9e0124 100644 --- a/app/src/fdroid/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt +++ b/app/src/fdroid/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt @@ -5,6 +5,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.navigation.NavController import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel +import java.net.Proxy @Composable fun TranslatableRichTextViewer( @@ -14,7 +15,8 @@ fun TranslatableRichTextViewer( tags: List>?, backgroundColor: Color, accountViewModel: AccountViewModel, - navController: NavController + navController: NavController, + proxy: Proxy? ) = ExpandableRichTextViewer( content, canPreview, @@ -22,5 +24,6 @@ fun TranslatableRichTextViewer( tags, backgroundColor, accountViewModel, - navController + navController, + proxy ) From c648f54b518604f5ed3fa75f38d1f68b563f013e Mon Sep 17 00:00:00 2001 From: greenart7c3 <115044884+greenart7c3@users.noreply.github.com> Date: Wed, 26 Apr 2023 10:03:51 -0300 Subject: [PATCH 007/171] created HttpClient class --- .../ui/components/TranslatableRichTextViewer.kt | 7 ++----- .../vitorpamplona/amethyst/ServiceManager.kt | 3 ++- .../amethyst/service/HttpClient.kt | 17 +++++++++++++++++ .../amethyst/service/Nip05Verifier.kt | 6 ++---- .../service/lnurl/LightningAddressResolver.kt | 7 +++---- .../amethyst/ui/actions/ImageSaver.kt | 7 +++---- .../amethyst/ui/actions/ImageUploader.kt | 7 +++---- .../amethyst/ui/actions/NewPostViewModel.kt | 3 +-- .../ui/actions/NewUserMetadataViewModel.kt | 3 +-- .../amethyst/ui/actions/SaveToGallery.kt | 6 ++---- .../ui/components/ExpandableRichTextViewer.kt | 7 ++----- .../amethyst/ui/components/InvoiceRequest.kt | 2 +- .../amethyst/ui/components/RichTextViewer.kt | 8 +++----- .../amethyst/ui/components/ZoomableImageView.kt | 9 ++++----- .../amethyst/ui/note/ChatroomMessageCompose.kt | 6 ++---- .../ui/note/NIP05VerificationDisplay.kt | 17 ++++++++--------- .../amethyst/ui/note/NoteCompose.kt | 11 ++++------- .../vitorpamplona/amethyst/ui/note/PollNote.kt | 10 +++------- .../amethyst/ui/screen/ThreadFeedView.kt | 8 +++----- .../ui/screen/loggedIn/AccountViewModel.kt | 2 +- .../ui/screen/loggedIn/ChatroomScreen.kt | 7 +++---- .../ui/screen/loggedIn/ProfileScreen.kt | 14 ++++++-------- .../ui/components/TranslatableRichTextViewer.kt | 7 ++----- 23 files changed, 78 insertions(+), 96 deletions(-) create mode 100644 app/src/main/java/com/vitorpamplona/amethyst/service/HttpClient.kt diff --git a/app/src/fdroid/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt b/app/src/fdroid/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt index a64a9e0124..5f4659d445 100644 --- a/app/src/fdroid/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt +++ b/app/src/fdroid/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt @@ -5,7 +5,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.navigation.NavController import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel -import java.net.Proxy @Composable fun TranslatableRichTextViewer( @@ -15,8 +14,7 @@ fun TranslatableRichTextViewer( tags: List>?, backgroundColor: Color, accountViewModel: AccountViewModel, - navController: NavController, - proxy: Proxy? + navController: NavController ) = ExpandableRichTextViewer( content, canPreview, @@ -24,6 +22,5 @@ fun TranslatableRichTextViewer( tags, backgroundColor, accountViewModel, - navController, - proxy + navController ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ServiceManager.kt b/app/src/main/java/com/vitorpamplona/amethyst/ServiceManager.kt index fbff99b632..a4db5f0331 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ServiceManager.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ServiceManager.kt @@ -2,6 +2,7 @@ package com.vitorpamplona.amethyst import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.LocalCache +import com.vitorpamplona.amethyst.service.HttpClient import com.vitorpamplona.amethyst.service.NostrAccountDataSource import com.vitorpamplona.amethyst.service.NostrChannelDataSource import com.vitorpamplona.amethyst.service.NostrChatroomListDataSource @@ -25,7 +26,7 @@ object ServiceManager { fun start() { val myAccount = account - + HttpClient.start(account) if (myAccount != null) { Client.connect(myAccount.activeRelays() ?: myAccount.convertLocalRelays()) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/HttpClient.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/HttpClient.kt new file mode 100644 index 0000000000..cf627893d0 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/HttpClient.kt @@ -0,0 +1,17 @@ +package com.vitorpamplona.amethyst.service + +import com.vitorpamplona.amethyst.model.Account +import okhttp3.OkHttpClient +import java.net.Proxy + +object HttpClient { + private var proxy: Proxy? = null + + fun start(account: Account?) { + this.proxy = account?.proxy + } + + fun getHttpClient(): OkHttpClient { + return OkHttpClient.Builder().proxy(proxy).build() + } +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/Nip05Verifier.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/Nip05Verifier.kt index fd86dc1eb8..e86a856331 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/Nip05Verifier.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/Nip05Verifier.kt @@ -9,13 +9,11 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import okhttp3.Call import okhttp3.Callback -import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response -import java.net.Proxy -class Nip05Verifier(proxy: Proxy?) { - val client = OkHttpClient.Builder().proxy(proxy).build() +class Nip05Verifier() { + val client = HttpClient.getHttpClient() fun assembleUrl(nip05address: String): String? { val parts = nip05address.trim().split("@") diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/lnurl/LightningAddressResolver.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/lnurl/LightningAddressResolver.kt index 26e68d2055..78ea520189 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/lnurl/LightningAddressResolver.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/lnurl/LightningAddressResolver.kt @@ -2,6 +2,7 @@ package com.vitorpamplona.amethyst.service.lnurl import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.vitorpamplona.amethyst.BuildConfig +import com.vitorpamplona.amethyst.service.HttpClient import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -10,15 +11,13 @@ import kotlinx.coroutines.withContext import nostr.postr.Bech32 import okhttp3.Call import okhttp3.Callback -import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import java.math.BigDecimal -import java.net.Proxy import java.net.URLEncoder -class LightningAddressResolver(proxy: Proxy?) { - val client = OkHttpClient.Builder().proxy(proxy).build() +class LightningAddressResolver() { + val client = HttpClient.getHttpClient() fun assembleUrl(lnaddress: String): String? { val parts = lnaddress.split("@") diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageSaver.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageSaver.kt index ca8727c1df..9d409efa98 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageSaver.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageSaver.kt @@ -9,12 +9,12 @@ import android.os.Environment import android.provider.MediaStore import androidx.annotation.RequiresApi import com.vitorpamplona.amethyst.BuildConfig +import com.vitorpamplona.amethyst.service.HttpClient import okhttp3.* import okio.BufferedSource import okio.IOException import okio.sink import java.io.File -import java.net.Proxy object ImageSaver { /** @@ -27,10 +27,9 @@ object ImageSaver { url: String, context: Context, onSuccess: () -> Any?, - onError: (Throwable) -> Any?, - proxy: Proxy? + onError: (Throwable) -> Any? ) { - val client = OkHttpClient.Builder().proxy(proxy).build() + val client = HttpClient.getHttpClient() val request = Request.Builder() .header("User-Agent", "Amethyst/${BuildConfig.VERSION_NAME}") diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageUploader.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageUploader.kt index 6ecddfeb0e..b395708331 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageUploader.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageUploader.kt @@ -4,12 +4,12 @@ import android.content.ContentResolver import android.net.Uri import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.vitorpamplona.amethyst.BuildConfig +import com.vitorpamplona.amethyst.service.HttpClient import okhttp3.* import okhttp3.MediaType.Companion.toMediaType import okio.BufferedSink import okio.source import java.io.IOException -import java.net.Proxy import java.util.* object ImageUploader { @@ -17,15 +17,14 @@ object ImageUploader { uri: Uri, contentResolver: ContentResolver, onSuccess: (String) -> Unit, - onError: (Throwable) -> Unit, - proxy: Proxy? + onError: (Throwable) -> Unit ) { val contentType = contentResolver.getType(uri) val category = contentType?.toMediaType()?.toString()?.split("/")?.get(0) ?: "image" val url = if (category == "image") "https://api.imgur.com/3/image" else "https://api.imgur.com/3/upload" - val client = OkHttpClient.Builder().proxy(proxy).build() + val client = HttpClient.getHttpClient() val requestBody: RequestBody = MultipartBody.Builder() .setType(MultipartBody.FORM) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt index 97ed777a1b..8be28a4913 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt @@ -124,8 +124,7 @@ open class NewPostViewModel : ViewModel() { viewModelScope.launch { imageUploadingError.emit("Failed to upload the image / video") } - }, - account!!.proxy + } ) } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataViewModel.kt index 7fd7a25af0..e6a9bf2e04 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataViewModel.kt @@ -180,8 +180,7 @@ class NewUserMetadataViewModel : ViewModel() { viewModelScope.launch { imageUploadingError.emit("Failed to upload the image / video") } - }, - account.proxy + } ) } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/SaveToGallery.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/SaveToGallery.kt index a757506bcf..e8dbca2cfc 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/SaveToGallery.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/SaveToGallery.kt @@ -18,7 +18,6 @@ import com.google.accompanist.permissions.isGranted import com.google.accompanist.permissions.rememberPermissionState import com.vitorpamplona.amethyst.R import kotlinx.coroutines.launch -import java.net.Proxy /** * A button to save the remote image to the gallery. @@ -28,7 +27,7 @@ import java.net.Proxy */ @OptIn(ExperimentalPermissionsApi::class) @Composable -fun SaveToGallery(url: String, proxy: Proxy?) { +fun SaveToGallery(url: String) { val localContext = LocalContext.current val scope = rememberCoroutineScope() @@ -55,8 +54,7 @@ fun SaveToGallery(url: String, proxy: Proxy?) { ) .show() } - }, - proxy = proxy + } ) } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt index 37c4689bf9..3b62e83bdd 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt @@ -27,7 +27,6 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavController import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel -import java.net.Proxy const val SHORT_TEXT_LENGTH = 350 @@ -39,8 +38,7 @@ fun ExpandableRichTextViewer( tags: List>?, backgroundColor: Color, accountViewModel: AccountViewModel, - navController: NavController, - proxy: Proxy? + navController: NavController ) { var showFullText by remember { mutableStateOf(false) } @@ -64,8 +62,7 @@ fun ExpandableRichTextViewer( tags, backgroundColor, accountViewModel, - navController, - proxy + navController ) if (content.length > whereToCut && !showFullText) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/InvoiceRequest.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/InvoiceRequest.kt index 13bb710692..06e38c773c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/InvoiceRequest.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/InvoiceRequest.kt @@ -138,7 +138,7 @@ fun InvoiceRequest( onClick = { val zapRequest = account.createZapRequestFor(toUserPubKeyHex, message, LnZapEvent.ZapType.PUBLIC) - LightningAddressResolver(account.proxy).lnAddressInvoice( + LightningAddressResolver().lnAddressInvoice( lud16, amount * 1000, message, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt index edc78229cd..474a1fea70 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt @@ -43,7 +43,6 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.net.MalformedURLException -import java.net.Proxy import java.net.URISyntaxException import java.net.URL import java.util.regex.Pattern @@ -81,8 +80,7 @@ fun RichTextViewer( tags: List>?, backgroundColor: Color, accountViewModel: AccountViewModel, - navController: NavController, - proxy: Proxy? + navController: NavController ) { Column(modifier = modifier) { if (content.startsWith("# ") || @@ -161,9 +159,9 @@ fun RichTextViewer( if (isValidURL(word)) { val removedParamsFromUrl = word.split("?")[0].lowercase() if (imageExtensions.any { removedParamsFromUrl.endsWith(it) }) { - ZoomableImageView(word, imagesForPager, proxy) + ZoomableImageView(word, imagesForPager) } else if (videoExtensions.any { removedParamsFromUrl.endsWith(it) }) { - ZoomableImageView(word, imagesForPager, proxy) + ZoomableImageView(word, imagesForPager) } else { UrlPreview(word, "$word ") } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableImageView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableImageView.kt index 2fa6a5c14c..e547da6bd5 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableImageView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableImageView.kt @@ -46,11 +46,10 @@ import com.vitorpamplona.amethyst.ui.actions.LoadingAnimation import com.vitorpamplona.amethyst.ui.actions.SaveToGallery import net.engawapg.lib.zoomable.rememberZoomState import net.engawapg.lib.zoomable.zoomable -import java.net.Proxy @Composable @OptIn(ExperimentalFoundationApi::class) -fun ZoomableImageView(word: String, images: List = listOf(word), proxy: Proxy?) { +fun ZoomableImageView(word: String, images: List = listOf(word)) { val clipboardManager = LocalClipboardManager.current // store the dialog open or close state @@ -127,13 +126,13 @@ fun ZoomableImageView(word: String, images: List = listOf(word), proxy: } if (dialogOpen) { - ZoomableImageDialog(word, images, onDismiss = { dialogOpen = false }, proxy) + ZoomableImageDialog(word, images, onDismiss = { dialogOpen = false }) } } @OptIn(ExperimentalPagerApi::class) @Composable -fun ZoomableImageDialog(imageUrl: String, allImages: List = listOf(imageUrl), onDismiss: () -> Unit, proxy: Proxy?) { +fun ZoomableImageDialog(imageUrl: String, allImages: List = listOf(imageUrl), onDismiss: () -> Unit) { Dialog( onDismissRequest = onDismiss, properties = DialogProperties(usePlatformDefaultWidth = false) @@ -151,7 +150,7 @@ fun ZoomableImageDialog(imageUrl: String, allImages: List = listOf(image ) { CloseButton(onCancel = onDismiss) - SaveToGallery(url = allImages[pagerState.currentPage], proxy) + SaveToGallery(url = allImages[pagerState.currentPage]) } if (allImages.size > 1) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt index 6aa2e5cb5c..bee9980155 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt @@ -290,8 +290,7 @@ fun ChatroomMessageCompose( note.event?.tags(), backgroundBubbleColor, accountViewModel, - navController, - account.proxy + navController ) } else { TranslatableRichTextViewer( @@ -301,8 +300,7 @@ fun ChatroomMessageCompose( note.event?.tags(), backgroundBubbleColor, accountViewModel, - navController, - account.proxy + navController ) } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt index bb13426608..cebfe1fdde 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt @@ -35,11 +35,10 @@ import com.vitorpamplona.amethyst.service.Nip05Verifier import com.vitorpamplona.amethyst.ui.theme.Nip05 import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import java.net.Proxy import java.util.Date @Composable -fun nip05VerificationAsAState(user: UserMetadata, pubkeyHex: String, proxy: Proxy?): State { +fun nip05VerificationAsAState(user: UserMetadata, pubkeyHex: String): State { var nip05Verified = remember { mutableStateOf(null) } LaunchedEffect(key1 = user) { @@ -49,7 +48,7 @@ fun nip05VerificationAsAState(user: UserMetadata, pubkeyHex: String, proxy: Prox if ((user.nip05LastVerificationTime ?: 0) > (now - 60 * 60)) { // 1hour nip05Verified.value = user.nip05Verified } else { - Nip05Verifier(proxy).verifyNip05( + Nip05Verifier().verifyNip05( nip05, onSuccess = { // Marks user as verified @@ -78,18 +77,18 @@ fun nip05VerificationAsAState(user: UserMetadata, pubkeyHex: String, proxy: Prox } @Composable -fun ObserveDisplayNip05Status(baseNote: Note, columnModifier: Modifier = Modifier, proxy: Proxy?) { +fun ObserveDisplayNip05Status(baseNote: Note, columnModifier: Modifier = Modifier) { val noteState by baseNote.live().metadata.observeAsState() val note = noteState?.note ?: return val author = note.author if (author != null) { - ObserveDisplayNip05Status(author, columnModifier, proxy) + ObserveDisplayNip05Status(author, columnModifier) } } @Composable -fun ObserveDisplayNip05Status(baseUser: User, columnModifier: Modifier = Modifier, proxy: Proxy?) { +fun ObserveDisplayNip05Status(baseUser: User, columnModifier: Modifier = Modifier) { val userState by baseUser.live().metadata.observeAsState() val user = userState?.user ?: return @@ -108,7 +107,7 @@ fun ObserveDisplayNip05Status(baseUser: User, columnModifier: Modifier = Modifie ) } - val nip05Verified by nip05VerificationAsAState(user.info!!, user.pubkeyHex, proxy) + val nip05Verified by nip05VerificationAsAState(user.info!!, user.pubkeyHex) if (nip05Verified == null) { Icon( tint = Color.Yellow, @@ -152,12 +151,12 @@ fun ObserveDisplayNip05Status(baseUser: User, columnModifier: Modifier = Modifie } @Composable -fun DisplayNip05ProfileStatus(user: User, proxy: Proxy?) { +fun DisplayNip05ProfileStatus(user: User) { val uri = LocalUriHandler.current user.nip05()?.let { nip05 -> if (nip05.split("@").size == 2) { - val nip05Verified by nip05VerificationAsAState(user.info!!, user.pubkeyHex, proxy) + val nip05Verified by nip05VerificationAsAState(user.info!!, user.pubkeyHex) Row(verticalAlignment = Alignment.CenterVertically) { if (nip05Verified == null) { Icon( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index ccabb83488..8400d174b3 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -353,7 +353,7 @@ fun NoteComposeInner( if (note.author != null && !makeItShort && !isQuotedNote) { Row(verticalAlignment = Alignment.CenterVertically) { - ObserveDisplayNip05Status(note.author!!, Modifier.weight(1f), account.proxy) + ObserveDisplayNip05Status(note.author!!, Modifier.weight(1f)) val baseReward = noteEvent.getReward() if (baseReward != null) { @@ -509,8 +509,7 @@ fun NoteComposeInner( noteEvent.tags(), backgroundColor, accountViewModel, - navController, - account.proxy + navController ) if (!makeItShort) { @@ -540,8 +539,7 @@ fun NoteComposeInner( noteEvent.tags(), backgroundColor, accountViewModel, - navController, - account.proxy + navController ) DisplayUncitedHashtags(noteEvent.hashtags(), eventContent, navController) @@ -553,8 +551,7 @@ fun NoteComposeInner( canPreview = canPreview && !makeItShort, backgroundColor, accountViewModel, - navController, - account.proxy + navController ) } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNote.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNote.kt index b95afb0d5f..26e83cf916 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNote.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNote.kt @@ -37,7 +37,6 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.theme.BitcoinOrange import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import java.net.Proxy import java.util.* import kotlin.math.roundToInt @@ -47,8 +46,7 @@ fun PollNote( canPreview: Boolean, backgroundColor: Color, accountViewModel: AccountViewModel, - navController: NavController, - proxy: Proxy? + navController: NavController ) { val zapsState by baseNote.live().zaps.observeAsState() val zappedNote = zapsState?.note ?: return @@ -113,8 +111,7 @@ fun PollNote( pollViewModel.pollEvent?.tags(), backgroundColor, accountViewModel, - navController, - proxy + navController ) } } @@ -147,8 +144,7 @@ fun PollNote( pollViewModel.pollEvent?.tags(), backgroundColor, accountViewModel, - navController, - proxy + navController ) } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt index e161b20035..26d0448be4 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt @@ -282,7 +282,7 @@ fun NoteMaster( } Row(verticalAlignment = Alignment.CenterVertically) { - ObserveDisplayNip05Status(baseNote, Modifier.weight(1f), account.proxy) + ObserveDisplayNip05Status(baseNote, Modifier.weight(1f)) val baseReward = noteEvent.getReward() if (baseReward != null) { @@ -362,8 +362,7 @@ fun NoteMaster( note.event?.tags(), MaterialTheme.colors.background, accountViewModel, - navController, - account.proxy + navController ) DisplayUncitedHashtags(noteEvent.hashtags(), eventContent, navController) @@ -374,8 +373,7 @@ fun NoteMaster( canPreview, backgroundColor, accountViewModel, - navController, - account.proxy + navController ) } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt index 22fffb0647..c88352b6c7 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt @@ -72,7 +72,7 @@ class AccountViewModel(private val account: Account) : ViewModel() { onProgress(0.10f) - LightningAddressResolver(account.proxy).lnAddressInvoice( + LightningAddressResolver().lnAddressInvoice( lud16, amount, message, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt index a1ac447147..0f26c18bcd 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt @@ -59,7 +59,6 @@ import com.vitorpamplona.amethyst.ui.note.UserPicture import com.vitorpamplona.amethyst.ui.note.UsernameDisplay import com.vitorpamplona.amethyst.ui.screen.ChatroomFeedView import com.vitorpamplona.amethyst.ui.screen.NostrChatRoomFeedViewModel -import java.net.Proxy @Composable fun ChatroomScreen(userId: String?, accountViewModel: AccountViewModel, navController: NavController) { @@ -105,7 +104,7 @@ fun ChatroomScreen(userId: String?, accountViewModel: AccountViewModel, navContr Column(Modifier.fillMaxHeight()) { NostrChatroomDataSource.withUser?.let { - ChatroomHeader(it, account.userProfile(), navController = navController, account.proxy) + ChatroomHeader(it, account.userProfile(), navController = navController) } Column( @@ -207,7 +206,7 @@ fun ChatroomScreen(userId: String?, accountViewModel: AccountViewModel, navContr } @Composable -fun ChatroomHeader(baseUser: User, accountUser: User, navController: NavController, proxy: Proxy?) { +fun ChatroomHeader(baseUser: User, accountUser: User, navController: NavController) { Column( modifier = Modifier.clickable( onClick = { navController.navigate("User/${baseUser.pubkeyHex}") } @@ -227,7 +226,7 @@ fun ChatroomHeader(baseUser: User, accountUser: User, navController: NavControll } Row(verticalAlignment = Alignment.CenterVertically) { - ObserveDisplayNip05Status(baseUser, proxy = proxy) + ObserveDisplayNip05Status(baseUser) } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt index 46623a0efc..6c832ceac1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt @@ -1,7 +1,6 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn import android.content.Intent -import java.net.Proxy import android.net.Uri import androidx.compose.foundation.* import androidx.compose.foundation.gestures.scrollBy @@ -309,7 +308,7 @@ private fun ProfileHeader( val clipboardManager = LocalClipboardManager.current Box { - DrawBanner(baseUser, account.proxy) + DrawBanner(baseUser) Box( modifier = Modifier @@ -411,7 +410,7 @@ private fun ProfileHeader( } if (zoomImageDialogOpen) { - ZoomableImageDialog(baseUser.profilePicture()!!, onDismiss = { zoomImageDialogOpen = false }, proxy = account.proxy) + ZoomableImageDialog(baseUser.profilePicture()!!, onDismiss = { zoomImageDialogOpen = false }) } } @@ -515,7 +514,7 @@ private fun DrawAdditionalInfo(baseUser: User, account: Account, accountViewMode } } - DisplayNip05ProfileStatus(user, account.proxy) + DisplayNip05ProfileStatus(user) val website = user.info?.website if (!website.isNullOrEmpty()) { @@ -617,8 +616,7 @@ private fun DrawAdditionalInfo(baseUser: User, account: Account, accountViewMode tags = null, backgroundColor = MaterialTheme.colors.background, accountViewModel = accountViewModel, - navController = navController, - proxy = account.proxy + navController = navController ) } } @@ -688,7 +686,7 @@ fun BadgeThumb( @OptIn(ExperimentalFoundationApi::class) @Composable -private fun DrawBanner(baseUser: User, proxy: Proxy?) { +private fun DrawBanner(baseUser: User) { val userState by baseUser.live().metadata.observeAsState() val user = userState?.user ?: return @@ -714,7 +712,7 @@ private fun DrawBanner(baseUser: User, proxy: Proxy?) { ) if (zoomImageDialogOpen) { - ZoomableImageDialog(imageUrl = banner, onDismiss = { zoomImageDialogOpen = false }, proxy = proxy) + ZoomableImageDialog(imageUrl = banner, onDismiss = { zoomImageDialogOpen = false }) } } else { Image( diff --git a/app/src/play/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt b/app/src/play/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt index e30a5f41e7..8100a3e9b1 100644 --- a/app/src/play/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt +++ b/app/src/play/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt @@ -35,7 +35,6 @@ import com.vitorpamplona.amethyst.service.lang.ResultOrError import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import java.net.Proxy import java.util.Locale @Composable @@ -46,8 +45,7 @@ fun TranslatableRichTextViewer( tags: List>?, backgroundColor: Color, accountViewModel: AccountViewModel, - navController: NavController, - proxy: Proxy? + navController: NavController ) { val translatedTextState = remember { mutableStateOf(ResultOrError(content, null, null, null)) @@ -89,8 +87,7 @@ fun TranslatableRichTextViewer( tags, backgroundColor, accountViewModel, - navController, - proxy + navController ) val target = translatedTextState.value.targetLang From 5d9d7ba16eec50964990e2f567cc219eefbeec13 Mon Sep 17 00:00:00 2001 From: greenart7c3 <115044884+greenart7c3@users.noreply.github.com> Date: Wed, 26 Apr 2023 10:19:30 -0300 Subject: [PATCH 008/171] created getProxy function --- .../java/com/vitorpamplona/amethyst/service/HttpClient.kt | 4 ++++ .../java/com/vitorpamplona/amethyst/service/relays/Client.kt | 4 ++-- .../com/vitorpamplona/amethyst/service/relays/Constants.kt | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/HttpClient.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/HttpClient.kt index cf627893d0..a711f2cabd 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/HttpClient.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/HttpClient.kt @@ -14,4 +14,8 @@ object HttpClient { fun getHttpClient(): OkHttpClient { return OkHttpClient.Builder().proxy(proxy).build() } + + fun getProxy(): Proxy? { + return proxy + } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt index b1ef135a9b..9604765b04 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt @@ -1,5 +1,6 @@ package com.vitorpamplona.amethyst.service.relays +import com.vitorpamplona.amethyst.service.HttpClient import com.vitorpamplona.amethyst.service.model.Event import com.vitorpamplona.amethyst.service.model.EventInterface import kotlinx.coroutines.DelicateCoroutinesApi @@ -76,8 +77,7 @@ object Client : RelayPool.Listener { } } else { /** temporary connection */ - /** TODO: set the proxy for this temporary connection */ - Relay(relay, false, true, emptySet(), null).requestAndWatch() { + Relay(relay, false, true, emptySet(), HttpClient.getProxy()).requestAndWatch() { it.send(signedEvent) it.disconnect() } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Constants.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Constants.kt index 9f5477687a..d62179f8d4 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Constants.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Constants.kt @@ -1,6 +1,7 @@ package com.vitorpamplona.amethyst.service.relays import com.vitorpamplona.amethyst.model.RelaySetupInfo +import com.vitorpamplona.amethyst.service.HttpClient object Constants { val activeTypes = setOf(FeedType.FOLLOWS, FeedType.PRIVATE_DMS) @@ -10,8 +11,7 @@ object Constants { fun convertDefaultRelays(): Array { return defaultRelays.map { - /** TODO: set the proxy */ - Relay(it.url, it.read, it.write, it.feedTypes, null) + Relay(it.url, it.read, it.write, it.feedTypes, HttpClient.getProxy()) }.toTypedArray() } From 3217d5095b7f9f9793293369bdd83e99a57f9705 Mon Sep 17 00:00:00 2001 From: greenart7c3 <115044884+greenart7c3@users.noreply.github.com> Date: Wed, 26 Apr 2023 11:54:04 -0300 Subject: [PATCH 009/171] created initProxy --- .../java/com/vitorpamplona/amethyst/LocalPreferences.kt | 5 ++--- .../java/com/vitorpamplona/amethyst/service/HttpClient.kt | 5 +++++ .../vitorpamplona/amethyst/ui/navigation/DrawerContent.kt | 5 ++--- .../amethyst/ui/screen/AccountStateViewModel.kt | 7 +++---- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt index 40b6d817ea..1b443d4aaa 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt @@ -8,6 +8,7 @@ import com.google.gson.reflect.TypeToken import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.RelaySetupInfo import com.vitorpamplona.amethyst.model.toByteArray +import com.vitorpamplona.amethyst.service.HttpClient import com.vitorpamplona.amethyst.service.model.ContactListEvent import com.vitorpamplona.amethyst.service.model.Event import com.vitorpamplona.amethyst.service.model.Event.Companion.getRefinedEvent @@ -17,8 +18,6 @@ import nostr.postr.Persona import nostr.postr.toHex import nostr.postr.toNpub import java.io.File -import java.net.InetSocketAddress -import java.net.Proxy import java.util.Locale // Release mode (!BuildConfig.DEBUG) always uses encrypted preferences @@ -256,7 +255,7 @@ object LocalPreferences { val hideDeleteRequestDialog = getBoolean(PrefKeys.HIDE_DELETE_REQUEST_DIALOG, false) val hideBlockAlertDialog = getBoolean(PrefKeys.HIDE_BLOCK_ALERT_DIALOG, false) val useProxy = getBoolean(PrefKeys.USE_PROXY, false) - var proxy = if (useProxy) Proxy(Proxy.Type.SOCKS, InetSocketAddress("127.0.0.1", 9050)) else null + val proxy = HttpClient.initProxy(useProxy, "127.0.0.1", 9050) val a = Account( Persona(privKey = privKey?.toByteArray(), pubKey = pubKey.toByteArray()), diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/HttpClient.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/HttpClient.kt index a711f2cabd..79c9018ada 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/HttpClient.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/HttpClient.kt @@ -2,6 +2,7 @@ package com.vitorpamplona.amethyst.service import com.vitorpamplona.amethyst.model.Account import okhttp3.OkHttpClient +import java.net.InetSocketAddress import java.net.Proxy object HttpClient { @@ -18,4 +19,8 @@ object HttpClient { fun getProxy(): Proxy? { return proxy } + + fun initProxy(useProxy: Boolean, hostname: String, port: Int): Proxy? { + return if (useProxy) Proxy(Proxy.Type.SOCKS, InetSocketAddress(hostname, port)) else null + } } 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 3126cc4ab1..f328efbd3c 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 @@ -49,13 +49,12 @@ import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.ServiceManager import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.User +import com.vitorpamplona.amethyst.service.HttpClient import com.vitorpamplona.amethyst.ui.components.ResizeImage import com.vitorpamplona.amethyst.ui.components.RobohashAsyncImageProxy import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountBackupDialog import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import kotlinx.coroutines.launch -import java.net.InetSocketAddress -import java.net.Proxy @OptIn(ExperimentalMaterialApi::class) @Composable @@ -283,7 +282,7 @@ fun ListContent( onClick = { checked = !checked println("changed tor to $checked") - account.proxy = if (checked) Proxy(Proxy.Type.SOCKS, InetSocketAddress("127.0.0.1", 9050)) else null + account.proxy = HttpClient.initProxy(checked, "127.0.0.1", 9050) ServiceManager.pause() ServiceManager.start() } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt index d6872f808c..79e306176e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt @@ -5,6 +5,7 @@ import com.vitorpamplona.amethyst.LocalPreferences import com.vitorpamplona.amethyst.ServiceManager import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.toByteArray +import com.vitorpamplona.amethyst.service.HttpClient import com.vitorpamplona.amethyst.service.nip19.Nip19 import fr.acinq.secp256k1.Hex import kotlinx.coroutines.CoroutineScope @@ -18,8 +19,6 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import nostr.postr.Persona import nostr.postr.bechToBytes -import java.net.InetSocketAddress -import java.net.Proxy import java.util.regex.Pattern class AccountStateViewModel() : ViewModel() { @@ -45,7 +44,7 @@ class AccountStateViewModel() : ViewModel() { val pattern = Pattern.compile(".+@.+\\.[a-z]+") val parsed = Nip19.uriToRoute(key) val pubKeyParsed = parsed?.hex?.toByteArray() - var proxy = if (useProxy) Proxy(Proxy.Type.SOCKS, InetSocketAddress("127.0.0.1", 9050)) else null + val proxy = HttpClient.initProxy(useProxy, "127.0.0.1", 9050) val account = if (key.startsWith("nsec")) { @@ -70,7 +69,7 @@ class AccountStateViewModel() : ViewModel() { } fun newKey(useProxy: Boolean) { - var proxy = if (useProxy) Proxy(Proxy.Type.SOCKS, InetSocketAddress("127.0.0.1", 9050)) else null + var proxy = HttpClient.initProxy(useProxy, "127.0.0.1", 9050) val account = Account(Persona(), proxy = proxy) // saves to local preferences LocalPreferences.updatePrefsForLogin(account) From 77a1b2ba89c49ccd298d4e436ca09052bd6bd3af Mon Sep 17 00:00:00 2001 From: greenart7c3 <115044884+greenart7c3@users.noreply.github.com> Date: Wed, 26 Apr 2023 14:41:36 -0300 Subject: [PATCH 010/171] show a dialog when disabling tor --- .../amethyst/ui/navigation/DrawerContent.kt | 53 +++++++++++++++++-- 1 file changed, 48 insertions(+), 5 deletions(-) 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 f328efbd3c..696faf20c6 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 @@ -15,6 +15,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.AlertDialog import androidx.compose.material.Divider import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.Icon @@ -24,7 +25,9 @@ import androidx.compose.material.ModalBottomSheetState import androidx.compose.material.ScaffoldState import androidx.compose.material.Surface import androidx.compose.material.Text +import androidx.compose.material.TextButton import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf @@ -235,6 +238,7 @@ fun ListContent( val coroutineScope = rememberCoroutineScope() var backupDialogOpen by remember { mutableStateOf(false) } var checked by remember { mutableStateOf(account.proxy != null) } + val openDialog = remember { mutableStateOf(false) } Column(modifier = modifier.fillMaxHeight()) { if (accountUser != null) { @@ -280,11 +284,12 @@ fun ListContent( icon = R.drawable.ic_tor, tint = MaterialTheme.colors.onBackground, onClick = { - checked = !checked - println("changed tor to $checked") - account.proxy = HttpClient.initProxy(checked, "127.0.0.1", 9050) - ServiceManager.pause() - ServiceManager.start() + if (checked) { + openDialog.value = true + } else { + checked = true + enableTor(account, true, openDialog) + } } ) @@ -301,6 +306,44 @@ fun ListContent( if (backupDialogOpen) { AccountBackupDialog(account, onClose = { backupDialogOpen = false }) } + + if (openDialog.value) { + AlertDialog( + text = { Text(text = "Do you really want to disable tor?") }, + onDismissRequest = { }, + confirmButton = { + TextButton( + onClick = { + openDialog.value = false + checked = false + enableTor(account, false, openDialog) + } + ) { + Text(text = "Yes") + } + }, + dismissButton = { + TextButton( + onClick = { + openDialog.value = false + } + ) { + Text(text = "No") + } + } + ) + } +} + +private fun enableTor( + account: Account, + checked: Boolean, + openDialog: MutableState +) { + account.proxy = HttpClient.initProxy(checked, "127.0.0.1", 9050) + ServiceManager.pause() + ServiceManager.start() + openDialog.value = false } @Composable From 6285bfaae7a6c20bc4badfdf3ab29014c74ba064 Mon Sep 17 00:00:00 2001 From: greenart7c3 <115044884+greenart7c3@users.noreply.github.com> Date: Fri, 28 Apr 2023 08:15:04 -0300 Subject: [PATCH 011/171] updated string.xml --- .../vitorpamplona/amethyst/ui/navigation/DrawerContent.kt | 8 ++++---- .../amethyst/ui/screen/loggedOff/LoginScreen.kt | 2 +- app/src/main/res/values/strings.xml | 6 ++++++ 3 files changed, 11 insertions(+), 5 deletions(-) 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 696faf20c6..f8bb405be5 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 @@ -277,7 +277,7 @@ fun ListContent( onClick = { backupDialogOpen = true } ) - var textTorProxy = if (checked) "Disable" else "Enable" + var textTorProxy = if (checked) stringResource(R.string.disable) else stringResource(R.string.enable) IconRow( title = "$textTorProxy Tor", @@ -309,7 +309,7 @@ fun ListContent( if (openDialog.value) { AlertDialog( - text = { Text(text = "Do you really want to disable tor?") }, + text = { Text(text = stringResource(R.string.do_you_really_want_to_disable_tor)) }, onDismissRequest = { }, confirmButton = { TextButton( @@ -319,7 +319,7 @@ fun ListContent( enableTor(account, false, openDialog) } ) { - Text(text = "Yes") + Text(text = stringResource(R.string.yes)) } }, dismissButton = { @@ -328,7 +328,7 @@ fun ListContent( openDialog.value = false } ) { - Text(text = "No") + Text(text = stringResource(R.string.no)) } } ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt index 6533d1c906..ea229bbdcb 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt @@ -228,7 +228,7 @@ fun LoginPage( onCheckedChange = { useProxy.value = it } ) - Text("Enable Tor") + Text(stringResource(R.string.connect_via_tor)) } Spacer(modifier = Modifier.height(20.dp)) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f1878907d7..17f760024c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -292,4 +292,10 @@ Create and Add Poll authors can\'t vote in their own polls. #zappoll + Connect via Tor + Do you really want to disable tor? + Disable + Enable + Yes + No From 20a65a0878909874dea327d514bd2eff5878b038 Mon Sep 17 00:00:00 2001 From: greenart7c3 <115044884+greenart7c3@users.noreply.github.com> Date: Fri, 28 Apr 2023 11:21:06 -0300 Subject: [PATCH 012/171] check if orbot is installed --- app/src/main/AndroidManifest.xml | 4 +++- .../amethyst/ui/navigation/DrawerContent.kt | 4 ++-- .../ui/screen/loggedOff/LoginScreen.kt | 19 +++++++++++++------ app/src/main/res/values/strings.xml | 7 +++---- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3735c465f9..0cad4951ab 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,9 @@ - + + + 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 f8bb405be5..79f5d168f2 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 @@ -277,10 +277,10 @@ fun ListContent( onClick = { backupDialogOpen = true } ) - var textTorProxy = if (checked) stringResource(R.string.disable) else stringResource(R.string.enable) + val textTorProxy = if (checked) stringResource(R.string.disconnect_from_your_orbot_setup) else stringResource(R.string.connect_via_tor) IconRow( - title = "$textTorProxy Tor", + title = textTorProxy, icon = R.drawable.ic_tor, tint = MaterialTheme.colors.onBackground, onClick = { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt index ea229bbdcb..d8b66015da 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt @@ -1,5 +1,6 @@ package com.vitorpamplona.amethyst.ui.screen.loggedOff +import android.content.Context import androidx.compose.foundation.Image import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState @@ -222,13 +223,15 @@ fun LoginPage( } } - Row(verticalAlignment = Alignment.CenterVertically) { - Checkbox( - checked = useProxy.value, - onCheckedChange = { useProxy.value = it } - ) + if (isPackageInstalled(context, "org.torproject.android")) { + Row(verticalAlignment = Alignment.CenterVertically) { + Checkbox( + checked = useProxy.value, + onCheckedChange = { useProxy.value = it } + ) - Text(stringResource(R.string.connect_via_tor)) + Text(stringResource(R.string.connect_via_tor)) + } } Spacer(modifier = Modifier.height(20.dp)) @@ -290,3 +293,7 @@ fun LoginPage( ) } } + +fun isPackageInstalled(context: Context, target: String): Boolean { + return context.packageManager.getInstalledApplications(0).find { info -> info.packageName == target } != null +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 17f760024c..e23e9f41ba 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -292,10 +292,9 @@ Create and Add Poll authors can\'t vote in their own polls. #zappoll - Connect via Tor - Do you really want to disable tor? - Disable - Enable + Connect through your Orbot setup + Do you really want to disconnect from your Orbot setup? Yes No + Disconnect from your Orbot setup From 264d6a40b3d7931266956bf2545dde571ce15a88 Mon Sep 17 00:00:00 2001 From: greenart7c3 <115044884+greenart7c3@users.noreply.github.com> Date: Wed, 3 May 2023 09:00:14 -0300 Subject: [PATCH 013/171] increased the default timeout when using proxy --- .../com/vitorpamplona/amethyst/service/HttpClient.kt | 10 +++++++++- .../com/vitorpamplona/amethyst/service/relays/Relay.kt | 10 ++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/HttpClient.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/HttpClient.kt index 79c9018ada..bf2448ece3 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/HttpClient.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/HttpClient.kt @@ -4,6 +4,7 @@ import com.vitorpamplona.amethyst.model.Account import okhttp3.OkHttpClient import java.net.InetSocketAddress import java.net.Proxy +import java.time.Duration object HttpClient { private var proxy: Proxy? = null @@ -13,7 +14,14 @@ object HttpClient { } fun getHttpClient(): OkHttpClient { - return OkHttpClient.Builder().proxy(proxy).build() + val seconds = if (proxy != null) 20L else 10L + val duration = Duration.ofSeconds(seconds) + return OkHttpClient.Builder() + .proxy(proxy) + .readTimeout(duration) + .connectTimeout(duration) + .writeTimeout(duration) + .build() } fun getProxy(): Proxy? { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt index 8408e985ad..6fdbd3c0d2 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt @@ -11,6 +11,7 @@ import okhttp3.Response import okhttp3.WebSocket import okhttp3.WebSocketListener import java.net.Proxy +import java.time.Duration import java.util.Date enum class FeedType { @@ -24,12 +25,13 @@ class Relay( var activeTypes: Set = FeedType.values().toSet(), proxy: Proxy? ) { - init { - println("Tor: ${proxy != null} url: $url") - } - + val seconds = if (proxy != null) 20L else 10L + val duration = Duration.ofSeconds(seconds) private val httpClient = OkHttpClient.Builder() .proxy(proxy) + .readTimeout(duration) + .connectTimeout(duration) + .writeTimeout(duration) .followRedirects(true) .followSslRedirects(true) .build() From 9c30547bd7f439c918950cfc804ca3b9c743d52f Mon Sep 17 00:00:00 2001 From: greenart7c3 <115044884+greenart7c3@users.noreply.github.com> Date: Fri, 5 May 2023 06:34:14 -0300 Subject: [PATCH 014/171] fix build --- app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt | 2 +- .../java/com/vitorpamplona/amethyst/service/relays/Client.kt | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index c029862647..8418532862 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -20,9 +20,9 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import nostr.postr.Persona -import java.net.Proxy import nostr.postr.Utils import java.math.BigDecimal +import java.net.Proxy import java.util.Locale val DefaultChannels = setOf( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt index 44bed20987..3fb91722fc 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt @@ -109,7 +109,6 @@ object Client : RelayPool.Listener { if (onDone != null) { onDone() - } } } From 28521c1a60e6cebaf7574d0ff8bd188838a35f22 Mon Sep 17 00:00:00 2001 From: greenart7c3 <115044884+greenart7c3@users.noreply.github.com> Date: Fri, 5 May 2023 08:25:48 -0300 Subject: [PATCH 015/171] add configuration screen when enabling tor in the drawer --- .../amethyst/ui/navigation/DrawerContent.kt | 27 +++-- .../ui/screen/loggedIn/ConnectOrbotDialog.kt | 105 ++++++++++++++++++ app/src/main/res/values/strings.xml | 10 ++ 3 files changed, 135 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ConnectOrbotDialog.kt 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 79f5d168f2..d2828ef6f6 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 @@ -27,7 +27,6 @@ import androidx.compose.material.Surface import androidx.compose.material.Text import androidx.compose.material.TextButton import androidx.compose.runtime.Composable -import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf @@ -48,6 +47,7 @@ import androidx.navigation.NavController import androidx.navigation.NavHostController import coil.compose.AsyncImage import com.vitorpamplona.amethyst.BuildConfig +import com.vitorpamplona.amethyst.LocalPreferences import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.ServiceManager import com.vitorpamplona.amethyst.model.Account @@ -57,6 +57,7 @@ import com.vitorpamplona.amethyst.ui.components.ResizeImage import com.vitorpamplona.amethyst.ui.components.RobohashAsyncImageProxy import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountBackupDialog import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel +import com.vitorpamplona.amethyst.ui.screen.loggedIn.ConnectOrbotDialog import kotlinx.coroutines.launch @OptIn(ExperimentalMaterialApi::class) @@ -239,6 +240,7 @@ fun ListContent( var backupDialogOpen by remember { mutableStateOf(false) } var checked by remember { mutableStateOf(account.proxy != null) } val openDialog = remember { mutableStateOf(false) } + var conectOrbotDialogOpen by remember { mutableStateOf(false) } Column(modifier = modifier.fillMaxHeight()) { if (accountUser != null) { @@ -287,8 +289,7 @@ fun ListContent( if (checked) { openDialog.value = true } else { - checked = true - enableTor(account, true, openDialog) + conectOrbotDialogOpen = true } } ) @@ -307,6 +308,19 @@ fun ListContent( AccountBackupDialog(account, onClose = { backupDialogOpen = false }) } + if (conectOrbotDialogOpen) { + ConnectOrbotDialog( + account = account, + onClose = { conectOrbotDialogOpen = false }, + onPost = { + conectOrbotDialogOpen = false + openDialog.value = false + checked = true + enableTor(account, true) + } + ) + } + if (openDialog.value) { AlertDialog( text = { Text(text = stringResource(R.string.do_you_really_want_to_disable_tor)) }, @@ -316,7 +330,7 @@ fun ListContent( onClick = { openDialog.value = false checked = false - enableTor(account, false, openDialog) + enableTor(account, false) } ) { Text(text = stringResource(R.string.yes)) @@ -337,13 +351,12 @@ fun ListContent( private fun enableTor( account: Account, - checked: Boolean, - openDialog: MutableState + checked: Boolean ) { account.proxy = HttpClient.initProxy(checked, "127.0.0.1", 9050) + LocalPreferences.saveToEncryptedStorage(account) ServiceManager.pause() ServiceManager.start() - openDialog.value = false } @Composable 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 new file mode 100644 index 0000000000..2e2655e0ee --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ConnectOrbotDialog.kt @@ -0,0 +1,105 @@ +package com.vitorpamplona.amethyst.ui.screen.loggedIn + +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.text.KeyboardOptions +import androidx.compose.material.MaterialTheme +import androidx.compose.material.OutlinedTextField +import androidx.compose.material.Surface +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.KeyboardCapitalization +import androidx.compose.ui.text.input.KeyboardType +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.model.Account +import com.vitorpamplona.amethyst.ui.actions.CloseButton +import com.vitorpamplona.amethyst.ui.actions.PostButton + +@Composable +fun ConnectOrbotDialog(account: Account, onClose: () -> Unit, onPost: () -> Unit) { + var portNumber by remember { mutableStateOf("9050") } + + Dialog( + onDismissRequest = onClose, + properties = DialogProperties(usePlatformDefaultWidth = false) + ) { + Surface(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .padding(10.dp) + .background(MaterialTheme.colors.background) + .fillMaxSize() + ) { + Row( + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.fillMaxWidth() + ) { + CloseButton(onCancel = { + onClose() + }) + + PostButton( + onPost = { + onPost() + }, + isActive = true + ) + } + + Column( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 30.dp) + ) { + MaterialRichText( + style = RichTextStyle().resolveDefaults() + ) { + Markdown( + content = stringResource(R.string.connect_through_your_orbot_setup_markdown) + ) + } + + Spacer(modifier = Modifier.height(10.dp)) + + OutlinedTextField( + value = portNumber, + onValueChange = { portNumber = 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) + ) + } + ) + } + } + } + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a53d1cd45d..07ee6bf1ce 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -358,5 +358,15 @@ Follow List All Follows Global + + ## Connect through your Orbot setup + \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 + \n5. Configure the Socks port in this screen + \n6. Press the post button to use Orbot as a proxy + + Orbot Socks Port From e1c3191f31008d2c9e4d704f5267035b3d3eae5c Mon Sep 17 00:00:00 2001 From: L <68351083+malimahda@users.noreply.github.com> Date: Sun, 7 May 2023 22:18:25 +0330 Subject: [PATCH 016/171] Update strings.xml --- app/src/main/res/values/strings.xml | 48 ++++++++++++++--------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 143f5b6b18..ad2ea45675 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,32 +1,32 @@ Amethyst Amethyst Debug - Point to the QR Code + Point to the QR code Show QR - Profile Image + تصویر پروفایل Scan QR - Show Anyway - Post was flagged as inappropriate by - Post not found - Channel Image - Referenced event not found - Could Not decrypt the message - Group Picture - Explicit Content - Spam - Impersonation - Illegal Behavior - Unknown - Relay Icon - Unknown Author - Copy Text - Copy Author ID - Copy Note ID - Broadcast - Request Deletion - - Report Spam / Scam - Report Impersonation + بهر حال نشان بده + این پست توسط این افراد نامناسب اعلام شده + این پست یافت نشد + تصویر کانال + رویداد مربوطه یافت نشد + قادر به رمزگشایی پیام نیست + تصویر گروه + محتوای آشکار + اسپم + جعل هویت + رفتار ناهنجار + ناشناس + آیکن رله + نویسنده ناشناس + کپی متن + کپی آیدی نویسنده + کپی آیدی نوت + انتشار + درخواست حذف/string> + بلاک/پنهان کردن کاربر + گزارش اسپم/ کلاهبرداری + گزارش جعل هویت Report Explicit Content Report Illegal Behaviour Login with a Private key to be able to reply From b829a42d76a4c826fbf72ca456404c91cfd51960 Mon Sep 17 00:00:00 2001 From: L <68351083+malimahda@users.noreply.github.com> Date: Sun, 7 May 2023 22:45:58 +0330 Subject: [PATCH 017/171] Update strings.xml --- app/src/main/res/values/strings.xml | 74 ++++++++++++++--------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ad2ea45675..85c71b8757 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,10 +1,10 @@ Amethyst Amethyst Debug - Point to the QR code - Show QR + اشاره کنید QR به کد + را نشان بده QR تصویر پروفایل - Scan QR + QRاسکن بهر حال نشان بده این پست توسط این افراد نامناسب اعلام شده این پست یافت نشد @@ -12,7 +12,7 @@ رویداد مربوطه یافت نشد قادر به رمزگشایی پیام نیست تصویر گروه - محتوای آشکار + محتوای نامناسب اسپم جعل هویت رفتار ناهنجار @@ -27,39 +27,39 @@ بلاک/پنهان کردن کاربر گزارش اسپم/ کلاهبرداری گزارش جعل هویت - Report Explicit Content - Report Illegal Behaviour - Login with a Private key to be able to reply - Login with a Private key to be able to boost posts - Login with a Private key to like Posts - No Zap Amount Setup. Long Press to change - Login with a Private key to be able to send Zaps - Zaps - View count - Boost - boosted - Quote - New Amount in Sats - Add - "replying to " - " and " - "in channel " - Profile Banner - " Following" - " Followers" - Profile - Security Filters - Logout - Show More - Lightning Invoice - Pay - Lightning Tips - Note to Receiver - Thank you so much! - Amount in Sats - Send Sats - "Error parsing preview for %1$s : %2$s" - "Preview Card Image for %1$s" + گزارش محتوای نامناسب + گزارش رفتار ناهنجار + با کلید خصوصی وارد شوید تا بتوانید پاسخ دهید + با کلید خصوصی وارد شوید تا بتوانید نوت را بازارسال کنید + با کلید خصوصی وارد شوید تا بتوانید نوت را لایک کنید + مقداری برای زب تعیین نشده. نگه دارید تا تغییر دهید + با کلید خصوصی وارد شوید تا بتوانید زپ کنید + زپ + دیدن تعداد + بازارسال + بازارسال شده + نقل قول + مبلغ جدید به ساتوشی + افزودن + " پاسخ به" + " و " + "در کانال " + بنر پروفایل + " دنبال شونده" + " دنبال کننده" + پروفایل + فیلترهای ایمنی + خروج + ادامه + اینویس لایتنینگ + پرداخت + انعام لایتنینگ + یادداشت برای گیرنده + !خیلی ممنون + مبلغ به ساتوشی + ارسال ساتوشی + " %1$s : %2$s خطا در تبدیل" + "%1$s پیش نمایش تصویر کارت برای" New Channel Channel Name My Awesome Group From 839e00ae36b2e58e79f310c1d3e8168eccba03f8 Mon Sep 17 00:00:00 2001 From: L <68351083+malimahda@users.noreply.github.com> Date: Sun, 7 May 2023 22:50:37 +0330 Subject: [PATCH 018/171] Update strings.xml --- app/src/main/res/values/strings.xml | 32 ++++++++++++++--------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 85c71b8757..2cfca4e7d0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -60,22 +60,22 @@ ارسال ساتوشی " %1$s : %2$s خطا در تبدیل" "%1$s پیش نمایش تصویر کارت برای" - New Channel - Channel Name - My Awesome Group - Picture Url - Description - "About us.. " - What\'s on your mind? - Post - Save - Create - Cancel - Failed to upload the image - Relay Address - Posts - Bytes - Errors + کانال جدید + نام کانال + گروه باحال من + آدرس تصویر + توصیف + "درباره ما.. " + به چی فکر میکنی؟ + ارسال + ذخیره + ساختن + لغو + تصویر بارگذاری نشد + آدرس رله + نوت ها + بایت + خطاها Home Feed Private Message Feed Public Chat Feed From faf215110a6651a73ead8e6a600ef7a7da03e64b Mon Sep 17 00:00:00 2001 From: L <68351083+malimahda@users.noreply.github.com> Date: Sun, 7 May 2023 23:34:27 +0330 Subject: [PATCH 019/171] Update strings.xml --- app/src/main/res/values/strings.xml | 96 ++++++++++++++--------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2cfca4e7d0..ec2ea4282d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -20,8 +20,8 @@ آیکن رله نویسنده ناشناس کپی متن - کپی آیدی نویسنده - کپی آیدی نوت + کپی شناسه نویسنده + کپی شناسه نوت انتشار درخواست حذف/string> بلاک/پنهان کردن کاربر @@ -76,52 +76,52 @@ نوت ها بایت خطاها - Home Feed - Private Message Feed - Public Chat Feed - Global Feed - Search Feed - Add a Relay - Display Name - My display name - Username - My username - About me - Avatar URL - Banner URL - Website URL - LN Address - LN URL (outdated) - Image saved to the gallery - Failed to save the image - Upload Image - Uploading… - User does not have a lightning address setup to receive sats - "reply here.. " - Copies the Note ID to the clipboard for sharing - Copy Channel ID (Note) to the Clipboard - Edits the Channel Metadata - Join - Known - New Requests - Blocked Users - New Threads - Conversations - Notes - Replies - "Follows" - "Reports" - More Options - " Relays" - Website - Lightning Address - Copies the Nsec ID (your password) to the clipboard for backup - Copy Secret Key to the Clipboard - Copies the public key to the clipboard for sharing - Copy Public Key (NPub) to the Clipboard - Send a Direct Message - Edits the User\'s Metadata - Follow + خبرنامه اصلی + پیام خصوصی + گفتگوی عمومی + خبرنامه همگانی + جستجو در خبرنامه + افزودن رله + نمایش نام + نام من + نام کاربری + نام کاربری من + درباره من + آدرس آواتار + آدرس بنر + آدری وبسایت + آدرس لایتنینگ + آدرس لایتنینگ(نقل شده) + تصویر در گالری ذخیره شد + تصویر خیره نشد + بارگذاری تصویر + در حال بارگذازی... + کاربر آدرس لایتنینگ برای دریافت ساتوشی تنظیم نکرده است + "اینجا پاسخ دهید... " + شناسه نوت را برای اشتراک گذاری در کلیپبورد ذخیره می کند + ذخیره شناسه کانال در کلیپبورد + متادیتای کانال را ذخیره می کند + پیوستن + شناس + در خواست جدید + کاربران بلاک شده + رشته جدید + گفتگوها + نوت ها + پاسخ ها + "دنبال شوندگان" + "گزارش ها" + انتخاب های بیشتر + "رله ها" + وبسایت + آدرس لایتنینگ + شناسه کلید خصوصی (پسوردتان) را در کلیپبورد کپی می کند( + کپی کردن کلید خصوصی در کلیپبورد + کلید عمومی را برای اشتراک گذاری در کلیپبورد ذخیره می کند + کپی کردن کلید عمومی در کلیپبورد + ارسال پیام مستقیم + متادیتای کاربر را ویرایش می کند + دنبال کردن Follow back Unblock Copy User ID From 43156e3e11b560b4e8c6748585e0c6f89aabf964 Mon Sep 17 00:00:00 2001 From: L <68351083+malimahda@users.noreply.github.com> Date: Sun, 7 May 2023 23:51:47 +0330 Subject: [PATCH 020/171] Update strings.xml --- app/src/main/res/values/strings.xml | 34 ++++++++++++++--------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ec2ea4282d..df526805f6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -122,23 +122,23 @@ ارسال پیام مستقیم متادیتای کاربر را ویرایش می کند دنبال کردن - Follow back - Unblock - Copy User ID - Unblock User - "npub, hex, username " - Clear - App Logo - nsec / npub / hex private key - Show Password - Hide Password - Invalid key - "I accept the " - terms of use - Acceptance of terms is required - Key is required - Login - Generate a new key + دنبال کردن متقابل + از بلاک درآوردن + کپی شناسه کاربر + از بلاک درآوردن کاربر + "npub, hex, نام کاربری " + پاک کردن + لوگوی اپ + nsec / npub / hex کلید خصوصی + نشان دادن پسورد + پنهان کردن پسورد + کلید نامعتبر + "می پذیرم " + شرایط استفاده + پذیرش شرایط الازمیست + کلید الزامیست + ورود + ساختن کلید جدید Loading feed "Error loading replies: " Try again From 69a130240464ddb3ba981531adafcb1d4c68f2d3 Mon Sep 17 00:00:00 2001 From: L <68351083+malimahda@users.noreply.github.com> Date: Mon, 8 May 2023 09:47:05 +0330 Subject: [PATCH 021/171] Update strings.xml --- app/src/main/res/values/strings.xml | 72 ++++++++++++++--------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index df526805f6..b128967b6b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,9 +2,9 @@ Amethyst Amethyst Debug اشاره کنید QR به کد - را نشان بده QR + کد را نشان بده QR تصویر پروفایل - QRاسکن + کد QR اسکن بهر حال نشان بده این پست توسط این افراد نامناسب اعلام شده این پست یافت نشد @@ -25,14 +25,14 @@ انتشار درخواست حذف/string> بلاک/پنهان کردن کاربر - گزارش اسپم/ کلاهبرداری + گزارش اسپم/کلاهبرداری گزارش جعل هویت گزارش محتوای نامناسب گزارش رفتار ناهنجار با کلید خصوصی وارد شوید تا بتوانید پاسخ دهید با کلید خصوصی وارد شوید تا بتوانید نوت را بازارسال کنید با کلید خصوصی وارد شوید تا بتوانید نوت را لایک کنید - مقداری برای زب تعیین نشده. نگه دارید تا تغییر دهید + مقداری برای زپ تعیین نشده. نگه دارید تا تغییر دهید با کلید خصوصی وارد شوید تا بتوانید زپ کنید زپ دیدن تعداد @@ -45,8 +45,8 @@ " و " "در کانال " بنر پروفایل - " دنبال شونده" - " دنبال کننده" + "دنبال شونده" + "دنبال کننده" پروفایل فیلترهای ایمنی خروج @@ -93,11 +93,11 @@ آدرس لایتنینگ آدرس لایتنینگ(نقل شده) تصویر در گالری ذخیره شد - تصویر خیره نشد + تصویر ذخیره نشد بارگذاری تصویر - در حال بارگذازی... - کاربر آدرس لایتنینگ برای دریافت ساتوشی تنظیم نکرده است - "اینجا پاسخ دهید... " + ...در حال بارگذاری + این کاربر آدرس لایتنینگ برای دریافت ساتوشی تنظیم نکرده است + "...اینجا پاسخ دهید " شناسه نوت را برای اشتراک گذاری در کلیپبورد ذخیره می کند ذخیره شناسه کانال در کلیپبورد متادیتای کانال را ذخیره می کند @@ -138,32 +138,32 @@ پذیرش شرایط الازمیست کلید الزامیست ورود - ساختن کلید جدید - Loading feed - "Error loading replies: " - Try again - Feed is empty. - Refresh - created - with description of - and picture - changed chat name to - description to - and picture to - Leave - Unfollow - Channel created - "Channel Information changed to" - Public Chat - posts received - Remove - sats - Auto - translated from - to - Show in %1$s first - Always translate to %1$s - Never translate from %1$s + ساختن جفت کلید جدید + در حال بارگذاری خبرنامه + " :خطا در بارگذاری پاسخ ها" + دوباره تلاش کنید + خبرنامه خالیست + تازه سازی + ساخته شد + با توصیف + و تصویر + نام گفتگو تغییر کرد به + تصویر + و تصویر به + ترک کردن + دنبال نکردن + کانال ساخته شد + "اطلاعات کانال تغییر کرد به" + گفتگوی عمومی + نوت های دریافت شده + بیرون کردن + ساتوشی + خودکار + ترجمه از + به + نشان بده s%1$ ابتدا به + همیشه به ترجمه کن %1$s + هرگز به ترجمه نکن %1$s NIP-05 LNURL... never From 915f7c07e81c9af729c87afad3adcf6342f03df6 Mon Sep 17 00:00:00 2001 From: L <68351083+malimahda@users.noreply.github.com> Date: Mon, 8 May 2023 10:40:59 +0330 Subject: [PATCH 022/171] Update strings.xml --- app/src/main/res/values/strings.xml | 116 ++++++++++++++-------------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b128967b6b..7cca70c5c1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -166,39 +166,39 @@ هرگز به ترجمه نکن %1$s NIP-05 LNURL... - never - now + هرگز + اکنون h m d - Nudity - Profanity / Hateful speech - Report Hateful speech - Report Nudity / Porn - others - Mark all Known as read - Mark all New as read - Mark all as read - Backup Keys + برهنگی + ناسزا / نفرت پراکنی + گزارش نفرت پراکنی + گزارش برهنگی / پورن + سایر + همه شناس ها خوانده شده کن + همه جدیدها را خوانده شده کن + همه را خوانده شده کن + بازیابی کلیدها - ## Key Backup and Safety Tips - \n\nYour account is secured by a secret key. The key is long random string starting with **nsec1**. Anyone who has access to your secret key can publish content using your identity. - \n\n- Do **not** put your secret key in any website or software you do not trust. - \n- Amethyst developers will **never** ask you for your secret key. - \n- **Do** keep a secure backup of your secret key for account recovery. We recommend using a password manager. + ## راهنمایی برای ایمنی و بازیابی کلید + \n\n- حساب کاربری شما با یک کلید خصوصی ایمن می شود. این کلید یک رشته تصادفی اعداد و ارقام است که با **nsec1** آغاز می گردد. + \n\n- هر کس به کلید خصوصی شما دست یابد می تواند به هویت شما اقدام به انتشار محتوا نماید. کلید خصوصی خود را در هیچ نرم افزار یا وب سایتی که به آن اعتماد ندارید قرار ندیهید. + \n- سازندگان آماتیست **هرگز** از ما کلید خصوصی تان را نمی خواهند. + \n- حتما یه کپی از کلید خصوصی را برای بازیابی حساب کاربری نزد خود نگه دارد. ما استفاده از یک نرم افزار مدیریت پسورد را توصیه می نماییم. - Secret key (nsec) copied to clipboard - Copy my secret key - Authentication failed - Error - "Created by %1$s" - "Badge award image for %1$s" - You Received a new Badge Award - Badge award granted to - Copied note text to clipboard - Copied author’s @npub to clipboard - Copied note ID (@note1) to clipboard - Select Text + کلید خصوصی در کلیپبورد کپی شد + کلید خصوصیم را کپی کن + صحت سنجی انجام نشد + خطا + "ساخته شده توسط %1$s" + "تصویر مدال پاداش برای %1$s" + یک مدال پاداش دریافت کردید + مدال پاداش داده شد به + نوت در کلیپبورد کپی شد + نویسنده در کلیپبورد کپی شد @npub + شناسه نوت در کلیپبورد کپی شد (@note1) + انتخاب متن Github Gist w/ Proof Telegram Mastodon Post ID w/ Proof @@ -207,37 +207,37 @@ https://t.me/<proof post> https://<server>/<user>/<proof post> https://twitter.com/<user>/status/<proof post> - "<Unable to decrypt private message>\n\nYou were cited in a private/encrypted conversation between %1$s and %2$s." - Add New Account - Accounts - Select Account - Add New Account - Active account - Has private key - Read only, no private key - Back - Select - Share Browser Link - Share - Author ID - Note ID - Copy Text - Delete - Unfollow - Follow + "<نمی توان پیام خصوصی را رمزگشایی کردن>\n\nYou در پیام خصوصی/رمزگذاری شده بین و به شما اشاره شده %1$s %2$s." + افزودن حساب کاربری جدید + حساب های کاربری + انتخاب حساب کارگری + افزودن حساب کاربری جدید + حساب کاربری فعال + کلید خصوصی دارد + فقط خواندن، کلید خصوصی ندارد + بازگشت + انتخاب + اشتراک گذاری لینک پیمایش + اشتراک گذاری + شناسه نویسنده + شناسه نوت + کپی متن + حذف + دنبال نکردن + دنبال کردن Request Deletion - Amethyst will request that your note be deleted from the relays you are currently connected to. There is no guarantee that your note will be permanently deleted from those relays, or from other relays where it may be stored. - Block - Delete - Block - Report - Delete - Don\'t show again - Spam or scams - Profanity or hateful conduct - Malicious impersonation - Nudity or graphic content - Illegal Behavior + آماتیست درخواست می کند که نوت شما از رله هایی که درحال حاضر به آن متصل هستید حذف شود. هیچ تضمینی نیست که نوت شما برای همیشه از آن رله ها یا از رله های دیگری که ممکن است در آنها ذخیره شده باشد حذف خواهد شد.. + بلاک + حذف + بلاک + گزارش + حذف + دوباره نشان نده + اسپم یا کلاهبرداری + محتوای نفرت پراکنی یا ناسزا + جعل هویت بدخواهانه + محتوای برهنگی یا نمایان + رفتار ناهنجار Blocking a user will hide their content in your app. Your notes are still publicly viewable, including to people you block. Blocked users are listed on the Security Filters screen. Report Abuse From 0bf317a8184c7d8d6b560a2037c83d296162130e Mon Sep 17 00:00:00 2001 From: L <68351083+malimahda@users.noreply.github.com> Date: Mon, 8 May 2023 12:01:21 +0330 Subject: [PATCH 023/171] Update strings.xml --- app/src/main/res/values/strings.xml | 168 ++++++++++++++-------------- 1 file changed, 84 insertions(+), 84 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7cca70c5c1..c53a975f26 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -217,7 +217,7 @@ فقط خواندن، کلید خصوصی ندارد بازگشت انتخاب - اشتراک گذاری لینک پیمایش + اشتراک گذاری لینک پیماینده اشتراک گذاری شناسه نویسنده شناسه نوت @@ -238,120 +238,120 @@ جعل هویت بدخواهانه محتوای برهنگی یا نمایان رفتار ناهنجار - Blocking a user will hide their content in your app. Your notes are still publicly viewable, including to people you block. Blocked users are listed on the Security Filters screen. + بلاک کردن کاربر محتوای ایشان را در اپ شما پنهان می کند. نوت های شما همچنا بطور عمومی دیده می شوند که شامل کاربران بلاک شده توسط شما نیز هست. کاربران بلاک شده در صفحه فیلترهای ایمنی ففهرست می شوند. - Report Abuse - All reports posted will be publicly visible. - Optionally provide additional context about your report… - Additional Context - Reason - Select a reason… - Post Report - Block and Report - Block + گزارش سواستفاده + تمام گزارش ها بطور عمومی دیده می شوند + در صورت تمایل توضیحاتی به گزارش خود بیفزایید... + توضیحات اضافه + دلایل + دلیلی انتخاب کنید... + گزارش نوت + بلاک و گزارش + بلاک - Bookmarks - Private Bookmarks - Public Bookmarks - Add to Private Bookmarks - Add to Public Bookmarks - Remove from Private Bookmarks - Remove from Public Bookmarks + علامت گذاشته ها + علامت گاشته های خصوصی + علامت گذاشته های عمومی + افزودن به علامت گذاشته های خصوصی + افزودن به علامت گذاشته های عمومی + برداشتن از علامت گذاشته های خصوصی + برداشتن از علامت گذاشته های خصوصی - Wallet Connect Service - Authorizes a Nostr Secret to pay zaps without leaving the app. Keep the secret safe and use a private relay if possible - Wallet Connect Pubkey - Wallet Connect Relay - Wallet Connect Secret - Show secret key - nsec / hex private key + خدمات اتصال به کیف پول + اجازه رمز نوستر برای پرداخت زپ بدون خارج شدن از اپ. رمز را ایمن نگه دارید و در صورت امکان از رله خصوصی استفاده کنید. + کلید عمومی اتصال به کیف پول + رله اتصال به کیف پول + رمز اتصال به کیف پول + نمایش کلید خصوصی + nsec / hex کلید خصوصی - Pledge Amount in Sats - Post Poll - Required fields: - Zap recipients - Primary poll description… - Option %s - Poll option description - Optional fields: - Zap minimum - Zap maximum - Consensus + مبلغ وثیقه به ساتوشی + ارسال نظرسنجی + قسمت های الزامی: + دریافت کنندگان زپ + توضیحات اولیه نظرسنجی… + گزینه ها %s + توضیح گزینه های نظرسنجی + قسمت های اختیاری: + حداقل زپ + حداکثر زپ + توافق نظر (0–100)% - Close after - days - Poll is closed to new votes - Zap amount - Only one vote per user is allowed on this type of poll + بسته شدن پس از + روز + نظر سنجی برای رای جدید بسته است + مبلغ زپ + - "Looking for Event %1$s" + "جستجوی رویداد %1$s" - Add a public message - Add a private message - Add an invoice message + افزودن پیام عمومی + افزودن پیام خصوصی + افزودن پیام اینویس - Thank you for all your work! + از زحمات شما متشکریم! - Create and Add - Poll authors can\'t vote in their own polls. - #zappoll + ساختن و افزودن + سازندگان نظرسنجی نمی توانند در نظر سنجی خود رای دهند. + #زپ_نظرسنجی - Image is the same since the post - Image has changed. The author might not have seen the change + تصویر از زمان ارسال یکسان است + تصویر تغییر کرده است. ممکن است نویسنده تغییر را ندیده باشد. - Add Image - Add Video - Add Document + افزودن تصویر + افزودن فیلم + افزودن مدارک - Add to Message - Description of the contents - A blue boat in a white sandy beach at sunset + افزودن به پیام + توصیف محتوا + قایقی آبی در ساحل شنی سفید هنگام غروب - Zap Type - Zap Type for all options + نوع زپ + نوع زپ برای همه گزینه ها - Public - Everybody can see the transaction and message + عمومی + همه می توانند تراکنش و پیام را ببینند - Private - Sender and Receiver can see each other and read the message + خصوصی + فرستنده و گیرنده می توانند یکدیگر و پیام را ببینند - Anonymous - Receiver and the public does not know who sent the payment + ناشناس + گیرنده و دیگران نمی دانند چه کسی پرداخت کرده است - Non-Zap - No trace in Nostr, only in Lightning + غیرزپ + هیچ ردی در نوستر نمی ماند، فقط در شبکه لایتنینگ انجام می شود - File Server - LnAddress or @User + سرور فایل + آدرس لایتنینگ یا @User - imgur.com - trusted - Imgur can modify the file + imgur.com - معتمد + Imgur میتواند فایل را بهینه کند - nostrimg.com - trusted - NostrImg can modify the file + nostrimg.com - معتمد + NostrImg میتواند فایل را بهینه کند - nostr.build - trusted + nostr.build - معتمد Nostr.build can modify the file - Verifiable Imgur (NIP-94) - Checks if Imgur modified the file. New NIP: other clients might not see it + قابل بررسی Imgur (NIP-94) + بررسی کنید که Imgur فایل را بهینه کرده یا خیر . NIPجدید : سایر کلاینت ها ممکن است آن را نبینند. - Verifiable NostrImg (NIP-94) - Checks if NostrImg modified the file. New NIP: other clients might not see it + قابل بررسی NostrImg (NIP-94) + بررسی کنید که NostrImg فایل را بهینه کرده یا خیر . NIPجدید : سایر کلاینت ها ممکن است آن را نبینند. Verifiable Nostr.build (NIP-94) - Checks if Nostr.build modified the file. New NIP: other clients might not see it + بررسی کنید که Nostr.build فایل را بهینه کرده یا خیر . NIPجدید : سایر کلاینت ها ممکن است آن را نبینند. - Your relays (NIP-95) - Files are hosted by your relays. New NIP: check if they support + رله های شما (NIP-95) + فایل ها در رله های شما میزبانی می شوند. NIPجدید: بررسی کنید آیا پشتیبانی می کنند یا خیر - Follow List - All Follows - Global + لیست دنبال ها + همه دنبال ها + همگانی From a503a1b21877776dc81bad9af5eff041c349fb31 Mon Sep 17 00:00:00 2001 From: greenart7c3 <115044884+greenart7c3@users.noreply.github.com> Date: Mon, 8 May 2023 10:45:10 -0300 Subject: [PATCH 024/171] show orbot dialog at login --- .../amethyst/LocalPreferences.kt | 9 +++-- .../vitorpamplona/amethyst/model/Account.kt | 3 +- .../amethyst/ui/navigation/DrawerContent.kt | 16 +++++---- .../ui/screen/AccountStateViewModel.kt | 18 +++++----- .../ui/screen/loggedIn/ConnectOrbotDialog.kt | 33 +++++++++++++------ .../ui/screen/loggedOff/LoginScreen.kt | 26 ++++++++++++--- 6 files changed, 72 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt index 25522fbf76..624d1bb2eb 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt @@ -56,6 +56,7 @@ private object PrefKeys { const val HIDE_DELETE_REQUEST_DIALOG = "hide_delete_request_dialog" const val HIDE_BLOCK_ALERT_DIALOG = "hide_block_alert_dialog" const val USE_PROXY = "use_proxy" + const val PROXY_PORT = "proxy_port" val LAST_READ: (String) -> String = { route -> "last_read_route_$route" } } @@ -209,8 +210,8 @@ object LocalPreferences { putString(PrefKeys.LATEST_CONTACT_LIST, Event.gson.toJson(account.backupContactList)) putBoolean(PrefKeys.HIDE_DELETE_REQUEST_DIALOG, account.hideDeleteRequestDialog) putBoolean(PrefKeys.HIDE_BLOCK_ALERT_DIALOG, account.hideBlockAlertDialog) - println(account.proxy != null) putBoolean(PrefKeys.USE_PROXY, account.proxy != null) + putInt(PrefKeys.PROXY_PORT, account.proxyPort) }.apply() } @@ -279,7 +280,8 @@ object LocalPreferences { val hideDeleteRequestDialog = getBoolean(PrefKeys.HIDE_DELETE_REQUEST_DIALOG, false) val hideBlockAlertDialog = getBoolean(PrefKeys.HIDE_BLOCK_ALERT_DIALOG, false) val useProxy = getBoolean(PrefKeys.USE_PROXY, false) - val proxy = HttpClient.initProxy(useProxy, "127.0.0.1", 9050) + val proxyPort = getInt(PrefKeys.PROXY_PORT, 9050) + val proxy = HttpClient.initProxy(useProxy, "127.0.0.1", proxyPort) val a = Account( Persona(privKey = privKey?.toByteArray(), pubKey = pubKey.toByteArray()), @@ -298,7 +300,8 @@ object LocalPreferences { hideDeleteRequestDialog, hideBlockAlertDialog, latestContactList, - proxy + proxy, + proxyPort ) return a diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index 8418532862..7444b899d8 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -60,7 +60,8 @@ class Account( var hideDeleteRequestDialog: Boolean = false, var hideBlockAlertDialog: Boolean = false, var backupContactList: ContactListEvent? = null, - var proxy: Proxy? + var proxy: Proxy?, + var proxyPort: Int ) { var transientHiddenUsers: Set = setOf() 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 d2828ef6f6..7fc79e2072 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 @@ -27,6 +27,7 @@ import androidx.compose.material.Surface import androidx.compose.material.Text import androidx.compose.material.TextButton import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf @@ -241,6 +242,7 @@ fun ListContent( var checked by remember { mutableStateOf(account.proxy != null) } val openDialog = remember { mutableStateOf(false) } var conectOrbotDialogOpen by remember { mutableStateOf(false) } + var proxyPort = remember { mutableStateOf(account.proxyPort.toString()) } Column(modifier = modifier.fillMaxHeight()) { if (accountUser != null) { @@ -310,14 +312,14 @@ fun ListContent( if (conectOrbotDialogOpen) { ConnectOrbotDialog( - account = account, onClose = { conectOrbotDialogOpen = false }, onPost = { conectOrbotDialogOpen = false openDialog.value = false checked = true - enableTor(account, true) - } + enableTor(account, true, proxyPort) + }, + proxyPort ) } @@ -330,7 +332,7 @@ fun ListContent( onClick = { openDialog.value = false checked = false - enableTor(account, false) + enableTor(account, false, proxyPort) } ) { Text(text = stringResource(R.string.yes)) @@ -351,9 +353,11 @@ fun ListContent( private fun enableTor( account: Account, - checked: Boolean + checked: Boolean, + portNumber: MutableState ) { - account.proxy = HttpClient.initProxy(checked, "127.0.0.1", 9050) + account.proxyPort = portNumber.value.toInt() + account.proxy = HttpClient.initProxy(checked, "127.0.0.1", account.proxyPort) LocalPreferences.saveToEncryptedStorage(account) ServiceManager.pause() ServiceManager.start() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt index 79e306176e..7bee6e873c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt @@ -40,22 +40,22 @@ class AccountStateViewModel() : ViewModel() { } } - fun startUI(key: String, useProxy: Boolean) { + fun startUI(key: String, useProxy: Boolean, proxyPort: Int) { val pattern = Pattern.compile(".+@.+\\.[a-z]+") val parsed = Nip19.uriToRoute(key) val pubKeyParsed = parsed?.hex?.toByteArray() - val proxy = HttpClient.initProxy(useProxy, "127.0.0.1", 9050) + val proxy = HttpClient.initProxy(useProxy, "127.0.0.1", proxyPort) val account = if (key.startsWith("nsec")) { - Account(Persona(privKey = key.bechToBytes()), proxy = proxy) + Account(Persona(privKey = key.bechToBytes()), proxy = proxy, proxyPort = proxyPort) } else if (pubKeyParsed != null) { - Account(Persona(pubKey = pubKeyParsed), proxy = proxy) + Account(Persona(pubKey = pubKeyParsed), proxy = proxy, proxyPort = proxyPort) } else if (pattern.matcher(key).matches()) { // Evaluate NIP-5 - Account(Persona(), proxy = proxy) + Account(Persona(), proxy = proxy, proxyPort = proxyPort) } else { - Account(Persona(Hex.decode(key)), proxy = proxy) + Account(Persona(Hex.decode(key)), proxy = proxy, proxyPort = proxyPort) } LocalPreferences.updatePrefsForLogin(account) @@ -68,9 +68,9 @@ class AccountStateViewModel() : ViewModel() { tryLoginExistingAccount() } - fun newKey(useProxy: Boolean) { - var proxy = HttpClient.initProxy(useProxy, "127.0.0.1", 9050) - val account = Account(Persona(), proxy = proxy) + fun newKey(useProxy: Boolean, proxyPort: Int) { + val proxy = HttpClient.initProxy(useProxy, "127.0.0.1", proxyPort) + val account = Account(Persona(), proxy = proxy, proxyPort = proxyPort) // saves to local preferences LocalPreferences.updatePrefsForLogin(account) startUI(account) 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 2e2655e0ee..2bf8278319 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,5 +1,6 @@ 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 @@ -15,12 +16,11 @@ import androidx.compose.material.OutlinedTextField import androidx.compose.material.Surface import androidx.compose.material.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.KeyboardCapitalization import androidx.compose.ui.text.input.KeyboardType @@ -32,14 +32,14 @@ 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.model.Account import com.vitorpamplona.amethyst.ui.actions.CloseButton import com.vitorpamplona.amethyst.ui.actions.PostButton +import kotlinx.coroutines.launch @Composable -fun ConnectOrbotDialog(account: Account, onClose: () -> Unit, onPost: () -> Unit) { - var portNumber by remember { mutableStateOf("9050") } - +fun ConnectOrbotDialog(onClose: () -> Unit, onPost: () -> Unit, portNumber: MutableState) { + val context = LocalContext.current + val scope = rememberCoroutineScope() Dialog( onDismissRequest = onClose, properties = DialogProperties(usePlatformDefaultWidth = false) @@ -62,6 +62,19 @@ fun ConnectOrbotDialog(account: Account, onClose: () -> Unit, onPost: () -> Unit PostButton( onPost = { + try { + Integer.parseInt(portNumber.value) + } catch (_: Exception) { + scope.launch { + Toast.makeText( + context, + "Invalid port number", + Toast.LENGTH_LONG + ).show() + } + return@PostButton + } + onPost() }, isActive = true @@ -84,8 +97,8 @@ fun ConnectOrbotDialog(account: Account, onClose: () -> Unit, onPost: () -> Unit Spacer(modifier = Modifier.height(10.dp)) OutlinedTextField( - value = portNumber, - onValueChange = { portNumber = it }, + value = portNumber.value, + onValueChange = { portNumber.value = it }, keyboardOptions = KeyboardOptions.Default.copy( capitalization = KeyboardCapitalization.None, keyboardType = KeyboardType.Number diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt index d8b66015da..450b147771 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt @@ -39,6 +39,7 @@ import androidx.compose.ui.unit.sp import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.ui.qrcode.SimpleQrCodeScanner import com.vitorpamplona.amethyst.ui.screen.AccountStateViewModel +import com.vitorpamplona.amethyst.ui.screen.loggedIn.ConnectOrbotDialog import java.util.* @OptIn(ExperimentalComposeUiApi::class) @@ -57,6 +58,8 @@ fun LoginPage( mutableStateOf(false) } val useProxy = remember { mutableStateOf(false) } + val proxyPort = remember { mutableStateOf("9050") } + var connectOrbotDialogOpen by remember { mutableStateOf(false) } Column( modifier = Modifier @@ -160,7 +163,7 @@ fun LoginPage( keyboardActions = KeyboardActions( onGo = { try { - accountViewModel.startUI(key.value.text, useProxy.value) + accountViewModel.startUI(key.value.text, useProxy.value, proxyPort.value.toInt()) } catch (e: Exception) { errorMessage = context.getString(R.string.invalid_key) } @@ -227,11 +230,26 @@ fun LoginPage( Row(verticalAlignment = Alignment.CenterVertically) { Checkbox( checked = useProxy.value, - onCheckedChange = { useProxy.value = it } + onCheckedChange = { + if (it) { + connectOrbotDialogOpen = true + } + } ) Text(stringResource(R.string.connect_via_tor)) } + + if (connectOrbotDialogOpen) { + ConnectOrbotDialog( + onClose = { connectOrbotDialogOpen = false }, + onPost = { + connectOrbotDialogOpen = false + useProxy.value = true + }, + proxyPort + ) + } } Spacer(modifier = Modifier.height(20.dp)) @@ -250,7 +268,7 @@ fun LoginPage( if (acceptedTerms.value && key.value.text.isNotBlank()) { try { - accountViewModel.startUI(key.value.text, useProxy.value) + accountViewModel.startUI(key.value.text, useProxy.value, proxyPort.value.toInt()) } catch (e: Exception) { errorMessage = context.getString(R.string.invalid_key) } @@ -278,7 +296,7 @@ fun LoginPage( .fillMaxWidth(), onClick = { if (acceptedTerms.value) { - accountViewModel.newKey(useProxy.value) + accountViewModel.newKey(useProxy.value, proxyPort.value.toInt()) } else { termsAcceptanceIsRequired = context.getString(R.string.acceptance_of_terms_is_required) From 0d051117b289de255531a85464ba083eec16f8ad Mon Sep 17 00:00:00 2001 From: greenart7c3 <115044884+greenart7c3@users.noreply.github.com> Date: Mon, 8 May 2023 11:03:17 -0300 Subject: [PATCH 025/171] add toast message to strings.xml --- .../amethyst/ui/screen/loggedIn/ConnectOrbotDialog.kt | 4 +++- app/src/main/res/values/strings.xml | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) 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 2bf8278319..53c2ac84ef 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 @@ -60,6 +60,8 @@ fun ConnectOrbotDialog(onClose: () -> Unit, onPost: () -> Unit, portNumber: Muta onClose() }) + val toastMessage = stringResource(R.string.invalid_port_number) + PostButton( onPost = { try { @@ -68,7 +70,7 @@ fun ConnectOrbotDialog(onClose: () -> Unit, onPost: () -> Unit, portNumber: Muta scope.launch { Toast.makeText( context, - "Invalid port number", + toastMessage, Toast.LENGTH_LONG ).show() } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 17dd6e0e1c..a752dced1e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -376,5 +376,6 @@ \n6. Press the post button to use Orbot as a proxy Orbot Socks Port + Invalid port number From 633be54dd404adb68ef5c7adc56b268d46ff9b6a Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 9 May 2023 13:20:59 -0400 Subject: [PATCH 026/171] Updates dependencies --- app/build.gradle | 2 +- build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a4d21bc8b1..e88d2de292 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -86,7 +86,7 @@ android { dependencies { implementation 'androidx.core:core-ktx:1.10.0' - implementation 'androidx.activity:activity-compose:1.7.0' + implementation 'androidx.activity:activity-compose:1.7.1' implementation "androidx.compose.ui:ui:$compose_ui_version" implementation "androidx.compose.ui:ui-tooling-preview:$compose_ui_version" diff --git a/build.gradle b/build.gradle index 2c099a9ed3..d06865d095 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { fragment_version = "1.5.7" lifecycle_version = '2.6.1' - compose_ui_version = '1.4.2' + compose_ui_version = '1.4.3' nav_version = "2.5.3" room_version = "2.4.3" accompanist_version = '0.30.0' From 489941106bde28c8f05d2a46e61e7b838a115639 Mon Sep 17 00:00:00 2001 From: Believethehype Date: Tue, 9 May 2023 21:14:50 +0200 Subject: [PATCH 027/171] fixed path of persian translation --- app/src/main/res/values-fa/strings.xml | 357 ++++++++++++++ app/src/main/res/values/strings.xml | 616 +++++++++++++------------ 2 files changed, 669 insertions(+), 304 deletions(-) create mode 100644 app/src/main/res/values-fa/strings.xml diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml new file mode 100644 index 0000000000..c53a975f26 --- /dev/null +++ b/app/src/main/res/values-fa/strings.xml @@ -0,0 +1,357 @@ + + Amethyst + Amethyst Debug + اشاره کنید QR به کد + کد را نشان بده QR + تصویر پروفایل + کد QR اسکن + بهر حال نشان بده + این پست توسط این افراد نامناسب اعلام شده + این پست یافت نشد + تصویر کانال + رویداد مربوطه یافت نشد + قادر به رمزگشایی پیام نیست + تصویر گروه + محتوای نامناسب + اسپم + جعل هویت + رفتار ناهنجار + ناشناس + آیکن رله + نویسنده ناشناس + کپی متن + کپی شناسه نویسنده + کپی شناسه نوت + انتشار + درخواست حذف/string> + بلاک/پنهان کردن کاربر + گزارش اسپم/کلاهبرداری + گزارش جعل هویت + گزارش محتوای نامناسب + گزارش رفتار ناهنجار + با کلید خصوصی وارد شوید تا بتوانید پاسخ دهید + با کلید خصوصی وارد شوید تا بتوانید نوت را بازارسال کنید + با کلید خصوصی وارد شوید تا بتوانید نوت را لایک کنید + مقداری برای زپ تعیین نشده. نگه دارید تا تغییر دهید + با کلید خصوصی وارد شوید تا بتوانید زپ کنید + زپ + دیدن تعداد + بازارسال + بازارسال شده + نقل قول + مبلغ جدید به ساتوشی + افزودن + " پاسخ به" + " و " + "در کانال " + بنر پروفایل + "دنبال شونده" + "دنبال کننده" + پروفایل + فیلترهای ایمنی + خروج + ادامه + اینویس لایتنینگ + پرداخت + انعام لایتنینگ + یادداشت برای گیرنده + !خیلی ممنون + مبلغ به ساتوشی + ارسال ساتوشی + " %1$s : %2$s خطا در تبدیل" + "%1$s پیش نمایش تصویر کارت برای" + کانال جدید + نام کانال + گروه باحال من + آدرس تصویر + توصیف + "درباره ما.. " + به چی فکر میکنی؟ + ارسال + ذخیره + ساختن + لغو + تصویر بارگذاری نشد + آدرس رله + نوت ها + بایت + خطاها + خبرنامه اصلی + پیام خصوصی + گفتگوی عمومی + خبرنامه همگانی + جستجو در خبرنامه + افزودن رله + نمایش نام + نام من + نام کاربری + نام کاربری من + درباره من + آدرس آواتار + آدرس بنر + آدری وبسایت + آدرس لایتنینگ + آدرس لایتنینگ(نقل شده) + تصویر در گالری ذخیره شد + تصویر ذخیره نشد + بارگذاری تصویر + ...در حال بارگذاری + این کاربر آدرس لایتنینگ برای دریافت ساتوشی تنظیم نکرده است + "...اینجا پاسخ دهید " + شناسه نوت را برای اشتراک گذاری در کلیپبورد ذخیره می کند + ذخیره شناسه کانال در کلیپبورد + متادیتای کانال را ذخیره می کند + پیوستن + شناس + در خواست جدید + کاربران بلاک شده + رشته جدید + گفتگوها + نوت ها + پاسخ ها + "دنبال شوندگان" + "گزارش ها" + انتخاب های بیشتر + "رله ها" + وبسایت + آدرس لایتنینگ + شناسه کلید خصوصی (پسوردتان) را در کلیپبورد کپی می کند( + کپی کردن کلید خصوصی در کلیپبورد + کلید عمومی را برای اشتراک گذاری در کلیپبورد ذخیره می کند + کپی کردن کلید عمومی در کلیپبورد + ارسال پیام مستقیم + متادیتای کاربر را ویرایش می کند + دنبال کردن + دنبال کردن متقابل + از بلاک درآوردن + کپی شناسه کاربر + از بلاک درآوردن کاربر + "npub, hex, نام کاربری " + پاک کردن + لوگوی اپ + nsec / npub / hex کلید خصوصی + نشان دادن پسورد + پنهان کردن پسورد + کلید نامعتبر + "می پذیرم " + شرایط استفاده + پذیرش شرایط الازمیست + کلید الزامیست + ورود + ساختن جفت کلید جدید + در حال بارگذاری خبرنامه + " :خطا در بارگذاری پاسخ ها" + دوباره تلاش کنید + خبرنامه خالیست + تازه سازی + ساخته شد + با توصیف + و تصویر + نام گفتگو تغییر کرد به + تصویر + و تصویر به + ترک کردن + دنبال نکردن + کانال ساخته شد + "اطلاعات کانال تغییر کرد به" + گفتگوی عمومی + نوت های دریافت شده + بیرون کردن + ساتوشی + خودکار + ترجمه از + به + نشان بده s%1$ ابتدا به + همیشه به ترجمه کن %1$s + هرگز به ترجمه نکن %1$s + NIP-05 + LNURL... + هرگز + اکنون + h + m + d + برهنگی + ناسزا / نفرت پراکنی + گزارش نفرت پراکنی + گزارش برهنگی / پورن + سایر + همه شناس ها خوانده شده کن + همه جدیدها را خوانده شده کن + همه را خوانده شده کن + بازیابی کلیدها + + ## راهنمایی برای ایمنی و بازیابی کلید + \n\n- حساب کاربری شما با یک کلید خصوصی ایمن می شود. این کلید یک رشته تصادفی اعداد و ارقام است که با **nsec1** آغاز می گردد. + \n\n- هر کس به کلید خصوصی شما دست یابد می تواند به هویت شما اقدام به انتشار محتوا نماید. کلید خصوصی خود را در هیچ نرم افزار یا وب سایتی که به آن اعتماد ندارید قرار ندیهید. + \n- سازندگان آماتیست **هرگز** از ما کلید خصوصی تان را نمی خواهند. + \n- حتما یه کپی از کلید خصوصی را برای بازیابی حساب کاربری نزد خود نگه دارد. ما استفاده از یک نرم افزار مدیریت پسورد را توصیه می نماییم. + + کلید خصوصی در کلیپبورد کپی شد + کلید خصوصیم را کپی کن + صحت سنجی انجام نشد + خطا + "ساخته شده توسط %1$s" + "تصویر مدال پاداش برای %1$s" + یک مدال پاداش دریافت کردید + مدال پاداش داده شد به + نوت در کلیپبورد کپی شد + نویسنده در کلیپبورد کپی شد @npub + شناسه نوت در کلیپبورد کپی شد (@note1) + انتخاب متن + Github Gist w/ Proof + Telegram + Mastodon Post ID w/ Proof + Twitter Status w/ Proof + https://gist.github.com/<user>/<gist> + https://t.me/<proof post> + https://<server>/<user>/<proof post> + https://twitter.com/<user>/status/<proof post> + "<نمی توان پیام خصوصی را رمزگشایی کردن>\n\nYou در پیام خصوصی/رمزگذاری شده بین و به شما اشاره شده %1$s %2$s." + افزودن حساب کاربری جدید + حساب های کاربری + انتخاب حساب کارگری + افزودن حساب کاربری جدید + حساب کاربری فعال + کلید خصوصی دارد + فقط خواندن، کلید خصوصی ندارد + بازگشت + انتخاب + اشتراک گذاری لینک پیماینده + اشتراک گذاری + شناسه نویسنده + شناسه نوت + کپی متن + حذف + دنبال نکردن + دنبال کردن + Request Deletion + آماتیست درخواست می کند که نوت شما از رله هایی که درحال حاضر به آن متصل هستید حذف شود. هیچ تضمینی نیست که نوت شما برای همیشه از آن رله ها یا از رله های دیگری که ممکن است در آنها ذخیره شده باشد حذف خواهد شد.. + بلاک + حذف + بلاک + گزارش + حذف + دوباره نشان نده + اسپم یا کلاهبرداری + محتوای نفرت پراکنی یا ناسزا + جعل هویت بدخواهانه + محتوای برهنگی یا نمایان + رفتار ناهنجار + بلاک کردن کاربر محتوای ایشان را در اپ شما پنهان می کند. نوت های شما همچنا بطور عمومی دیده می شوند که شامل کاربران بلاک شده توسط شما نیز هست. کاربران بلاک شده در صفحه فیلترهای ایمنی ففهرست می شوند. + + گزارش سواستفاده + تمام گزارش ها بطور عمومی دیده می شوند + در صورت تمایل توضیحاتی به گزارش خود بیفزایید... + توضیحات اضافه + دلایل + دلیلی انتخاب کنید... + گزارش نوت + بلاک و گزارش + بلاک + + علامت گذاشته ها + علامت گاشته های خصوصی + علامت گذاشته های عمومی + افزودن به علامت گذاشته های خصوصی + افزودن به علامت گذاشته های عمومی + برداشتن از علامت گذاشته های خصوصی + برداشتن از علامت گذاشته های خصوصی + + خدمات اتصال به کیف پول + اجازه رمز نوستر برای پرداخت زپ بدون خارج شدن از اپ. رمز را ایمن نگه دارید و در صورت امکان از رله خصوصی استفاده کنید. + کلید عمومی اتصال به کیف پول + رله اتصال به کیف پول + رمز اتصال به کیف پول + نمایش کلید خصوصی + nsec / hex کلید خصوصی + + مبلغ وثیقه به ساتوشی + ارسال نظرسنجی + قسمت های الزامی: + دریافت کنندگان زپ + توضیحات اولیه نظرسنجی… + گزینه ها %s + توضیح گزینه های نظرسنجی + قسمت های اختیاری: + حداقل زپ + حداکثر زپ + توافق نظر + (0–100)% + بسته شدن پس از + روز + نظر سنجی برای رای جدید بسته است + مبلغ زپ + + + "جستجوی رویداد %1$s" + + افزودن پیام عمومی + افزودن پیام خصوصی + افزودن پیام اینویس + + از زحمات شما متشکریم! + + ساختن و افزودن + سازندگان نظرسنجی نمی توانند در نظر سنجی خود رای دهند. + #زپ_نظرسنجی + + + تصویر از زمان ارسال یکسان است + تصویر تغییر کرده است. ممکن است نویسنده تغییر را ندیده باشد. + + افزودن تصویر + افزودن فیلم + افزودن مدارک + + افزودن به پیام + توصیف محتوا + قایقی آبی در ساحل شنی سفید هنگام غروب + + نوع زپ + نوع زپ برای همه گزینه ها + + عمومی + همه می توانند تراکنش و پیام را ببینند + + خصوصی + فرستنده و گیرنده می توانند یکدیگر و پیام را ببینند + + ناشناس + گیرنده و دیگران نمی دانند چه کسی پرداخت کرده است + + غیرزپ + هیچ ردی در نوستر نمی ماند، فقط در شبکه لایتنینگ انجام می شود + + + سرور فایل + آدرس لایتنینگ یا @User + + imgur.com - معتمد + Imgur میتواند فایل را بهینه کند + + nostrimg.com - معتمد + NostrImg میتواند فایل را بهینه کند + + nostr.build - معتمد + Nostr.build can modify the file + + قابل بررسی Imgur (NIP-94) + بررسی کنید که Imgur فایل را بهینه کرده یا خیر . NIPجدید : سایر کلاینت ها ممکن است آن را نبینند. + + قابل بررسی NostrImg (NIP-94) + بررسی کنید که NostrImg فایل را بهینه کرده یا خیر . NIPجدید : سایر کلاینت ها ممکن است آن را نبینند. + + Verifiable Nostr.build (NIP-94) + بررسی کنید که Nostr.build فایل را بهینه کرده یا خیر . NIPجدید : سایر کلاینت ها ممکن است آن را نبینند. + + رله های شما (NIP-95) + فایل ها در رله های شما میزبانی می شوند. NIPجدید: بررسی کنید آیا پشتیبانی می کنند یا خیر + + + + لیست دنبال ها + همه دنبال ها + همگانی + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c53a975f26..703bb8e124 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,204 +1,204 @@ Amethyst Amethyst Debug - اشاره کنید QR به کد - کد را نشان بده QR - تصویر پروفایل - کد QR اسکن - بهر حال نشان بده - این پست توسط این افراد نامناسب اعلام شده - این پست یافت نشد - تصویر کانال - رویداد مربوطه یافت نشد - قادر به رمزگشایی پیام نیست - تصویر گروه - محتوای نامناسب - اسپم - جعل هویت - رفتار ناهنجار - ناشناس - آیکن رله - نویسنده ناشناس - کپی متن - کپی شناسه نویسنده - کپی شناسه نوت - انتشار - درخواست حذف/string> - بلاک/پنهان کردن کاربر - گزارش اسپم/کلاهبرداری - گزارش جعل هویت - گزارش محتوای نامناسب - گزارش رفتار ناهنجار - با کلید خصوصی وارد شوید تا بتوانید پاسخ دهید - با کلید خصوصی وارد شوید تا بتوانید نوت را بازارسال کنید - با کلید خصوصی وارد شوید تا بتوانید نوت را لایک کنید - مقداری برای زپ تعیین نشده. نگه دارید تا تغییر دهید - با کلید خصوصی وارد شوید تا بتوانید زپ کنید - زپ - دیدن تعداد - بازارسال - بازارسال شده - نقل قول - مبلغ جدید به ساتوشی - افزودن - " پاسخ به" - " و " - "در کانال " - بنر پروفایل - "دنبال شونده" - "دنبال کننده" - پروفایل - فیلترهای ایمنی - خروج - ادامه - اینویس لایتنینگ - پرداخت - انعام لایتنینگ - یادداشت برای گیرنده - !خیلی ممنون - مبلغ به ساتوشی - ارسال ساتوشی - " %1$s : %2$s خطا در تبدیل" - "%1$s پیش نمایش تصویر کارت برای" - کانال جدید - نام کانال - گروه باحال من - آدرس تصویر - توصیف - "درباره ما.. " - به چی فکر میکنی؟ - ارسال - ذخیره - ساختن - لغو - تصویر بارگذاری نشد - آدرس رله - نوت ها - بایت - خطاها - خبرنامه اصلی - پیام خصوصی - گفتگوی عمومی - خبرنامه همگانی - جستجو در خبرنامه - افزودن رله - نمایش نام - نام من - نام کاربری - نام کاربری من - درباره من - آدرس آواتار - آدرس بنر - آدری وبسایت - آدرس لایتنینگ - آدرس لایتنینگ(نقل شده) - تصویر در گالری ذخیره شد - تصویر ذخیره نشد - بارگذاری تصویر - ...در حال بارگذاری - این کاربر آدرس لایتنینگ برای دریافت ساتوشی تنظیم نکرده است - "...اینجا پاسخ دهید " - شناسه نوت را برای اشتراک گذاری در کلیپبورد ذخیره می کند - ذخیره شناسه کانال در کلیپبورد - متادیتای کانال را ذخیره می کند - پیوستن - شناس - در خواست جدید - کاربران بلاک شده - رشته جدید - گفتگوها - نوت ها - پاسخ ها - "دنبال شوندگان" - "گزارش ها" - انتخاب های بیشتر - "رله ها" - وبسایت - آدرس لایتنینگ - شناسه کلید خصوصی (پسوردتان) را در کلیپبورد کپی می کند( - کپی کردن کلید خصوصی در کلیپبورد - کلید عمومی را برای اشتراک گذاری در کلیپبورد ذخیره می کند - کپی کردن کلید عمومی در کلیپبورد - ارسال پیام مستقیم - متادیتای کاربر را ویرایش می کند - دنبال کردن - دنبال کردن متقابل - از بلاک درآوردن - کپی شناسه کاربر - از بلاک درآوردن کاربر - "npub, hex, نام کاربری " - پاک کردن - لوگوی اپ - nsec / npub / hex کلید خصوصی - نشان دادن پسورد - پنهان کردن پسورد - کلید نامعتبر - "می پذیرم " - شرایط استفاده - پذیرش شرایط الازمیست - کلید الزامیست - ورود - ساختن جفت کلید جدید - در حال بارگذاری خبرنامه - " :خطا در بارگذاری پاسخ ها" - دوباره تلاش کنید - خبرنامه خالیست - تازه سازی - ساخته شد - با توصیف - و تصویر - نام گفتگو تغییر کرد به - تصویر - و تصویر به - ترک کردن - دنبال نکردن - کانال ساخته شد - "اطلاعات کانال تغییر کرد به" - گفتگوی عمومی - نوت های دریافت شده - بیرون کردن - ساتوشی - خودکار - ترجمه از - به - نشان بده s%1$ ابتدا به - همیشه به ترجمه کن %1$s - هرگز به ترجمه نکن %1$s + Point to the QR Code + Show QR + Profile Image + Scan QR + Show Anyway + Post was flagged as inappropriate by + Post not found + Channel Image + Referenced event not found + Could Not decrypt the message + Group Picture + Explicit Content + Spam + Impersonation + Illegal Behavior + Unknown + Relay Icon + Unknown Author + Copy Text + Copy Author ID + Copy Note ID + Broadcast + Request Deletion + + Report Spam / Scam + Report Impersonation + Report Explicit Content + Report Illegal Behaviour + Login with a Private key to be able to reply + Login with a Private key to be able to boost posts + Login with a Private key to like Posts + No Zap Amount Setup. Long Press to change + Login with a Private key to be able to send Zaps + Zaps + View count + Boost + boosted + Quote + New Amount in Sats + Add + "replying to " + " and " + "in channel " + Profile Banner + " Following" + " Followers" + Profile + Security Filters + Logout + Show More + Lightning Invoice + Pay + Lightning Tips + Note to Receiver + Thank you so much! + Amount in Sats + Send Sats + "Error parsing preview for %1$s : %2$s" + "Preview Card Image for %1$s" + New Channel + Channel Name + My Awesome Group + Picture Url + Description + "About us.. " + What\'s on your mind? + Post + Save + Create + Cancel + Failed to upload the image + Relay Address + Posts + Bytes + Errors + Home Feed + Private Message Feed + Public Chat Feed + Global Feed + Search Feed + Add a Relay + Display Name + My display name + Username + My username + About me + Avatar URL + Banner URL + Website URL + LN Address + LN URL (outdated) + Image saved to the gallery + Failed to save the image + Upload Image + Uploading… + User does not have a lightning address setup to receive sats + "reply here.. " + Copies the Note ID to the clipboard for sharing + Copy Channel ID (Note) to the Clipboard + Edits the Channel Metadata + Join + Known + New Requests + Blocked Users + New Threads + Conversations + Notes + Replies + "Follows" + "Reports" + More Options + " Relays" + Website + Lightning Address + Copies the Nsec ID (your password) to the clipboard for backup + Copy Secret Key to the Clipboard + Copies the public key to the clipboard for sharing + Copy Public Key (NPub) to the Clipboard + Send a Direct Message + Edits the User\'s Metadata + Follow + Follow back + Unblock + Copy User ID + Unblock User + "npub, hex, username " + Clear + App Logo + nsec / npub / hex private key + Show Password + Hide Password + Invalid key + "I accept the " + terms of use + Acceptance of terms is required + Key is required + Login + Generate a new key + Loading feed + "Error loading replies: " + Try again + Feed is empty. + Refresh + created + with description of + and picture + changed chat name to + description to + and picture to + Leave + Unfollow + Channel created + "Channel Information changed to" + Public Chat + posts received + Remove + sats + Auto + translated from + to + Show in %1$s first + Always translate to %1$s + Never translate from %1$s NIP-05 LNURL... - هرگز - اکنون + never + now h m d - برهنگی - ناسزا / نفرت پراکنی - گزارش نفرت پراکنی - گزارش برهنگی / پورن - سایر - همه شناس ها خوانده شده کن - همه جدیدها را خوانده شده کن - همه را خوانده شده کن - بازیابی کلیدها + Nudity + Profanity / Hateful speech + Report Hateful speech + Report Nudity / Porn + others + Mark all Known as read + Mark all New as read + Mark all as read + Backup Keys - ## راهنمایی برای ایمنی و بازیابی کلید - \n\n- حساب کاربری شما با یک کلید خصوصی ایمن می شود. این کلید یک رشته تصادفی اعداد و ارقام است که با **nsec1** آغاز می گردد. - \n\n- هر کس به کلید خصوصی شما دست یابد می تواند به هویت شما اقدام به انتشار محتوا نماید. کلید خصوصی خود را در هیچ نرم افزار یا وب سایتی که به آن اعتماد ندارید قرار ندیهید. - \n- سازندگان آماتیست **هرگز** از ما کلید خصوصی تان را نمی خواهند. - \n- حتما یه کپی از کلید خصوصی را برای بازیابی حساب کاربری نزد خود نگه دارد. ما استفاده از یک نرم افزار مدیریت پسورد را توصیه می نماییم. + ## Key Backup and Safety Tips + \n\nYour account is secured by a secret key. The key is long random string starting with **nsec1**. Anyone who has access to your secret key can publish content using your identity. + \n\n- Do **not** put your secret key in any website or software you do not trust. + \n- Amethyst developers will **never** ask you for your secret key. + \n- **Do** keep a secure backup of your secret key for account recovery. We recommend using a password manager. - کلید خصوصی در کلیپبورد کپی شد - کلید خصوصیم را کپی کن - صحت سنجی انجام نشد - خطا - "ساخته شده توسط %1$s" - "تصویر مدال پاداش برای %1$s" - یک مدال پاداش دریافت کردید - مدال پاداش داده شد به - نوت در کلیپبورد کپی شد - نویسنده در کلیپبورد کپی شد @npub - شناسه نوت در کلیپبورد کپی شد (@note1) - انتخاب متن + Secret key (nsec) copied to clipboard + Copy my secret key + Authentication failed + Error + "Created by %1$s" + "Badge award image for %1$s" + You Received a new Badge Award + Badge award granted to + Copied note text to clipboard + Copied author’s @npub to clipboard + Copied note ID (@note1) to clipboard + Select Text Github Gist w/ Proof Telegram Mastodon Post ID w/ Proof @@ -207,151 +207,159 @@ https://t.me/<proof post> https://<server>/<user>/<proof post> https://twitter.com/<user>/status/<proof post> - "<نمی توان پیام خصوصی را رمزگشایی کردن>\n\nYou در پیام خصوصی/رمزگذاری شده بین و به شما اشاره شده %1$s %2$s." - افزودن حساب کاربری جدید - حساب های کاربری - انتخاب حساب کارگری - افزودن حساب کاربری جدید - حساب کاربری فعال - کلید خصوصی دارد - فقط خواندن، کلید خصوصی ندارد - بازگشت - انتخاب - اشتراک گذاری لینک پیماینده - اشتراک گذاری - شناسه نویسنده - شناسه نوت - کپی متن - حذف - دنبال نکردن - دنبال کردن + "<Unable to decrypt private message>\n\nYou were cited in a private/encrypted conversation between %1$s and %2$s." + Add New Account + Accounts + Select Account + Add New Account + Active account + Has private key + Read only, no private key + Back + Select + Share Browser Link + Share + Author ID + Note ID + Copy Text + Delete + Unfollow + Follow Request Deletion - آماتیست درخواست می کند که نوت شما از رله هایی که درحال حاضر به آن متصل هستید حذف شود. هیچ تضمینی نیست که نوت شما برای همیشه از آن رله ها یا از رله های دیگری که ممکن است در آنها ذخیره شده باشد حذف خواهد شد.. - بلاک - حذف - بلاک - گزارش - حذف - دوباره نشان نده - اسپم یا کلاهبرداری - محتوای نفرت پراکنی یا ناسزا - جعل هویت بدخواهانه - محتوای برهنگی یا نمایان - رفتار ناهنجار - بلاک کردن کاربر محتوای ایشان را در اپ شما پنهان می کند. نوت های شما همچنا بطور عمومی دیده می شوند که شامل کاربران بلاک شده توسط شما نیز هست. کاربران بلاک شده در صفحه فیلترهای ایمنی ففهرست می شوند. + Amethyst will request that your note be deleted from the relays you are currently connected to. There is no guarantee that your note will be permanently deleted from those relays, or from other relays where it may be stored. + Block + Delete + Block + Report + Delete + Don\'t show again + Spam or scams + Profanity or hateful conduct + Malicious impersonation + Nudity or graphic content + Illegal Behavior + Blocking a user will hide their content in your app. Your notes are still publicly viewable, including to people you block. Blocked users are listed on the Security Filters screen. - گزارش سواستفاده - تمام گزارش ها بطور عمومی دیده می شوند - در صورت تمایل توضیحاتی به گزارش خود بیفزایید... - توضیحات اضافه - دلایل - دلیلی انتخاب کنید... - گزارش نوت - بلاک و گزارش - بلاک + Report Abuse + All reports posted will be publicly visible. + Optionally provide additional context about your report… + Additional Context + Reason + Select a reason… + Post Report + Block and Report + Block - علامت گذاشته ها - علامت گاشته های خصوصی - علامت گذاشته های عمومی - افزودن به علامت گذاشته های خصوصی - افزودن به علامت گذاشته های عمومی - برداشتن از علامت گذاشته های خصوصی - برداشتن از علامت گذاشته های خصوصی + Bookmarks + Private Bookmarks + Public Bookmarks + Add to Private Bookmarks + Add to Public Bookmarks + Remove from Private Bookmarks + Remove from Public Bookmarks - خدمات اتصال به کیف پول - اجازه رمز نوستر برای پرداخت زپ بدون خارج شدن از اپ. رمز را ایمن نگه دارید و در صورت امکان از رله خصوصی استفاده کنید. - کلید عمومی اتصال به کیف پول - رله اتصال به کیف پول - رمز اتصال به کیف پول - نمایش کلید خصوصی - nsec / hex کلید خصوصی + Wallet Connect Service + Authorizes a Nostr Secret to pay zaps without leaving the app. Keep the secret safe and use a private relay if possible + Wallet Connect Pubkey + Wallet Connect Relay + Wallet Connect Secret + Show secret key + nsec / hex private key - مبلغ وثیقه به ساتوشی - ارسال نظرسنجی - قسمت های الزامی: - دریافت کنندگان زپ - توضیحات اولیه نظرسنجی… - گزینه ها %s - توضیح گزینه های نظرسنجی - قسمت های اختیاری: - حداقل زپ - حداکثر زپ - توافق نظر + Pledge Amount in Sats + Post Poll + Required fields: + Zap recipients + Primary poll description… + Option %s + Poll option description + Optional fields: + Zap minimum + Zap maximum + Consensus (0–100)% - بسته شدن پس از - روز - نظر سنجی برای رای جدید بسته است - مبلغ زپ - + Close after + days + Poll is closed to new votes + Zap amount + Only one vote per user is allowed on this type of poll - "جستجوی رویداد %1$s" + "Looking for Event %1$s" - افزودن پیام عمومی - افزودن پیام خصوصی - افزودن پیام اینویس + Add a public message + Add a private message + Add an invoice message - از زحمات شما متشکریم! + Thank you for all your work! - ساختن و افزودن - سازندگان نظرسنجی نمی توانند در نظر سنجی خود رای دهند. - #زپ_نظرسنجی + Create and Add + Poll authors can\'t vote in their own polls. + #zappoll - تصویر از زمان ارسال یکسان است - تصویر تغییر کرده است. ممکن است نویسنده تغییر را ندیده باشد. + Image is the same since the post + Image has changed. The author might not have seen the change - افزودن تصویر - افزودن فیلم - افزودن مدارک + Add Image + Add Video + Add Document - افزودن به پیام - توصیف محتوا - قایقی آبی در ساحل شنی سفید هنگام غروب + Add to Message + Description of the contents + A blue boat in a white sandy beach at sunset - نوع زپ - نوع زپ برای همه گزینه ها + Zap Type + Zap Type for all options - عمومی - همه می توانند تراکنش و پیام را ببینند + Public + Everybody can see the transaction and message - خصوصی - فرستنده و گیرنده می توانند یکدیگر و پیام را ببینند + Private + Sender and Receiver can see each other and read the message - ناشناس - گیرنده و دیگران نمی دانند چه کسی پرداخت کرده است + Anonymous + Receiver and the public does not know who sent the payment - غیرزپ - هیچ ردی در نوستر نمی ماند، فقط در شبکه لایتنینگ انجام می شود + Non-Zap + No trace in Nostr, only in Lightning - سرور فایل - آدرس لایتنینگ یا @User + File Server + LnAddress or @User - imgur.com - معتمد - Imgur میتواند فایل را بهینه کند + imgur.com - trusted + Imgur can modify the file - nostrimg.com - معتمد - NostrImg میتواند فایل را بهینه کند + nostrimg.com - trusted + NostrImg can modify the file - nostr.build - معتمد + nostr.build - trusted Nostr.build can modify the file - قابل بررسی Imgur (NIP-94) - بررسی کنید که Imgur فایل را بهینه کرده یا خیر . NIPجدید : سایر کلاینت ها ممکن است آن را نبینند. + nostrfiles.dev - trusted + Nostrfiles.dev can modify the file - قابل بررسی NostrImg (NIP-94) - بررسی کنید که NostrImg فایل را بهینه کرده یا خیر . NIPجدید : سایر کلاینت ها ممکن است آن را نبینند. + + Verifiable Imgur (NIP-94) + Checks if Imgur modified the file. New NIP: other clients might not see it + + Verifiable NostrImg (NIP-94) + Checks if NostrImg modified the file. New NIP: other clients might not see it Verifiable Nostr.build (NIP-94) - بررسی کنید که Nostr.build فایل را بهینه کرده یا خیر . NIPجدید : سایر کلاینت ها ممکن است آن را نبینند. + Checks if Nostr.build modified the file. New NIP: other clients might not see it - رله های شما (NIP-95) - فایل ها در رله های شما میزبانی می شوند. NIPجدید: بررسی کنید آیا پشتیبانی می کنند یا خیر + Verifiable Nostrfiles.dev (NIP-94) + Checks if Nostrfiles.dev modified the file. New NIP: other clients might not see it + + + Your relays (NIP-95) + Files are hosted by your relays. New NIP: check if they support - لیست دنبال ها - همه دنبال ها - همگانی + Follow List + All Follows + Global From d48a15bfb315a61dafdbc078b3b3b564b05d3c0f Mon Sep 17 00:00:00 2001 From: Believethehype Date: Tue, 9 May 2023 21:15:55 +0200 Subject: [PATCH 028/171] Update strings.xml --- app/src/main/res/values-fa/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index c53a975f26..6b7d036976 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -23,7 +23,7 @@ کپی شناسه نویسنده کپی شناسه نوت انتشار - درخواست حذف/string> + درخواست حذف/string> بلاک/پنهان کردن کاربر گزارش اسپم/کلاهبرداری گزارش جعل هویت @@ -282,7 +282,7 @@ روز نظر سنجی برای رای جدید بسته است مبلغ زپ - + فقط یک رای به ازای هر کاربر در این نوع نظرسنجی مجاز است "جستجوی رویداد %1$s" From 910849b3c7b9e9b8dc0a13a7d1efd4ad8b2bc709 Mon Sep 17 00:00:00 2001 From: Bardesss <30936735+Bardesss@users.noreply.github.com> Date: Wed, 10 May 2023 08:55:43 +0000 Subject: [PATCH 029/171] Update strings.xml (NL) Updated translation --- app/src/main/res/values-nl/strings.xml | 29 ++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index e4760f5af6..ef55fe717d 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -318,18 +318,35 @@ File server LnAddress of @User - imgur.com - minder beveiligd - Upload naar Imgur. Imgur kan uw afbeelding/video op elk moment wijzigen + imgur.com - vertrouwd + Imgur kan het bestand aanpassen - nostrimg.com - minder beveiligd - Upload naar NostrImg. NostrImg kan uw afbeelding/video op elk moment wijzigen + nostrimg.com - vertrouwd + NostrImg kan het bestand aanpassen + + nostr.build - vertrouwd + Nostr.build kan het bestand aanpassen + + nostrfiles.dev - vertrouwd + Nostrfiles.dev kan het bestand aanpassen Verifieerbare Imgur (NIP-94) - Beschermt tegen het achteraf wijzigen van de inhoud door Imgur. Dit is een nieuwe NIP: andere clients zien de afbeelding misschien niet. + Checkt of Imgur het bestand heeft aangepast. Dit is een nieuwe NIP: andere clients zien het misschien niet. Verifieerbare NostrImg (NIP-94) - Beschermt tegen het achteraf wijzigen van de inhoud door NostrImg. Dit is een nieuwe NIP: andere clients zien de afbeelding misschien niet. + Checkt of NostrImg het bestand heeft aangepast. Dit is een nieuwe NIP: andere clients zien het misschien niet. + + Verifieerbare Nostr.build (NIP-94) + Checkt of Nostr.build het bestand heeft aangepast. Dit is een nieuwe NIP: andere clients zien het misschien niet. + + Verifieerbare Nostrfiles.dev (NIP-94) + Checkt of Nostrfiles.dev het bestand heeft aangepast. Dit is een nieuwe NIP: andere clients zien het misschien niet. Uw relays (NIP-95) Bestanden worden geüpload naar en gehost door relays. Ze zijn vrij van een vaste url (afhankelijkheid van derden). Zorg ervoor dat u een NIP-95 relay in uw lijst met relays hebt. + + Volgerslijst + Alle gevolgden + Globaal + From 3c3b6544cff01a292f7f71a3cf05e50b34411112 Mon Sep 17 00:00:00 2001 From: L <68351083+malimahda@users.noreply.github.com> Date: Wed, 10 May 2023 15:02:28 +0330 Subject: [PATCH 030/171] Update strings.xml changed a couple of words --- app/src/main/res/values-fa/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 6b7d036976..cb8797ca3a 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -6,8 +6,8 @@ تصویر پروفایل کد QR اسکن بهر حال نشان بده - این پست توسط این افراد نامناسب اعلام شده - این پست یافت نشد + این نوت توسط این افراد نامناسب اعلام شده + این نوت یافت نشد تصویر کانال رویداد مربوطه یافت نشد قادر به رمزگشایی پیام نیست From ca9b7adfa0d3b370545d728b285e23ce2ca440ed Mon Sep 17 00:00:00 2001 From: L <68351083+malimahda@users.noreply.github.com> Date: Wed, 10 May 2023 15:21:40 +0330 Subject: [PATCH 031/171] Update strings.xml a few words --- app/src/main/res/values-fa/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index cb8797ca3a..6c12ac3135 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -1,10 +1,10 @@ Amethyst Amethyst Debug - اشاره کنید QR به کد - کد را نشان بده QR + به QRکد اشاره کنید + QR کد را نشان بده تصویر پروفایل - کد QR اسکن + اسکن QRکد بهر حال نشان بده این نوت توسط این افراد نامناسب اعلام شده این نوت یافت نشد @@ -181,11 +181,11 @@ همه را خوانده شده کن بازیابی کلیدها - ## راهنمایی برای ایمنی و بازیابی کلید + ## راهنمای ایمنی و بازیابی کلید \n\n- حساب کاربری شما با یک کلید خصوصی ایمن می شود. این کلید یک رشته تصادفی اعداد و ارقام است که با **nsec1** آغاز می گردد. - \n\n- هر کس به کلید خصوصی شما دست یابد می تواند به هویت شما اقدام به انتشار محتوا نماید. کلید خصوصی خود را در هیچ نرم افزار یا وب سایتی که به آن اعتماد ندارید قرار ندیهید. - \n- سازندگان آماتیست **هرگز** از ما کلید خصوصی تان را نمی خواهند. - \n- حتما یه کپی از کلید خصوصی را برای بازیابی حساب کاربری نزد خود نگه دارد. ما استفاده از یک نرم افزار مدیریت پسورد را توصیه می نماییم. + \n\n- هر کس به کلید خصوصی شما دست یابد می تواند با هویت شما اقدام به انتشار محتوا نماید. کلید خصوصی خود را در هیچ نرم افزار یا وب سایتی که به آن اعتماد ندارید قرار ندهید. + \n- سازندگان آماتیست **هرگز** از شما کلید خصوصی تان را نمی خواهند. + \n- حتما یک کپی از کلید خصوصی را برای بازیابی حساب کاربری نزد خود نگه دارد. ما استفاده از یک نرم افزار مدیریت پسورد را توصیه می نماییم. کلید خصوصی در کلیپبورد کپی شد کلید خصوصیم را کپی کن @@ -238,7 +238,7 @@ جعل هویت بدخواهانه محتوای برهنگی یا نمایان رفتار ناهنجار - بلاک کردن کاربر محتوای ایشان را در اپ شما پنهان می کند. نوت های شما همچنا بطور عمومی دیده می شوند که شامل کاربران بلاک شده توسط شما نیز هست. کاربران بلاک شده در صفحه فیلترهای ایمنی ففهرست می شوند. + بلاک کردن کاربر محتوای ایشان را در اپ شما پنهان می کند. نوت های شما همچنان بطور عمومی دیده می شوند که شامل کاربران بلاک شده توسط شما نیز هست. کاربران بلاک شده در صفحه فیلترهای ایمنی فهرست می شوند. گزارش سواستفاده تمام گزارش ها بطور عمومی دیده می شوند From a8069f7a3e6342d82be703b505a6e3be0e1ee843 Mon Sep 17 00:00:00 2001 From: L <68351083+malimahda@users.noreply.github.com> Date: Wed, 10 May 2023 16:17:01 +0330 Subject: [PATCH 032/171] Update strings.xml --- app/src/main/res/values-fa/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 6c12ac3135..3dce68a9dc 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -161,9 +161,9 @@ خودکار ترجمه از به - نشان بده s%1$ ابتدا به + ابتدا به نشان بده %1$s همیشه به ترجمه کن %1$s - هرگز به ترجمه نکن %1$s + هرگز به ترجمه نکن %1$s NIP-05 LNURL... هرگز @@ -196,8 +196,8 @@ یک مدال پاداش دریافت کردید مدال پاداش داده شد به نوت در کلیپبورد کپی شد - نویسنده در کلیپبورد کپی شد @npub - شناسه نوت در کلیپبورد کپی شد (@note1) + @npubنویسنده در کلیپبورد کپی شد + (@note1)شناسه نوت در کلیپبورد کپی شد انتخاب متن Github Gist w/ Proof Telegram From b8bc370bc1adf60699eb61591d91dfdc9f2ef6aa Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 10 May 2023 11:16:47 -0400 Subject: [PATCH 033/171] Support for Push Notifications in the PlayStore build --- app/build.gradle | 5 + app/google-services.json | 68 +++++++ .../notifications/PushNotificationUtils.kt | 8 + app/src/main/AndroidManifest.xml | 1 + .../amethyst/LocalPreferences.kt | 8 +- .../vitorpamplona/amethyst/model/Account.kt | 18 +- .../amethyst/model/LocalCache.kt | 60 +++++- .../amethyst/service/NostrDataSource.kt | 69 +------ .../amethyst/service/model/PrivateDmEvent.kt | 2 +- .../amethyst/service/nip19/Nip19.kt | 6 +- .../EventNotificationConsumer.kt | 97 +++++++++ .../notifications/NotificationUtils.kt | 185 ++++++++++++++++++ .../service/notifications/RegisterAccounts.kt | 73 +++++++ .../vitorpamplona/amethyst/ui/MainActivity.kt | 38 +++- app/src/main/res/values/strings.xml | 14 +- app/src/play/AndroidManifest.xml | 29 +++ .../PushNotificationReceiverService.kt | 22 +++ .../notifications/PushNotificationUtils.kt | 31 +++ build.gradle | 3 + 19 files changed, 645 insertions(+), 92 deletions(-) create mode 100644 app/google-services.json create mode 100644 app/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushNotificationUtils.kt create mode 100644 app/src/main/java/com/vitorpamplona/amethyst/service/notifications/EventNotificationConsumer.kt create mode 100644 app/src/main/java/com/vitorpamplona/amethyst/service/notifications/NotificationUtils.kt create mode 100644 app/src/main/java/com/vitorpamplona/amethyst/service/notifications/RegisterAccounts.kt create mode 100644 app/src/play/AndroidManifest.xml create mode 100644 app/src/play/java/com/vitorpamplona/amethyst/service/notifications/PushNotificationReceiverService.kt create mode 100644 app/src/play/java/com/vitorpamplona/amethyst/service/notifications/PushNotificationUtils.kt diff --git a/app/build.gradle b/app/build.gradle index e88d2de292..bec364b6ff 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,6 +2,7 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'org.jlleitschuh.gradle.ktlint' version "11.3.1" + id 'com.google.gms.google-services' } android { @@ -172,6 +173,10 @@ dependencies { // Google services model the translate text playImplementation 'com.google.mlkit:translate:17.0.1' + // PushNotifications + playImplementation platform('com.google.firebase:firebase-bom:32.0.0') + playImplementation 'com.google.firebase:firebase-messaging-ktx' + // Automatic memory leak detection debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.10' diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000000..4a9fa85f5e --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,68 @@ +{ + "project_info": { + "project_number": "768341258853", + "project_id": "amethyst-3057a", + "storage_bucket": "amethyst-3057a.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:768341258853:android:5d07c35a37b24ff36b8c8c", + "android_client_info": { + "package_name": "com.vitorpamplona.amethyst" + } + }, + "oauth_client": [ + { + "client_id": "768341258853-6um8ig59qstvio60gfo60fe5e45lnqqe.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyB7ZxgdpgrN6R223HCFdfv4ulP8Egp7trE" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "768341258853-6um8ig59qstvio60gfo60fe5e45lnqqe.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:768341258853:android:e0200680f552484d6b8c8c", + "android_client_info": { + "package_name": "com.vitorpamplona.amethyst.debug" + } + }, + "oauth_client": [ + { + "client_id": "768341258853-6um8ig59qstvio60gfo60fe5e45lnqqe.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyB7ZxgdpgrN6R223HCFdfv4ulP8Egp7trE" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "768341258853-6um8ig59qstvio60gfo60fe5e45lnqqe.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushNotificationUtils.kt b/app/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushNotificationUtils.kt new file mode 100644 index 0000000000..af98585d05 --- /dev/null +++ b/app/src/fdroid/java/com/vitorpamplona/amethyst/service/notifications/PushNotificationUtils.kt @@ -0,0 +1,8 @@ +package com.vitorpamplona.amethyst.service.notifications + +import com.vitorpamplona.amethyst.AccountInfo + +class PushNotificationUtils { + fun init(accounts: List) { + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2fc406f2c5..4c7929cf2a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -70,6 +70,7 @@ android:name="com.journeyapps.barcodescanner.CaptureActivity" android:screenOrientation="fullSensor" tools:replace="screenOrientation" /> + \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt index eee89bf058..001c4dddea 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt @@ -213,7 +213,13 @@ object LocalPreferences { } fun loadFromEncryptedStorage(): Account? { - encryptedPreferences(currentAccount()).apply { + val acc = loadFromEncryptedStorage(currentAccount()) + acc?.registerObservers() + return acc + } + + fun loadFromEncryptedStorage(npub: String?): Account? { + encryptedPreferences(npub).apply { val pubKey = getString(PrefKeys.NOSTR_PUBKEY, null) ?: return null val privKey = getString(PrefKeys.NOSTR_PRIVKEY, null) val followingChannels = getStringSet(PrefKeys.FOLLOWING_CHANNELS, null) ?: setOf() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index 2796ed79a0..9fa2c65f6f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -1037,14 +1037,7 @@ class Account( saveable.invalidateData() } - init { - backupContactList?.let { - println("Loading saved contacts ${it.toJson()}") - if (userProfile().latestContactList == null) { - LocalCache.consume(it) - } - } - + fun registerObservers() { // Observes relays to restart connections userProfile().live().relays.observeForever { GlobalScope.launch(Dispatchers.IO) { @@ -1071,6 +1064,15 @@ class Account( } } } + + init { + backupContactList?.let { + println("Loading saved contacts ${it.toJson()}") + if (userProfile().latestContactList == null) { + LocalCache.consume(it) + } + } + } } class AccountLiveData(private val account: Account) : LiveData(AccountState(account)) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index dc7177f984..38f50ab203 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -347,7 +347,7 @@ object LocalCache { } } - fun consume(event: PrivateDmEvent, relay: Relay?) { + fun consume(event: PrivateDmEvent, relay: Relay?): Note { val note = getOrCreateNote(event.id) val author = getOrCreateUser(event.pubKey) @@ -357,7 +357,7 @@ object LocalCache { } // Already processed this event. - if (note.event != null) return + if (note.event != null) return note val recipient = event.verifiedRecipientPubKey()?.let { getOrCreateUser(it) } @@ -374,6 +374,8 @@ object LocalCache { } refreshObservers(note) + + return note } fun consume(event: DeletionEvent) { @@ -911,6 +913,60 @@ object LocalCache { private fun refreshObservers(newNote: Note) { live.invalidateData(newNote) } + + fun consume(event: Event, relay: Relay?) { + if (!event.hasValidSignature()) return + + try { + when (event) { + is BadgeAwardEvent -> consume(event) + is BadgeDefinitionEvent -> consume(event) + is BadgeProfilesEvent -> consume(event) + is BookmarkListEvent -> consume(event) + is ChannelCreateEvent -> consume(event) + is ChannelHideMessageEvent -> consume(event) + is ChannelMessageEvent -> consume(event, relay) + is ChannelMetadataEvent -> consume(event) + is ChannelMuteUserEvent -> consume(event) + is ContactListEvent -> consume(event) + is DeletionEvent -> consume(event) + + is FileHeaderEvent -> consume(event, relay) + is FileStorageEvent -> consume(event, relay) + is FileStorageHeaderEvent -> consume(event, relay) + is HighlightEvent -> consume(event, relay) + is LnZapEvent -> { + event.zapRequest?.let { + consume(it, relay) + } + consume(event) + } + is LnZapRequestEvent -> consume(event) + is LnZapPaymentRequestEvent -> consume(event) + is LnZapPaymentResponseEvent -> consume(event) + is LongTextNoteEvent -> consume(event, relay) + is MetadataEvent -> consume(event) + is PrivateDmEvent -> consume(event, relay) + is PeopleListEvent -> consume(event) + is ReactionEvent -> consume(event) + is RecommendRelayEvent -> consume(event) + is ReportEvent -> consume(event, relay) + is RepostEvent -> { + event.containedPost()?.let { + consume(it, relay) + } + consume(event) + } + is TextNoteEvent -> consume(event, relay) + is PollNoteEvent -> consume(event, relay) + else -> { + Log.w("Event Not Supported", event.toJson()) + } + } + } catch (e: Exception) { + e.printStackTrace() + } + } } class LocalCacheLiveData : LiveData>(setOf()) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrDataSource.kt index 5de8ef2bfb..99db838b59 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrDataSource.kt @@ -3,28 +3,7 @@ package com.vitorpamplona.amethyst.service import android.util.Log import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.service.model.* -import com.vitorpamplona.amethyst.service.model.BadgeAwardEvent -import com.vitorpamplona.amethyst.service.model.BadgeDefinitionEvent -import com.vitorpamplona.amethyst.service.model.BadgeProfilesEvent -import com.vitorpamplona.amethyst.service.model.BookmarkListEvent -import com.vitorpamplona.amethyst.service.model.ChannelCreateEvent -import com.vitorpamplona.amethyst.service.model.ChannelHideMessageEvent -import com.vitorpamplona.amethyst.service.model.ChannelMessageEvent -import com.vitorpamplona.amethyst.service.model.ChannelMetadataEvent -import com.vitorpamplona.amethyst.service.model.ChannelMuteUserEvent -import com.vitorpamplona.amethyst.service.model.ContactListEvent -import com.vitorpamplona.amethyst.service.model.DeletionEvent import com.vitorpamplona.amethyst.service.model.Event -import com.vitorpamplona.amethyst.service.model.LnZapEvent -import com.vitorpamplona.amethyst.service.model.LnZapRequestEvent -import com.vitorpamplona.amethyst.service.model.LongTextNoteEvent -import com.vitorpamplona.amethyst.service.model.MetadataEvent -import com.vitorpamplona.amethyst.service.model.PrivateDmEvent -import com.vitorpamplona.amethyst.service.model.ReactionEvent -import com.vitorpamplona.amethyst.service.model.RecommendRelayEvent -import com.vitorpamplona.amethyst.service.model.ReportEvent -import com.vitorpamplona.amethyst.service.model.RepostEvent -import com.vitorpamplona.amethyst.service.model.TextNoteEvent import com.vitorpamplona.amethyst.service.relays.Client import com.vitorpamplona.amethyst.service.relays.Relay import com.vitorpamplona.amethyst.service.relays.Subscription @@ -52,8 +31,6 @@ abstract class NostrDataSource(val debugName: String) { private val clientListener = object : Client.Listener() { override fun onEvent(event: Event, subscriptionId: String, relay: Relay) { if (subscriptionId in subscriptions.keys) { - if (!event.hasValidSignature()) return - val key = "$debugName $subscriptionId ${event.kind}" val keyValue = eventCounter.get(key) if (keyValue != null) { @@ -62,51 +39,7 @@ abstract class NostrDataSource(val debugName: String) { eventCounter = eventCounter + Pair(key, Counter(1)) } - try { - when (event) { - is BadgeAwardEvent -> LocalCache.consume(event) - is BadgeDefinitionEvent -> LocalCache.consume(event) - is BadgeProfilesEvent -> LocalCache.consume(event) - is BookmarkListEvent -> LocalCache.consume(event) - is ChannelCreateEvent -> LocalCache.consume(event) - is ChannelHideMessageEvent -> LocalCache.consume(event) - is ChannelMessageEvent -> LocalCache.consume(event, relay) - is ChannelMetadataEvent -> LocalCache.consume(event) - is ChannelMuteUserEvent -> LocalCache.consume(event) - is ContactListEvent -> LocalCache.consume(event) - is DeletionEvent -> LocalCache.consume(event) - - is FileHeaderEvent -> LocalCache.consume(event, relay) - is FileStorageEvent -> LocalCache.consume(event, relay) - is FileStorageHeaderEvent -> LocalCache.consume(event, relay) - is HighlightEvent -> LocalCache.consume(event, relay) - is LnZapEvent -> { - event.zapRequest?.let { onEvent(it, subscriptionId, relay) } - LocalCache.consume(event) - } - is LnZapRequestEvent -> LocalCache.consume(event) - is LnZapPaymentRequestEvent -> LocalCache.consume(event) - is LnZapPaymentResponseEvent -> LocalCache.consume(event) - is LongTextNoteEvent -> LocalCache.consume(event, relay) - is MetadataEvent -> LocalCache.consume(event) - is PrivateDmEvent -> LocalCache.consume(event, relay) - is PeopleListEvent -> LocalCache.consume(event) - is ReactionEvent -> LocalCache.consume(event) - is RecommendRelayEvent -> LocalCache.consume(event) - is ReportEvent -> LocalCache.consume(event, relay) - is RepostEvent -> { - event.containedPost()?.let { onEvent(it, subscriptionId, relay) } - LocalCache.consume(event) - } - is TextNoteEvent -> LocalCache.consume(event, relay) - is PollNoteEvent -> LocalCache.consume(event, relay) - else -> { - Log.w("Event Not Supported", event.toJson()) - } - } - } catch (e: Exception) { - e.printStackTrace() - } + LocalCache.consume(event, relay) } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PrivateDmEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PrivateDmEvent.kt index c10837f3ac..20e4bc6967 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PrivateDmEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PrivateDmEvent.kt @@ -21,7 +21,7 @@ class PrivateDmEvent( * nip-04 EncryptedDmEvent but may omit the recipient, too. This value can be queried and used * for initial messages. */ - fun recipientPubKey() = tags.firstOrNull { it.size > 1 && it[0] == "p" } + private fun recipientPubKey() = tags.firstOrNull { it.size > 1 && it[0] == "p" } fun recipientPubKeyBytes() = recipientPubKey()?.runCatching { Hex.decode(this[1]) }?.getOrNull() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/nip19/Nip19.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/nip19/Nip19.kt index 460f1488e8..6bfc27e69f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/nip19/Nip19.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/nip19/Nip19.kt @@ -20,7 +20,7 @@ object Nip19 { val hex: String, val relay: String? = null, val author: String? = null, - val kind: Long? = null, + val kind: Int? = null, val additionalChars: String = "" ) @@ -109,7 +109,7 @@ object Nip19 { val kind = tlv.get(Tlv.Type.KIND.id) ?.get(0) - ?.let { Tlv.toInt32(it) }?.toLong() + ?.let { Tlv.toInt32(it) } return Return(Type.EVENT, hex, relay, author, kind) } @@ -140,7 +140,7 @@ object Nip19 { val kind = tlv.get(Tlv.Type.KIND.id) ?.get(0) - ?.let { Tlv.toInt32(it) }?.toLong() + ?.let { Tlv.toInt32(it) } return Return(Type.ADDRESS, "$kind:$author:$d", relay, author, kind) } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/EventNotificationConsumer.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/EventNotificationConsumer.kt new file mode 100644 index 0000000000..e971ed0a6b --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/EventNotificationConsumer.kt @@ -0,0 +1,97 @@ +package com.vitorpamplona.amethyst.service.notifications + +import android.app.NotificationManager +import android.content.Context +import androidx.core.content.ContextCompat +import com.vitorpamplona.amethyst.LocalPreferences +import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.model.LocalCache +import com.vitorpamplona.amethyst.service.model.Event +import com.vitorpamplona.amethyst.service.model.LnZapEvent +import com.vitorpamplona.amethyst.service.model.LnZapRequestEvent +import com.vitorpamplona.amethyst.service.model.PrivateDmEvent +import com.vitorpamplona.amethyst.service.notifications.NotificationUtils.sendDMNotification +import com.vitorpamplona.amethyst.service.notifications.NotificationUtils.sendZapNotification +import com.vitorpamplona.amethyst.ui.note.showAmount + +class EventNotificationConsumer(private val applicationContext: Context) { + fun consume(event: Event) { + // adds to database + LocalCache.consume(event, null) + + when (event) { + is PrivateDmEvent -> notify(event) + is LnZapEvent -> notify(event) + } + } + + private fun notify(event: PrivateDmEvent) { + val note = LocalCache.notes[event.id] ?: return + + LocalPreferences.allSavedAccounts().forEach { + val acc = LocalPreferences.loadFromEncryptedStorage(it.npub) + + if (acc != null && acc.userProfile().pubkeyHex == event.verifiedRecipientPubKey()) { + val followingKeySet = acc.followingKeySet() + + val messagingWith = acc.userProfile().privateChatrooms.keys.filter { + ( + it.pubkeyHex in followingKeySet || acc.userProfile() + .hasSentMessagesTo(it) + ) && !acc.isHidden(it) + }.toSet() + + if (note.author in messagingWith) { + val content = acc.decryptContent(note) ?: "" + val user = note.author?.toBestDisplayName() ?: "" + val userPicture = note.author?.profilePicture() + val noteUri = note.toNEvent() + notificationManager().sendDMNotification(content, user, userPicture, noteUri, applicationContext) + } + } + } + } + + private fun notify(event: LnZapEvent) { + val noteZapEvent = LocalCache.notes[event.id] ?: return + val noteZapRequest = event.zapRequest?.id?.let { LocalCache.checkGetOrCreateNote(it) } + val noteZapped = event.zappedPost().firstOrNull()?.let { LocalCache.checkGetOrCreateNote(it) } + + LocalPreferences.allSavedAccounts().forEach { + val acc = LocalPreferences.loadFromEncryptedStorage(it.npub) + + if (acc != null && acc.userProfile().pubkeyHex == event.zappedAuthor().firstOrNull()) { + val amount = showAmount(event.amount) + val senderInfo = (noteZapRequest?.event as? LnZapRequestEvent)?.let { + val decryptedContent = acc.decryptZapContentAuthor(noteZapRequest) + if (decryptedContent != null) { + val author = LocalCache.getOrCreateUser(decryptedContent.pubKey) + Pair(author, decryptedContent.content) + } else if (!noteZapRequest.event?.content().isNullOrBlank()) { + Pair(noteZapRequest.author, noteZapRequest.event?.content()) + } else { + Pair(noteZapRequest.author, null) + } + } + + val zappedContent = noteZapped?.event?.content()?.split("\n")?.get(0)?.take(50) + val user = senderInfo?.first?.toBestDisplayName() ?: "" + var title = applicationContext.getString(R.string.app_notification_zaps_channel_message, amount) + senderInfo?.second?.let { + title += " ($it)" + } + var content = applicationContext.getString(R.string.app_notification_zaps_channel_message_from, user) + zappedContent?.let { + content += " " + applicationContext.getString(R.string.app_notification_zaps_channel_message_for, zappedContent) + } + val userPicture = senderInfo?.first?.profilePicture() + val noteUri = "nostr:Notifications" + notificationManager().sendZapNotification(content, title, userPicture, noteUri, applicationContext) + } + } + } + + private fun notificationManager(): NotificationManager { + return ContextCompat.getSystemService(applicationContext, NotificationManager::class.java) as NotificationManager + } +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/NotificationUtils.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/NotificationUtils.kt new file mode 100644 index 0000000000..d8d5d5d0b7 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/NotificationUtils.kt @@ -0,0 +1,185 @@ +package com.vitorpamplona.amethyst.service.notifications + +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.graphics.drawable.BitmapDrawable +import android.net.Uri +import androidx.core.app.NotificationCompat +import coil.ImageLoader +import coil.executeBlocking +import coil.request.ImageRequest +import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.ui.MainActivity + +object NotificationUtils { + + // Notification ID. + private var notificationId = 0 + + private var dmChannel: NotificationChannel? = null + private var zapChannel: NotificationChannel? = null + + private fun getOrCreateDMChannel(applicationContext: Context): NotificationChannel { + if (dmChannel != null) return dmChannel!! + + dmChannel = NotificationChannel( + applicationContext.getString(R.string.app_notification_dms_channel_id), + applicationContext.getString(R.string.app_notification_dms_channel_name), + NotificationManager.IMPORTANCE_DEFAULT + ).apply { + description = applicationContext.getString(R.string.app_notification_dms_channel_description) + } + + // Register the channel with the system + val notificationManager: NotificationManager = + applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + + notificationManager.createNotificationChannel(dmChannel!!) + + return dmChannel!! + } + + private fun getOrCreateZapChannel(applicationContext: Context): NotificationChannel { + if (zapChannel != null) return zapChannel!! + + zapChannel = NotificationChannel( + applicationContext.getString(R.string.app_notification_zaps_channel_id), + applicationContext.getString(R.string.app_notification_zaps_channel_name), + NotificationManager.IMPORTANCE_DEFAULT + ).apply { + description = applicationContext.getString(R.string.app_notification_zaps_channel_description) + } + + // Register the channel with the system + val notificationManager: NotificationManager = + applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + + notificationManager.createNotificationChannel(zapChannel!!) + + return zapChannel!! + } + + fun NotificationManager.sendZapNotification( + messageBody: String, + messageTitle: String, + pictureUrl: String?, + uri: String, + applicationContext: Context + ) { + val zapChannel = getOrCreateZapChannel(applicationContext) + val channelId = applicationContext.getString(R.string.app_notification_zaps_channel_id) + + sendNotification(messageBody, messageTitle, pictureUrl, uri, channelId, applicationContext) + } + + fun NotificationManager.sendDMNotification( + messageBody: String, + messageTitle: String, + pictureUrl: String?, + uri: String, + applicationContext: Context + ) { + val dmChannel = getOrCreateDMChannel(applicationContext) + val channelId = applicationContext.getString(R.string.app_notification_dms_channel_id) + + sendNotification(messageBody, messageTitle, pictureUrl, uri, channelId, applicationContext) + } + + fun NotificationManager.sendNotification( + messageBody: String, + messageTitle: String, + pictureUrl: String?, + uri: String, + channelId: String, + applicationContext: Context + ) { + if (pictureUrl != null) { + val request = ImageRequest.Builder(applicationContext) + .data(pictureUrl) + .build() + + val imageLoader = ImageLoader(applicationContext) + val imageResult = imageLoader.executeBlocking(request) + sendNotification( + messageBody = messageBody, + messageTitle = messageTitle, + picture = imageResult.drawable as? BitmapDrawable, + uri = uri, + channelId, + applicationContext = applicationContext + ) + } else { + sendNotification( + messageBody = messageBody, + messageTitle = messageTitle, + picture = null, + uri = uri, + channelId, + applicationContext = applicationContext + ) + } + } + + private fun NotificationManager.sendNotification( + messageBody: String, + messageTitle: String, + picture: BitmapDrawable?, + uri: String, + channelId: String, + applicationContext: Context + ) { + val contentIntent = Intent(applicationContext, MainActivity::class.java).apply { + data = Uri.parse(uri) + } + + val contentPendingIntent = PendingIntent.getActivity( + applicationContext, + notificationId, + contentIntent, + PendingIntent.FLAG_MUTABLE + ) + + // Build the notification + val builderPublic = NotificationCompat.Builder( + applicationContext, + channelId + ) + .setSmallIcon(R.drawable.amethyst) + .setContentTitle(messageTitle) + .setContentText(applicationContext.getString(R.string.app_notification_private_message)) + .setLargeIcon(picture?.bitmap) + .setGroup(messageTitle) + .setContentIntent(contentPendingIntent) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setAutoCancel(true) + + // Build the notification + val builder = NotificationCompat.Builder( + applicationContext, + channelId + ) + .setSmallIcon(R.drawable.amethyst) + .setContentTitle(messageTitle) + .setContentText(messageBody) + .setLargeIcon(picture?.bitmap) + .setGroup(messageTitle) + .setContentIntent(contentPendingIntent) + .setPublicVersion(builderPublic.build()) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setAutoCancel(true) + + notify(notificationId, builder.build()) + + notificationId++ + } + + /** + * Cancels all notifications. + */ + fun NotificationManager.cancelNotifications() { + cancelAll() + } +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/RegisterAccounts.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/RegisterAccounts.kt new file mode 100644 index 0000000000..d3cb9d0c52 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/RegisterAccounts.kt @@ -0,0 +1,73 @@ +package com.vitorpamplona.amethyst.service.notifications + +import android.util.Log +import com.vitorpamplona.amethyst.AccountInfo +import com.vitorpamplona.amethyst.BuildConfig +import com.vitorpamplona.amethyst.LocalPreferences +import com.vitorpamplona.amethyst.service.model.RelayAuthEvent +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody + +class RegisterAccounts( + private val accounts: List +) { + + // creates proof that it controls all accounts + private fun signEventsToProveControlOfAccounts( + accounts: List, + notificationToken: String + ): List { + return accounts.mapNotNull { + val acc = LocalPreferences.loadFromEncryptedStorage(it.npub) + if (acc != null) { + val relayToUse = acc.activeRelays()?.firstOrNull { it.read } + if (relayToUse != null) { + acc.createAuthEvent(relayToUse, notificationToken) + } else { + null + } + } else { + null + } + } + } + + private fun postRegistrationEvent(events: List) { + try { + val jsonObject = """{ + "events": [ ${events.joinToString(", ") { it.toJson() }} ] + } + """ + + val mediaType = "application/json; charset=utf-8".toMediaType() + val body = jsonObject.toRequestBody(mediaType) + + val request = Request.Builder() + .header("User-Agent", "Amethyst/${BuildConfig.VERSION_NAME}") + .url("https://push.amethyst.social/register") + .post(body) + .build() + + val client = OkHttpClient.Builder().build() + + client.newCall(request).execute() + } catch (e: java.lang.Exception) { + Log.e("FirebaseMsgService", "Unable to register with push server", e) + } + } + + fun go(notificationToken: String) { + val scope = CoroutineScope(Job() + Dispatchers.IO) + scope.launch { + postRegistrationEvent( + signEventsToProveControlOfAccounts(accounts, notificationToken) + ) + } + } +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt index 808caf46f6..f09b0735c2 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt @@ -20,7 +20,12 @@ import coil.decode.SvgDecoder import com.vitorpamplona.amethyst.LocalPreferences import com.vitorpamplona.amethyst.ServiceManager import com.vitorpamplona.amethyst.VideoCache +import com.vitorpamplona.amethyst.service.model.ChannelCreateEvent +import com.vitorpamplona.amethyst.service.model.ChannelMessageEvent +import com.vitorpamplona.amethyst.service.model.ChannelMetadataEvent +import com.vitorpamplona.amethyst.service.model.PrivateDmEvent import com.vitorpamplona.amethyst.service.nip19.Nip19 +import com.vitorpamplona.amethyst.service.notifications.PushNotificationUtils import com.vitorpamplona.amethyst.service.relays.Client import com.vitorpamplona.amethyst.ui.components.muted import com.vitorpamplona.amethyst.ui.navigation.Route @@ -39,15 +44,30 @@ class MainActivity : FragmentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val nip19 = Nip19.uriToRoute(intent?.data?.toString()) - val startingPage = when (nip19?.type) { - Nip19.Type.USER -> "User/${nip19.hex}" - Nip19.Type.NOTE -> "Note/${nip19.hex}" - Nip19.Type.EVENT -> "Event/${nip19.hex}" - Nip19.Type.ADDRESS -> "Note/${nip19.hex}" - else -> null + val uri = intent?.data?.toString() + + val startingPage = if (uri.equals("nostr:Notifications", true)) { + Route.Notification.route.replace("{scrollToTop}", "true") + } else { + val nip19 = Nip19.uriToRoute(uri) + when (nip19?.type) { + Nip19.Type.USER -> "User/${nip19.hex}" + Nip19.Type.NOTE -> "Note/${nip19.hex}" + Nip19.Type.EVENT -> { + if (nip19.kind == PrivateDmEvent.kind) { + "Room/${nip19.author}" + } else if (nip19.kind == ChannelMessageEvent.kind || nip19.kind == ChannelCreateEvent.kind || nip19.kind == ChannelMetadataEvent.kind) { + "Channel/${nip19.hex}" + } else { + "Event/${nip19.hex}" + } + } + + Nip19.Type.ADDRESS -> "Note/${nip19.hex}" + else -> null + } } ?: try { - intent?.data?.toString()?.let { + uri?.let { Nip47.parse(it) val encodedUri = URLEncoder.encode(it, StandardCharsets.UTF_8.toString()) Route.Home.base + "?nip47=" + encodedUri @@ -100,6 +120,8 @@ class MainActivity : FragmentActivity() { GlobalScope.launch(Dispatchers.IO) { ServiceManager.start() } + + PushNotificationUtils().init(LocalPreferences.allSavedAccounts()) } override fun onPause() { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 703bb8e124..cab4a7e449 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -357,9 +357,21 @@ Files are hosted by your relays. New NIP: check if they support - Follow List All Follows Global + DefaultChannelID + New notification arrived + + PrivateMessagesID + Private Messages + Notifies you when a private message arrives + + ZapsID + Zaps Received + Notifies you when somebody zaps you + %1$s sats + from %1$s + for %1$s diff --git a/app/src/play/AndroidManifest.xml b/app/src/play/AndroidManifest.xml new file mode 100644 index 0000000000..f85be4db8d --- /dev/null +++ b/app/src/play/AndroidManifest.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/play/java/com/vitorpamplona/amethyst/service/notifications/PushNotificationReceiverService.kt b/app/src/play/java/com/vitorpamplona/amethyst/service/notifications/PushNotificationReceiverService.kt new file mode 100644 index 0000000000..a933abb527 --- /dev/null +++ b/app/src/play/java/com/vitorpamplona/amethyst/service/notifications/PushNotificationReceiverService.kt @@ -0,0 +1,22 @@ +package com.vitorpamplona.amethyst.service.notifications + +import com.google.firebase.messaging.FirebaseMessagingService +import com.google.firebase.messaging.RemoteMessage +import com.vitorpamplona.amethyst.LocalPreferences +import com.vitorpamplona.amethyst.service.model.Event + +class PushNotificationReceiverService : FirebaseMessagingService() { + + // this is called when a message is received + override fun onMessageReceived(remoteMessage: RemoteMessage) { + remoteMessage.data.let { + val eventStr = remoteMessage.data["event"] ?: return + val event = Event.fromJson(eventStr, true) + EventNotificationConsumer(applicationContext).consume(event) + } + } + + override fun onNewToken(token: String) { + RegisterAccounts(LocalPreferences.allSavedAccounts()).go(token) + } +} diff --git a/app/src/play/java/com/vitorpamplona/amethyst/service/notifications/PushNotificationUtils.kt b/app/src/play/java/com/vitorpamplona/amethyst/service/notifications/PushNotificationUtils.kt new file mode 100644 index 0000000000..9fc979cb9e --- /dev/null +++ b/app/src/play/java/com/vitorpamplona/amethyst/service/notifications/PushNotificationUtils.kt @@ -0,0 +1,31 @@ +package com.vitorpamplona.amethyst.service.notifications + +import android.util.Log +import com.google.android.gms.tasks.OnCompleteListener +import com.google.firebase.messaging.FirebaseMessaging +import com.vitorpamplona.amethyst.AccountInfo +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch + +class PushNotificationUtils { + fun init(accounts: List) { + val scope = CoroutineScope(Job() + Dispatchers.IO) + scope.launch { + // get user notification token provided by firebase + FirebaseMessaging.getInstance().token.addOnCompleteListener( + OnCompleteListener { task -> + if (!task.isSuccessful) { + Log.w("FirebaseMsgService", "Fetching FCM registration token failed", task.exception) + return@OnCompleteListener + } + // Get new FCM registration token + val notificationToken = task.result + + RegisterAccounts(accounts).go(notificationToken) + } + ) + } + } +} diff --git a/build.gradle b/build.gradle index d06865d095..09111b5782 100644 --- a/build.gradle +++ b/build.gradle @@ -8,6 +8,9 @@ buildscript { accompanist_version = '0.30.0' coil_version = '2.3.0' } + dependencies { + classpath 'com.google.gms:google-services:4.3.15' + } }// Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { id 'com.android.application' version '8.0.1' apply false From c87b246a4e8a8179d95b741575379bf6cdb05876 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 10 May 2023 11:19:32 -0400 Subject: [PATCH 034/171] Fixing tests --- .../com/vitorpamplona/amethyst/NIP19ParserTest.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/test/java/com/vitorpamplona/amethyst/NIP19ParserTest.kt b/app/src/test/java/com/vitorpamplona/amethyst/NIP19ParserTest.kt index cbd9950b86..2f618ddf9c 100644 --- a/app/src/test/java/com/vitorpamplona/amethyst/NIP19ParserTest.kt +++ b/app/src/test/java/com/vitorpamplona/amethyst/NIP19ParserTest.kt @@ -61,7 +61,7 @@ class NIP19ParserTest { assertEquals("31337:27241bb702d145a975260cfedee6265936dcd939eaecb88ea0e4071752c30402:xx1xulrf7wdbdlbc31far", result?.hex) assertEquals(null, result?.relay) assertEquals("27241bb702d145a975260cfedee6265936dcd939eaecb88ea0e4071752c30402", result?.author) - assertEquals(31337L, result?.kind) + assertEquals(31337, result?.kind) } @Test @@ -71,7 +71,7 @@ class NIP19ParserTest { assertEquals("30023:46fcbe3065eaf1ae7811465924e48923363ff3f526bd6f73d7c184b16bd8ce4d:613f014d2911fb9df52e048aae70268c0d216790287b5814910e1e781e8e0509", result?.hex) assertEquals(null, result?.relay) assertEquals("46fcbe3065eaf1ae7811465924e48923363ff3f526bd6f73d7c184b16bd8ce4d", result?.author) - assertEquals(30023L, result?.kind) + assertEquals(30023, result?.kind) } @Test @@ -81,7 +81,7 @@ class NIP19ParserTest { assertEquals("30023:46fcbe3065eaf1ae7811465924e48923363ff3f526bd6f73d7c184b16bd8ce4d:1679509418", result?.hex) assertEquals(null, result?.relay) assertEquals("46fcbe3065eaf1ae7811465924e48923363ff3f526bd6f73d7c184b16bd8ce4d", result?.author) - assertEquals(30023L, result?.kind) + assertEquals(30023, result?.kind) } @Test @@ -101,7 +101,7 @@ class NIP19ParserTest { assertEquals("b60ffa7256d3dd7543d830eb717ae50d05a6c32c5f791ed15b867c2bb0b954ac", result?.hex) assertEquals("wss://nostr.mom", result?.relay) assertEquals("f8ff11c7a7d3478355d3b4d174e5a473797a906ea4aa61aa9b6bc0652c1ea17a", result?.author) - assertEquals(1L, result?.kind) + assertEquals(1, result?.kind) } @Test @@ -112,7 +112,7 @@ class NIP19ParserTest { assertEquals("1f878e82063d80f41a781d3a2ef7bc336f1beb7942bf3b49b42aee1251eb5cf0", result?.hex) assertEquals("wss://relay.damus.io", result?.relay) assertEquals("460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c", result?.author) - assertEquals(1L, result?.kind) + assertEquals(1, result?.kind) } @Test @@ -123,7 +123,7 @@ class NIP19ParserTest { assertEquals("4300ec7fa2f98a276f033908349651620aa8e282b76030ab22abca63e85e07e6", result?.hex) assertEquals("wss://relay.damus.io", result?.relay) assertEquals("460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c", result?.author) - assertEquals(1L, result?.kind) + assertEquals(1, result?.kind) } @Test From 920ce54fe3fe4ff4e5dd6a916d3b9530a9d2f0be Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 10 May 2023 11:20:28 -0400 Subject: [PATCH 035/171] v0.45.0 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index bec364b6ff..b1921914d4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 151 - versionName "0.44.0" + versionCode 152 + versionName "0.45.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From 0b2e5de7527384b4efef0d558269fdfdcb25f683 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 10 May 2023 13:30:52 -0400 Subject: [PATCH 036/171] Uppercase --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cab4a7e449..f2ceb9b0a5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -372,6 +372,6 @@ Zaps Received Notifies you when somebody zaps you %1$s sats - from %1$s + From %1$s for %1$s From c1d127ac1e251f37a72adec547f32692272ca977 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 10 May 2023 13:31:25 -0400 Subject: [PATCH 037/171] Fixing blank messages and Zapped DM content --- .../service/notifications/EventNotificationConsumer.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/EventNotificationConsumer.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/EventNotificationConsumer.kt index e971ed0a6b..0d7fcd26fa 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/EventNotificationConsumer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/EventNotificationConsumer.kt @@ -74,10 +74,12 @@ class EventNotificationConsumer(private val applicationContext: Context) { } } - val zappedContent = noteZapped?.event?.content()?.split("\n")?.get(0)?.take(50) + val zappedContent = + noteZapped?.let { it1 -> acc.decryptContent(it1)?.split("\n")?.get(0)?.take(50) } + val user = senderInfo?.first?.toBestDisplayName() ?: "" var title = applicationContext.getString(R.string.app_notification_zaps_channel_message, amount) - senderInfo?.second?.let { + senderInfo?.second?.ifBlank { null }?.let { title += " ($it)" } var content = applicationContext.getString(R.string.app_notification_zaps_channel_message_from, user) From ee4c54aa27df00313eacc0f96780619b90b862af Mon Sep 17 00:00:00 2001 From: greenart7c3 <115044884+greenart7c3@users.noreply.github.com> Date: Wed, 10 May 2023 14:47:46 -0300 Subject: [PATCH 038/171] use httpclient.getHttpClient --- .../amethyst/service/notifications/RegisterAccounts.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/RegisterAccounts.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/RegisterAccounts.kt index d3cb9d0c52..f3772e3e49 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/RegisterAccounts.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/RegisterAccounts.kt @@ -4,13 +4,13 @@ import android.util.Log import com.vitorpamplona.amethyst.AccountInfo import com.vitorpamplona.amethyst.BuildConfig import com.vitorpamplona.amethyst.LocalPreferences +import com.vitorpamplona.amethyst.service.HttpClient import com.vitorpamplona.amethyst.service.model.RelayAuthEvent import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.launch import okhttp3.MediaType.Companion.toMediaType -import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody @@ -54,7 +54,7 @@ class RegisterAccounts( .post(body) .build() - val client = OkHttpClient.Builder().build() + val client = HttpClient.getHttpClient() client.newCall(request).execute() } catch (e: java.lang.Exception) { From aa0ace5014961ff01f7ebddaa725066f0db9aac8 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 10 May 2023 14:02:05 -0400 Subject: [PATCH 039/171] Delaying a bit more the average update filter for relays. --- .../java/com/vitorpamplona/amethyst/service/NostrDataSource.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrDataSource.kt index 99db838b59..085a6767ec 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrDataSource.kt @@ -103,7 +103,7 @@ abstract class NostrDataSource(val debugName: String) { } // Refreshes observers in batches. - private val bundler = BundledUpdate(250, Dispatchers.IO) { + private val bundler = BundledUpdate(300, Dispatchers.IO) { // println("DataSource: ${this.javaClass.simpleName} InvalidateFilters") // adds the time to perform the refresh into this delay From a62f2e44d0890eca1d17adba388292e84053e5cb Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 10 May 2023 14:02:38 -0400 Subject: [PATCH 040/171] Only calls invalidate if things change --- .../service/NostrSingleEventDataSource.kt | 24 ++++++++++++------- .../service/NostrSingleUserDataSource.kt | 12 ++++++---- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt index 2e3123c313..e1b663965f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt @@ -152,22 +152,30 @@ object NostrSingleEventDataSource : NostrDataSource("SingleEventFeed") { } fun add(eventId: Note) { - eventsToWatch = eventsToWatch.plus(eventId) - invalidateFilters() + if (!eventsToWatch.contains(eventId)) { + eventsToWatch = eventsToWatch.plus(eventId) + invalidateFilters() + } } fun remove(eventId: Note) { - eventsToWatch = eventsToWatch.minus(eventId) - invalidateFilters() + if (eventsToWatch.contains(eventId)) { + eventsToWatch = eventsToWatch.minus(eventId) + invalidateFilters() + } } fun addAddress(aTag: Note) { - addressesToWatch = addressesToWatch.plus(aTag) - invalidateFilters() + if (!addressesToWatch.contains(aTag)) { + addressesToWatch = addressesToWatch.plus(aTag) + invalidateFilters() + } } fun removeAddress(aTag: Note) { - addressesToWatch = addressesToWatch.minus(aTag) - invalidateFilters() + if (addressesToWatch.contains(aTag)) { + addressesToWatch = addressesToWatch.minus(aTag) + invalidateFilters() + } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleUserDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleUserDataSource.kt index ba54572801..d6991c53fe 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleUserDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleUserDataSource.kt @@ -64,12 +64,16 @@ object NostrSingleUserDataSource : NostrDataSource("SingleUserFeed") { } fun add(user: User) { - usersToWatch = usersToWatch.plus(user) - invalidateFilters() + if (!usersToWatch.contains(user)) { + usersToWatch = usersToWatch.plus(user) + invalidateFilters() + } } fun remove(user: User) { - usersToWatch = usersToWatch.minus(user) - invalidateFilters() + if (usersToWatch.contains(user)) { + usersToWatch = usersToWatch.minus(user) + invalidateFilters() + } } } From 434c1e9af324cbef64ea0a5c20e55e768c300219 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 10 May 2023 14:02:53 -0400 Subject: [PATCH 041/171] Don't try to decrypt if message is blank --- .../vitorpamplona/amethyst/service/model/GeneralListEvent.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/GeneralListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/GeneralListEvent.kt index 6b1940e47f..cbb8b2facb 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/GeneralListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/GeneralListEvent.kt @@ -23,12 +23,14 @@ abstract class GeneralListEvent( fun bookmarkedPeople() = taggedUsers() fun plainContent(privKey: ByteArray): String? { + if (content.isBlank()) return null + return try { val sharedSecret = Utils.getSharedSecret(privKey, pubKey.hexToByteArray()) return Utils.decrypt(content, sharedSecret) } catch (e: Exception) { - Log.w("GeneralList", "Error decrypting the message ${e.message}") + Log.w("GeneralList", "Error decrypting the message ${e.message} for ${dTag()}") null } } From 8fcd05a6bb1b9cd27ceebe53adc04f23521142db Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 10 May 2023 14:03:05 -0400 Subject: [PATCH 042/171] avoids cutting the first paragraph of notifcations --- .../amethyst/service/notifications/EventNotificationConsumer.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/EventNotificationConsumer.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/EventNotificationConsumer.kt index 0d7fcd26fa..fd06198ae7 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/EventNotificationConsumer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/EventNotificationConsumer.kt @@ -75,7 +75,7 @@ class EventNotificationConsumer(private val applicationContext: Context) { } val zappedContent = - noteZapped?.let { it1 -> acc.decryptContent(it1)?.split("\n")?.get(0)?.take(50) } + noteZapped?.let { it1 -> acc.decryptContent(it1)?.split("\n")?.get(0) } val user = senderInfo?.first?.toBestDisplayName() ?: "" var title = applicationContext.getString(R.string.app_notification_zaps_channel_message, amount) From ff54d581aed2fbc353cd157467cb7c0f69adc76a Mon Sep 17 00:00:00 2001 From: Oleg Koretsky Date: Wed, 10 May 2023 22:57:41 +0300 Subject: [PATCH 043/171] Actualize Russian and Ukrainian translations --- app/src/main/res/values-ru/strings.xml | 87 ++++++++++++++++++++++++++ app/src/main/res/values-uk/strings.xml | 87 ++++++++++++++++++++++++++ 2 files changed, 174 insertions(+) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 66cb4e11bf..ea19d2dfa9 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -234,4 +234,91 @@ Отправить жалобу "<Не удалось расшифровать сообщение>\n\nВас упомянули в приватном/зашифрованном чате между %1$s и %2$s." Заблокировать и пожаловаться + Байт + Подписаться в ответ + Закладки + Личные закладки + Публичные закладки + Добавить в Личные закладки + Добавить в Публичные закладки + Убрать из Личных закладок + Убрать из Публичных закладок + Служба Wallet Connect + Позволяет оплачивать запы с помощью секрета, не выходя из приложения. Храните секрет в безопасности и по возможности используйте приватный релей + Публичный ключ Wallet Connect + Релей Wallet Connect + Секрет Wallet Connect + Показать секрет + nsec / приватный ключ в hex + Сумма взноса в sat + Отправить опрос + Обязательные поля: + Получатели запов + Описание опроса + Вариант %s + Описание варианта + Опциональные поля: + Минимальный зап + Максимальный зап + Консенсус + (0–100)% + Закрытие после + дней + Опрос закрыт + Сумма запа + В этом опросе можно голосовать только один раз + Поиск события %1$s + Добавить публичное сообщение + Добавить личное сообщение + Добавить примечание к инвойсу + Спасибо всем вам за работу! + Создать и Добавить + Автор опроса не может голосовать + Фото не изменилось после публикации + Фото изменено. Автор мог не заметить изменение + Добавить фото + Добавить видео + Добавить документ + Добавить к сообщению + Описание содержимого + Компания весёлых молодых людей + Тип запа + Тип запа для всех вариантов + Публичный + Все видят платеж и сообщение + Приватный + Отправитель и получатель видят друг друга и могут прочесть сообщение + Анонимный + Никто не видит отправителя платежа + Не-зап + Без следа в Nostr, обычный Lightning платеж + Сервер для загрузки + LnAddress или @User + imgur.com – доверенный + Imgur может изменять файл + nostrimg.com – доверенный + NostrImg может изменять файл + Верифицируемый Imgur (NIP-94) + Проверка на изменение файла Imgur. Новый NIP: может не работать в других клиентах + Верифицируемый NostrImg (NIP-94) + Проверка на изменение файла NostrImg. Новый NIP: может не работать в других клиентах + Ваши релеи (NIP-95) + Файл хранится на ваших релеях. Новый NIP: может не работать в других клиентах + Все подписки + Глобально + nostr.build – доверенный + Nostr.build может изменять файл + nostrfiles.dev – доверенный + Nostrfiles.dev может изменять файл + Верифицируемый Nostr.build (NIP-94) + Проверка на изменение файла Nostr.build. Новый NIP: может не работать в других клиентах + Верифицируемый Nostrfiles.dev (NIP-94) + Проверка на изменение файла nostrfiles.dev. Новый NIP: может не работать в других клиентах + Личные сообщения + Уведомления о входящих сообщениях + Запы + Уведомления о полученных запах + %1$s sat + От %1$s + за %1$s \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 4bb25631b2..e01745d789 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -234,4 +234,91 @@ Відправити скаргу "<Не вдалося розшифрувати повідомлення>\n\n\пВас згадали в приватному/зашифрованому чаті між %1$s і %2$s." Заблокувати та поскаржитися + Байт + Підписатися у відповідь + Закладки + Особисті закладки + Публічні закладки + Додати в Особисті закладки + Додати в Публічні закладки + Прибрати з Особистих закладок + Прибрати з Публічних закладок + Служба Wallet Connect + Дозволяє оплачувати запи за допомогою секрету, не виходячи з програми. Зберігайте секрет у безпеці та за можливості використовуйте приватний релей + Публічний ключ Wallet Connect + Релей Wallet Connect + Секрет Wallet Connect + Показати секрет + nsec / приватний ключ в hex + Сума внеску в sat + Відправити опитування + Обов\'язкові поля: + Одержувачі запів + Опис опитування + Варіант %s + Опис варіанту + Опціональні поля: + Мінімальний зап + Максимальний зап + Консенсус + (0–100)% + Закриття після + днів + Опитування закрито + Сума запу + У цьому опитуванні можна голосувати тільки один раз + Пошук події %1$s + Додати публічне повідомлення + Додати приватне повідомлення + Додати примітку до інвойсу + Дякую всім вам за роботу! + Створити та Додати + Автор опитування не може голосувати + Фото не змінилося після публікації + Фото змінено. Автор міг не помітити зміну + Додати фото + Додати відео + Додати документ + Додати до повідомлення + Опис вмісту + Компанія веселих молодих людей + Тип запу + Тип запу для всіх варіантів + Публічний + Всі бачать платіж і повідомлення + Приватний + Відправник і одержувач бачать один одного і можуть прочитати повідомлення + Анонімний + Ніхто не бачить відправника платежу + Не-зап + Без сліду в Nostr, звичайний Lightning платіж + Сервер для завантаження + LnAddress або @User + imgur.com – довірений + Imgur може змінювати файл + nostrimg.com – довірений + NostrImg може змінювати файл + Верифікований Imgur (NIP-94) + Перевірка на зміну файлу Imgur. Новий NIP: може не працювати в інших клієнтах + Верифікований NostrImg (NIP-94) + Перевірка на зміну файлу NostrImg. Новий NIP: може не працювати в інших клієнтах + Ваші релеї (NIP-95) + Файл зберігається на ваших релеях. Новий NIP: може не працювати в інших клієнтах + Всі підписки + Глобально + nostr.build – довірений + Nostr.build може змінювати файл + nostrfiles.dev – довірений + Nostrfiles.dev може змінювати файл + Верифікований Nostr.build (NIP-94) + Перевірка на зміну файлу Nostr.build. Новий NIP: може не працювати в інших клієнтах + Верифікований Nostrfiles.dev (NIP-94) + Перевірка на зміну файлу nostrfiles.dev. Новий NIP: може не працювати в інших клієнтах + Особисті повідомлення + Сповіщення про вхідні повідомлення + Запи + Сповіщення про отримані запахи + %1$s sat + Від %1$s + за %1$s \ No newline at end of file From b1de36f423e35cb021d8133082185fa53b0c723d Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 10 May 2023 19:08:56 -0400 Subject: [PATCH 044/171] Trying to improve rendering by allowing recompositions to perform layout faster. --- .../ui/components/RobohashAsyncImage.kt | 42 +- .../amethyst/ui/note/MessageSetCompose.kt | 75 +- .../amethyst/ui/note/MultiSetCompose.kt | 300 +++++--- .../amethyst/ui/note/NoteCompose.kt | 676 ++++++++++-------- .../amethyst/ui/note/ReactionsRow.kt | 129 ++-- 5 files changed, 720 insertions(+), 502 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt index c50d08163a..06519d8305 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt @@ -1,6 +1,7 @@ package com.vitorpamplona.amethyst.ui.components import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.ColorFilter @@ -30,24 +31,31 @@ fun RobohashAsyncImage( colorFilter: ColorFilter? = null, filterQuality: FilterQuality = DrawScope.DefaultFilterQuality ) { - with(LocalDensity.current) { - AsyncImage( - model = Robohash.imageRequest( - LocalContext.current, - robot, - Size(robotSize.roundToPx(), robotSize.roundToPx()) - ), - contentDescription = contentDescription, - modifier = modifier, - transform = transform, - onState = onState, - alignment = alignment, - contentScale = contentScale, - alpha = alpha, - colorFilter = colorFilter, - filterQuality = filterQuality + val context = LocalContext.current + val size = with(LocalDensity.current) { + robotSize.roundToPx() + } + + val imageRequest = remember(size, robot) { + Robohash.imageRequest( + context, + robot, + Size(size, size) ) } + + AsyncImage( + model = imageRequest, + contentDescription = contentDescription, + modifier = modifier, + transform = transform, + onState = onState, + alignment = alignment, + contentScale = contentScale, + alpha = alpha, + colorFilter = colorFilter, + filterQuality = filterQuality + ) } var imageErrors = setOf() @@ -120,7 +128,7 @@ fun RobohashAsyncImageProxy( colorFilter: ColorFilter? = null, filterQuality: FilterQuality = DrawScope.DefaultFilterQuality ) { - val proxy = model.proxyUrl() + val proxy = remember(model) { model.proxyUrl() } if (proxy == null) { RobohashAsyncImage( robot = robot, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MessageSetCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MessageSetCompose.kt index 4e6fa71fe1..36fe88205d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MessageSetCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MessageSetCompose.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width @@ -34,18 +35,18 @@ import kotlinx.coroutines.launch @OptIn(ExperimentalFoundationApi::class) @Composable -fun MessageSetCompose(messageSetCard: MessageSetCard, isInnerNote: Boolean = false, routeForLastRead: String, accountViewModel: AccountViewModel, navController: NavController) { +fun MessageSetCompose(messageSetCard: MessageSetCard, routeForLastRead: String, accountViewModel: AccountViewModel, navController: NavController) { val noteState by messageSetCard.note.live().metadata.observeAsState() - val note = noteState?.note + val note = remember(noteState) { noteState?.note } var popupExpanded by remember { mutableStateOf(false) } val scope = rememberCoroutineScope() if (note == null) { - BlankNote(Modifier, isInnerNote) + BlankNote(Modifier) } else { - var isNew by remember { mutableStateOf(false) } + var isNew by remember { mutableStateOf(false) } LaunchedEffect(key1 = messageSetCard.createdAt()) { scope.launch(Dispatchers.IO) { @@ -66,44 +67,40 @@ fun MessageSetCompose(messageSetCard: MessageSetCard, isInnerNote: Boolean = fal MaterialTheme.colors.background } - Column( - modifier = Modifier.background(backgroundColor).combinedClickable( - onClick = { - scope.launch { - routeFor( - note, - accountViewModel.userProfile() - )?.let { navController.navigate(it) } - } - }, - onLongClick = { popupExpanded = true } - ) - ) { - Row( - modifier = Modifier - .padding( - start = if (!isInnerNote) 12.dp else 0.dp, - end = if (!isInnerNote) 12.dp else 0.dp, - top = 10.dp + val columnModifier = remember { + Modifier + .background(backgroundColor) + .padding( + start = 12.dp, + end = 12.dp, + top = 10.dp + ) + .combinedClickable( + onClick = { + scope.launch { + routeFor( + note, + accountViewModel.userProfile() + )?.let { navController.navigate(it) } + } + }, + onLongClick = { popupExpanded = true } + ) + .fillMaxWidth() + } + + Column(columnModifier) { + Row(Modifier.fillMaxWidth()) { + Box(modifier = remember { Modifier.width(55.dp).padding(top = 5.dp, end = 5.dp) }) { + Icon( + painter = painterResource(R.drawable.ic_dm), + null, + modifier = remember { Modifier.size(16.dp).align(Alignment.TopEnd) }, + tint = MaterialTheme.colors.primary ) - ) { - // Draws the like picture outside the boosted card. - if (!isInnerNote) { - Box( - modifier = Modifier - .width(55.dp) - .padding(top = 5.dp) - ) { - Icon( - painter = painterResource(R.drawable.ic_dm), - null, - modifier = Modifier.size(16.dp).align(Alignment.TopEnd), - tint = MaterialTheme.colors.primary - ) - } } - Column(modifier = Modifier.padding(start = if (!isInnerNote) 10.dp else 0.dp)) { + Column(modifier = remember { Modifier.padding(start = 10.dp) }) { NoteCompose( baseNote = messageSetCard.note, routeForLastRead = null, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt index 1aebd5efab..ffe5c5da6c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt @@ -19,6 +19,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Bolt import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.State import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf @@ -40,6 +41,7 @@ import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.User +import com.vitorpamplona.amethyst.model.UserState import com.vitorpamplona.amethyst.service.model.LnZapRequestEvent import com.vitorpamplona.amethyst.ui.components.TranslatableRichTextViewer import com.vitorpamplona.amethyst.ui.screen.MultiSetCard @@ -52,19 +54,19 @@ import kotlinx.coroutines.launch @Composable fun MultiSetCompose(multiSetCard: MultiSetCard, routeForLastRead: String, accountViewModel: AccountViewModel, navController: NavController) { val noteState by multiSetCard.note.live().metadata.observeAsState() - val note = noteState?.note + val note = remember(noteState) { noteState?.note } val accountState by accountViewModel.accountLiveData.observeAsState() - val account = accountState?.account ?: return + val account = remember(accountState) { accountState?.account } var popupExpanded by remember { mutableStateOf(false) } val scope = rememberCoroutineScope() - if (note == null) { + if (note == null || account == null) { BlankNote(Modifier, false) } else { - var isNew by remember { mutableStateOf(false) } + var isNew by remember { mutableStateOf(false) } LaunchedEffect(key1 = multiSetCard.createdAt()) { scope.launch(Dispatchers.IO) { @@ -84,112 +86,157 @@ fun MultiSetCompose(multiSetCard: MultiSetCard, routeForLastRead: String, accoun MaterialTheme.colors.background } - Column( - modifier = Modifier + val columnModifier = remember { + Modifier .background(backgroundColor) + .padding( + start = 12.dp, + end = 12.dp, + top = 10.dp + ) .combinedClickable( onClick = { scope.launch { - routeFor(note, account.userProfile())?.let { navController.navigate(it) } + routeFor( + note, + account.userProfile() + )?.let { navController.navigate(it) } } }, onLongClick = { popupExpanded = true } ) - ) { - Row( - modifier = Modifier - .padding( - start = 12.dp, - end = 12.dp, - top = 10.dp - ) - ) { - Column(Modifier.fillMaxWidth()) { - if (multiSetCard.zapEvents.isNotEmpty()) { - Row(Modifier.fillMaxWidth()) { - // Draws the like picture outside the boosted card. - Box( - modifier = Modifier - .width(55.dp) - .padding(0.dp) - ) { - Icon( - imageVector = Icons.Default.Bolt, - contentDescription = "Zaps", - tint = BitcoinOrange, - modifier = Modifier - .size(25.dp) - .align(Alignment.TopEnd) - ) - } + .fillMaxWidth() + } - AuthorGalleryZaps(multiSetCard.zapEvents, navController, account, accountViewModel) - } - } + val zapEvents = remember { multiSetCard.zapEvents } + val boostEvents = remember { multiSetCard.boostEvents } + val likeEvents = remember { multiSetCard.likeEvents } - if (multiSetCard.boostEvents.isNotEmpty()) { - Row(Modifier.fillMaxWidth()) { - Box( - modifier = Modifier - .width(55.dp) - .padding(end = 4.dp) - ) { - Icon( - painter = painterResource(R.drawable.ic_retweeted), - null, - modifier = Modifier - .size(18.dp) - .align(Alignment.TopEnd), - tint = Color.Unspecified - ) - } + Column(modifier = columnModifier) { + if (zapEvents.isNotEmpty()) { + RenderZapGallery(zapEvents, navController, account, accountViewModel) + } - AuthorGallery(multiSetCard.boostEvents, navController, account, accountViewModel) - } - } + if (boostEvents.isNotEmpty()) { + RenderBoostGallery(boostEvents, navController, account, accountViewModel) + } - if (multiSetCard.likeEvents.isNotEmpty()) { - Row(Modifier.fillMaxWidth()) { - Box( - modifier = Modifier - .width(55.dp) - .padding(end = 5.dp) - ) { - Icon( - painter = painterResource(R.drawable.ic_liked), - null, - modifier = Modifier - .size(16.dp) - .align(Alignment.TopEnd), - tint = Color.Unspecified - ) - } + if (likeEvents.isNotEmpty()) { + RenderLikeGallery(likeEvents, navController, account, accountViewModel) + } - AuthorGallery(multiSetCard.likeEvents, navController, account, accountViewModel) - } - } + Row(Modifier.fillMaxWidth()) { + Spacer(modifier = Modifier.width(65.dp)) - Row(Modifier.fillMaxWidth()) { - Spacer(modifier = Modifier.width(65.dp)) + NoteCompose( + baseNote = multiSetCard.note, + routeForLastRead = null, + modifier = Modifier.padding(top = 5.dp), + isBoostedNote = true, + parentBackgroundColor = backgroundColor, + accountViewModel = accountViewModel, + navController = navController + ) - NoteCompose( - baseNote = multiSetCard.note, - routeForLastRead = null, - modifier = Modifier.padding(top = 5.dp), - isBoostedNote = true, - parentBackgroundColor = backgroundColor, - accountViewModel = accountViewModel, - navController = navController - ) - - NoteDropDownMenu(note, popupExpanded, { popupExpanded = false }, accountViewModel) - } - } + NoteDropDownMenu(note, popupExpanded, { popupExpanded = false }, accountViewModel) } } } } +@Composable +private fun RenderLikeGallery( + likeEvents: List, + navController: NavController, + account: Account, + accountViewModel: AccountViewModel +) { + Row(Modifier.fillMaxWidth()) { + Box( + modifier = remember { + Modifier + .width(55.dp) + .padding(end = 5.dp) + } + ) { + Icon( + painter = painterResource(R.drawable.ic_liked), + null, + modifier = remember { + Modifier + .size(16.dp) + .align(Alignment.TopEnd) + }, + tint = Color.Unspecified + ) + } + + AuthorGallery(likeEvents, navController, account, accountViewModel) + } +} + +@Composable +private fun RenderZapGallery( + zapEvents: Map, + navController: NavController, + account: Account, + accountViewModel: AccountViewModel +) { + Row(Modifier.fillMaxWidth()) { + Box( + modifier = remember { + Modifier + .width(55.dp) + .padding(0.dp) + } + ) { + Icon( + imageVector = Icons.Default.Bolt, + contentDescription = "Zaps", + tint = BitcoinOrange, + modifier = remember { + Modifier + .size(25.dp) + .align(Alignment.TopEnd) + } + ) + } + + AuthorGalleryZaps(zapEvents, navController, account, accountViewModel) + } +} + +@Composable +private fun RenderBoostGallery( + boostEvents: List, + navController: NavController, + account: Account, + accountViewModel: AccountViewModel +) { + Row(Modifier.fillMaxWidth()) { + Box( + modifier = remember { + Modifier + .width(55.dp) + .padding(end = 4.dp) + } + ) { + Icon( + painter = painterResource(R.drawable.ic_retweeted), + null, + modifier = remember { + Modifier + .size(18.dp) + .align(Alignment.TopEnd) + }, + tint = Color.Unspecified + ) + } + + AuthorGallery(boostEvents, navController, account, accountViewModel) + } +} + @Composable fun AuthorGalleryZaps( authorNotes: Map, @@ -197,13 +244,16 @@ fun AuthorGalleryZaps( account: Account, accountViewModel: AccountViewModel ) { - val accountState by account.userProfile().live().follows.observeAsState() - val accountUser = accountState?.user ?: return + val accountState = account.userProfile().live().follows.observeAsState() + + val listToRender = remember { + authorNotes.keys.take(50) + } Column(modifier = Modifier.padding(start = 10.dp)) { FlowRow() { - authorNotes.forEach { - AuthorPictureAndComment(it.key, navController, accountUser, accountViewModel) + listToRender.forEach { + AuthorPictureAndComment(it, navController, accountState, accountViewModel) } } } @@ -213,7 +263,7 @@ fun AuthorGalleryZaps( private fun AuthorPictureAndComment( zapRequest: Note, navController: NavController, - accountUser: User, + accountUser: State, accountViewModel: AccountViewModel ) { val author = zapRequest.author ?: return @@ -245,19 +295,25 @@ private fun AuthorPictureAndComment( author: User, comment: String?, navController: NavController, - accountUser: User, + accountUser: State, accountViewModel: AccountViewModel ) { - val modifier = if (!comment.isNullOrBlank()) { - Modifier.fillMaxWidth() - } else { - Modifier + val modifier = remember(comment) { + if (!comment.isNullOrBlank()) { + Modifier + .fillMaxWidth() + .clickable { + navController.navigate("User/${author.pubkeyHex}") + } + } else { + Modifier.clickable { + navController.navigate("User/${author.pubkeyHex}") + } + } } Row( - modifier = modifier.clickable { - navController.navigate("User/${author.pubkeyHex}") - }, + modifier = modifier, verticalAlignment = Alignment.CenterVertically ) { FastNoteAuthorPicture( @@ -288,20 +344,22 @@ fun AuthorGallery( account: Account, accountViewModel: AccountViewModel ) { - val accountState by account.userProfile().live().follows.observeAsState() - val accountUser = accountState?.user ?: return + val accountState = account.userProfile().live().follows.observeAsState() + val listToRender = remember { + Pair( + authorNotes.take(50).mapNotNull { it.author }, + authorNotes.size + ) + } Column(modifier = Modifier.padding(start = 10.dp)) { FlowRow() { - authorNotes.take(50).forEach { - val author = it.author - if (author != null) { - AuthorPictureAndComment(author, null, navController, accountUser, accountViewModel) - } + listToRender.first.forEach { author -> + AuthorPictureAndComment(author, null, navController, accountState, accountViewModel) } - if (authorNotes.size > 50) { - Text(" and ${authorNotes.size - 50} others") + if (listToRender.second > 50) { + Text(" and ${listToRender.second - 50} others") } } } @@ -310,18 +368,26 @@ fun AuthorGallery( @Composable fun FastNoteAuthorPicture( author: User, - userAccount: User, + userAccount: State, size: Dp, pictureModifier: Modifier = Modifier ) { val userState by author.live().metadata.observeAsState() - val user = userState?.user ?: return + val profilePicture = remember(userState) { + userState?.user?.profilePicture() + } - val showFollowingMark = userAccount.isFollowingCached(user) || user === userAccount + val authorPubKey = remember { + author.pubkeyHex + } + + val showFollowingMark = remember(userAccount.value) { + userAccount.value?.user?.isFollowingCached(author) == true || (author === userAccount.value?.user) + } UserPicture( - userHex = user.pubkeyHex, - userPicture = user.profilePicture(), + userHex = authorPubKey, + userPicture = profilePicture, showFollowingMark = showFollowingMark, size = size, modifier = pictureModifier diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index 5c6bdc9591..0ed76233f6 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -96,6 +96,7 @@ import com.vitorpamplona.amethyst.service.model.PollNoteEvent import com.vitorpamplona.amethyst.service.model.PrivateDmEvent import com.vitorpamplona.amethyst.service.model.ReactionEvent import com.vitorpamplona.amethyst.service.model.ReportEvent +import com.vitorpamplona.amethyst.service.model.ReportedKey import com.vitorpamplona.amethyst.service.model.RepostEvent import com.vitorpamplona.amethyst.service.model.TextNoteEvent import com.vitorpamplona.amethyst.ui.components.ClickableUrl @@ -178,208 +179,226 @@ fun NoteComposeInner( navController: NavController ) { val accountState by accountViewModel.accountLiveData.observeAsState() - val account = accountState?.account ?: return - val loggedIn = account.userProfile() + val account = remember(accountState) { accountState?.account } ?: return + val loggedIn = remember(accountState) { accountState?.account?.userProfile() } ?: return val noteState by baseNote.live().metadata.observeAsState() - val note = noteState?.note + val note = remember(noteState) { noteState?.note } val noteReportsState by baseNote.live().reports.observeAsState() - val noteForReports = noteReportsState?.note ?: return - - var popupExpanded by remember { mutableStateOf(false) } - var showHiddenNote by remember { mutableStateOf(false) } - - var isAcceptableAndCanPreview by remember { mutableStateOf(Pair(true, true)) } - - LaunchedEffect(key1 = noteReportsState) { - withContext(Dispatchers.IO) { - val newCanPreview = note?.author === loggedIn || - (note?.author?.let { loggedIn.isFollowingCached(it) } ?: true) || - !noteForReports.hasAnyReports() - - val newIsAcceptable = account.isAcceptable(noteForReports) - - if (newIsAcceptable != isAcceptableAndCanPreview.first && newCanPreview != isAcceptableAndCanPreview.second) { - isAcceptableAndCanPreview = Pair(newIsAcceptable, newCanPreview) - } - } - } + val noteForReports = remember(noteReportsState) { noteReportsState?.note } ?: return val noteEvent = note?.event val baseChannel = note?.channel() + var popupExpanded by remember { mutableStateOf(false) } + if (noteEvent == null) { BlankNote( - modifier.combinedClickable( - onClick = { }, - onLongClick = { popupExpanded = true } - ), - isBoostedNote - ) - } else if (!isAcceptableAndCanPreview.first && !showHiddenNote) { - if (!account.isHidden(noteForReports.author!!)) { - HiddenNote( - account.getRelevantReports(noteForReports), - loggedIn, - modifier, - isBoostedNote, - navController, - onClick = { showHiddenNote = true } - ) - } - } else if ((noteEvent is ChannelCreateEvent || noteEvent is ChannelMetadataEvent) && baseChannel != null) { - ChannelHeader(baseChannel = baseChannel, account = account, navController = navController) - } else if (noteEvent is BadgeDefinitionEvent) { - BadgeDisplay(baseNote = note) - } else if (noteEvent is FileHeaderEvent) { - FileHeaderDisplay(note) - } else if (noteEvent is FileStorageHeaderEvent) { - FileStorageHeaderDisplay(note) - } else { - var isNew by remember { mutableStateOf(false) } - - val scope = rememberCoroutineScope() - - LaunchedEffect(key1 = routeForLastRead) { - scope.launch(Dispatchers.IO) { - routeForLastRead?.let { - val lastTime = NotificationCache.load(it) - - val createdAt = note.createdAt() - if (createdAt != null) { - NotificationCache.markAsRead(it, createdAt) - - val newIsNew = createdAt > lastTime - if (newIsNew != isNew) { - isNew = newIsNew - } - } - } - } - } - - val backgroundColor = if (isNew) { - val newColor = MaterialTheme.colors.primary.copy(0.12f) - if (parentBackgroundColor != null) { - newColor.compositeOver(parentBackgroundColor) - } else { - newColor.compositeOver(MaterialTheme.colors.background) - } - } else { - parentBackgroundColor ?: MaterialTheme.colors.background - } - - Column( - modifier = modifier - .combinedClickable( - onClick = { - scope.launch { - routeFor(note, loggedIn)?.let { navController.navigate(it) } - } - }, + remember { + modifier.combinedClickable( + onClick = { }, onLongClick = { popupExpanded = true } ) - .background(backgroundColor) - ) { - Row( - modifier = Modifier - .padding( - start = if (!isBoostedNote) 12.dp else 0.dp, - end = if (!isBoostedNote) 12.dp else 0.dp, - top = if (addMarginTop && !isBoostedNote) 10.dp else 0.dp - ) - ) { - if (!isBoostedNote && !isQuotedNote) { - DrawAuthorImages(baseNote, loggedIn, navController) + }, + isBoostedNote + ) + + note?.let { + NoteQuickActionMenu(it, popupExpanded, { popupExpanded = false }, accountViewModel) + } + } else { + var showHiddenNote by remember { mutableStateOf(false) } + var isAcceptableAndCanPreview by remember { mutableStateOf(Pair(true, true)) } + + LaunchedEffect(key1 = noteReportsState, key2 = accountState) { + withContext(Dispatchers.IO) { + account.userProfile().let { loggedIn -> + val newCanPreview = note.author === loggedIn || + (note.author?.let { loggedIn.isFollowingCached(it) } ?: true) || + !(noteForReports.hasAnyReports()) + + val newIsAcceptable = account.isAcceptable(noteForReports) + + if (newIsAcceptable != isAcceptableAndCanPreview.first && newCanPreview != isAcceptableAndCanPreview.second) { + isAcceptableAndCanPreview = Pair(newIsAcceptable, newCanPreview) + } } + } + } - Column( - modifier = Modifier - .padding(start = if (!isBoostedNote && !isQuotedNote) 10.dp else 0.dp) - ) { - FirstUserInfoRow( - baseNote = baseNote, - showAuthorPicture = isQuotedNote, - account = account, - accountViewModel = accountViewModel, - navController = navController + if (!isAcceptableAndCanPreview.first && !showHiddenNote) { + if (!account.isHidden(noteForReports.author!!)) { + HiddenNote( + account.getRelevantReports(noteForReports), + account.userProfile(), + modifier, + isBoostedNote, + navController, + onClick = { showHiddenNote = true } + ) + } + } else if ((noteEvent is ChannelCreateEvent || noteEvent is ChannelMetadataEvent) && baseChannel != null) { + ChannelHeader(baseChannel = baseChannel, account = account, navController = navController) + } else if (noteEvent is BadgeDefinitionEvent) { + BadgeDisplay(baseNote = note) + } else if (noteEvent is FileHeaderEvent) { + FileHeaderDisplay(note) + } else if (noteEvent is FileStorageHeaderEvent) { + FileStorageHeaderDisplay(note) + } else { + var isNew by remember { mutableStateOf(false) } + + val scope = rememberCoroutineScope() + + LaunchedEffect(key1 = routeForLastRead) { + scope.launch(Dispatchers.IO) { + routeForLastRead?.let { + val lastTime = NotificationCache.load(it) + + val createdAt = note.createdAt() + if (createdAt != null) { + NotificationCache.markAsRead(it, createdAt) + + val newIsNew = createdAt > lastTime + if (newIsNew != isNew) { + isNew = newIsNew + } + } + } + } + } + + val backgroundColor = if (isNew) { + val newColor = MaterialTheme.colors.primary.copy(0.12f) + if (parentBackgroundColor != null) { + newColor.compositeOver(parentBackgroundColor) + } else { + newColor.compositeOver(MaterialTheme.colors.background) + } + } else { + parentBackgroundColor ?: MaterialTheme.colors.background + } + + val columnModifier = remember(backgroundColor) { + modifier + .combinedClickable( + onClick = { + scope.launch { + routeFor(note, loggedIn)?.let { + navController.navigate(it) + } + } + }, + onLongClick = { popupExpanded = true } ) + .background(backgroundColor) + } - if (noteEvent !is RepostEvent && !makeItShort && !isQuotedNote) { - SecondUserInfoRow( - note, - account, - navController - ) + Column(modifier = columnModifier) { + Row( + modifier = remember { + Modifier + .padding( + start = if (!isBoostedNote) 12.dp else 0.dp, + end = if (!isBoostedNote) 12.dp else 0.dp, + top = if (addMarginTop && !isBoostedNote) 10.dp else 0.dp + ) + } + ) { + if (!isBoostedNote && !isQuotedNote) { + DrawAuthorImages(baseNote, loggedIn, navController) } - Spacer(modifier = Modifier.height(2.dp)) - - if (!makeItShort) { - ReplyRow( - note, - unPackReply, - backgroundColor, - account, - accountViewModel, - navController + Column( + modifier = remember { + Modifier + .padding(start = if (!isBoostedNote && !isQuotedNote) 10.dp else 0.dp) + } + ) { + FirstUserInfoRow( + baseNote = baseNote, + showAuthorPicture = isQuotedNote, + account = account, + accountViewModel = accountViewModel, + navController = navController ) - } - when (noteEvent) { - is ReactionEvent -> { - RenderReaction(note, backgroundColor, accountViewModel, navController) - } - - is RepostEvent -> { - RenderRepost(note, backgroundColor, accountViewModel, navController) - } - - is ReportEvent -> { - RenderReport(note) - } - - is LongTextNoteEvent -> { - RenderLongFormContent(note, loggedIn, accountViewModel, navController) - } - - is BadgeAwardEvent -> { - RenderBadgeAward(note, backgroundColor, accountViewModel, navController) - } - - is PrivateDmEvent -> { - RenderPrivateMessage(note, makeItShort, isAcceptableAndCanPreview.second, backgroundColor, accountViewModel, navController) - } - - is HighlightEvent -> { - RenderHighlight(note, makeItShort, isAcceptableAndCanPreview.second, backgroundColor, accountViewModel, navController) - } - - is PollNoteEvent -> { - RenderPoll( + if (noteEvent !is RepostEvent && !makeItShort && !isQuotedNote) { + SecondUserInfoRow( note, - makeItShort, - isAcceptableAndCanPreview.second, + account, + navController + ) + } + + Spacer(modifier = Modifier.height(2.dp)) + + if (!makeItShort) { + ReplyRow( + note, + unPackReply, backgroundColor, + account, accountViewModel, navController ) } - else -> { - RenderTextEvent( - note, - makeItShort, - isAcceptableAndCanPreview.second, - backgroundColor, - accountViewModel, - navController - ) - } - } + when (noteEvent) { + is ReactionEvent -> { + RenderReaction(note, backgroundColor, accountViewModel, navController) + } - NoteQuickActionMenu(note, popupExpanded, { popupExpanded = false }, accountViewModel) + is RepostEvent -> { + RenderRepost(note, backgroundColor, accountViewModel, navController) + } + + is ReportEvent -> { + RenderReport(note) + } + + is LongTextNoteEvent -> { + RenderLongFormContent(note, loggedIn, accountViewModel, navController) + } + + is BadgeAwardEvent -> { + RenderBadgeAward(note, backgroundColor, accountViewModel, navController) + } + + is PrivateDmEvent -> { + RenderPrivateMessage(note, makeItShort, isAcceptableAndCanPreview.second, backgroundColor, accountViewModel, navController) + } + + is HighlightEvent -> { + RenderHighlight(note, makeItShort, isAcceptableAndCanPreview.second, backgroundColor, accountViewModel, navController) + } + + is PollNoteEvent -> { + RenderPoll( + note, + makeItShort, + isAcceptableAndCanPreview.second, + backgroundColor, + accountViewModel, + navController + ) + } + + else -> { + RenderTextEvent( + note, + makeItShort, + isAcceptableAndCanPreview.second, + backgroundColor, + accountViewModel, + navController + ) + } + } + + NoteQuickActionMenu(note, popupExpanded, { popupExpanded = false }, accountViewModel) + } } } } @@ -424,13 +443,14 @@ private fun RenderTextEvent( accountViewModel: AccountViewModel, navController: NavController ) { - val noteEvent = note.event ?: return - + val tags = remember { note.event?.tags() } + val hashtags = remember { note.event?.hashtags() ?: emptyList() } val eventContent = remember { accountViewModel.decrypt(note) } val modifier = remember { Modifier.fillMaxWidth() } + val isAuthorTheLoggedUser = remember { accountViewModel.isLoggedUser(note.author) } if (eventContent != null) { - if (makeItShort && accountViewModel.isLoggedUser(note.author)) { + if (makeItShort && isAuthorTheLoggedUser) { Text( text = eventContent, color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f), @@ -442,13 +462,13 @@ private fun RenderTextEvent( content = eventContent, canPreview = canPreview && !makeItShort, modifier = modifier, - tags = noteEvent.tags(), + tags = tags, backgroundColor = backgroundColor, accountViewModel = accountViewModel, navController = navController ) - DisplayUncitedHashtags(noteEvent.hashtags(), eventContent, navController) + DisplayUncitedHashtags(hashtags, eventContent, navController) } } @@ -637,9 +657,11 @@ private fun RenderBadgeAward( FlowRow(modifier = Modifier.padding(top = 5.dp)) { awardees.take(100).forEach { user -> Row( - modifier = Modifier.size(size = 35.dp).clickable { - navController.navigate("User/${user.pubkeyHex}") - }, + modifier = Modifier + .size(size = 35.dp) + .clickable { + navController.navigate("User/${user.pubkeyHex}") + }, verticalAlignment = Alignment.CenterVertically ) { UserPicture( @@ -711,7 +733,11 @@ private fun RenderRepost( accountViewModel: AccountViewModel, navController: NavController ) { - note.replyTo?.lastOrNull()?.let { + val boostedNote = remember { + note.replyTo?.lastOrNull() + } + + boostedNote?.let { NoteCompose( it, modifier = Modifier, @@ -745,9 +771,16 @@ private fun RenderLongFormContent( @Composable private fun RenderReport(note: Note) { - val noteEvent = note.event as? ReportEvent ?: return + val base = remember { + val noteEvent = note.event as? ReportEvent + if (noteEvent == null) { + emptyList() + } else { + (noteEvent.reportedPost() + noteEvent.reportedAuthor()) + } + } - val reportType = (noteEvent.reportedPost() + noteEvent.reportedAuthor()).map { + val reportType = base.map { when (it.reportType) { ReportEvent.ReportType.EXPLICIT -> stringResource(R.string.explicit_content) ReportEvent.ReportType.NUDITY -> stringResource(R.string.nudity) @@ -780,7 +813,9 @@ private fun ReplyRow( val noteEvent = note.event if (noteEvent is TextNoteEvent && (note.replyTo != null || noteEvent.hasAnyTaggedUser())) { - val replyingDirectlyTo = note.replyTo?.lastOrNull() + val replyingDirectlyTo = remember { + note.replyTo?.lastOrNull() + } if (replyingDirectlyTo != null && unPackReply) { NoteCompose( baseNote = replyingDirectlyTo, @@ -821,18 +856,18 @@ private fun SecondUserInfoRow( account: Account, navController: NavController ) { - val noteEvent = note.event ?: return - val noteAuthor = note.author ?: return + val noteEvent = remember { note.event } ?: return + val noteAuthor = remember { note.author } ?: return Row(verticalAlignment = Alignment.CenterVertically) { ObserveDisplayNip05Status(noteAuthor, Modifier.weight(1f)) - val baseReward = noteEvent.getReward() + val baseReward = remember { noteEvent.getReward() } if (baseReward != null) { DisplayReward(baseReward, note, account, navController) } - val pow = noteEvent.getPoWRank() + val pow = remember { noteEvent.getPoWRank() } if (pow > 20) { DisplayPoW(pow) } @@ -848,14 +883,17 @@ private fun FirstUserInfoRow( navController: NavController ) { var moreActionsExpanded by remember { mutableStateOf(false) } - val eventNote = baseNote.event ?: return - val time = baseNote.createdAt() ?: return - val loggedIn = account.userProfile() + val eventNote = remember { baseNote.event } ?: return + val time = remember { baseNote.createdAt() } ?: return + val loggedIn = remember { account.userProfile() } + val padding = remember { + Modifier.padding(horizontal = 5.dp) + } Row(verticalAlignment = Alignment.CenterVertically) { if (showAuthorPicture) { NoteAuthorPicture(baseNote, navController, loggedIn, 25.dp) - Spacer(Modifier.padding(horizontal = 5.dp)) + Spacer(padding) NoteUsernameDisplay(baseNote, Modifier.weight(1f)) } else { NoteUsernameDisplay(baseNote, Modifier.weight(1f)) @@ -916,10 +954,11 @@ fun TimeAgo(time: Long) { @Composable private fun DrawAuthorImages(baseNote: Note, loggedIn: User, navController: NavController) { val baseChannel = remember { baseNote.channel() } + val modifier = remember { Modifier.width(55.dp) } - Column(Modifier.width(55.dp)) { + Column(modifier) { // Draws the boosted picture outside the boosted card. - Box(modifier = Modifier.width(55.dp), contentAlignment = Alignment.BottomEnd) { + Box(modifier = modifier, contentAlignment = Alignment.BottomEnd) { NoteAuthorPicture(baseNote, navController, loggedIn, 55.dp) if (baseNote.event is RepostEvent) { @@ -932,7 +971,10 @@ private fun DrawAuthorImages(baseNote: Note, loggedIn: User, navController: NavC } if (baseNote.event is RepostEvent) { - baseNote.replyTo?.lastOrNull()?.let { + val baseReply = remember { + baseNote.replyTo?.lastOrNull() + } + baseReply?.let { RelayBadges(it) } } else { @@ -946,20 +988,30 @@ private fun ChannelNotePicture(baseChannel: Channel) { val channelState by baseChannel.live.observeAsState() val channel = channelState?.channel + val modifier = remember { + Modifier + .width(30.dp) + .height(30.dp) + .clip(shape = CircleShape) + } + + val boxModifier = remember { + Modifier + .width(30.dp) + .height(30.dp) + } + if (channel != null) { - Box( - Modifier - .width(30.dp) - .height(30.dp) - ) { + val model = remember(channelState) { + ResizeImage(channel.profilePicture(), 30.dp) + } + + Box(boxModifier) { RobohashAsyncImageProxy( robot = channel.idHex, - model = ResizeImage(channel.profilePicture(), 30.dp), + model = model, contentDescription = stringResource(R.string.group_picture), - modifier = Modifier - .width(30.dp) - .height(30.dp) - .clip(shape = CircleShape) + modifier = modifier .background(MaterialTheme.colors.background) .border( 2.dp, @@ -977,12 +1029,16 @@ private fun RepostNoteAuthorPicture( navController: NavController, loggedIn: User ) { - baseNote.replyTo?.lastOrNull()?.let { - Box( - Modifier - .width(30.dp) - .height(30.dp) - ) { + val baseRepost = remember { baseNote.replyTo?.lastOrNull() } + + val modifier = remember { + Modifier + .width(30.dp) + .height(30.dp) + } + + baseRepost?.let { + Box(modifier) { NoteAuthorPicture( it, navController, @@ -1041,13 +1097,14 @@ fun DisplayHighlight( authorHex?.let { authorHex -> userBase?.let { userBase -> val userState by userBase.live().metadata.observeAsState() - val user = userState?.user + val route = remember { "User/${userBase.pubkeyHex}" } + val userDisplayName = remember(userState) { userState?.user?.toBestDisplayName() } - if (user != null) { + if (userDisplayName != null) { CreateClickableText( - user.toBestDisplayName(), + userDisplayName, "", - "User/${user.pubkeyHex}", + route, navController ) } @@ -1055,11 +1112,13 @@ fun DisplayHighlight( } url?.let { url -> - val validatedUrl = try { - URL(url) - } catch (e: Exception) { - Log.w("Note Compose", "Invalid URI: $url") - null + val validatedUrl = remember { + try { + URL(url) + } catch (e: Exception) { + Log.w("Note Compose", "Invalid URI: $url") + null + } } validatedUrl?.host?.let { host -> @@ -1524,44 +1583,59 @@ private fun VerticalRelayPanelWithFlow( private fun RelayIconCompose(url: String) { val uri = LocalUriHandler.current - Box( + val model = remember(url) { "https://$url/favicon.ico" } + + val boxModifier = remember { Modifier .padding(1.dp) .size(15.dp) - ) { + } + val iconModifier = remember(url) { + Modifier + .width(13.dp) + .height(13.dp) + .clip(shape = CircleShape) + .clickable(onClick = { uri.openUri("https://$url") }) + } + val colorFilter = remember { + ColorFilter.colorMatrix(ColorMatrix().apply { setToSaturation(0f) }) + } + + Box(boxModifier) { RobohashFallbackAsyncImage( - robot = "https://$url/favicon.ico", + robot = model, robotSize = 15.dp, - model = "https://$url/favicon.ico", + model = model, contentDescription = stringResource(R.string.relay_icon), - colorFilter = ColorFilter.colorMatrix(ColorMatrix().apply { setToSaturation(0f) }), - modifier = Modifier - .width(13.dp) - .height(13.dp) - .clip(shape = CircleShape) - .background(MaterialTheme.colors.background) - .clickable(onClick = { uri.openUri("https://$url") }) + colorFilter = colorFilter, + modifier = iconModifier.background(MaterialTheme.colors.background) ) } } @Composable private fun ShowMoreRelaysButton(onClick: () -> Unit) { - Row( + val boxModifier = remember { Modifier .fillMaxWidth() - .height(25.dp), + .height(25.dp) + } + val iconButtonModifier = remember { Modifier.size(24.dp) } + val iconModifier = remember { Modifier.size(15.dp) } + + Row( + boxModifier, horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.Top ) { IconButton( - modifier = Modifier.then(Modifier.size(24.dp)), + modifier = iconButtonModifier, onClick = onClick ) { Icon( imageVector = Icons.Default.ExpandMore, null, - modifier = Modifier.size(15.dp), + modifier = iconModifier, tint = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) ) } @@ -1590,25 +1664,30 @@ fun NoteAuthorPicture( onClick: ((User) -> Unit)? = null ) { val noteState by baseNote.live().metadata.observeAsState() - val note = noteState?.note ?: return + val author = remember(noteState) { + noteState?.note?.author + } - val author = note.author - - Box( + val boxModifier = remember { Modifier .width(size) .height(size) - ) { + } + + val nullModifier = remember { + modifier + .width(size) + .height(size) + .clip(shape = CircleShape) + } + + Box(boxModifier) { if (author == null) { RobohashAsyncImage( robot = "authornotfound", robotSize = size, contentDescription = stringResource(R.string.unknown_author), - modifier = modifier - .width(size) - .height(size) - .clip(shape = CircleShape) - .background(MaterialTheme.colors.background) + modifier = nullModifier.background(MaterialTheme.colors.background) ) } else { UserPicture(author, baseUserAccount, size, modifier, onClick) @@ -1640,31 +1719,38 @@ fun UserPicture( onLongClick: ((User) -> Unit)? = null ) { val userState by baseUser.live().metadata.observeAsState() - val user = userState?.user ?: return - val accountState by baseUserAccount.live().follows.observeAsState() - val accountUser = accountState?.user ?: return - val showFollowingMark = accountUser.isFollowingCached(user) || user == accountUser + val userPubkey = remember { + baseUser.pubkeyHex + } - Row( - modifier = Modifier - .run { - if (onClick != null && onLongClick != null) { - this.combinedClickable( - onClick = { onClick(user) }, - onLongClick = { onLongClick(user) } - ) - } else if (onClick != null) { - this.clickable(onClick = { onClick(user) }) - } else { - this - } - } - ) { + val userProfile = remember(userState) { + userState?.user?.profilePicture() + } + + val showFollowingMark = remember(accountState) { + accountState?.user?.isFollowingCached(baseUser) == true || baseUser === accountState?.user + } + + // BaseUser is the same reference as accountState.user + val myModifier = remember { + if (onClick != null && onLongClick != null) { + Modifier.combinedClickable( + onClick = { onClick(baseUser) }, + onLongClick = { onLongClick(baseUser) } + ) + } else if (onClick != null) { + Modifier.clickable(onClick = { onClick(baseUser) }) + } else { + Modifier + } + } + + Row(modifier = myModifier) { UserPicture( - userHex = user.pubkeyHex, - userPicture = user.profilePicture(), + userHex = userPubkey, + userPicture = userProfile, showFollowingMark = showFollowingMark, size = size, modifier = modifier @@ -1680,43 +1766,59 @@ fun UserPicture( size: Dp, modifier: Modifier = Modifier ) { - Box( + val myBoxModifier = remember { Modifier .width(size) .height(size) - ) { + } + + val myImageModifier = remember { + modifier + .width(size) + .height(size) + .clip(shape = CircleShape) + } + + val myResizeImage = remember(userPicture) { + ResizeImage(userPicture, size) + } + + Box(myBoxModifier) { RobohashAsyncImageProxy( robot = userHex, - model = ResizeImage(userPicture, size), + model = myResizeImage, contentDescription = stringResource(id = R.string.profile_image), - modifier = modifier - .width(size) - .height(size) - .clip(shape = CircleShape) - .background(MaterialTheme.colors.background) + modifier = myImageModifier.background(MaterialTheme.colors.background) ) if (showFollowingMark) { - Box( + val myIconBoxModifier = remember { Modifier .width(size.div(3.5f)) .height(size.div(3.5f)) - .align(Alignment.TopEnd), - contentAlignment = Alignment.Center - ) { - // Background for the transparent checkmark + .align(Alignment.TopEnd) + } + + val myIconBackgroundModifier = remember { + Modifier + .clip(CircleShape) + .fillMaxSize(0.6f) + .align(Alignment.Center) + } + + val myIconModifier = remember { + Modifier.fillMaxSize() + } + + Box(myIconBoxModifier, contentAlignment = Alignment.Center) { Box( - Modifier - .clip(CircleShape) - .fillMaxSize(0.6f) - .align(Alignment.Center) - .background(MaterialTheme.colors.background) + myIconBackgroundModifier.background(MaterialTheme.colors.background) ) Icon( painter = painterResource(R.drawable.ic_verified), stringResource(id = R.string.following), - modifier = Modifier.fillMaxSize(), + modifier = myIconModifier, tint = Following ) } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt index 77cf78c930..36891d3b5b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt @@ -68,7 +68,7 @@ import kotlin.math.roundToInt @Composable fun ReactionsRow(baseNote: Note, accountViewModel: AccountViewModel, navController: NavController) { val accountState by accountViewModel.accountLiveData.observeAsState() - val account = accountState?.account ?: return + val account = remember(accountState) { accountState?.account } ?: return val grayTint = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) @@ -123,13 +123,21 @@ fun ReplyReaction( onPress: () -> Unit ) { val repliesState by baseNote.live().replies.observeAsState() - val replies = repliesState?.note?.replies ?: emptySet() + val replies = remember(repliesState) { repliesState?.note?.replies } ?: emptySet() val context = LocalContext.current val scope = rememberCoroutineScope() + val iconButtonModifier = remember { + Modifier.size(iconSize) + } + + val iconModifier = remember { + Modifier.size(iconSize) + } + IconButton( - modifier = Modifier.size(iconSize), + modifier = iconButtonModifier, onClick = { if (accountViewModel.isWriteable()) { onPress() @@ -147,7 +155,7 @@ fun ReplyReaction( Icon( painter = painterResource(R.drawable.ic_comment), null, - modifier = Modifier.size(iconSize), + modifier = iconModifier, tint = grayTint ) } @@ -162,7 +170,7 @@ fun ReplyReaction( } @Composable -public fun BoostReaction( +fun BoostReaction( baseNote: Note, grayTint: Color, accountViewModel: AccountViewModel, @@ -170,17 +178,32 @@ public fun BoostReaction( onQuotePress: () -> Unit ) { val boostsState by baseNote.live().boosts.observeAsState() - val boostedNote = boostsState?.note + val boostedNote = remember(boostsState) { boostsState?.note } ?: return + + val hasBoosted = remember(boostsState) { accountViewModel.hasBoosted(baseNote) } + val wasBoostedByLoggedIn = remember(boostsState) { boostedNote.isBoostedBy(accountViewModel.userProfile()) } + val isWriteable = remember { accountViewModel.isWriteable() } + + val boostCount = remember(boostsState) { showCount(boostedNote.boosts.size) } + val context = LocalContext.current val scope = rememberCoroutineScope() var wantsToBoost by remember { mutableStateOf(false) } + val iconButtonModifier = remember { + Modifier.size(iconSize) + } + + val iconModifier = remember { + Modifier.size(iconSize) + } + IconButton( - modifier = Modifier.then(Modifier.size(iconSize)), + modifier = iconButtonModifier, onClick = { - if (accountViewModel.isWriteable()) { - if (accountViewModel.hasBoosted(baseNote)) { + if (isWriteable) { + if (hasBoosted) { accountViewModel.deleteBoostsTo(baseNote) } else { wantsToBoost = true @@ -210,25 +233,16 @@ public fun BoostReaction( ) } - if (boostedNote?.isBoostedBy(accountViewModel.userProfile()) == true) { - Icon( - painter = painterResource(R.drawable.ic_retweeted), - null, - modifier = Modifier.size(iconSize), - tint = Color.Unspecified - ) - } else { - Icon( - painter = painterResource(R.drawable.ic_retweet), - null, - modifier = Modifier.size(iconSize), - tint = grayTint - ) - } + Icon( + painter = painterResource(R.drawable.ic_retweeted), + null, + modifier = iconModifier, + tint = if (wasBoostedByLoggedIn) Color.Unspecified else grayTint + ) } Text( - " ${showCount(boostedNote?.boosts?.size)}", + " $boostCount", fontSize = 14.sp, color = grayTint ) @@ -243,16 +257,30 @@ fun LikeReaction( heartSize: Dp = 16.dp ) { val reactionsState by baseNote.live().reactions.observeAsState() - val reactedNote = reactionsState?.note ?: return + val reactedNote = remember(reactionsState) { reactionsState?.note } ?: return + + val hasReacted = remember(reactionsState) { accountViewModel.hasReactedTo(baseNote) } + val wasReactedByLoggedIn = remember(reactionsState) { reactedNote.isReactedBy(accountViewModel.userProfile()) } + val isWriteable = remember { accountViewModel.isWriteable() } + + val reactionCount = remember(reactionsState) { showCount(reactedNote.reactions.size) } val context = LocalContext.current val scope = rememberCoroutineScope() + val iconButtonModifier = remember { + Modifier.size(iconSize) + } + + val iconModifier = remember { + Modifier.size(heartSize) + } + IconButton( - modifier = Modifier.then(Modifier.size(iconSize)), + modifier = iconButtonModifier, onClick = { - if (accountViewModel.isWriteable()) { - if (accountViewModel.hasReactedTo(baseNote)) { + if (isWriteable) { + if (hasReacted) { accountViewModel.deleteReactionTo(baseNote) } else { accountViewModel.reactTo(baseNote) @@ -268,25 +296,25 @@ fun LikeReaction( } } ) { - if (reactedNote.isReactedBy(accountViewModel.userProfile())) { + if (wasReactedByLoggedIn) { Icon( painter = painterResource(R.drawable.ic_liked), null, - modifier = Modifier.size(heartSize), + modifier = iconModifier, tint = Color.Unspecified ) } else { Icon( painter = painterResource(R.drawable.ic_like), null, - modifier = Modifier.size(heartSize), + modifier = iconModifier, tint = grayTint ) } } Text( - " ${showCount(reactedNote.reactions.size)}", + " $reactionCount", fontSize = 14.sp, color = grayTint ) @@ -472,6 +500,19 @@ public fun ViewCountReaction( numberSize: Dp = 24.dp ) { val uri = LocalUriHandler.current + val context = LocalContext.current + + val iconButtonModifier = remember { + Modifier.size(barChartSize) + } + + val iconModifier = remember { + Modifier.height(numberSize) + } + + val colorFilter = remember { + ColorFilter.tint(grayTint) + } IconButton( modifier = Modifier.size(iconSize), @@ -480,21 +521,25 @@ public fun ViewCountReaction( Icon( imageVector = Icons.Outlined.BarChart, null, - modifier = Modifier.size(barChartSize), + modifier = iconButtonModifier, tint = grayTint ) } - Row() { + val request = remember { + ImageRequest.Builder(context) + .data("https://counter.amethyst.social/$idHex.svg?label=+&color=00000000") + .diskCachePolicy(CachePolicy.DISABLED) + .memoryCachePolicy(CachePolicy.ENABLED) + .build() + } + + Row { AsyncImage( - model = ImageRequest.Builder(LocalContext.current) - .data("https://counter.amethyst.social/$idHex.svg?label=+&color=00000000") - .diskCachePolicy(CachePolicy.DISABLED) - .memoryCachePolicy(CachePolicy.ENABLED) - .build(), + model = request, contentDescription = stringResource(R.string.view_count), - modifier = Modifier.height(numberSize), - colorFilter = ColorFilter.tint(grayTint) + modifier = iconModifier, + colorFilter = colorFilter ) } } From 28a1f0d6dae63b656144045968d53503fa966454 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 10 May 2023 19:36:07 -0400 Subject: [PATCH 045/171] v0.45.1 --- app/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b1921914d4..fe8451b62f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 152 - versionName "0.45.0" + versionCode 153 + versionName "0.45.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { @@ -86,7 +86,7 @@ android { } dependencies { - implementation 'androidx.core:core-ktx:1.10.0' + implementation 'androidx.core:core-ktx:1.10.1' implementation 'androidx.activity:activity-compose:1.7.1' implementation "androidx.compose.ui:ui:$compose_ui_version" implementation "androidx.compose.ui:ui-tooling-preview:$compose_ui_version" From eb9be2108dc67042d820df8dd0bed3d2fa5038d1 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 11 May 2023 09:18:17 -0400 Subject: [PATCH 046/171] Adjustments to Tor/Orbot screens --- .../amethyst/ui/navigation/DrawerContent.kt | 39 +++++-- .../amethyst/ui/note/NoteQuickActionMenu.kt | 4 +- .../ui/screen/loggedIn/ConnectOrbotDialog.kt | 106 ++++++++++++------ app/src/main/res/values/strings.xml | 24 ++-- 4 files changed, 112 insertions(+), 61 deletions(-) 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 7fc79e2072..a25d4c8e2c 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 e5271bc0f4..67517b5438 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 53c2ac84ef..c7b3a1ebb3 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 c7323b8a1d..7818c049f5 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 From b72b0b028ffcf6ca8e5f9331a2195da97978ae76 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 11 May 2023 09:19:27 -0400 Subject: [PATCH 047/171] v0.46.0 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index fe8451b62f..31157d167f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 153 - versionName "0.45.1" + versionCode 154 + versionName "0.46.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From f02e18ff9b6124333aac7ab3fd6252de548ce079 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 11 May 2023 09:32:33 -0400 Subject: [PATCH 048/171] Fix background color from remember calls --- .../com/vitorpamplona/amethyst/ui/note/MessageSetCompose.kt | 2 +- .../java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MessageSetCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MessageSetCompose.kt index 36fe88205d..c893e0439b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MessageSetCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MessageSetCompose.kt @@ -67,7 +67,7 @@ fun MessageSetCompose(messageSetCard: MessageSetCard, routeForLastRead: String, MaterialTheme.colors.background } - val columnModifier = remember { + val columnModifier = remember(isNew) { Modifier .background(backgroundColor) .padding( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt index ffe5c5da6c..456bec7125 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt @@ -86,7 +86,7 @@ fun MultiSetCompose(multiSetCard: MultiSetCard, routeForLastRead: String, accoun MaterialTheme.colors.background } - val columnModifier = remember { + val columnModifier = remember(isNew) { Modifier .background(backgroundColor) .padding( From f202422ff1b9a61d1e6da073817c199acf79092c Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 11 May 2023 10:12:01 -0400 Subject: [PATCH 049/171] hasValidSignature crashes in some weirdly formed events. --- .../com/vitorpamplona/amethyst/service/model/Event.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt index 8accaaf8a0..6747b1f13e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt @@ -1,5 +1,6 @@ package com.vitorpamplona.amethyst.service.model +import android.util.Log import com.google.gson.* import com.google.gson.annotations.SerializedName import com.vitorpamplona.amethyst.model.HexKey @@ -110,11 +111,12 @@ open class Event( } override fun hasValidSignature(): Boolean { - if (!id.contentEquals(generateId())) { - return false + return try { + id.contentEquals(generateId()) && secp256k1.verifySchnorr(Hex.decode(sig), Hex.decode(id), Hex.decode(pubKey)) + } catch (e: Exception) { + Log.e("Event", "Fail checking if event $id has a valid signature", e) + false } - - return secp256k1.verifySchnorr(Hex.decode(sig), Hex.decode(id), Hex.decode(pubKey)) } private fun generateId(): String { From 96d66646b48784d5ccb385fb8605c9b37403d179 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 11 May 2023 14:39:05 -0400 Subject: [PATCH 050/171] Displaying lists as Notes --- .../amethyst/ui/dal/NotificationFeedFilter.kt | 10 +- .../amethyst/ui/note/NoteCompose.kt | 118 ++++++++++++++++++ .../amethyst/ui/note/UserCompose.kt | 19 +-- .../amethyst/ui/screen/ThreadFeedView.kt | 5 +- 4 files changed, 143 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/NotificationFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/NotificationFeedFilter.kt index ea26abdd3c..ea06b0771d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/NotificationFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/NotificationFeedFilter.kt @@ -48,7 +48,15 @@ object NotificationFeedFilter : AdditiveFeedFilter() { val event = note.event if (event is BaseTextNoteEvent) { - return (event.citedUsers().contains(author.pubkeyHex) || note.replyTo?.any { it.author === author } == true) + val isAuthoredPostCited = event.findCitations().any { + LocalCache.notes[it]?.author === author || LocalCache.addressables[it]?.author === author + } + + return isAuthoredPostCited || + ( + event.citedUsers().contains(author.pubkeyHex) || + note.replyTo?.any { it.author === author } == true + ) } if (event is ReactionEvent) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index 0ed76233f6..d1d224dbb3 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -12,6 +12,7 @@ import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize @@ -24,6 +25,8 @@ import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CutCornerShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.ClickableText +import androidx.compose.material.Button +import androidx.compose.material.ButtonDefaults import androidx.compose.material.Divider import androidx.compose.material.DropdownMenu import androidx.compose.material.DropdownMenuItem @@ -50,6 +53,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.ColorMatrix @@ -81,6 +85,7 @@ import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.Channel import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.model.NoteState import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.model.BadgeAwardEvent import com.vitorpamplona.amethyst.service.model.BadgeDefinitionEvent @@ -92,6 +97,7 @@ import com.vitorpamplona.amethyst.service.model.FileHeaderEvent import com.vitorpamplona.amethyst.service.model.FileStorageHeaderEvent import com.vitorpamplona.amethyst.service.model.HighlightEvent import com.vitorpamplona.amethyst.service.model.LongTextNoteEvent +import com.vitorpamplona.amethyst.service.model.PeopleListEvent import com.vitorpamplona.amethyst.service.model.PollNoteEvent import com.vitorpamplona.amethyst.service.model.PrivateDmEvent import com.vitorpamplona.amethyst.service.model.ReactionEvent @@ -366,6 +372,10 @@ fun NoteComposeInner( RenderBadgeAward(note, backgroundColor, accountViewModel, navController) } + is PeopleListEvent -> { + RenderPeopleList(noteState, backgroundColor, accountViewModel, navController) + } + is PrivateDmEvent -> { RenderPrivateMessage(note, makeItShort, isAcceptableAndCanPreview.second, backgroundColor, accountViewModel, navController) } @@ -630,6 +640,114 @@ private fun RenderPrivateMessage( ) } +@Composable +fun RenderPeopleList( + noteState: NoteState?, + backgroundColor: Color, + accountViewModel: AccountViewModel, + navController: NavController +) { + DisplayPeopleList(noteState, backgroundColor, accountViewModel, navController) + + noteState?.note?.let { + ReactionsRow(it, accountViewModel, navController) + } + + Divider( + modifier = Modifier.padding(top = 10.dp), + thickness = 0.25.dp + ) +} + +@Composable +fun DisplayPeopleList( + noteState: NoteState?, + backgroundColor: Color, + accountViewModel: AccountViewModel, + navController: NavController +) { + val note = remember(noteState) { noteState?.note } ?: return + val noteEvent = note.event as? PeopleListEvent ?: return + + var members by remember { mutableStateOf>(listOf()) } + + val account = accountViewModel.userProfile() + var expanded by remember { + mutableStateOf(false) + } + + val toMembersShow = if (expanded) { + members + } else { + members.take(3) + } + + Text( + text = "#${noteEvent.dTag()}", + fontWeight = FontWeight.Bold, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier + .fillMaxWidth() + .padding(5.dp), + textAlign = TextAlign.Center + ) + + LaunchedEffect(key1 = noteState) { + withContext(Dispatchers.IO) { + members = noteEvent.bookmarkedPeople().mapNotNull { hex -> + LocalCache.checkGetOrCreateUser(hex) + }.sortedBy { account.isFollowing(it) }.reversed() + } + } + + Box { + FlowRow(modifier = Modifier.padding(top = 5.dp)) { + toMembersShow.forEach { user -> + Row(modifier = Modifier.fillMaxWidth()) { + UserCompose( + user, + overallModifier = Modifier, + accountViewModel = accountViewModel, + navController = navController + ) + } + } + } + + if (members.size > 3 && !expanded) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center, + modifier = Modifier + .align(Alignment.BottomCenter) + .fillMaxWidth() + .background( + brush = Brush.verticalGradient( + colors = listOf( + backgroundColor.copy(alpha = 0f), + backgroundColor + ) + ) + ) + ) { + Button( + modifier = Modifier.padding(top = 10.dp), + onClick = { expanded = !expanded }, + shape = RoundedCornerShape(20.dp), + colors = ButtonDefaults.buttonColors( + backgroundColor = MaterialTheme.colors.primary.copy(alpha = 0.32f) + .compositeOver(MaterialTheme.colors.background) + ), + contentPadding = PaddingValues(vertical = 6.dp, horizontal = 16.dp) + ) { + Text(text = stringResource(R.string.show_more), color = Color.White) + } + } + } + } +} + @Composable private fun RenderBadgeAward( note: Note, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserCompose.kt index ebcaca5466..1164d90677 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserCompose.kt @@ -25,7 +25,17 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @Composable -fun UserCompose(baseUser: User, accountViewModel: AccountViewModel, navController: NavController) { +fun UserCompose( + baseUser: User, + overallModifier: Modifier = Modifier + .padding( + start = 12.dp, + end = 12.dp, + top = 10.dp + ), + accountViewModel: AccountViewModel, + navController: NavController +) { val accountState by accountViewModel.accountLiveData.observeAsState() val account = accountState?.account ?: return @@ -41,12 +51,7 @@ fun UserCompose(baseUser: User, accountViewModel: AccountViewModel, navControlle ) ) { Row( - modifier = Modifier - .padding( - start = 12.dp, - end = 12.dp, - top = 10.dp - ), + modifier = overallModifier, verticalAlignment = Alignment.CenterVertically ) { UserPicture(baseUser, navController, account.userProfile(), 55.dp) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt index 0fbcd2eccc..63fb4d985e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt @@ -56,6 +56,7 @@ import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.service.model.BadgeDefinitionEvent import com.vitorpamplona.amethyst.service.model.HighlightEvent import com.vitorpamplona.amethyst.service.model.LongTextNoteEvent +import com.vitorpamplona.amethyst.service.model.PeopleListEvent import com.vitorpamplona.amethyst.service.model.PollNoteEvent import com.vitorpamplona.amethyst.ui.components.ObserveDisplayNip05Status import com.vitorpamplona.amethyst.ui.components.TranslatableRichTextViewer @@ -349,7 +350,9 @@ fun NoteMaster( ) ) { Column() { - if (noteEvent is HighlightEvent) { + if (noteEvent is PeopleListEvent) { + DisplayPeopleList(noteState, MaterialTheme.colors.background, accountViewModel, navController) + } else if (noteEvent is HighlightEvent) { DisplayHighlight( noteEvent.quote(), noteEvent.author(), From 9ebb3fbefc8dcc182d8cc0a1533668baa4c93e9b Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 11 May 2023 15:26:09 -0400 Subject: [PATCH 051/171] Improving reply screen to clarify which users will be notified. --- .../amethyst/ui/actions/NewPostView.kt | 52 ++++++++++++++++--- .../amethyst/ui/actions/NewPostViewModel.kt | 4 +- app/src/main/res/values/strings.xml | 2 + 3 files changed, 50 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt index 620e393c54..5795091163 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt @@ -26,6 +26,7 @@ import androidx.compose.material.icons.outlined.Bolt import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -47,6 +48,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.KeyboardCapitalization import androidx.compose.ui.text.input.TextFieldValue +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextDirection import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -58,9 +60,8 @@ import coil.compose.AsyncImage import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.Note -import com.vitorpamplona.amethyst.service.model.TextNoteEvent +import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.ui.components.* -import com.vitorpamplona.amethyst.ui.note.ReplyInformation import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.TextSpinner import com.vitorpamplona.amethyst.ui.screen.loggedIn.UserLine @@ -145,10 +146,8 @@ fun NewPostView(onClose: () -> Unit, baseReplyTo: Note? = null, quote: Note? = n .fillMaxWidth() .verticalScroll(scroolState) ) { - if (postViewModel.replyTos != null && baseReplyTo?.event is TextNoteEvent) { - ReplyInformation(postViewModel.replyTos, postViewModel.mentions, account, "✖ ") { - postViewModel.removeFromReplyList(it) - } + Notifying(postViewModel.mentions) { + postViewModel.removeFromReplyList(it) } OutlinedTextField( @@ -345,6 +344,47 @@ fun NewPostView(onClose: () -> Unit, baseReplyTo: Note? = null, quote: Note? = n } } +@OptIn(ExperimentalLayoutApi::class) +@Composable +fun Notifying(baseMentions: List?, onClick: (User) -> Unit) { + val mentions = baseMentions?.toSet() + + FlowRow(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.padding(horizontal = 10.dp)) { + if (!mentions.isNullOrEmpty()) { + Text( + stringResource(R.string.reply_notify), + fontWeight = FontWeight.Bold, + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) + + mentions.forEachIndexed { idx, user -> + val innerUserState by user.live().metadata.observeAsState() + val innerUser = innerUserState?.user + + innerUser?.let { myUser -> + Spacer(modifier = Modifier.width(5.dp)) + + Button( + shape = RoundedCornerShape(20.dp), + colors = ButtonDefaults.buttonColors( + backgroundColor = MaterialTheme.colors.primary.copy(alpha = 0.32f) + ), + onClick = { + onClick(myUser) + } + ) { + Text( + "✖ ${myUser.toBestDisplayName()}", + color = Color.White, + textAlign = TextAlign.Center + ) + } + } + } + } + } +} + @Composable private fun AddPollButton( isPollActive: Boolean, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt index 4b12675d4d..a74a15d7a9 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt @@ -198,8 +198,8 @@ open class NewPostViewModel : ViewModel() { } } - open fun removeFromReplyList(it: User) { - mentions = mentions?.minus(it) + open fun removeFromReplyList(userToRemove: User) { + mentions = mentions?.filter { it != userToRemove } } open fun updateMessage(it: TextFieldValue) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7818c049f5..50c42780f0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -394,4 +394,6 @@ %1$s sats From %1$s for %1$s + + Notify: From 3ae75a33337b888e4e99829fac41219e50927fd5 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 11 May 2023 16:42:05 -0400 Subject: [PATCH 052/171] Adds FAB column to create new channels and join channels/users --- .../ui/actions/JoinUserOrChannelView.kt | 351 ++++++++++++++++++ .../{FabColumn.kt => ChannelFabColumn.kt} | 75 ++-- .../ui/screen/loggedIn/ChannelScreen.kt | 1 - .../amethyst/ui/screen/loggedIn/MainScreen.kt | 4 +- app/src/main/res/values/strings.xml | 6 + 5 files changed, 397 insertions(+), 40 deletions(-) create mode 100644 app/src/main/java/com/vitorpamplona/amethyst/ui/actions/JoinUserOrChannelView.kt rename app/src/main/java/com/vitorpamplona/amethyst/ui/buttons/{FabColumn.kt => ChannelFabColumn.kt} (50%) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/JoinUserOrChannelView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/JoinUserOrChannelView.kt new file mode 100644 index 0000000000..51dc0461d2 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/JoinUserOrChannelView.kt @@ -0,0 +1,351 @@ +package com.vitorpamplona.amethyst.ui.actions + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.material.Divider +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.MaterialTheme +import androidx.compose.material.OutlinedTextField +import androidx.compose.material.Surface +import androidx.compose.material.Text +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Clear +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.focus.onFocusChanged +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalLifecycleOwner +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation.NavController +import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.model.Account +import com.vitorpamplona.amethyst.model.LocalCache +import com.vitorpamplona.amethyst.model.User +import com.vitorpamplona.amethyst.service.NostrSearchEventOrUserDataSource +import com.vitorpamplona.amethyst.ui.note.ChannelName +import com.vitorpamplona.amethyst.ui.note.UserPicture +import com.vitorpamplona.amethyst.ui.note.UsernameDisplay +import com.vitorpamplona.amethyst.ui.screen.loggedIn.SearchBarViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.debounce +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.receiveAsFlow +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +@Composable +fun JoinUserOrChannelView(onClose: () -> Unit, account: Account, navController: NavController) { + val searchBarViewModel: SearchBarViewModel = viewModel() + + Dialog( + onDismissRequest = { + NostrSearchEventOrUserDataSource.clear() + searchBarViewModel.clean() + onClose() + }, + properties = DialogProperties( + dismissOnClickOutside = false + ) + ) { + Surface() { + Column( + modifier = Modifier.padding(10.dp).heightIn(min = 500.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + CloseButton(onCancel = { + searchBarViewModel.clean() + NostrSearchEventOrUserDataSource.clear() + onClose() + }) + + Text( + text = stringResource(R.string.channel_list_join_conversation), + fontWeight = FontWeight.Bold + ) + + Text( + text = "", + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f), + fontWeight = FontWeight.Bold + ) + } + + Spacer(modifier = Modifier.height(15.dp)) + + RenderSeach(searchBarViewModel, account, navController) + } + } + } +} + +@OptIn(ExperimentalComposeUiApi::class) +@Composable +private fun RenderSeach( + searchBarViewModel: SearchBarViewModel, + account: Account, + navController: NavController +) { + val scope = rememberCoroutineScope() + val listState = rememberLazyListState() + + // initialize focus reference to be able to request focus programmatically + val focusRequester = remember { FocusRequester() } + val keyboardController = LocalSoftwareKeyboardController.current + + val onlineSearch = NostrSearchEventOrUserDataSource + + val dbState = LocalCache.live.observeAsState() + val db = dbState.value ?: return + + val lifeCycleOwner = LocalLifecycleOwner.current + + // Create a channel for processing search queries. + val searchTextChanges = remember { + Channel(Channel.CONFLATED) + } + + LaunchedEffect(db) { + withContext(Dispatchers.IO) { + if (searchBarViewModel.isSearching()) { + searchBarViewModel.invalidateData() + } + } + } + + LaunchedEffect(Unit) { + delay(100) + focusRequester.requestFocus() + + // Wait for text changes to stop for 300 ms before firing off search. + withContext(Dispatchers.IO) { + searchTextChanges.receiveAsFlow() + .filter { it.isNotBlank() } + .distinctUntilChanged() + .debounce(300) + .collectLatest { + if (it.length >= 2) { + onlineSearch.search(it.trim()) + } + + searchBarViewModel.invalidateData() + + // makes sure to show the top of the search + scope.launch(Dispatchers.Main) { + listState.animateScrollToItem(0) + } + } + } + } + + DisposableEffect(Unit) { + val observer = LifecycleEventObserver { _, event -> + if (event == Lifecycle.Event.ON_RESUME) { + println("Join Start") + NostrSearchEventOrUserDataSource.start() + searchBarViewModel.invalidateData() + } + if (event == Lifecycle.Event.ON_PAUSE) { + println("Join Stop") + NostrSearchEventOrUserDataSource.clear() + NostrSearchEventOrUserDataSource.stop() + } + } + + lifeCycleOwner.lifecycle.addObserver(observer) + onDispose { + lifeCycleOwner.lifecycle.removeObserver(observer) + } + } + + // LAST ROW + Row( + modifier = Modifier.padding(horizontal = 10.dp).fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + OutlinedTextField( + label = { Text(text = stringResource(R.string.channel_list_user_or_group_id)) }, + value = searchBarViewModel.searchValue, + onValueChange = { + searchBarViewModel.updateSearchValue(it) + scope.launch(Dispatchers.IO) { + searchTextChanges.trySend(it) + } + }, + leadingIcon = { + Icon( + painter = painterResource(R.drawable.ic_search), + contentDescription = null, + modifier = Modifier.size(20.dp), + tint = Color.Unspecified + ) + }, + modifier = Modifier + .weight(1f, true) + .defaultMinSize(minHeight = 20.dp) + .focusRequester(focusRequester) + .onFocusChanged { + if (it.isFocused) { + keyboardController?.show() + } + }, + placeholder = { + Text( + text = stringResource(R.string.channel_list_user_or_group_id_demo), + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) + }, + trailingIcon = { + if (searchBarViewModel.isTrailingIconVisible) { + IconButton( + onClick = { + searchBarViewModel.clean() + onlineSearch.clear() + } + ) { + Icon( + imageVector = Icons.Default.Clear, + contentDescription = stringResource(R.string.clear) + ) + } + } + } + ) + } + + if (searchBarViewModel.searchValue.isNotBlank()) { + Row( + modifier = Modifier.fillMaxWidth().fillMaxHeight().padding(vertical = 10.dp) + ) { + LazyColumn( + modifier = Modifier.fillMaxHeight(), + contentPadding = PaddingValues( + top = 10.dp, + bottom = 10.dp + ), + state = listState + ) { + itemsIndexed( + searchBarViewModel.searchResults.value, + key = { _, item -> "u" + item.pubkeyHex } + ) { _, item -> + UserComposeForChat( + item, + account = account, + navController = navController + ) + } + + itemsIndexed( + searchBarViewModel.searchResultsChannels.value, + key = { _, item -> "c" + item.idHex } + ) { _, item -> + ChannelName( + channelIdHex = item.idHex, + channelPicture = item.profilePicture(), + channelTitle = { + Text( + "${item.info.name}", + fontWeight = FontWeight.Bold + ) + }, + channelLastTime = null, + channelLastContent = item.info.about, + false, + onClick = { navController.navigate("Channel/${item.idHex}") } + ) + } + } + } + } +} + +@Composable +fun UserComposeForChat( + baseUser: User, + account: Account, + navController: NavController +) { + Column( + modifier = + Modifier.clickable( + onClick = { navController.navigate("Room/${baseUser.pubkeyHex}") } + ) + ) { + Row( + modifier = Modifier + .padding( + start = 12.dp, + end = 12.dp, + top = 10.dp + ), + verticalAlignment = Alignment.CenterVertically + ) { + UserPicture(baseUser, navController, account.userProfile(), 55.dp) + + Column(modifier = Modifier.padding(start = 10.dp).weight(1f)) { + Row(verticalAlignment = Alignment.CenterVertically) { + UsernameDisplay(baseUser) + } + + val baseUserState by baseUser.live().metadata.observeAsState() + val user = baseUserState?.user ?: return + + Text( + user.info?.about ?: "", + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f), + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + } + + Divider( + modifier = Modifier.padding(top = 10.dp), + thickness = 0.25.dp + ) + } +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/buttons/FabColumn.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/buttons/ChannelFabColumn.kt similarity index 50% rename from app/src/main/java/com/vitorpamplona/amethyst/ui/buttons/FabColumn.kt rename to app/src/main/java/com/vitorpamplona/amethyst/ui/buttons/ChannelFabColumn.kt index 771b5f6586..7a4d3dad86 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/buttons/FabColumn.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/buttons/ChannelFabColumn.kt @@ -6,69 +6,78 @@ import androidx.compose.material.ButtonDefaults 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.outlined.Add import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import androidx.navigation.NavController import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.Account -import com.vitorpamplona.amethyst.ui.actions.NewPollView +import com.vitorpamplona.amethyst.ui.actions.JoinUserOrChannelView +import com.vitorpamplona.amethyst.ui.actions.NewChannelView @Composable -fun FabColumn(account: Account) { +fun ChannelFabColumn(account: Account, navController: NavController) { var isOpen by remember { mutableStateOf(false) } - var wantsToPoll by remember { + + var wantsToJoinChannelOrUser by remember { mutableStateOf(false) } - var wantsToPost by remember { + + var wantsToCreateChannel by remember { mutableStateOf(false) } + if (wantsToCreateChannel) { + NewChannelView({ wantsToCreateChannel = false }, account = account) + } + + if (wantsToJoinChannelOrUser) { + JoinUserOrChannelView({ wantsToJoinChannelOrUser = false }, account = account, navController = navController) + } + Column() { if (isOpen) { OutlinedButton( - onClick = { - wantsToPoll = true - isOpen = false - }, - modifier = Modifier.size(45.dp), + onClick = { wantsToJoinChannelOrUser = true; isOpen = false }, + modifier = Modifier.size(55.dp), shape = CircleShape, colors = ButtonDefaults.outlinedButtonColors(backgroundColor = MaterialTheme.colors.primary), - contentPadding = PaddingValues(0.dp) + contentPadding = PaddingValues(bottom = 3.dp) ) { - Icon( - painter = painterResource(R.drawable.ic_poll), - null, - modifier = Modifier.size(26.dp), - tint = Color.White + Text( + text = stringResource(R.string.channel_list_join_channel), + color = Color.White, + textAlign = TextAlign.Center ) } Spacer(modifier = Modifier.height(20.dp)) OutlinedButton( - onClick = { - wantsToPost = true - isOpen = false - }, - modifier = Modifier.size(45.dp), + onClick = { wantsToCreateChannel = true; isOpen = false }, + modifier = Modifier.size(55.dp), shape = CircleShape, colors = ButtonDefaults.outlinedButtonColors(backgroundColor = MaterialTheme.colors.primary), - contentPadding = PaddingValues(0.dp) + contentPadding = PaddingValues(bottom = 3.dp) ) { - Icon( - painter = painterResource(R.drawable.ic_lists), - null, - modifier = Modifier.size(26.dp), - tint = Color.White + Text( + text = stringResource(R.string.channel_list_create_channel), + color = Color.White, + textAlign = TextAlign.Center ) } Spacer(modifier = Modifier.height(20.dp)) } + OutlinedButton( onClick = { isOpen = !isOpen }, modifier = Modifier.size(55.dp), @@ -77,19 +86,11 @@ fun FabColumn(account: Account) { contentPadding = PaddingValues(0.dp) ) { Icon( - painter = painterResource(R.drawable.ic_compose), - null, + imageVector = Icons.Outlined.Add, + contentDescription = stringResource(R.string.new_channel), modifier = Modifier.size(26.dp), tint = Color.White ) } } - - if (wantsToPost) { - // NewPostView({ wantsToPost = false }, account = NostrAccountDataSource.account) - } - - if (wantsToPoll) { - NewPollView({ wantsToPoll = false }, account = account) - } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt index 63e0e4d928..d2cdff2615 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt @@ -386,7 +386,6 @@ private fun JoinButton(account: Account, channel: Channel, navController: NavCon modifier = Modifier.padding(horizontal = 3.dp), onClick = { account.joinChannel(channel.idHex) - navController.navigate(Route.Message.route) }, shape = RoundedCornerShape(20.dp), colors = ButtonDefaults diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt index 94c9604935..54579a4d4f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt @@ -24,7 +24,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.navigation.NavHostController import androidx.navigation.compose.rememberNavController -import com.vitorpamplona.amethyst.buttons.NewChannelButton +import com.vitorpamplona.amethyst.ui.buttons.ChannelFabColumn import com.vitorpamplona.amethyst.ui.buttons.NewNoteButton import com.vitorpamplona.amethyst.ui.navigation.* import com.vitorpamplona.amethyst.ui.navigation.AccountSwitchBottomSheet @@ -101,7 +101,7 @@ fun FloatingButtons(navController: NavHostController, accountViewModel: AccountV NewNoteButton(state.account, accountViewModel, navController) } if (currentRoute(navController) == Route.Message.base) { - NewChannelButton(state.account) + ChannelFabColumn(state.account, navController) } if (currentRoute(navController)?.substringBefore("?") == Route.Video.base) { NewImageButton(accountViewModel, navController) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 50c42780f0..9de6c008b6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -396,4 +396,10 @@ for %1$s Notify: + + Join Conversation + User or Group\'s ID + npub, nevent or hex + Create + Join From 9b92dfca5e11df21663636c33b0947ff6c61ab16 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 11 May 2023 17:31:32 -0400 Subject: [PATCH 053/171] Isolating state changes in the profile page. --- .../service/NostrUserProfileDataSource.kt | 1 - .../ui/screen/loggedIn/ProfileScreen.kt | 439 +++++++++--------- 2 files changed, 226 insertions(+), 214 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt index a0e216f6ea..49d4e2bc46 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt @@ -11,7 +11,6 @@ object NostrUserProfileDataSource : NostrDataSource("UserProfileFeed") { fun loadUserProfile(user: User?) { this.user = user - resetFilters() } fun createUserInfoFilter() = user?.let { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt index cd6379cca1..14c0b56693 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt @@ -1,5 +1,6 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn +import android.content.Context import android.content.Intent import android.net.Uri import android.widget.Toast @@ -18,7 +19,6 @@ import androidx.compose.material.icons.filled.ContentCopy import androidx.compose.material.icons.filled.EditNote import androidx.compose.material.icons.filled.Link import androidx.compose.material.icons.filled.MoreVert -import androidx.compose.material.icons.filled.Share import androidx.compose.runtime.* import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Alignment @@ -95,6 +95,7 @@ import com.vitorpamplona.amethyst.ui.screen.RelayFeedView import com.vitorpamplona.amethyst.ui.screen.RelayFeedViewModel import com.vitorpamplona.amethyst.ui.screen.UserFeedView import com.vitorpamplona.amethyst.ui.theme.BitcoinOrange +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -125,7 +126,7 @@ fun ProfileScreen(userId: String?, accountViewModel: AccountViewModel, navContro @Composable fun ProfileScreen(user: User, accountViewModel: AccountViewModel, navController: NavController) { val accountState by accountViewModel.accountLiveData.observeAsState() - val account = accountState?.account ?: return + val account = remember(accountState) { accountState?.account } ?: return UserProfileNewThreadFeedFilter.loadUserProfile(account, user) UserProfileConversationsFeedFilter.loadUserProfile(account, user) @@ -139,6 +140,10 @@ fun ProfileScreen(user: User, accountViewModel: AccountViewModel, navController: val lifeCycleOwner = LocalLifecycleOwner.current + LaunchedEffect(Unit) { + NostrUserProfileDataSource.start() + } + DisposableEffect(accountViewModel) { val observer = LifecycleEventObserver { _, event -> if (event == Lifecycle.Event.ON_RESUME) { @@ -214,64 +219,14 @@ fun ProfileScreen(user: User, accountViewModel: AccountViewModel, navController: } ) { val tabs = listOf<@Composable() (() -> Unit)?>( - { - Text(text = stringResource(R.string.notes)) - }, - { - Text(text = stringResource(R.string.replies)) - }, - { - val userState by baseUser.live().follows.observeAsState() - val userFollows = userState?.user?.transientFollowCount() ?: "--" - - Text(text = "$userFollows ${stringResource(R.string.follows)}") - }, - { - val userState by baseUser.live().follows.observeAsState() - val userFollowers = userState?.user?.transientFollowerCount() ?: "--" - - Text(text = "$userFollowers ${stringResource(id = R.string.followers)}") - }, - { - val userState by baseUser.live().zaps.observeAsState() - val userZaps = userState?.user - - var zapAmount by remember { mutableStateOf(null) } - - LaunchedEffect(key1 = userState) { - withContext(Dispatchers.IO) { - val tempAmount = userZaps?.zappedAmount() - withContext(Dispatchers.Main) { - zapAmount = tempAmount - } - } - } - - Text(text = "${showAmount(zapAmount)} ${stringResource(id = R.string.zaps)}") - }, - { - val userState by baseUser.live().bookmarks.observeAsState() - val bookmarkList = userState?.user?.latestBookmarkList - val userBookmarks = - (bookmarkList?.taggedEvents()?.count() ?: 0) + (bookmarkList?.taggedAddresses()?.count() ?: 0) - - Text(text = "$userBookmarks ${stringResource(R.string.bookmarks)}") - }, - { - val userState by baseUser.live().reports.observeAsState() - val userReports = userState?.user?.reports?.values?.flatten()?.count() - - Text(text = "$userReports ${stringResource(R.string.reports)}") - }, - { - val userState by baseUser.live().relays.observeAsState() - val userRelaysBeingUsed = userState?.user?.relaysBeingUsed?.size ?: "--" - - val userStateRelayInfo by baseUser.live().relayInfo.observeAsState() - val userRelays = userStateRelayInfo?.user?.latestContactList?.relays()?.size ?: "--" - - Text(text = "$userRelaysBeingUsed / $userRelays ${stringResource(R.string.relays)}") - } + { Text(text = stringResource(R.string.notes)) }, + { Text(text = stringResource(R.string.replies)) }, + { FollowTabHeader(baseUser) }, + { FollowersTabHeader(baseUser) }, + { ZapTabHeader(baseUser) }, + { BookmarkTabHeader(baseUser) }, + { ReportsTabHeader(baseUser) }, + { RelaysTabHeader(baseUser) } ) tabs.forEachIndexed { index, function -> @@ -306,6 +261,72 @@ fun ProfileScreen(user: User, accountViewModel: AccountViewModel, navController: } } +@Composable +private fun RelaysTabHeader(baseUser: User) { + val userState by baseUser.live().relays.observeAsState() + val userRelaysBeingUsed = remember(userState) { userState?.user?.relaysBeingUsed?.size ?: "--" } + + val userStateRelayInfo by baseUser.live().relayInfo.observeAsState() + val userRelays = remember(userStateRelayInfo) { userStateRelayInfo?.user?.latestContactList?.relays()?.size ?: "--" } + + Text(text = "$userRelaysBeingUsed / $userRelays ${stringResource(R.string.relays)}") +} + +@Composable +private fun ReportsTabHeader(baseUser: User) { + val userState by baseUser.live().reports.observeAsState() + val userReports = remember(userState) { userState?.user?.reports?.values?.flatten()?.count() } + + Text(text = "$userReports ${stringResource(R.string.reports)}") +} + +@Composable +private fun BookmarkTabHeader(baseUser: User) { + val userState by baseUser.live().bookmarks.observeAsState() + val userBookmarks = remember(userState) { + val bookmarkList = userState?.user?.latestBookmarkList + (bookmarkList?.taggedEvents()?.count() ?: 0) + ( + bookmarkList?.taggedAddresses()?.count() + ?: 0 + ) + } + + Text(text = "$userBookmarks ${stringResource(R.string.bookmarks)}") +} + +@Composable +private fun ZapTabHeader(baseUser: User) { + val userState by baseUser.live().zaps.observeAsState() + var zapAmount by remember { mutableStateOf(null) } + + LaunchedEffect(key1 = userState) { + withContext(Dispatchers.IO) { + val tempAmount = baseUser.zappedAmount() + withContext(Dispatchers.Main) { + zapAmount = tempAmount + } + } + } + + Text(text = "${showAmount(zapAmount)} ${stringResource(id = R.string.zaps)}") +} + +@Composable +private fun FollowersTabHeader(baseUser: User) { + val userState by baseUser.live().follows.observeAsState() + val userFollowers = remember(userState) { userState?.user?.transientFollowerCount() ?: "--" } + + Text(text = "$userFollowers ${stringResource(id = R.string.followers)}") +} + +@Composable +private fun FollowTabHeader(baseUser: User) { + val userState by baseUser.live().follows.observeAsState() + val userFollows = remember(userState) { userState?.user?.transientFollowCount() ?: "--" } + + Text(text = "$userFollows ${stringResource(R.string.follows)}") +} + @Composable private fun ProfileHeader( baseUser: User, @@ -316,9 +337,6 @@ private fun ProfileHeader( var popupExpanded by remember { mutableStateOf(false) } var zoomImageDialogOpen by remember { mutableStateOf(false) } - val accountUserState by account.userProfile().live().follows.observeAsState() - val accountUser = accountUserState?.user ?: return - val coroutineScope = rememberCoroutineScope() val clipboardManager = LocalClipboardManager.current @@ -398,23 +416,7 @@ private fun ProfileHeader( // No need for this button anymore // NPubCopyButton(baseUser) - if (accountUser == baseUser) { - EditButton(account) - } - - if (account.isHidden(baseUser)) { - ShowUserButton { - account.showUser(baseUser.pubkeyHex) - } - } else if (accountUser.isFollowingCached(baseUser)) { - UnfollowButton { coroutineScope.launch(Dispatchers.IO) { account.unfollow(baseUser) } } - } else { - if (baseUser.isFollowingCached(accountUser)) { - FollowButton({ coroutineScope.launch(Dispatchers.IO) { account.follow(baseUser) } }, R.string.follow_back) - } else { - FollowButton({ coroutineScope.launch(Dispatchers.IO) { account.follow(baseUser) } }, R.string.follow) - } - } + ProfileActions(baseUser, account, coroutineScope) } } @@ -430,14 +432,44 @@ private fun ProfileHeader( } } -@OptIn(ExperimentalLayoutApi::class) +@Composable +private fun ProfileActions( + baseUser: User, + account: Account, + coroutineScope: CoroutineScope +) { + val accountUserState by account.userProfile().live().follows.observeAsState() + val accountUser = remember(accountUserState) { accountUserState?.user } ?: return + + if (accountUser == baseUser) { + EditButton(account) + } + + if (account.isHidden(baseUser)) { + ShowUserButton { + account.showUser(baseUser.pubkeyHex) + } + } else if (accountUser.isFollowingCached(baseUser)) { + UnfollowButton { coroutineScope.launch(Dispatchers.IO) { account.unfollow(baseUser) } } + } else { + if (baseUser.isFollowingCached(accountUser)) { + FollowButton( + { coroutineScope.launch(Dispatchers.IO) { account.follow(baseUser) } }, + R.string.follow_back + ) + } else { + FollowButton( + { coroutineScope.launch(Dispatchers.IO) { account.follow(baseUser) } }, + R.string.follow + ) + } + } +} + @Composable private fun DrawAdditionalInfo(baseUser: User, account: Account, accountViewModel: AccountViewModel, navController: NavController) { val userState by baseUser.live().metadata.observeAsState() - val user = userState?.user ?: return - - val userBadgeState by baseUser.live().badges.observeAsState() - val userBadge = userBadgeState?.user ?: return + val user = remember(userState) { userState?.user } ?: return val uri = LocalUriHandler.current val clipboardManager = LocalClipboardManager.current @@ -513,23 +545,7 @@ private fun DrawAdditionalInfo(baseUser: User, account: Account, accountViewMode } } - userBadge.acceptedBadges?.let { note -> - (note.event as? BadgeProfilesEvent)?.let { event -> - FlowRow(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.padding(vertical = 5.dp)) { - event.badgeAwardEvents().forEach { badgeAwardEvent -> - val baseNote = LocalCache.notes[badgeAwardEvent] - if (baseNote != null) { - val badgeAwardState by baseNote.live().metadata.observeAsState() - val baseBadgeDefinition = badgeAwardState?.note?.replyTo?.firstOrNull() - - if (baseBadgeDefinition != null) { - BadgeThumb(baseBadgeDefinition, navController, 35.dp) - } - } - } - } - } - } + DisplayBadges(baseUser, navController) DisplayNip05ProfileStatus(user) @@ -552,9 +568,58 @@ private fun DrawAdditionalInfo(baseUser: User, account: Account, accountViewMode } } - var zapExpanded by remember { mutableStateOf(false) } + val lud16 = remember(userState) { user.info?.lud16?.trim() ?: user.info?.lud06?.trim() } + val pubkeyHex = remember { baseUser.pubkeyHex } + DisplayLNAddress(lud16, pubkeyHex, account, scope, context) - val lud16 = user.info?.lud16?.trim() ?: user.info?.lud06?.trim() + val identities = user.info?.latestMetadata?.identityClaims() + if (!identities.isNullOrEmpty()) { + identities.forEach { identity: IdentityClaim -> + Row(verticalAlignment = Alignment.CenterVertically) { + Icon( + tint = Color.Unspecified, + painter = painterResource(id = identity.toIcon()), + contentDescription = stringResource(identity.toDescriptor()), + modifier = Modifier.size(16.dp) + ) + + ClickableText( + text = AnnotatedString(identity.identity), + onClick = { runCatching { uri.openUri(identity.toProofUrl()) } }, + style = LocalTextStyle.current.copy(color = MaterialTheme.colors.primary), + modifier = Modifier + .padding(top = 1.dp, bottom = 1.dp, start = 5.dp) + .weight(1f) + ) + } + } + } + + user.info?.about?.let { + Row( + modifier = Modifier.padding(top = 5.dp, bottom = 5.dp) + ) { + TranslatableRichTextViewer( + content = it, + canPreview = false, + tags = null, + backgroundColor = MaterialTheme.colors.background, + accountViewModel = accountViewModel, + navController = navController + ) + } + } +} + +@Composable +private fun DisplayLNAddress( + lud16: String?, + userHex: String, + account: Account, + scope: CoroutineScope, + context: Context +) { + var zapExpanded by remember { mutableStateOf(false) } if (!lud16.isNullOrEmpty()) { Row(verticalAlignment = Alignment.CenterVertically) { @@ -576,10 +641,13 @@ private fun DrawAdditionalInfo(baseUser: User, account: Account, accountViewMode } if (zapExpanded) { - Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.padding(vertical = 5.dp)) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(vertical = 5.dp) + ) { InvoiceRequest( lud16, - baseUser.pubkeyHex, + userHex, account, onSuccess = { // pay directly @@ -619,44 +687,34 @@ private fun DrawAdditionalInfo(baseUser: User, account: Account, accountViewMode } } } +} - val identities = user.info?.latestMetadata?.identityClaims() - if (!identities.isNullOrEmpty()) { - identities.forEach { identity: IdentityClaim -> - Row(verticalAlignment = Alignment.CenterVertically) { - Icon( - tint = Color.Unspecified, - painter = painterResource(id = identity.toIcon()), - contentDescription = stringResource(identity.toDescriptor()), - modifier = Modifier.size(16.dp) - ) +@Composable +@OptIn(ExperimentalLayoutApi::class) +private fun DisplayBadges( + baseUser: User, + navController: NavController +) { + val userBadgeState by baseUser.live().badges.observeAsState() + val userBadge = remember(userBadgeState) { userBadgeState?.user } ?: return - ClickableText( - text = AnnotatedString(identity.identity), - onClick = { runCatching { uri.openUri(identity.toProofUrl()) } }, - style = LocalTextStyle.current.copy(color = MaterialTheme.colors.primary), - modifier = Modifier - .padding(top = 1.dp, bottom = 1.dp, start = 5.dp) - .weight(1f) - ) + userBadge.acceptedBadges?.let { note -> + (note.event as? BadgeProfilesEvent)?.let { event -> + FlowRow(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.padding(vertical = 5.dp)) { + event.badgeAwardEvents().forEach { badgeAwardEvent -> + val baseNote = LocalCache.notes[badgeAwardEvent] + if (baseNote != null) { + val badgeAwardState by baseNote.live().metadata.observeAsState() + val baseBadgeDefinition = badgeAwardState?.note?.replyTo?.firstOrNull() + + if (baseBadgeDefinition != null) { + BadgeThumb(baseBadgeDefinition, navController, 35.dp) + } + } + } } } } - - user.info?.about?.let { - Row( - modifier = Modifier.padding(top = 5.dp, bottom = 5.dp) - ) { - TranslatableRichTextViewer( - content = it, - canPreview = false, - tags = null, - backgroundColor = MaterialTheme.colors.background, - accountViewModel = accountViewModel, - navController = navController - ) - } - } } @Composable @@ -727,9 +785,8 @@ fun BadgeThumb( @Composable private fun DrawBanner(baseUser: User) { val userState by baseUser.live().metadata.observeAsState() - val user = userState?.user ?: return + val banner = remember(userState) { userState?.user?.info?.banner } - val banner = user.info?.banner val clipboardManager = LocalClipboardManager.current var zoomImageDialogOpen by remember { mutableStateOf(false) } @@ -767,67 +824,58 @@ private fun DrawBanner(baseUser: User) { @Composable fun TabNotesNewThreads(accountViewModel: AccountViewModel, navController: NavController) { - val accountState by accountViewModel.accountLiveData.observeAsState() - if (accountState != null) { - val feedViewModel: NostrUserProfileNewThreadsFeedViewModel = viewModel() + val feedViewModel: NostrUserProfileNewThreadsFeedViewModel = viewModel() - LaunchedEffect(Unit) { - feedViewModel.invalidateData() - } + LaunchedEffect(Unit) { + feedViewModel.invalidateData() + } - Column(Modifier.fillMaxHeight()) { - Column( - modifier = Modifier.padding(vertical = 0.dp) - ) { - FeedView(feedViewModel, accountViewModel, navController, null, enablePullRefresh = false) - } + Column(Modifier.fillMaxHeight()) { + Column( + modifier = Modifier.padding(vertical = 0.dp) + ) { + FeedView(feedViewModel, accountViewModel, navController, null, enablePullRefresh = false) } } } @Composable fun TabNotesConversations(accountViewModel: AccountViewModel, navController: NavController) { - val accountState by accountViewModel.accountLiveData.observeAsState() - if (accountState != null) { - val feedViewModel: NostrUserProfileConversationsFeedViewModel = viewModel() + val feedViewModel: NostrUserProfileConversationsFeedViewModel = viewModel() - LaunchedEffect(Unit) { - feedViewModel.invalidateData() - } + LaunchedEffect(Unit) { + feedViewModel.invalidateData() + } - Column(Modifier.fillMaxHeight()) { - Column( - modifier = Modifier.padding(vertical = 0.dp) - ) { - FeedView(feedViewModel, accountViewModel, navController, null, enablePullRefresh = false) - } + Column(Modifier.fillMaxHeight()) { + Column( + modifier = Modifier.padding(vertical = 0.dp) + ) { + FeedView(feedViewModel, accountViewModel, navController, null, enablePullRefresh = false) } } } @Composable fun TabBookmarks(baseUser: User, accountViewModel: AccountViewModel, navController: NavController) { - val accountState by accountViewModel.accountLiveData.observeAsState() - val userState by baseUser.live().bookmarks.observeAsState() - if (accountState != null) { - val feedViewModel: NostrUserProfileBookmarksFeedViewModel = viewModel() + val feedViewModel: NostrUserProfileBookmarksFeedViewModel = viewModel() - LaunchedEffect(userState) { - feedViewModel.invalidateData() - } + LaunchedEffect(Unit) { + feedViewModel.invalidateData() + } - Column(Modifier.fillMaxHeight()) { - Column( - modifier = Modifier.padding(vertical = 0.dp) - ) { - FeedView(feedViewModel, accountViewModel, navController, null, enablePullRefresh = false) - } + Column(Modifier.fillMaxHeight()) { + Column( + modifier = Modifier.padding(vertical = 0.dp) + ) { + FeedView(feedViewModel, accountViewModel, navController, null, enablePullRefresh = false) } } } @Composable fun TabFollows(baseUser: User, accountViewModel: AccountViewModel, navController: NavController) { + println("TabFollows") val feedViewModel: NostrUserProfileFollowsUserFeedViewModel = viewModel() val userState by baseUser.live().follows.observeAsState() @@ -937,41 +985,6 @@ fun TabRelays(user: User, accountViewModel: AccountViewModel) { } } -@Composable -private fun NPubCopyButton( - user: User -) { - val clipboardManager = LocalClipboardManager.current - var popupExpanded by remember { mutableStateOf(false) } - - Button( - modifier = Modifier - .padding(horizontal = 3.dp) - .width(50.dp), - onClick = { popupExpanded = true }, - shape = RoundedCornerShape(20.dp), - colors = ButtonDefaults - .buttonColors( - backgroundColor = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) - ) - ) { - Icon( - tint = Color.White, - imageVector = Icons.Default.Share, - contentDescription = stringResource(R.string.copies_the_public_key_to_the_clipboard_for_sharing) - ) - - DropdownMenu( - expanded = popupExpanded, - onDismissRequest = { popupExpanded = false } - ) { - DropdownMenuItem(onClick = { clipboardManager.setText(AnnotatedString(user.pubkeyNpub())); popupExpanded = false }) { - Text(stringResource(R.string.copy_public_key_npub_to_the_clipboard)) - } - } - } -} - @Composable private fun MessageButton(user: User, navController: NavController) { Button( From 55aafffb37861ac68ce9f5cc33c38fd9481cbd62 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 11 May 2023 17:39:21 -0400 Subject: [PATCH 054/171] Remove logs --- .../vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt index 14c0b56693..2069612c77 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt @@ -875,7 +875,6 @@ fun TabBookmarks(baseUser: User, accountViewModel: AccountViewModel, navControll @Composable fun TabFollows(baseUser: User, accountViewModel: AccountViewModel, navController: NavController) { - println("TabFollows") val feedViewModel: NostrUserProfileFollowsUserFeedViewModel = viewModel() val userState by baseUser.live().follows.observeAsState() From 19a58bb6696c53b8e1a7db352cace6b1e2831471 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 11 May 2023 17:39:31 -0400 Subject: [PATCH 055/171] correctly refreshes the screen --- .../java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt index 1b78c427c7..3db7f38030 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt @@ -66,13 +66,13 @@ fun FeedView( when (state) { is FeedState.Empty -> { FeedEmpty { - refreshing = true + refresh() } } is FeedState.FeedError -> { FeedError(state.errorMessage) { - refreshing = true + refresh() } } From aa60367c723662c921790c826e29a8ec4114daf1 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 11 May 2023 18:15:48 -0400 Subject: [PATCH 056/171] Doesn't update if it returned the same reference for the list. --- .../java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt index 1290d4ed4b..2f2cced221 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt @@ -98,7 +98,8 @@ abstract class FeedViewModel(val localFilter: FeedFilter) : ViewModel() { val oldNotesState = _feedContent.value if (localFilter is AdditiveFeedFilter && oldNotesState is FeedState.Loaded) { val newList = localFilter.updateListWith(oldNotesState.feed.value, newItems.toSet()) - updateFeed(newList) + if (newList !== oldNotesState.feed.value) + updateFeed(newList) } else { // Refresh Everything refreshSuspended() From a7063042fb3595c7c6bf2109a2f139e091511211 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 11 May 2023 18:15:56 -0400 Subject: [PATCH 057/171] Formatting --- .../java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt index 2f2cced221..1e512b4ace 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt @@ -98,8 +98,9 @@ abstract class FeedViewModel(val localFilter: FeedFilter) : ViewModel() { val oldNotesState = _feedContent.value if (localFilter is AdditiveFeedFilter && oldNotesState is FeedState.Loaded) { val newList = localFilter.updateListWith(oldNotesState.feed.value, newItems.toSet()) - if (newList !== oldNotesState.feed.value) + if (newList !== oldNotesState.feed.value) { updateFeed(newList) + } } else { // Refresh Everything refreshSuspended() From 66b84c0deabf84ccbe4a24c87134ffd684b97051 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 11 May 2023 18:30:18 -0400 Subject: [PATCH 058/171] 0.46.1 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 31157d167f..c2aa849c9e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 154 - versionName "0.46.0" + versionCode 155 + versionName "0.46.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From e80c8b37b394064f78423dbfefd8ab06435c1a32 Mon Sep 17 00:00:00 2001 From: Pextar <129750633+Pextar@users.noreply.github.com> Date: Fri, 12 May 2023 12:14:20 +0200 Subject: [PATCH 059/171] Create values-sv --- app/src/main/res/values-sv | 1 + 1 file changed, 1 insertion(+) create mode 100644 app/src/main/res/values-sv diff --git a/app/src/main/res/values-sv b/app/src/main/res/values-sv new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/app/src/main/res/values-sv @@ -0,0 +1 @@ + From 93c3a49ecf3e1952897c1891a35ef4ef65c1ed5f Mon Sep 17 00:00:00 2001 From: Zoltan <34719275+ZsZolee@users.noreply.github.com> Date: Fri, 12 May 2023 14:04:52 +0200 Subject: [PATCH 060/171] TOR Hungarian translation --- app/src/main/res/values-hu/strings.xml | 40 ++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 64568685b5..2d5f6b0371 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -333,11 +333,45 @@ Saját csomópontjaid (NIP-95) A fájlokat a csomópontokra töltik fel és ott tárolják. Rögzített URL-től mentesek (harmadik féltől való függőség). Győződj meg róla, hogy legalább egy NIP-95 csomópont a csomópontlistában szerepel - - - + + + Követek Lista Mindenki akit követek Globális + + ## Kapcsolódj a TOR-on keresztül az Orbot segítségével + \n\n1. Telepítsd az [Orbot-ot](https://play.google.com/store/apps/details?id=org.torproject.android) + \n2. Indítsd el az Orbot-ot + \n3. Az Orbot-ban ellenőrizd a Socks portokat. Az alapbeállítás 9050 + \n4. Ha szükséges az Orbot-ban változtasd meg a portot + \n5. Ezen a felületen állítsd be a Socks portot + \n6. Kattíts az Aktiválás gombra, hogy az Orbot-ot átjátszóként használd + + Orbot Socks portja + Érvénytelen Port szám + Használd az Orbot-ot + TOR/Orbot Lekapcsolása + DefaultChannelID + New notification arrived + + PrivateMessagesID + Privát üzenetek + Értesítést küld, amikor privát üzeneted érkezik + + ZapsID + Zap-et kaptál + Értesítést küld, amikor valaki neked Zap-et küldött + %1$s sats + %1$s -tól + %1$s -ért + + Értesítés: + + Csatlakozz a beszélgetéshez + Felhasználó vagy Csoport azonosító + npub, nevent vagy hex + Létrehoz + Csatlakozás From 672380653414520da6a9f2a87f8f9011408fe32b Mon Sep 17 00:00:00 2001 From: JdM Date: Fri, 12 May 2023 17:26:11 +0200 Subject: [PATCH 061/171] French translation for android description. --- .../android/fr-FR/full_description.txt | 1 + .../metadata/android/fr-FR/images/icon.png | Bin 0 -> 31177 bytes .../fr-FR/images/phoneScreenshots/home.jpg | Bin 0 -> 754245 bytes .../images/phoneScreenshots/notifications.png | Bin 0 -> 317628 bytes .../fr-FR/images/phoneScreenshots/replies.png | Bin 0 -> 217447 bytes .../android/fr-FR/short_description.txt | 1 + 6 files changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/fr-FR/full_description.txt create mode 100644 fastlane/metadata/android/fr-FR/images/icon.png create mode 100644 fastlane/metadata/android/fr-FR/images/phoneScreenshots/home.jpg create mode 100644 fastlane/metadata/android/fr-FR/images/phoneScreenshots/notifications.png create mode 100644 fastlane/metadata/android/fr-FR/images/phoneScreenshots/replies.png create mode 100644 fastlane/metadata/android/fr-FR/short_description.txt diff --git a/fastlane/metadata/android/fr-FR/full_description.txt b/fastlane/metadata/android/fr-FR/full_description.txt new file mode 100644 index 0000000000..1db1b2cf48 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/full_description.txt @@ -0,0 +1 @@ +

Amethyst apporte le meilleur réseau social sur votre téléphone Android. Insérez simplement votre clé privée Nostr et commencez à poster.

Nostr est un protocole ouvert qui permet de créer un réseau "social" mondial résistant à la censure, en transférant des notes et d'autres éléments à l'aide de relais. Il ne repose pas sur un serveur central de confiance, ce qui le rend résistant; il est basé sur des clés et des signatures cryptographiques, ce qui le rend inviolable; il ne repose pas sur des techniques P2P, ce qui le rend efficace. \ No newline at end of file diff --git a/fastlane/metadata/android/fr-FR/images/icon.png b/fastlane/metadata/android/fr-FR/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..dfae07cf09ee7f2d76bfe2bdadcb9b8c61039033 GIT binary patch literal 31177 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ℑyj5n8L`KtPr!iipf;Mvq3LdM91qHbH~@94Rcdj@ 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

?7$k~)LA4} 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®9zaGCyX6K2VF`HlXW-Lpv9BQN~c~+5u2CS+| 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 z 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%0A;6nTUB=uGk4UPJqitBQ*zU|o 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�IjQ7%Rt4q}jg6lRApZ3Se%1m_JbLh62|3?S!uV* zGc!uEqc}Mjp$^z;LPg5d+GC*1nhM;m0@TN3vS3!5Qgb5v9BL2TRKz4rPsxVDtfmGJ zth;BHy3s02oMSGV#5IwXg!yhe=tM}|TaPJGWqol88#&(Zp6A)G!PGgZW#AUXjpmyS zQQHZk&L>MuLHs{xJFBiZns5ux41?PYE`z&6a39>=-Q8V6$l&hog9dj9n&3_X0fL6$ zPJ#qULii5n;{1ej)fc^1uT`tNs=D5H?`PxW>UHc^2-u;?J6t+;>WDdcqD}rlsW&fE z10on5(-i)pyJS>Vooc_zo{NnP+X9d|Rz$H-`ZMe$uRxaRAv1MxZ=|+M08{BTI(hs@Q5vKccD~9LmWk57PQe?%Wu}Ls<*! z+U6TuW;E~h*QOddZ z#slR%MY$z{f`1@j&GWTDw_l35zH3u)a+kAB%-U)kEN@8cJGE25o=_EusJ93S$}10J zCn4nh)lx5);CT*cEOx};?>q7j_+wEI!_YXcaVNtFe-@|EE&gh8S963LcMyu}UiJ9W zs}VD)PM_^SIt*z!GD1p`vH0N^6q@r9o)9Btb~+x12f8T+`X(>{sAld8|vLAH^(1iUuE~wBn78s<1KXUlI{8`Luh88ruCoe!f~u4WlI^ zq46kPcKRaKrgz!y&xRp1TAhO~{p$u&{3?0|KS|OV3MN1&`dmZT{Xycl%V*Bv)Q>M# zSU&n=%+d4hV3ut3fqx;26PqU{r(0eMBlm0c*S@?*by1T)UdRg?6ac0g07n8Cpu~5< zPY^J{+}I>57#qxT9A=`&P`O8Twa1w+5cUI-V88gl(>N8u;aOf+`o8gr;I(K6TNuiM zVa{<@3QS;`rdE{@ADGIswYh*YHkU$mCl+0WnOnZiR_{>`FfcuyV%#WiDjFvvPPK`h zlzvv9e;?O;7HzcmJrXr!tr^JkK5vvF`{&`pVAdWzayeX>K@^6cuYj3u2c8I;`gR+z z*A;;WV(?iQw)bPjkNo$s$U^ronZbb|_%w}_KV+Nn?DTT`)!SXek`1cZh-vZo0Qa-4 zey8H$MpjERv1NzD^vh1K-=(`heX|@Y_$Au6c!8ohijg_sMI5J|Y|o!%{{eWYuYT&M z@Gt>tO^^R%h+?n;d_{fG*5IM~SaH!~vAEnDAG#~>$}l1TSg`;PBe;iOnGu=aTU^;e zLl6?H5yf=?_>+iX09EF@0NXONIE~FePi`#*m;6e5f7)nWEI_cj0xTvoH-onJw;mx6 zDsMF@3Ew*Tgi8ns@6u5UYx4J}(-JLLzK~M8Bzz#hep;>(^VeLFhg|(H;yZ1-jWPlf zRex!ZW~nAL)S|C4Id7`Bdcx?UuLC z?4)u24g^3(L2sNowszE2naB&9!;`%l;NMzEWcmJaPMRy2s#5Gyb>RKv#+4G0g73K$ zFIn~Ahs~d<9K}7&r?b9nj77~a+Z;#3)ntF;O}MhqFSoZ}w3#;F+Lh(G^-+7Luwt<` z5>soM{aBg8k!d8Fm$O`tjBUbf(jSDmMw(NLQR2PX@_DWIc_cOo#^qt9V;#@8#TH!* z&E*L180!41Xd{hus%x(`#C(c0S>-k0pUOc|ChHKh1r|Ux3Bh; zhHobo4+J$#_l40MhSTI7j=(s#<8ss=LnWXB%0DHm4m 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%0Dn@H8Ke{ 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

SDB&(H=yR3RwCaLR=Oj|DJLzw8= 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

2Nv4LaHkOksyYhXchqruNT2N z&i^_l0QI{9-730*2c7Ah^dh~xENO);FS}DEir52MmSO}+5g;K!(e#?5G@UUlzxFW-_86-x1~fogRokBC@ds29UE z{YBbrY=HG_<4d{HM5q9hVX8+gBiC{LLjeEe>Lel%YZO12JHoXyX5fANESeI&8Fypz zl{g2mlmYZg+=e>!KE@y*42=oFGA?N6BSp%c%Hw#)Q!vanr4lKM3(t)L%L*jb(F?69 zk%93;N9e#vZ0o?cd9 zL)->+!7$X=Na#9tOFf#Sq!0_e97Pq6HmzzfC^`Ac|3F%%@ z6qIbpswpVZD)b}Jn$85(^FbK)+9rNcnj+tC`Q%SWYwo699zv!SGigB*h=QvlKWAO9 z_yKXK8#Sa=G<9_de{eIGe z_=y7no~m+Ub2GcbMBFsAUV7t;i5LJ37}Rg}$-e%JmnOOQ4KC&H zr@B0e0#pqysG>8h$sd(mgWM9i`*3}kk}SO3kV^$3D`NMdz!?~ss7sJ~T$o4hk&d*EOIlpz&;b`_ zFJcr+iA~co9dpojSH=qvDdK7Y?P03^-KZ)DXo^YM46TA)(yEDC!ELarJZNrY{4}yO zYjsaO$NQNBjo@#813vb$i)tN(T2UlXIomCImT z@`>17E=Gpp?%Vug2113J={6jL9DU#z5G0zo21halX2TIRSW~Z!U6_oX90Z_dbg;32 zCN8QO^mcM+f(pa-;@R&x1NHD7&Y2e@_cs`l1Qrp4j6Ov=6MkT)`{~5DkQsUHw-!f- zYJg@aPv_N)#myyg_0yuDsHsv`=Yx!VES(P?gHvD@XU}D?0sz3d$;BaVFe`?B6`U9d z%J-SR=(-gQ7}mG!vu2D3k6q*2iFZ=Vsw3ho;{<_7rMzNnikMR|sEFTC5*Rd^ zHI|sQJ+s!({VbeN6pj$@itrE*nd^SU8SltQ~P0&a~NndnoMX1_>*Q80*w9qF)* z&UsgAK7v96M~yfwUlEea?_aH%VrWuGp{l;5KQ@!-tc*1wM10o^3wTvvRHOwtO8Z3K4}SA1 zk7?XY?K1PZLtQt$N)Anzow2c5q@f=?w~2KFGK4#j4^P&aD^I}C!3Y=Z1|-TO=R3zx z&;U{inxI3S2{_Y?F1aS+j?-zfxH9fLHElrV!Y`nRyZ|@xGU@7Hzsf6388J9(K=Ca6 zKR}!??@i{fTC20XiWYYi$zIRZX&&R7kV@P4Hn$syhME}nsEk7v8gy?=sCd4lsbi$h z4E-t}cz1XTV>fFA+N?AdhnEtQ#pHwd`zn=_%C3Cz)G+$LW71-9{d>Ad=3)N+0s*0Q zV<}q1@uxg#N9G?araoNcv!ESIgnheKMhGaS->{OsLuI#(QIX&j1djGzXt7UH3J=U9 zHf+>j7!Qq>yHG(Xxp%i`n`{;>Qcv|x-_8`=qTL?(H(Z)W&8EJYc|RG>ydO+Z{!)ec zf6#VbQB8Hxw@*SSfdC=&9zuZ7yHq8F-aFEy_o7qAgskqKNb& zh=3@F!gu+Pai8vexi9zWJf3m(IpeIg_MY=My_rAFGRk?6=6f2qi%)-^jQA(LS1xItZl;S`)lGmC70R&Lt-j24A+@!{zvT4b6Z1G zMvYUCY?^^W7Ajw%de=sYt8Vs(^A=;^w}TcPP8*f=LhkEF2ZYv~L}u;3d`gWF!b1An z#L(vp-d;)ifuLc%wa)$?)E{oV9f5mgdM3?J0`*non#4I!s!mkGU5K{B`nO5QL{p&T zY>2Yq1J0pp3sj6Elg&pu=gXDV>MS0OIB+V2sOMI9cs>S z8G^_2FFZZpUEF6XFB-SN{``(+qp2}{X3i-hHw}I#!~Zo`F7O^k(QRa)%yqVQjDN9p z>H5?8^O3=p*o_3Xg~Uy40xC&1rD%aIdG1W1tUbJ|K^dHwaF-^37ji1(fMF0%aFAHnsFeWFHs(-O7epxc>KD+8m zj56>&M;0N&J`x@<7sG#m3o_3ytg4r;8&`M2v#H{*pbpj7Sa3VL&L|1XqGTw@tr$|KhrvyqgbttFpFtad^U z=aMfqH3}=Vks7?4l8b1YzzRDRynSwWv@TTN_+A|@OWr5-kD>3+{qVz)1g=K~t|~$M zl7@;g{PTbdli7>|E9jv6>u=F!1Cile9r!EN(Mawpf0b}E!(haVc;F`Jr^A5DB zqXRHu3;vv;E7Rj{@@?A~9?{22{BbF77CK$InqAn&Uwlq?K&8fu zt|}34Ob<#~ltn_d$*{L70HL5#4xEl?%};AvIJa7gu300)=a7x-7EBl{0M*&W;4GLx$73#HIc z#e=$Y`PWCr(>I9zSf}%mSx`d`$nj1oi0gv-%CH#9IBrC% zS#W89D;-~w(w~=Gc%qf1X}?vr2>O`)AWv09`k1-NeJ~MvnyhN)zB_R+6PY8is{hPg zTy`)0B+7~MBwgIDCY{AOpzfL08>$F0rvfQV-ipi1EyU}d#u?#J(hUA=(#H}p#$*8g zt+cy^4(+jb#xV@6nlNm9iDO-7vg8lc2ZG%cF8*nHV75^dPt*{G?kF#h7AqceKk*nV z;eq-|nfqh&&&iKF2JRnuB0cjpRSBoBMPBoKlDKl5;gb6^MWxzB4H9jLUvU1BkuFw) zanxj==+81vool0jZx|Cl<8_6UF%1X~U2ri=5kg`npPYtXJ}E#-esGJl)n+ImU&+#7 zBa^yBiL64_(p8Krh1_#9e*ko!A|g5>zvE);h;r=n61?6~66O+_ou-WVJkjMW;%yps zEKR}hO?VgKO&&`O)Bs#G3Av%@iloGC)+F>5<0{^HPHUG{{Oi!qjWuuF07+s9-jI8K zh+Xbb>g!6rA}4s7&axExz?#1A#g@_Qc^OTZ1IqvKF9yVOF0!w5XDYJ)j)oyA);yT4VeV6xUFfGpn3|(-pYI%e!m}!qljj3 zCt@@o^7Xu2@No*Zi)a`2lV&-T0K<7)J_Z3B(dXmLj`pU}EPx@y0ybZ8r_!Qd5^~o@ zyua}+`Jgfmu@v=e2OVFj_m8i4#>Fe2&!h00Lgjd+nBUAHFa=%B(~B8KmX487^z;WL zl1cEG`8S{>$bm^o3~A`1eBk60iWUjA2rUi1uJA+B^&q>{*K4x^yt$gXgUTC5#CeA0 zrSaHjy(aHT9=Xse^8Y@P3$W0reCr4 zqAP+TGHCR9%ku6HdH4mEfV%B*#K-Zd{ho zoirlOKB$EEBMC8cE_{6Jm5h!xk;z01qPc-{&Unb!+v(PZSZlUd)h1>s=^t`ES04|1 z=EZJ(q#BEdAYkcGT9-J#%^(8Up}Hvu}rz)YF;4-G-Bi2$SBq5%ei`Em<5?5`oMpOr900$qUo4Sp<-kRnm%DgWDU>du(9|l?fq6DX zB)%7H(KI2(L8JDf+W$_5VULj5z$+fN)@`+#?<^h_1#cxT&iI#3MM52dnZDyV<{WKD zxLF8nXO!#1{IL2O-toP#r#*J|_CI9A2lW?Mnp;LKM=*CZ2MviX-N1}B6IC}imVrWJ z`LOsRro|sZ*Hp?BYzi6WJ*`bQLtk^FUn?b645{Z7{z56WZy0Yd{@va^7J>Bgkc_XG zM>|0mpDoGu2cJiSQ>De64cFg^&Shfct}zMcoPUK;^(qmjwCD` zK5o2GSbb#W?tL=VI|GB}ms&#_U~|S5-hQlt|ATmzmEV6rv6&~%dh2T5g#~Qq>naMp z?L_{OicijHtr~lmi-|(9Vr^TSFfPIw$p=zYG|5w@pK^4<6v#1l{^qJy zhW<-ck=o#`T0gL;vY`W6Z|cki6E8_^11RqsU5FRx=aWAg$zSeIkc0ox-JPxbo->Y8 zs?{4N$fZzI5qH6A~N_1^|EFPm09NLFD+ECF{!(Hu0UO$0N0Zf3mMhm zDAg{r@ei`w6%i#n95O+6LTK6{>OjwDE@$yfxR}@i%dyg#jJP_vtbQ8Grh(vdQgQ-` z+;3CPwR>z4y-jk3S(&A0xZ(*FejmqoNCC;GxW)qS4N)q=g{#`!aZ_sHflqN^CiwX# z26LLbU%8)OE;DgB%DpZun5g;>FvzhGcBd!<@YIIAte}UomSlib?Jw)$p5fN;GamWI=QcT8)8AK}q|H1lp zeati@jIK^%Yur;=w?lOHZDpJ}EmRhqcrH6m{6->@{;TDkSR={8o$qocgKd`2CvVZA ztBw5s-O6-_+;aS^-qlu{6q>Xl33~Urr#p?fHqNP9n4SgBtIse{6KQBHk)JSs^;)rI zO<_~F$8R9(IrMr@hguk5CU8&`#osh;dvSBq9zWJmBdYHWyMyFsJQ~(mzTRigFyv=v zHC*zw?*(S4a6Qxf#MYau;QtD4ZKTWjw1Gdxr_9pu z;VsD`b2#v$TNz@+(If+r$w3}$!_pxyvapUMo(#yw;LrQmyIof}SaDn-z%a;EUiH{$86#&xm z#R=}Z{|FjNR|>Q;x8dXV`PQ#fEpGQ9ehRU#TPYVp zVONT>g+PC~AaFHWl^c1^?1-1i{A4(nDoEuD1u!v$=WiRQWz?*_AEvAh;*4E3V|1?(1BgpHU&SNx zn*0qzL*;pP!qni|#$ikTk*C2xmgE5}x?H|rVU#Q}k~1I4Dap*=QKjvO>o6otyy@kHwZH?m|* zr#s=ugsQB)JLrNH{R+j~5GJBt5+}%sW|1{+5S@3M-TAJvka)OsB->?)z*|7-qoT~c z)ys3oCw(#J;QN8bv&%R!68Il<*9Y$|bX;C6SF(r6hT-ca;K`z4-%)d+5XC_xmqxu0E4V`5+)pRr9a=%gb84RpG`X> zd`JUn93q_oqJ?CDNm_3PTLC4i6MMA}sPLJ7=^#)7MW( zuNBf(rA24P*%b(FrN))5;-K-`R}PT;91d$H3b7&R$4WXVd@sx4ZZ)$spmV8py6ZPU zpKm<0YHk~$PC?-}d;&HF4ahuH3K{$S{NWCX_yg`5x+qwI(rwQXLpo#MQcjXibvFNc zu9<8~pDv~9_fsY*1OrJ_uEsXmcFT8*rYe#kq~#<7iaNkCKQwUIj`(BhD;siShTZ~W z4UG1!L;;ytDgRfKFSi9F*Ho&X#JHDCD@wWA}=h7z1Jr=LK1xLvC?&vX9yzSwV) z6gp+|_f z=x_^j83rs9PU)_fIL+<-7{$msz z9YQhhF%JIh^=ehKOLxO2Y5KCMI}g;HtE*0Iv|8_z`q44{0sKm_ms>Q6=KlDsg3#|L z2Kw;xu4%QF6c^h#PW~QJHCJrR;jNTtZ}#dCbNkWRcez=+5gjTWnSJ>0`cjsX>id;n zvWq!;^njTmZQ&%^Of&|=b;61Ys$O3ffIMQL>3P#lE9=Wna~^ z7U{FP1#{GTR6Y{>^IQHfch)O%VUf|vwX2Oe+H{B0%wZipc}0#stHP!SESG=2gG7lu zd4AquI)CorvB_1lEA*Fdjz+A6t4=xjXD7}C-&jXAr+|JHlN>pMhpNm!6?mW=YU6jL+XdX zq<=f)l=vrRrBYZO8ZzM$FVsHV@=+zw-zdN6&|9plR|;<<$M>0>%V%mtP#@n;!Hbt=s-KiPh^*z<6kmKU``-DEv-SJ(ZbtQ znYP0E%s=|PEB*o8tmRb&S}1s!p9+z^ExSN`pa>9D{Y%z6UO1k)w65@6&C{osa{z3~ zXP@7pUhe+Z8Mpze_|Yy$^CaGmYf!-F04Iks6ygFK>UKmXnET9{yzbmfF)+NSkMd+~ zWfU8LvK_u#|3uj>u=a^U<698hPm)is;w} z-m*A!W?0oJ<|8+MRPq2{1q*QG8S6ERmC)61lW#sB53_jbM3~Q(;u@<9F=W4S=6D+k z5Jcd0uxLg(uLD@Fqoav%G)nAEEGm`QKYyR}Hn>C&U`)`&N5YGxJSndnja)K55rV^L zYNJ?U>#;PQ9~!^uZj~NpZ;(ERm)5}<))(N5thu~sPhP(v?8bOJf>CJvyv^Y(RPjx{ zq-UO%#3Kg^eK&q0np_DHI2^}lSQ=%6vSG#n#vj8|L8d?>5_NJK{2dzp+Yc_<4O9y< z_L^}M*g(d^Fq03!^$c&TeceqFGnAj2?Y;N<2M)m^F+yQ@9>JYlK3Q|%8N*CchF zw|qma6UZjwtqdiIsQP~!cA7|M6P1b$qXk+>Ya}@EG>F?|#dQuhLzrqmk@WA+1_NIY z1`&}8mdc?I`id6Dhnl0mNXoXVq^fi=-gGYW>gZ7i_~cl;!LNRMo&4*K7y;8vgwLD7 zxMRVp%5c`xItpV+0OW;%x@hcy1TZu@VF1mIzLfaD@{%({bU9A@XVp`Y)NN*f=>Z^@ zaAv61HYWS$0iaVucCFw5TU;rPEGq`1NE~qhJ2a6e?jf7TZ-!cc^2`?5HQUxTXM+gc z*>cK&I4W^VD{L#YjBk{ZGh+C{d9d_Fyp=cQG*YHpd47I!T-qUgJJOciakbNi4+|^zn4}&1mrR})fFcK6*-oJ^{nkR17H?1gB)}fR zN&Ka_+iuEc1H-9D+^b9L>m$5jU~}oF={%H45>e$f6!(tD{M{~h!J{r#&jAZ& zO8j#Q?`qj7-#7(<>JLILCaKm52H(oKpT7;`72K+~YS8`|Ji|ri=AX+ZU`zBbBxui> z<>7t2fOrw=@?r1v2K18{7_19niurJEB;lvJ=Hw?;wDC8b?;?Ct!R$o|#-;pTFgv{A zp_}{J2*aIb?e%A!lJX3$gu)5&C7XR-TxyU@S8NTi8_H$aB^56vLHA9dhGfg;tss(z z`i5b-KC!ym=Tk%vrr#0?KnyKQ$Je|Du<2nJ4kIU22!jq82t^K^8Q z(_HmciEr1FN;QKPuZ%qRTrvWKl|xJil3sP1Yq;*$H2D%WVx9rrhFLjL1MHHZbM&fz zTtW1V%2^mINx%ig|7O^SY5 z7Yt1P2(Pmtid^4@JkUpxzageFIq3Ua?099@r_{-(_Hewdqo-Q=7A9uo?kp7f)2p?- zfZCm0zqWl(`O@zL2jESdb-%?M85)0_uO!y`28qtkM%NV$2;kb|J;}Q@ykgk2n(^b$P{p#Kp2&Y9HYTvcaYcSoQg2qkSAMGV z!?7p|$sKdLgr{GSXW4R3#e}If0{9$ z5f4MBj##OEDbjwT3@}C%c~xagTDeM-cW=Ec@}C1~%+iOWws0mA-X)RWBq6^jLt!?n z1`UdT*bo#U>lokN;Php1?@_I_!$+}_No9F=ZPdT$$uK&#ec+hlYIGvo@cIjdgYir@ z#RO(X{-WH9C_VNGMSEA|uEtt@0QE@hCH8fS4on6aXC2qe_AWDysM+5Wy;YYu7nR6h z`CCoz+0%#^M>5~rfzFJQbr8J$6{Y6w+id}zT(!yU2MPVjx^4H9s;r(elJN0Rsz`i| zzR!aV9*W${cn2p=!D#P{GIZK7Qzx-~5zJf|7EuWtNPVQCcABBBmO$OkODjkO!x>G(GWw&a$mA{eO|-=0~2#xXZl5b;lSy} z4KS1nUP`RO;>^?-wa(yhsi})TuhY)RFC&qxE-+Z+6U|+>{s1D1l^jgz_Pcu%tl&+|opByoa6XAz2-OedH zj<#4i($;=4B*vT}WK_ym9%z`}-?XZm96xll8pZp*vISp;@q4jU^66bio+Uvu&<4W%ndsoLTB`+OyW+j;B{r^w%dr_zDvWA*`! z_^n7rV9(Ftny!{vNL1{%BWxZCo59tuXsy@ET+^M1|pD&jc89yaQc>1iGG`b&Cxws~ZsQeIK%{Ht$b&uN zoit@_2SqCJPQ`9Mbp0Q9ZmTV;*HnHH&T^>hiwOXwl{mYXY~@=?J%)vRT91mP{a4k3 zmK7~c8{=t`B^V|x76w@>GAC1{ZoOcW`XwF1 zO*1ckGp5Lk|Bt{0PEAt}a2zeoKM?iR@<^BwkyJwcSja^A=v?wXBhWuoHFDk2iz)rf z26GcwMOaI*1S#j$k}hGR-lzE3FOhoo7PT%d!|!wLe&;{H-;C%`$08gbTV@uV&Y6KU z`G{8-aDzi{#vse!VEWMSUbAR&blPt>Pfi9`KeC2BFpJo>oS*0QFGn`}u=GQ9 zzES>EIY;Mk*6|4Nq+T`VKsE+y5Wma>dRV<(d+#oPK0@;o;aWi$`cy}t3SOqjKAldv z?VZ-$0?e9EXvTzkRWvh8lsjqlmDD$+RaQ%~&~C zX)jJx)X8Dyg65`KPst5WR-(en-GgE+=|Dx0TW5T*uhcz~i@qh?KDpDhMIPtySt(GG z)+0?`pDT)X^DzmapsrJpI#v5|9Q;mY0?a26M*2gPTv&oc`vsl65KR>S0i2)3d~=xYm6t4= zw{M%NWWmt$T$45_@a@Y$74*&obRQV1YfX19Zrm*Jna^jZ2-jn)$LMqkt(;7ukC6G%uWuamJwS#gLGsrH98T!M=Kr zqhWp8h)tPWi$*K%b=w>D7OEH$Vv%YYNX&TtNtroeU2>2$=T+BIh?@af5Bv^`meKEj z=vY}P7C+*{Uqs|#yZ^I`8cO@|BjWj_6#PonV78lN(%TreT^LUwWV4AMNHL+a|!rZTC!^@PN(fOt?@;~Wyz{Rtj z=Yu<0q-#1_ofkE13yr!y*J33M1vWO)XR2fo8+dz58O;; zRw;xNHM5w#iNC1Nuq=yx+2yIhbbs2TojAiDY?JEcf^X@%2tMw`to3&X)8%3vhQF>{20029W!}&rJ8Z%Mi~JEO>?~_xulAISo_O^yovfTY@LU z%mzQdcj^VALQ(qB5SrrQMpL`qDT$)(%Q~WChtixmWLWb49Ve$Wi@P&abqM<;;M%Nq z_coH*sL!^c$s_IS`cc}xy}j`_C*NG}x>w}%9wJ1F%AHUDPCdyE9GzxQ#h%`G_Z@5o z7an7|h9j6Ejp$r2DSdI2wx)b>Nms%!)I^TUz&4;R64{;4wbl2N{^XmrD__Xc(>7OM zmBc$o%F^~$FY}xZ)FsledXS;g1?!Qc28wq6%z{2--3#m=Mdp!+Z#497Ce1`U*SCNC zBGVEhjfKd;-wQpATXGVK{eGY%;#3d%AK9VWjJeF_fzqvHpPdG?4x>k=wr?@f2|^by z%;4-2w?dRSik_%WdyBsDFtyTQwRWQGY4jr_h!HBcuh!94qqKa@aw)PM{5{Z7EJN-; zz}e5MXKmZweQv$+P=YYIg4>mYGHHk+(+$3YKtIK74EURviFE9x{7C~5jGzMuFcn20 zwsmrZa9mLEBv2WkT?HUErKm| zasmUU3_u$GfHAtKkd<^T#t~rng(9D}c6Ua&8ULy2uB^6HcZ+Y|_m;vZiE+U(<5tB) ztLrtAekj;m4(cQ-B`kl+z`(im78|{!86gvSkc$Ovm??3J1%*N_O2W-OWpRHoq|tgW zxb9HMz((!FN%L_{0>x%AeWd*-ibZh-w5MG-Yb=erjA4hY@ROUr9UiWw-&$~&d2@n= zz$bl!ifjmgsxB()7dDb|>^*TZu~bhGqK85%DmiyqN3PVy7~GdUg;aujxKeKO`=f0& z!H;YoUJJ|L(B40NL}7P5`sg*gQE+&{kPh6eT2q7~hV#4QJ(90i#htwaDo;q#eX(g` ze1%r8iua&r1fD}x)NSKPlLex+si&dVBS6fm$YE)*KJ4`OXxqnO#E+8ue^WL(Ri$MNkfA%-k=lZ_h|i zNXSx2-VNRk1{?|FcZGhCH)?wQ2iRWP9uuzGIKuI*J4OJ^F!cSNK!HpW6jDmnM%S_e zmoqx`!CLh5`Yrlp=DM^`pdT%p#(W|f7>+yWcR4c|AiX{UPEUxOFdR0(O2fUV@~e+i z0Pt=81G5o?7=`!@AHWRujYEf4wm>$`TLw$A&B|nS-Es1y>zn+ei=1?X?kT(%kSlRt z)7Qq#7~?K7*i{CiYbJ&dYCWRZfi-B=k48`vCo%7%vX^aP9)G!I|3)hdvBqVM8mks0 zltFwe;J!J+d!I1y^%B@W2M+5aj(?@_b?^N{>X+ow#$Z>#oZWX+iLVgoyF=J@@37N+ zbv3WLqlDJ60#HmdawvUvm^+P+ZEf!bMcC=yf?-z zH#_Zx;+osjfEundPGL?pq~u!oJH0AzuE!>byIQ&7%ItTrfx*Ku-n`HUkKIF$7DhWl{x> zYip}rSIN>%Kgbz`baC!?JRJ#WZo3$~Emn{DB{x1-Fpx+$+y}0y)71d6qw~O1yL=Ur zTmg_AWv?s)OXNp9F=rP^8{7;*Ecy4@(~Bsjc55l9nP1`}ky9@iNCVRaDDb$E*nL6t zv^@8{Tan&{8AWU;*E(MXN^DKd0?!o#y?O2FHBaJvgxn3%!e-^4_1gH;F$4NL zaPQA#?SKJi%nd=bH^;4l!Zdnb&AJLzB*OTci4QOyat2Tkzg)k7l&AP#mE6-DTDwow zatF1}`7dps)q7Ay@`zTxNvrU9cdy+NPCi0j_J~DkI}ayq$Y*aILP>ye0n4F+fI* z@XOkp`4LvPM%8ko@Ebgnn0;Rq3H1NVzG)zG5=AR#|Wh07zk_1vYDqOzrL=WF`ttg75g1`hIQq2k(4 z`8<8k*k95nn13Y3bL`7Ad{KK6oBwHfkmy(FIo0Y$VZi}+ZSPryKoT7gL;Jh*e;aHl zD8g(0I&re>22Q4bx^4N}e!8%Ss+G~w>;ea+!aSwaSUK#orlauRVqS1lbJ5z=W@Ppw z=}*gx-gv0{JjO+Y?;(0}5e8Xjl-cimxQ|{gllB)Oi>Wz-H_ExSjq?m8v_$0K3gtRU zyez&>kY!yjnel9FvA9xdzMiU)IiN#6p?@sdq~4iq@>dLPY#eZaJ!y*T1m`GId^dGI z!q=D%;`AP<6YeuUUa7c#;Iug~F_xzNjYYMos#o@=E{XD^NUqIf6@?wtz3+H&b@>xh z8>jONx~b~>%{oN$mR%N)_h-ZspePjR2LER;gR-no$9N2n;lpUT;2YEdw!CV#&zo8# z>IT?88GVZIiDa{bL?anU6lvg>xhKa)CBv(pW3jjrrb@2OCMF5W$^(?QAtB7_-2p*`iIj^YN%|9XbTZfI5Qn^8%R@F_;xz zI{JD3T!lt3m@IuR?QWAqKW&%knD3%bLK@f@gr#Ehh*#?!!T_~D{RhB#cfiI{je?KJ zHeL%q7TbE4B(N5}nc!vu*>P+p_uT%Q_sFZ*FJkpp)DvT2%~Xj3zXX{|bvfR(uHKZ~ zwvT;JMi1PjW{EJ?j+A}$J&S2$?KQE9P@NNy=VJ|?88t{la3juvS`v_ba#FiKEDx)e zoB_EY8hz8<&J!M5vB_RED@F?7{m(c5>xLmUlPw*OPWiUo(I`m548Dpx*PWTEj1`== z(oFb-L+3Iv!er$4-`aO!d-a>aUn>D==d%?&#`;7muU6=9J7>=lbRPHPs@O~ zSF!ES#L}O*w%0I5pmsr;T&yg$#r?&}p;5QLEE0iRHW-Ngh~kNo(Hxj;+j@1m4(aBL z9gBLGzsJVXWoU=@K|O-qJL};`yzplVZy_j(>jl4Xi24t(8&Lan}bj^jMu=Iu0r-uR7r`- zf*MQ=3~u3tzu`qdYa@hoD2(TF>Yk0qC;*)YGgU4Iia&YdtOKjl@C zEL)>9!whyLD}+kkJ+{T1_Q#IQg`>30ebpFX%BpI5d3wj+$Z>d zGEo-A7E^#IKB~M6evfoGDTH3`56nZ>&N28YP)x{hmHC;NW382Z3~p+z744K*l|p7Z zo3B>#yh>LunFnBZSdIe@ZL+9P?X#@g03XEd_sy(8hkRp@OtWg8!-Qva*PxHMw zM6}p)^-G_-K6c#MLL9`M-sv@VyyL)jT#<*N1p=TqnMOZym`A#n@$iITvHUIuIX5Ey z_;mLoi|qlM2R=f-8`NzuRvcaQMrB6H6!l^k2^WPKS1v4SkwYHk9eAIZ3!+IO#LJZU z7PTX*sbuDY9p~83fxDHFK(~Ih$m`@G$+LOyVxu=}KrZIIB3bk|;OvSP*-Bn9~p8kyaOvUlmL!=j;TlOuwG`2>2d^?5(=)^Vv#x%+*)S&;Ho z75vub#d{|CHJ6^Q>M z$PNq1^qckg()*sQp?uS#JOu5k?y{exCCL=wkcPF)O534u&(l!1R3Kt;2Z~!l8gJkJEX15M8s^AN)0AU?cD) zDm=5&vYT!a1%3IHM_gRrihsscBw{>1+w!*d?3d}Pv*6yTUaGKX1t;4I^7LotI#qTC zUmNXtZ3Zj%%%FkAFrFjO>5Hu@7vgJXJ=PE3!|G}J+vTbYFGlH+V%>SJ?55 z+!dO@ME~QuR8!>cAWM1tLus1)Yzlw#PTuvIB3DJ@ndBhxAH*4PFr4pqgZ;Ti0y-(S z{gEnJnX=*d3(xk(#`k<7bD3$*<@qi4il6^*VPps@jd*nqpb6W+f1rnJmWf1u5;_ zx3(>-mRUx-kqfeF1aCd-hIrZgr;ogrQQjQk*$A@N&7%H>y=Ie zsqKHW;iM09hak~fiqN47W|<7QApD`8;vgU!v|NlEX4~f=;61i$=~f?zxX*RZkvXes zlXD4FIHAd?TJ6(v!1>!6Zg&F!;P$f&`i56he-TA?-68W()mr-Td!tY)KQx0TAgov@ zf=qTg5M9s>f71uRxcV~kEa^OzuT2tR$qUc@G5X{i$?rUGyAItDe7kRS>!eR7dAhE1 z^~3gCtVDVXA-D^ndz2&oUNvE1J51gW7$y4Q^+_Jz!RNrRoQllXyqyjzZpn;+PIqVlxb z2t5?33Z;ETpJegMkW;ZN`@{mVXe#ak0;}qxn|zxiXd_%hsV%pPUx72oL8o8CI9(F@ zELWlgs6(05^Uf>29(P`Q>U^fJc=IRz86E4lqxNUfeQOk&W*|q!T!5u$D<&f_7Ch80 zqlCm7lQB^cRmQx*{cP|D=y8QK#YOt5u}M(orDYEHRa9;!O8Ofy73rakd_z>~ATokpSx0Xu&4S$2 zqVmGL)g@x>cb%1`rdojaPm3fHdXXHO$;R$xZtSAwE=M7)LUVSqzzvBXF5`Q%*x6PB)*q)WHF1 zJZ*2KUV#1}mW!#D4j9~KBk#zffo@>6I**4ezS;bVTmgSwT^+>JHGa}kfi^H?jeTp~C!8SEeb9jxNZFjcg$l2^IT`;PZ`{RdiUP=dUj`3PK; z&qKq*2h&bc4MS>bl9hZjMq|eCFduGVgBwVlt5kn4a=*jT%ncJ5kpEKoLiW4687$K# zohT}zLS&G+S4(Q>Jp=~6@1awW12(2&X}qQJJ7{dfqwhBSVFpvFQtkWSYXYUEgLH#L z3&45e5A2oItJv?G1a&7e7X?Esj|vjZ3|1EZVOCnj-^VA819iP#V70)Xt|_06qa0Z# z@5fkjJ3ZQd#{hZqh;c!>dQudRFeCaK87VJV ztkPt$htv+Tx0Fba%A&V0>Lyu?uPmc4>+rF$j=3wo?#n%gEvyyi5ZO)$mXc4)0~>7d z*vm@uYGOu0zx8T|=Ku>}Dopxr9UG6nr!_9>zOQ;~l))aGS@=-nZ-*PZL><&#NJc?` zBqC09uuv!|cZbA;OYMb0sJ~vf@i6~g@0Ve6IC9PZ0Nm8{v=h2dKMKsIdGKOXPeAjZ z_3iIVv4=3Bnh_8B2Q8=;)EDEkg;L4GjP4?|;DPEvz4{qX25jp2_&Hb{Yi4Pzov+2g zFO8n16N#l~x^oZ%zOXJE#3#T6NvpscagH#$2QY4E83QeKRT=N{qI*u@>4#5(6)I%} zpao>$w9y#&8KGyvXYnB$TO*_GmQ=b~%NP*6L^Bj`Fa1(eThnx5FxveI7@^t%(num1 z3-?T*6!M5n&Pk9hs#A;0A_YS}tC!b+)ng82v6<*NGCG}HFjJhG+B1GfAU>Dkvs3OS z+N>I79z!2Vqb6psCC*N=?3h^yg%nCe{?A^BKof0B{#cz3;Hmp3#_PXPRJB#gB{NZv zotW~w8##&GC%)weVt-OWTBwzLhAQPq$(QZjd7R}OCK$F6q)2KhzQ>S~f-1AtYuM{e zfgNLz!bSTt1*22vkAaT`9tw={|DOEE%boQ}7s*uHbvPaL^`<*6kS4)inr8CK4EB*jj zdhFa-G-1-}4Ppc?=`;%ZG9s{d|7ZV<1Le(*@2@7RDVQ^+a-C_C z4gHf;)g6MXPz_+$+w%> zMP}}!WWlb>M-Lm-#uDFbvO7t@ABGdLxD<)<(zQcY2^?_*^tL=Ef>=+&C-X|e@aKR8 z7r$_9q*%XWoqe8TR`Dn`B~Q6hv`)-X(qeoO-h)n$31>{->>Vs zUeD_mS+3wFrGU^FKWn6%#Ifw3m>_c5g`u6vpCEj=T{Ox{7AmEYLTtVtF@Sh zh)VMGA_Wp)MfLGFUxq}Ta!QpmG-PgCZ%?eh5t_R;9;g0&3{n7dgPr|7%9{KDX9)<` z)?Um_m6eC5B!%+&6J{+eOmA^y#! z9aBhrCh4A4Z%fSM_bM&Ze6k{B&Qs`8Qw)?0dpm?_N)J8#lBrLcf3n+sy{ znUzeV6`kyV`{bX!nMkOcmR0kIJ%V+hfW^OxQQx1=7c>W7-V>fFU-JWC;j3NGY6+htU(=Twy~I$TPj0B8$F_ zGNI>SkESKU*1aVYKGw|w+z5bfDBG}?p7{|FGA6|@eMlAeu-u_H%e%?~m;|5zV7yc1 z`r7IBJ)@HU2Mi>P2ontr{hnz^YrEjZ!N(BZ&;hq_l+9`A*o`jpp>=b}88FLcXxuIk z&eh0xLxa=x5X!_dytaAm{!-U{Hb|LX){FTDFf4>ZEOUfuU^c)Di0yBT*uocIVr3?h zio&W0U)GWNBO}bV&cFdhz~sN7ZqPY)3fq?o0QE)H?W3c7g)C?sO2uy8LB%a6b=*xx zmHbta;P0s-iC~@aLNl`01V8;wlW&nTliIQWmRESc zP9Kotdyg2c2wbX+G7{_XzJ;Zb6EO57LTOC@NHT&d8&pR z06~3VlXmXp@f~k=@07?4vo-c5rC84! zaggrJP_mW4MkZerR|AvO?+1E1Mya5*&StE%#gNH&aCG3e*LS#g!1{TAWLFy0Mk~en z^a~s9U^p7)RSiqQ^k!XM9|T=Ra@0^r4b{=Bp$0%H(8Mv6yC=>{VXpAz#R%8pM(7(` zTFx=(pifF|g>6)-cWjSJ;9Z$8U1E&DUQ(so1`GK*r}mcRc9LVvx9#Uf%6;^qi|ilY zw}m!+no=xl8iXl4`l#-h@!DOeP@39nVN{D|OOsu-B zDe|ap`@|tIVZg0)xr2;PPZvyS{uZBuoCLJ^cnrTaSdnqONKCJ}KT=@Y^BCC@?j>Zx zN=I&$r>IniMWw&s(O1|t16>GOZqmQhq^YNH+?R(gvE;I4_b)^k*Ycfgks%*2f67$w z>>^X*!^6G_yq>kpOEp#pvAM@abxiZ&qxqB;4Pp(Am(4vXjV==2G4#5o*ZLI!!F<#S zMCFjub;0kP39;uqY#z%uv#ovUd2TYL-Vu0TP_H+eH5uRY!`G}-Aen+|o-UT~NxzDY zL6+1Q>I!@~$fyI2!JpBV1m1_#P&ij8lD&J48yAf>H5j-(<9_P$hqU*M``zOri-E~> zu?JpJ@1(kEHCfv6C#Ih&*{f0+=%YHRln>Z8oA{kk)4@?)A#{a0+?sHo*#~?i7b+#t zvq;Ok;7OVxNt&kTmqVN=k)qIZxElnu-Ue7Tu*-VX4yNm20rU`C>nO&J5=Ni-g<#4W5&j7RN=nbzVeJYVz(5Ta7!wc{x!wIlU7BoM=fhT&-3AVA z5bd5aK^rkL23FV-!KGrxwlAr$_iUL|@St)6r7eKj1N}w@=kOa$eN{hghpe$8a?_wP z@my}R0^aJcCGiJ;Aa2tUY>fGxzr=#$45V8=O1af?Vg+Bm4rLh9Lz_oFxFTphr;qy& zfa<$D#uvTp*Tgye}0>I%{1835q2PF@wN2T{e_%loFQ&>{NzIO>yn0=ax) z`qn23frK9vumg607RZt0|S!0KS%Q-hS%!Mz(CTSN>>c+^s2`t%@@;P0SjLWmvi~E z9daB*i#XuDIL_k7MKj?x;d(yCfH(6hDl)q2rTTZ3Y_xI=VKJnWag}X2JU5V_Pu`yd z%ZEq96T#SxE0jYHCyng`27einJ{qa(I>CT;EhqdzC@~26Ox+A+w{5bK zM^JzNa}jV7=XuxqyjKrZrR^aOzb+TeGGZwDV7*qL+t4bL&VrrdczK*J+Zg1IznqtU zuMC2O*6@jS;ra&Ogb2VFX|=U9Kl50#J(6aVa149d;jFv7FI1gCHd5jE#$OH4^3nn2 zfm~;xGLV{3ufm{TgK`#!?1?d1ZeIPk;U~OGv zIM|r8H$QP$Z=KnFU!({^d-Wo9uT~y-A(Eo*FMK^FT)?wEIBK-7FV~ANtwHS@213{s zhzh74e1Y-1`=rOZ3tUrcpnu+c+iru&<|pWfKnl>p@wf2FcD!~ZKE>^m5hcJd`O6Cn z!L@fX(~yy(A&;o^6jUl;b@$Ohm~5(40IUXZDWHO~E&x{boJ`B{J?3EqEK}yDUeuTv z!R;YAu;V$ZnP?q5VAV#@C*5H$^8L#w zac0IP!_S7*G<+cUHx&0G32=1B?9=zYGO|_~k9|LgRNhv2tc<3vb%%K0VyhZ9*pDEH z^0zqqQm9|#i`_1z@En;BZsTq4?s80X`VVlXeIrkc*4JMT7+Qg_Aj@-Yrchp0R?woo zW!$XHD0P&bHeKv*i9(<<=YV%RMl7U9B3Jq3Jmm{`R(l2p@A1zE=S{Fy)CJi>D}K8?MB}S!0Wup&foH2~~vhq}V+D z=S*|vaU3wBKNYatJP%O16cfwv^|Mbf;0$N$WNwvtM0epv!!89qBTIgSbyDSIO&e-uGLTH?u8H7dNo( zP^kl3$}C2Si6US~@EK`(DX-a<8+DIw{>caDa<>w?JA#JkGI(}}Um;*54+KQQ&T6HT z2M7e1Zl$mUe&SEOEP?jx!*<7^h-bBs{m0&Q2Ne_5H!vVw6Uvte7_UyDSJ&a&n?AiJ zp_;!O^Y2i%E%UwR%f|52p7tq*O@C&Y^`nrG9geBB)y8I>yzL$E%mNoU^{aw=`ETJC zOD)UE^p`!?^}bY<%ds{342|&mz%eUvgsA#s$Gy3bd&RK4T~8q-Q==9v1(poT$br)u zwWp|@eVc9hFinRk;QUVDw678oHuQDcvbg4{b8n^h-g&ZKZyi^w&m1#-(aX!8g zA)+B+@Q~%ke1NL`VpHnqQ%l?E(n$^!we+DW?#kQLuI+80Xf-oJWqP}+Hy9d|@ZWXHMh2E7(i2H31=}8IK>vXBo2Q+mS{hb$WRrh$m zHl6pY;7(H*l?sdL;hLlJT}Gtnks#q1siU3*RjS-UC9)>eSYv(go@xr7;5S zV7@j{HF&Bs{!(|L0BoI`K1Fn}+rA`b3`qR_B?PZ&EjQ^Eg+XcYLIFlnyp@swyMRI_ zrD>T&0Eac5nQDr|-(Fd`Af+B!XwgWEk;LYY1-Z)dEY+&|wbwLL7u0C`TtPm)Whe?+ zugo2)dRjiosFK&Kn`xOOseh;6@q#&MVoI@uS|CGc{}7HTR4u-I4Aj~CaN{+-gxVJd zO=g*w}?CV!0j0nJjZDnt1%>5KwT5z07<@?b6R zTF?wN!fHshAXyfBj!lJ8L&fpO-`ii2V(0Ft6r>KZ z3+#xT8sP=1y3+y{jW84_CT1?(gi>yAL$PqOD#^1=>y7xGv{ZLB@TjW?dQg^&?bnMO zqtZ==N_I(D@W|)&^}@^^*`PMKRC6CNWiy`b=vkCENajOeE}*_z4Gdg@By zm`5A(ncyLTw8Iq@;P>vh_3+5+FYTu9CVAcZ&>ar}CUU3psX~l(<0&!SIWKj)Y5i*m zFg6iAz2i83MO3z|Ii!0_#Xt(`+n7R_%DLJ5&InbY!rZaUmfsCq7Y0StZ^iHW=Gljr zJp7~FH6+L7PAg9d3+biSc?Xd-*+Yo_PRhoxQ}?HJ{(} zKfur5GOqmwo1IqI+_9>r1$F88;E@`tui5s`*|asTk)A{gi;R1&D8!`XFwh)iR z8lFXz{BpI<=E=+WfZ84}uNX0*&Afj%?^?>iE8U43*>s-M4Ztv$Y?FYuGvGCjD)84t zkcfqiY{SyiCjmE!u0`aosR8W{qN4mN)WQ%4!Vn`H0Yxmz6vkx0l*_Af*Sa5qFBPuC zWwI$`;ZTu|%zNXXPPsPjwJVr?&Pl9694gq)Uab($&<*#d6bweosBK&^S;5h8Z6E!j zZ}oN~rI_5hCtH*frMdT)9~>-$R?S`yausKU%DNqxZf4IMB|O0{KH5PU=zEIxw*Kun@xri>2Q^-lYzr{Y)nqzLB@p)@J&lPTWPD(OSeX9@c2SLXj?j z!;f30gx|$u)ng{f-Q?}7e$d<)CcyH8O0gg9x1pTHN$=!@+-a+|lKw7K$BoB3vKS+* z@i*NqR|-2^97m65B0YvaRo^%*=FOMnXY@iSX9&jt5mrSkVq-#T*hR7kHgTwtjB)*B z(58l-{e(}9qnogU#TC*)67&?(mTNLBu7k4q)!6Lt-fse#25|9Yq7h3{PY=dx)UK23 z^$x(lax(;=y&7jo9yYSlwB(o55Ryu=FPbxPCCJTasOp1gO<*wKI z0^NIsL;g+tc`23BR2b6GCC$H1F=;5>P@Hc6w4&eph7&z#FKZg9=v>1NL4jXs6)_Yc z&7qn5ogEY3CR_RvABk{4n3;5k)LezB6Pa&|>C^SfJu+D5V!SEM?^&rYiTEH?7RE`d z{2*139wT@fTW^#O6|TMY!EEXA)R+GIaYen%Bv}G8)RD{-tZXT#NMLDsze|Itf51B> z^HkAAR;qcfX*!C_=c&kg$zyfoE?GLK*Q4cgY3jP;x2>mkAi;F#ltAAO=C$}zt%XW* z?klxhsZaFm^JpM+sau7~tEa?jf$uy2pvMnr>6 z^`rm?I3qwfL`ZO>iiDqesX`@S3w_YCu-md-Mo8}$%>NiY{aPN7kB6@Yrmc%Y?!G?* zU@KBzQ5GxJzGmI%>}UR0Vejh@R^*aG_pg45NJ{K-ej?(~cjq3JeoX^-Asz}8^qh``+Yt3>tP~Z~mQtKxzVY&w!lw=xXvQxV)9bt` zp;~@aQB;f?^rN9|mU)Q<#--lYhMbT(?4ElMvCz%)WOKg4F!AG7BGgL}a=Yz&W)p@t z@1xiD2cIaZBtXyma4kN58jMY$uRFG=|GRy)WjdGL02gN4I3+xGki$3nHQi`~c@$ao zkDDsWO6~azBtar-M}1689X)8ipWjC+_ii3xr~RZLr)RX{CnV5fq5rl~#f*(up`xh} z!qA}Erw^Z1rAcA=t%P1q$wjO?z44UGxE-r zZq{r80P+PDb%A5z_+QFtR?{^An%!GKMwS~T{{bRQ5P(`Te#pv?I^1cGkF@#FzO}8L z%iy#)AQ2exDrt;m3ilrX#820VmfCJ{+4OYX6cqP=mKY|^h}Fg#KBVrEM&4Nml_lKy z=or`3IsEC`3aqib>BRr5@V~!bPLuruCTIg5w#sN}<=C?6Rlfnb8oxnvR3K{Pg#_3* z&DNVBRDOnmG<-blP9rtu)UW6ze-99elx0x{6oqw-om)ZPH1Zr9;(&z6w5dWAAa!JB zVIDUmBGJs%P{2qN7&wO-1XZe@_h#-am4)%r3wBqa@UCtKa(WFBoDX|In{<{dw9ivS zy7euj%EM)b*J}cqi$u{qPsU}>}8?*PX5>vzt#PlYKf?41AxI@r z3XsgWs4;pXS)A=fs5qN|fhoi0sLtZo<_YYzvc_QC3OjV$HuEFBKtZ*jxMDvgZT5Y< zl?OjZ-Y1wFSeb>rPaOe!8o>!$&#HtB&46uF-q71caE8R5#|$^TxoMyqrtj-vo66i> zU0-1$(;8Nkj{_?5L(or@Mf;cfmb?Ne@%)Q#Ov2Wt3a^-h^i95{LPj26x4`3{_;Y?) zdCKL2HfiHipo#Sry&I&b;PyTzjvbm*LY*LMWJyqM?F)j{gUJ0f*(nKfci$79rk4-; zpLKZT)&;Arcek47cz*67m9E7b0fmgRLD7;-wZPS@ZwhPz#!efJ(J(`JoI_PVDJ(q5E@aE8a$waC3dXo^-3NV7RDsX0&Z#U_nIavHP zkz0p$_F)+m?Xs)C0c-68?ofE)3JKARGK@eq&XhpYW^sHe~n_ zVF;UJ&tNt4j3O@~0k|r+7D*X=jHufHXt3LhZ}_`+_nQ~1E6Ex!X3}Hc#nF3sDUN!3 zMir%2RevkRKX77xYgC}9n{z5PtVo)n#nU$XchhPRvVa)(^@smf+{oa!v}QT7DZ|s| zcF;-<5sA#*Kt(mtNrHHNWAV7wS&poNpg zFw86}9}KrhL|&U0m@1qjc8UG)vCn>Bwrnn~v~CvK^yN8aNk@h4ecDviWw{N|mLO@5 z4QmgH0N1zgNQ`7&fn$Bg*jNx`0zYnX2<7Aj~*&( z;{}z=6RF@kdbU1J(N|jHBO00h{{X|@w##8T5AE-fYq3M!FeyH5h}eS$ieqI5*-sCR zgHbW5_!dRfS2i(M>p+C4=!-n@)fNgYyM^6@e0HtE7QJpF4p3K4uDNVm!x5H8_zK!M zV=E{*OUCXC7@>spB2R?MzS8t^t9_iSHJ5lmH~Fgt#dI~g+M1TmHgOb`iqXY6r>??F zI+?3v(oDCvH$MUKRqVNi$0##5G|83gLy$`oZV|`!MDMwBQv(c;4!ZvzfLmQ3Gh~z~ zu^0NwL7SCT(U_V>X34=8!k-Dk0K#f}1#OuqP|T*ew(`~5DyrALi1*T9so%9ZSpL3H zmQM^tR6nCDem=s@b6J(7wXyTNtCny(Ac3nuU`Q5|Um7Y)(Vo1%Mz-VlCD#4&4y%gm zqeA6AmQ`+=bET35t)j=B8^3hS^$jK&UYJWn^Q6PZM*I{C{hyg`6|!v*+{@Wh`96pu z_?O45K8L)M1a;3-CfUQmI{j9!ENxCjO;$eBFC5b!3 zry<@_*1mH6f{%u+7~V@QyaSj*)y6E7>wYtcB1q7r?)T@0Bv!0g+pC-#(c#yKD&&P) zqO8M@3_{4$#bzmetusg#B{cq59>PI&QYH9l5Y+Dzd%r>hetdWV z?T7yEsf$8*-|W#$Tm;&L#r9l8kiB5{3P593qvm%kD?&|uqAzC2Y=G)P4veNV50N4H zTD<#kafUNu!iNCqBAfy?j$T8Lom|cWW{B&cEUtQ)Yt-z~A42>HxtoC*z^B*d3dJ!< zVvtd`UbU;f#9f7<4PC$F$Agb!A2a0jm^d0yPeC$LY45t_O%#!{yGd{Utupvb(h+tI zx*=R4OTl;6SoE^9J?RAV2Dps>#=~~>_; z&?I;$c7&#;vYPa!!-jos;(`bHRs+cZf;t)bT#K;W3q2L3tK2h zTprB31}Z?+S4+h*a(t7lQ>hU|m~jQDQT?V1AkQFziX-vKUDLYTp0k9W;6}Zs&{pas zNsdHTnLcUCa`22%_yeW9_~lgA?^8$bu@~dN74q-A%h|t(bS{H+7G#hqP2q59dC^-Fvci)m(dJ{xAWU@Wu!a&Uf;KSbfqhcz$6+& zgy@V6z$Pz5%;c~TEEbahA(3+AzY24Rr4XDH`e@WG4-u%;M0iGnZIJAnCjp;Bu^&ks z3~kxZpn}fML||iXY=U_xlWs7g{n%@j-2s<)*IoUq>fee>!C2~;MAQ8#Yk%q(TZIx& zdq)XD=diPyl92M%s(=n!d(nDYk)SLbS1F~hiD2|;p`1id3&F|y8qbrmenGi9GM(ho zdIpU^{c@h}K}|4ViidZu+EP!1f^F*j1 zwByNVoJgD2p;-}Y@8C=>=+TRe{h`GOMen3C(el>=EeFedYQ1&V&{d&&$p>%=$~;8jZ;ov~6oBvWgxN6%D7?+}1B2C2a~-+h4s3aK?`k6&mY(e3 zi9?H$1jaka1o_yC@ob7$zM_Kf4rv4jX^MvRhv;yhM_9?vsAd&0ZZ2TSWycsE!c_gu zw+woNGv9UBm`Zl2~x(YmIJ#$$$rtp=RiN4p{TBdjk@Hvcc~U`YsDn{ z?Hx9A#mq4?i=IeeEhu_;&&_gF{jp4jHNh#58k?^w`Ej*p?1w!!&5n$e5BiKq`UpEe`|%X1B1!!($w&sbX~3Y#UEPipgr@b^ zf&4z3<%YMTYzV>81GWc(Y=Aw=0R|8B<_uyZ>>Gb}+_z`Kqsqt&=b5a>0N`xC63p;K z?QQ&Zpi&RT^4d{nroaPpixpdMGZxH9MuLqb%imn!sierSIF=_5r===d*nYLA|B70# z?{h6wE|*um>^jp*9lI6JI;;&(mTSEBQ{7R_T1d=6D9AZ-8u3@J{feC6@@iorh=9}& z$Z3{x`Ydt(0Lu#|r6)0^z4LF&rSbMde&}~}+@6WcjO$Ipn(?!Kd@)5%d@&r$2{X{{ zz+DFF%-i08ea(x{QVmHLCThN^n{;9Ec)fh{ORkbE5#mNt`t=~0g_({d~_v0mksp`4{4j#B-U?}cjV`G{(}(L8OJ zg5!J-sqLX)v=+o9L_E5Rl0xE%RIyDH`G$oZ1!^~ZD}jk zK|5eChxz-uM$qwE|5K+og?vgqH!}|v6zlr^GGyHs4e|^+VHWEtWDeJE-1;}|2$liE zU!1(P94w!@EzjP-|Mn$qM(_Y5Eu*NHC(#_Rk5wt*#MBS{uo0Pcf5s_g3QLj8qdQq2 zM0`t_+PAZIx+%rNw=vV$#C7gu8X1l>!p2?>;8rWPNf^zJ9R`Udm!_t$mHrRNQUe{#^*E49UTsT9P zo`2PuKplV^9+nDOH%RBNzQfD@n0axD!lgXBth{`O9#J%@ltGs)wC8$ROvcoF%vj?E zqwy=!o{UmD00@CZ5|E}^ia}N{K$ruZu|$xBwG~o?81g8G=J<~emHqh zX$Co^5(fEA80We=hFy)$R*5~zyuHFAL8k%pf7cErDZ$SZAOKY$^(&_AwOjG-?v8$a zU7bqv9g$NHv8P@#}vHmVQOs^v!d1bGkNA5X5t zaE|UrH+d`Ka}Q@5xeQAJz7c&38Bl|+!o}$N&`>KiT~X1|@G@$T3H@}ajwBVQGkEE@ z7|tSc<(WO{dFR%dnU2wdQ;_@}a(^$RM%edK8&={k71G3GM{M`0OWR#T?$p_#G73{e zJmnvV%27W+aWwHJRXDvDBynczO7`O!Tt;+(iyaEc(Aj}qt${R&b9C+7w^$t+urhcG z-;k8C3N#l?>Sn|^OB{^Wm|P2&ia2#x@Kkq~Fo+(CibWZoDwhLn2;!OQ@<$ZSE!xOR zB=gWiz7isrUl*qNb-u=Pte4-y>3NurjJo-Qz8;nqXeUXHCrlmh&hCp@S`}KTuo6o+ zxX;vPP(fSiu8z7(RQOYm8qxOI$q4%P`OfvAYeLMk1Hk3!x5bm9(w}~e0Xc;ze3dei z8lo_62IVlfufQdw(qzBPoE?{Zd)CBhsBAv=hBb!jRm=Iu_D@EUQHC*JZsQ>zWn=V5-yN)ExZFu{ zASPaa)!QLlxBbb1N7gcNKRU#aF44c~txH4uuUxgBWyzNp-XTQG_|JQ%t@@;b-~WUp zJsT>p4~e>tc|6Q1VCv^4o`&l@m*a^tQNr=R&iS{SjSvg}KL9UvtW)L-Li zB}CnA$C;Adto*iw?71*oV38-nc$WD>mxlLw>gT=H08P$Mq*}33KwK91SaGjLN^b9+ zt&(mbmSXt1$VN9h+dTv$J`V()`=-T6tlNi0XP{1Sn2@Z}vP$71Mne1+MQqd~(D$Z< z?+jef7o9YF#NMZ(khTEP?iVnXW-qDZ9AZ+1E)BSs-b$bFg|K%au#$$N30p&X97Lyl z^0J+vK*eWhk38W$qlxK)NwjXFe|GIQ97MLaS>d=T`$uk;0rT!krGPV}&ZsZ?;racj0Zzs@V= z#J&*Y>KmEh)ZIXlpt-F6Lc%+4Y@(v|45(B&1afXSVEdWkcCCnJbsBOZ|JtzgK~TNP zSVhjy9)3RJrqmclTsB0wm}6%ys8FS`M`Iv8l-D3qUCdARu4&9Yro8DMn=qSeu(;cf z@ebzR+L7|wnmDPPn}VPGt>r{K-y9eWxhaq3QrUzkug49R2386cT?2Y_C(Yc#MSOKR z5{Wp2nK+iOcUwj8w7vUb;+e_MF7RH< zN}b6|8<+KYSoPPAJz6?A6(g$L+ncc5DUoh|CM;AcAQ|VPcW?MHMC*WM`bML2LP_Ff z(l(K%kuzQqk_TLy#+iS6nDrm}_p~5Qw5|v{SX4@3k zjj_N%-xL46if}oevmxfL`nPG2Rj9oG01LN2 zN4-D4h5H2XL9TvO{#xQ)<$BH2RH3WciJmX=jc}UGGpVqRqb8Fa_5pwDpB6N$4XgF^ z#8#ijJxmI6gilOd@!irF**`ezlhpt_6UnCWAGFBbE&y4*417P>tWWM=U*n4t5{2+}{$aQ;W z5$z&MgUh0ma9Z)^7^a)V#Uy!YZ-aPY$duF&X^i(uWxt2j{lM!2Z2-kkrX8M90{0wgm>wB)^xJk6U%#=r5RjB4KosgDuD3fWeb4CQf|lr>N3)>aljid?l_=!YJpo ztCpn(PC-#cXaIexVNB9BS%8P-Dv3G#@|Heq%HDilkjDIqAjR;Nv0aGrZ_I+W%8QKa zk{)PnWzD8^7Ku7RDV)KYEAHUsd2v_?rd}t=nkN;&X0g_WOZ82;lav?Net$1tM7T6m zJg+SYOEE8ONo<;9>(tTnS^Yc@-Hg{QWlF4ipOIM;D27xBDFT(D(nu{V4UPZU?Cg~j z*)Zu8eA=C9Ye9eHw-nv1l9p<(Apw|*9^V8c9I-z`7Apm%!}KV~75|T0sK%v=q}=v1 zkl4VQyD3tYfxAY-I~Sri{g7SQ6^5`scTM>XVk#>nsc1I00_fg2DhbBU{$F;~TdxIA zZbK$G3%uIrNLy*+L*Ewq8v(5iqAakPS^PUK%!ZJZV6yd?SY}9I)aQ*kM(-1@R zp4$D186{CPHru(z&NnsP>(3M`Zj;XKDUD>P zfZN?tgK69VwN{%onAcV9R;O^G6MCG|z{daTQM>xrd$+=x&0aB&j)N)hxPE?i*E=#R zRUinCmy1jfm@!^*YhBfP`h2$Qd+FCRxe>`x#PJK1FhO6^5NH)t=Lao#98znneWq%2 z1ofD0?tSa*$h#SI?b)~Y?V`U>L23hbRJFyVX)mLD_#}Ka=4*_`s*4+S)wW?$j22%} zSc&z6gt&-C!2#BOe~)wWQ@W#Yij}+@xmPJwBG>|gMx}4SZUynfL?9aUk7K_HA85yL zx0)cPY;p~`P_aGEHmx!r@0rP7>cAVue$zF}BnoPaD@M}(c>BirWbA+!X|ROu_C91^ znc|6)pHtrR!|c$=PO@O2mf7!yZN4uSd7s?9rUho2V*VmlD-vQI58R#q`gVzf2;h2d zOE0AvP!Jv?G-xMPxL825(vh<9A%r$qsX|rz@#9mGgWdl_O-dr>p(G4y;t5u6QwXm| z73ma6&zmi_YPW?P-s-(p~@N~WXZ~TvW zoe7`h3}|KrXgljrPYN@>mgQ!Fv%fhIZ@m5eC~*(*Z5J9D%VAP^P>QVr;#Dc*-lCsB zCNT3uhOK=jg#}7o)vw#mal2fBRa~wW>77+Pr;&cAKxhG<{r1DY3 zjtTr>M%26Om3r>=Zm!l|h*xCBsD1e#Dtq%%%Wt^UTOpESI6B)868A+0tssUK%55BJ zvHS1FXR5HoYbFse69tBQ=7KT~tABg`K{AYD|DO6}eh?v&rYTUmS9~Xk_Wvd{UjT{- zA}AW0azH~*WaNcxs=+vLfbo=Ot^zQG-HxmE3h>#STfgcO%igU$?`2XHDY9Jsr+HPY z;SD6XUY{wRRCk?1#}d}^{_5Fx6BacM581EysbN~GaN+*t&}c>*xn%pz9Zh0sp$nDY zmHMRYrD2(WfKt4gP5Rl&cBkt{=#Hxl1|C0`7HO8PS9wbmCT8b8k9&ITTRx!%_oUU- zQf))AL%62o$DRiMEAF%-kpJ;f?N+6*!v>hrEwY~IyQOh6o`Qzilw}`AGmBp|K8rBU z(J5PTCPXY~V=X_i(8KpT+Da@2Jd2Rw^0jQZ*SB&aMdE!S2{8FnHq-5OI`Gzo&w1qU zMRD&ZF1ewnHw6k>Kp;wiTb8DN&VYKvuO%rRH8I@7>(?}YUz;FAKTTn8XD;q)@ic93 z;*VR{ta_E=p5Ordeq2ZXP5O{H4KknwFqjGTTI32RY2n%V5TVE7pnM$~zJ$II4^D_l zQS*V^(+7W^);!$C^hn;wD%YoBuH2O7?qP($ZqO{tynOGrGN>SYTVjb1)FP$BV$EZI z{1hN#0y~fkeAP$yCbKCgu^PsILQGJK%Clodj7DP8E&VF0j}y5JoO{y6$RF)Kj_ zvs*4vaO+QLAZ6|tBeh7FflV*xfQvPXm7VVn^Gu77N|>|YquE#y&>~zFi%bOFiVqeO zj5uXSmgDy{Zr&4tmJ}J_6xJYs8XHO5E+)m%dzd%v-&mXr2v1mA;z;kHpg5FFVUG*@ zl$mDZ&k*D6rd6UrMj=Sfm2wFdN_%gC)IbD-;-}!U1D2J>oJQ(KF?1l$mfk3{(BCmi z_ItK1&j4ZOs-rAU&?|68> zMpi$rvgn{0^bPeI&ZZJcIMw+w>{};Lt-D@sCqs*@|@!* zOjg2zjW3#ydQo8)NWOQieIzSA@7!*xJVj2r6@E*S)JO!}<6tjO zg*`AQCePqlUMp_oQguu)r2KQ-Pf^-B%hzEIc3flcDYiEo72gZ{D;hR9uw&#DMTo+6 z7Dfn)4qSly!$T^yA;`4sjl(!A3BHsp({QU0uVw#JZMxNgRJWo~*;seo$CZ9Z`t1-dH_j=q$ju-w~&!JA1IzJZoD?p@S!@8 z`PY%ItS>oM{{4zxb3!hBI28J(@y5e=5xu^s&vzXN*Gm(-b?1h7AKs2n)s!y)$X7Hi ze!kgIQET(ZpYzXzd*9;oe{7l-PmTcOCq1R?cR1d`;!kBfZ|&e^+bSF;l@7W;-q{i1HSf7Rh|_ocUI<4FB1#Cc@a z?!uZ*^@8L`pcme=PYWHj=XHI_58)KZokCi|_)E^Xrb!>n6L(Vw0+xFh=w&5k{jk~6 zig>)is`TGY(eMdProF|l@4QQQ!~E+Hk)kGNPC>g)Jn9$?&iBtdfp=j^eAP*RkB^9& z7OJ)bSLnwmv(pW^;`P2C8HVE{r=pxpUV{3OX*`O|`G6!h^=B{3v2?3>&r8Zul{6De zY&)u3e|nQ&kMqG+pXfBYY3~pPax(p~qIZWs(~jP7e)pPg{s6#nxZ$&@$0~Uz=!H*` zoF`-s?)*$FB*$IqfG{Jk#Zq*@A#6@IipFPPea$ zve31*lp8bScT4Zr&)Wa>P0+?slO%fwgX3zpmNp(j{Zh&mobmqR5rsF$Ro5b1F&y)J z-T?VW70$tSH%-@p<6+I|=4>}W^0S(s9yMhX#Hd1+Q;yUVDHiHCv0BeN`)lphFCLqo3zqxsLnJbHDsW4wr2Ckd1tm z+_PEvj?eYJN?p3D!t+;!n_2Z6vW(h=tYvvMg7X|QuhI-enR)d=DJw#a+fY`ro3lA4{FpM?cP>Iq9>BV$bhAH8+qdr6PhD>3 z<`UOCnnOLTnft)z7pqBFT;P`qhko*kGFeg1J`oY zIC!f0Wy|?|Xh-fhM0&_u>oeTbED(0Jzpc4~Q9P0w#zGd}C9J9$RwsUI-nUp9iwxF_ zPEUL=>?bSmm+J@Jqj%4)M5;+F%j=*d^zD`RwoHXGp@Qn9N9pQj8K6Tz%9q;QFA4>o zIxg{vYmMDUpGo@>R zh-pcw?o;cbMw_kVAb~iMms%>~9+pWag%A3-)KldUKKnNN!~ECM|CWA|CxInvn^(>5 z2;2$waKqrDy%HaIj$;`_+L*GeDA&!20Ls*dN$&Y%XK1@cu_*~|Xs;dd?b1>0P9w8$ zH!GV$Pr+vjU2w2BQ?K`~6HqMSF8|NH^uTh9W%ut_qVs`Sqr zR6r;h_VgqNm3H}QS~ftJH}s1eB5m1kT;i^g1^z)T0JL?Wc2lgN6``M~M@maclMj*o z%ii(L>--+v5>(9F#wO^1qef6@Pz7flTvIlAXB3J55Ac?t^3iJr^!ZjilJR>SVE*>D z+JqueL&mRN4+|Z<#&^`)rv7Bg6yL|RIOh#Brm!9AOW6u`S4aD2E!F%7ptP0@#ycu! zk8x%0N?p}WJ-(PVU{cp@0ti9#XSi6IZO9yS&C*xVObIRBX2kX0zq;ZG{}vQQj|WvW zjo?dGB1g>7gvOeMG1afH0p#5ZWr#?WYaG=r|uE~w{xnh_I-=b zu!&csOzu6(&Q{-X@6rxBjT^tq; z@ae5kLH9kjmBSQLL%8&r*%d@B=x83s%&Qcb;~^L#U!f;hJ5KKsXmkW_scC2y7kRi` zr7}Y645Bw8N4Nb42niB*qiZPw?wRzR(P@1{+SHIzhiC`E+vk0T_6}uv+_`*xQf>Z_r=#K8$nX40 z?b>FS35=JqFLyUeTPvxj`v(W;^W$eC+I&f6Li2WI6^{{f{kUVpIluEyfM`4syd-CGGyX~_BudRAp4SniO6|sJB!3bYo@&4 z%SqlT2P~0HaKl71{0}ah!BI>B&i*7_rh?g<4N=P$zn0-M*u{SMeDGetVX~+ps7bZk z6!aDtnhxn{8k6grCc3Th#4azM{1kPX%v=JI9~Ey>rRLc@|Gr=60hyNDle}mUF^H12c+B_igNMjI4i_ zzAyXXf8cUcouR^u@YeeOOEB_ZElMO1$uBfZ`c4K$j7**@84bt-U&Kg`eDahi3~we; z&7?H%DDFzh}BE^fLTjRf<=(vi>TeRuk|DxK4T}seiU(4!4h2pAcU5=2^ z1W{d0c+QV~XIhSDvrDAWG!rk@M3EY`3lEEDFXy;b5{3h|R$UHhadIIM(X5X3f_y|k zE-W^>wn8%qas&Y(A={nihFgD>T{YvqDmwMhcO|{(&tuLs>%!Sy{s?^JToHi~+x!e+3@xN}W1>@rkH{2Y=8XMm0)?5LPflQ+PnTm^ zifuJb>s4Atf9lIQtZZXG?yoC!k(Et(;jpERTM$`k=ub8i%BEg)|74k5Pb?WKL`M_EL(DdEQ!9COA_isAzsVuxw7S_Cf!OA8z;HE$pCsgbl(=pp4l3=yEc z%K6L*K|!|)8Tt!I#i1fedl#c%^ivQW%x(R{ntr4NS>{59Dg8$KqmEchy`Gio6_a$0 z8nG!{0vUCkz&l(|AT*CuDT84+anG8mX0f&e*(H&Zhy)>Jrk}bw_y(^bLg}?690xmh z9}}q*P^J^zLy#6;&Bvtqh@~l^T?*hHp;8-IA^Z!NNWAJsl4TTY{+w=JmKGVA5tj5d z?b?iAo&+<4pu{n?f}547`m^(O>;u3xKq))|tcaaO*$&b`kx6)ciQH_m8yVGd+r(6O zHzq60Y2rRFutwO*W=~^{;ncp5`Mw6Itu|~--o#~xEj=~seYlk)!xo-YX{HJ>i`2(_ z$A`GCEk~OUfz#Y^5TOKbiV)9hD&(Y5uOcZADWdFRV=0X>VNQj&`c6g4U=>m1*;m@R zKB`)(P-ZGcb!JzVtx@qrXQU#@R@%vt`La3bpk-vl6U38Wt4Ccjeh)qT3jloP+sEHu zETP++1Y6Mm(AO--_;`+_P{Q$@V*-gXS1w%k%X?cvgk^5@=o`h?#y@3$xlJ>29R8B8 zP7R&kq0c4u*Rd(go_xjRre`|V#xfID6-R&Lt!{zL5NWhcy8X2NINRIoX|_8Wsg+uF zzG1^w&hX{MT`rm;&9+$m9_}DkUpOZeei2jP_vq(-Za^a+IGTkH#A=l2l(w+%knB zp-lV8s2*9pjP!I#d;P@UQzU*2nu!vk(`pRDe0f+b&Y6D!(G1Od73|}aOCJR6n8iI# z!SPNWbTxMOj7-*?jr@BeWv~J*Q{1P_BJrvhH>C3!G+>ny+6v~Qy`7IZzh)N2< zuW4rW(Q#Sm!dq5a82k?&{c~EQ-=Y@6)fBb?$aAE&1eG}xP9EA~w26oIP=PofTe&Er z{MWBiP;CG3eRtXNfc(cxg1 z=YXy#1Aq)aAz#gb{?7ESJOUXT?k=C|4+tC-WuwuoTad@Kflcy!Nl7#S4i^p_SB!TK}-m@O@J-(tpDB=Un$csLee=E|7DTi?#hu@lMKYnu03uK zPY25GbsBN_$_%zOt6qj4K>7r`w?7Cs6Rk z1}2ESi!j?C>tYsQCF7zht&1Se;LH`Sg_!G1-g*irP^$2OtflU8#8l{~m~=uXM*@!| z!pEmdl19tvuo;8NXXU90{81QL>f3F8yyzmYOWj3KI8943RHeNsNL6LQG(bURq?CdP zZ8$~8*-|osL~Y$aawF=pT-P$BIzncMJaJ1u87Ff^^OQ@?!h68a!S9EjJ2>y98AEsd zINOM(r!{y1jLIHn6avgviF3ss%=4|f7RB-c%PchkBi&)B6FDFO%r`>s1_P5Yqq=UH zBUxop&GEk(Uxsmdod}f6fMwVTNB)S$l)uSAMUSS!0@)K3^on#dOBKU&Sc@;@tXa_8 zBXEvp!TdD>=&va|=k?84r87q(I3puO^Rn>ltzSBjlMg^h#gt$xd>sQNrFU5Dont0S z%7CFkRwC~55vOD_qiA1Y6ao$gV>EugG*&U5FYM$*UAW+d)Iz|x@}N${|LfPW`^8gh zXy){1NU`4!Aeg<`X*}V^L@$^as3bENp#VAM;RqiU(#fc?r&gBENTiB7Y0mZc{;D-o zG-e(we1%QX&|)g$1bFV7^!9@0a#{|-h%6*l{f@Aa?*Oms2?j!b>NSPnsG~SQ7IviR zajiY;K}>z~MH;kDr?y?pqaC8GZhbPMWcNWKCHzH&tUdK$l&v5t^*AU?KK8ic_BeiM zPC75|P02QfuXG-OK?McP=%}TlGGmiT?USn({YPZKxV@;jj;*AY2IVrsxP#)qfEZQ@ z&}S(V>)+S=yDx4;VA(hAlwI28Sp0au!}Fs#CIG)=1hI3)4Ed0JwXo!IBcBNi+xNAQ z-qeYSR(+L;BsE4;o)vwn`TcR?Qa2zV9u1mEBAxbZT;=zX%igCj-oboY9QB07EA@C# z2~e(va;?p0z-Kw>;!%PB)@(S}>Z2W|w$g4Fj)Z^Os zk`l<8*r!;KnPc2{1^{v&$K#YkzeCrSTk4*Rdlu%#2xhwPr{d33$kW3SPGmO#3yI<( zLVJ1UW?Giyzglg@0Y3v$=t9xMIv-}2RRf504p8C7PNZYB@ng~Y57Nj%hb5V;-P2@ZW++j zj;*KQD>}}`Z+`&=X)JcC3K__leoAbjf_$j2{*AvqsZhoB?HIx_kkGN@EUKGSG)2fD zKPVj4F)NBzsO3RLJc2q^K||I`A)u%}h6tG^u9oM`&1lP#>Fe^cYQk<*+e21VhtCfa z=t3j2#OeWZc*4$h;eKMmHe%sPb@L-re4dxo!!}spb$kGq?K#PM*Whd=% zsnQ`$_VB4!85%igGftLyL%*h?H5-UM)7KRM_KoHW7Oa;_SYePQ|Kq}G$uC)$R?E8V z$m-($&~irHPxQ=vl0-U~pOd@6i5IXI~Ys8iHgnxW_X{HQXYI%TGLnoo$%FhJNr zA4^3h4fw(pq#CRl-^8zQCD&N7a%ys_g?l?AQ63W$U1tFB{t^CVD&_tZ?Nc)YU`L6@ z({2m<=0B(Iks=tu@?M(t)iO!hoW2F)aqri}CN*{nTvB>vM-T%UapKSNTT)aoTr>DB zAAKfjsj_jpZPayy9j^Z6YZZce<{1W6whT1pMz(KD$!MICR%ZqR4m`zrq_Y2N+Pw4_ zd28@xMl_IwCOv;+*^5EAxbbn@j_6ESPVT7 z%%b=ZMa;-aj#ZY8uB`6qD@jg`60kD+HFq{P3%v||6ow{-4wirZBu=ANUZOy-5+rpn3mvs( z09RCqFg~+}6?Z-gUtZ0cEdxu(s=%g39y`9a^}qhr$PyAvAY>xWMwlfTQx!8gm61Mz z8PTisq(?X9Tz9V-i}{KK;b}?mq3-+)y*eGa8I^Cn*F{M#)-75lM|U`TT`TTWdn>@6 z(6M=PTFjWTwK(p;WR`@jNf`qR<$GjxT7ilvAqgY0D&~r5-ab*}?4it67fXfvXM+@P z{dN)S=eN>RIZiz>NuP4SC#)2eX_;uUlQLRIs!PPysCcBplWF^idrZtvNop1&c1$i% z_Su0%b0Bz%Ma^p~{v=7FEuT1{y#Odb`6##7wj6>+sLpNKl$&RW^E{bXO2^kW} z$f%q;zs_fJ$FwqmQ3dQG!K6Ws&i9@}h@yl8A&^qVNLEl}B$$B^6%0;CNdb`1a}rdK z4eO7KkkdzDmdFFJ!;Ue^>7t17tLN*jBd2orWH4D#6}>8rm?`im9QnD+DWkI}=BM!; z%SR!bSCcBBIib8br-rmif=q@<-b9x?MC3WY|%#JzL?DK>{JM#bK0M2YY)+f=>~`53~OH%}l|G$!V^ zc-X$Je*u)XPqe0hFDUg~DEGO2Zw_N9zDm$Eg5)ZKusNyTzmOYHfjkbrkHTS}_AtDfzZk7pf220as>NNJ@*KrpqPT`#r%4T|r)JTjm_vBnLDeiC> zX>D|V;xK-*m*BqW=v4s{M)N!ln89J8SG#16+(*Tb%QvSpZQ~=c`#+1(CP2l8l5#IN zj%QtZX53)l#5Sfug($&4%h7v!;nu{WY%Ke+Mp=T26B}xu+xW_lRH=xxm9@Db#7PYZ zWgur@O&T_2`A%!!JaVF#)zQD16+(piO|6B99!YePOkm*y8Ho8pMd0^u<|EJ5@jUQFBOkdKF>4Y(Y7&V9;ju(A$`fE5azL zeIs5=ngV8j32bW;hA5J3!68xb0gC%Y?vtZiA1pF zX|sIS3<;-^xOIx-!kbaDnvid?CcGz_bd*vFgz6Klr`lcOX?i@q65rO-=PG82b+8Z& z?)JRLYhIIqlOsj9&k*8Oo}uRIVo;V8+hcG+WI+39HY80}8pznHI8>i%${{Vx%A)a| zd$lfcU0+a#cq;hyMxsANX+(xjD8%p!rsm+RW!c-j5pyN2RSQM}XK8UDtek!{xy$@I z`JE=2O+QJgL60&A+N1mI{U%PsV28fv_v{`$fB>kt9Fv@MAZWB{LYifpH-6%w=FfZD z6_XBt7=_RSk(HPe#cmn%r{uwgu5?ZW{ZjezKun3ejRx$`DoW%?C<4V_2`C6kut4MF z6D6^udI$BT1cjf@uH#4EXd*SJL58|<>`rrN;xFmq96Yh`!VljNiAEU+vq+X7^c@o7 zft-Mot9+GH0!nBYFI%aohdM*7O5x&2P96lWiTLrOdznSZzdK80MLK6pqr_M>FnqIT zNDLMb-$f?HBtQm4Dk~Do6|2k>y*>=5GfmUU*o8>&A>|MsH_=#N73~VLX-JLp8$J0|lI#7ey5^X$tkPXn|D~}z z*^_~bMcKqnU;vIUO6<~u)S5ntj`>W%80TF6P$D@zQvd21ulFS+GgBet5MiLD8#$wG zc-nKJor*4=`g6+7Wl%+T?&7mv(_0g2o6LDh8$I*3=!Azj0oZZ+9z0t>KK70w(yF3( zxEKeziWv?xn|!m&gl4nbs=6Nd4u6A3k)Q2eB|xxdrVAUyQFH)~0lF~i+X`RcqSRUG zV9bZgAy;-q0vyAE%OyO~%*7lym`jHVtR4cl0{D)y>_r_vwmSeKn2c6y7W^!RaRxFy zX1|3t1(2{UPu~&_6;`}UWAE_X+rpn%-QZ{W3(&g$3+VI_-IukpU5Ow8nrJ3W6*Ygc zE-qGMUjUm#@XaVtam?_=eV&j178%KyZES~wyumf5mO)=82VnitPEP+twrmIj3dTs{ zxq7vMAt5ry95ym|RQa-Ad0E~)5)s9p6OZ-;j!Yz}2M;oU0Q zC1$0Oc{0&s+6(|Dj8Lo8T!&vQ4p_AQDj(6E(mi7LRS;CX_XlZtnK2ZdzA0ns@!t&W z#Rp){EYcv8*6A`7!PQvVOGO{%{vnqOH6}DVV@e6CL*k z`2_X)xcYmux}9-x@t@R87UsiwQ*hRr6&k~=6DwqM+~Yd_ z;gX4FZ({kXIrB&c$HrJ0WZO4y}I+7tkv{Ik3(JVg18o3_>4&VNT%!VT~fwmH_6*IW!>z~4x z-#L}cxh!+zPPQ)B+Wu=&PN*uHSbVZyN3Q-?oUnqQ(m-GhMQvStbZc6X7xR@Bgn{@j zd@3Vy2Gd;?0PzT;sYf;5Gflj|J3v+@qZUL0;6i*)Si^xR3@#G8)t*TjOtG0BjGlNu zK%8UM15TnR2pjQ7vOmFfU-f=XyuRFr#4|GT#o4exPR4bR92T{Agl5hJW=WF-m(d>5 zJ%zj$r*b##WSvRCn3Far8M~N5tXLL5DHUg18i|9Seo$4V>a!Xh#Hj#v7Hz=UT!NSs zoZx~_sf;$_o_Nj1=^3%4v#C5=8(`JQ*H2`^g-vRr%9R27lMJcKe6}7`9T8N>qg-l0 z(w-P&8Sv8c`*6|86{&Ph?tiAMw&m=TKK#B&XDRQvX-Q~QJQ8R2NBLnAuxsyjS<4BE zoq#Ni^dxszGfrjqkdgf{6`+|?)?-N<&Gkw&DE0guu>=4C;D%an`^b6lZ!Vpw%$NumbBn!2QafHZ{b$U92oPlGM#ZYOQM@#<#@{?LleX>@+p%KvNcGyYHDSUs&u7HWdwuAJM9ZU&+ zuel+bVpf$(0oUX2YL6NMEB~sD5?rKiC8AD&@$$s2TyLbfiop$&?6G4PQBX}a z|8|RspJaCt$m8&)3KwyI6F}4XjVfiLsEc;$_eks2Qokk%AOJfoaGbR_p#yF?y%MRRf(!AcnScte!Q0@ z`=%Yg%k6O((;h*gAD$Wdz~x{3cCvTLcADA2JnB2a%Gx)2hJTn@@@$8=eqsadI_?N& z95a@I+DT?85ZQbb8mCVZ$b|GN#iV;;A23cRjZtM}7zlbUdON~-zUf_8_=<;RRRUkR z$6qb`;YPG+M)0YDoT~6Fg2vc~&FQD8k^G(AJPm%xF^v%*6I+KYn^U7Sb9PHcfWK9P z(7ABE6mckrN!q`mt6yH!4oF6~IEfLgzhlw^u zIK&FuXa-zPL=oa=hCe3o>B}J~=NwU1bZm8k;X?-)gJXe9aUj&i`osOg8+1&4TT-?+ z2Uk_CubD>Wd)2Rf5?>^nP-IbjwBAB`0$q7%Fw=!1#*7`|3N7#PVtQ zR+d|^B)`E@X^V(w72Vhv#~_iZuSs4^Wi3z7G-~u*R>v!~wfX^w*FwT`pct&A@6L4Q z(VHcaB^mgR6n;L8-8)=S%0=Tyw>`wS^R_}r3olkGkx;>kr>$NXFj&lDCBYV=`P-%2 zSZLQP0`!3gq=#xPz<|ULP?}K6W(3R(m!D_-x$Dy=u(S5bJma=AJYqp+2H6^G<;yQr z|5n)M?$IOS8d92p5FvwEhK-qaI7^#zQe){EbT5b>v7hWFKp5~hQ0zScD)0ydKi-q% zTd8HYJ{Hq{07*(IKwUXTX_`B@;(fv=fl&`}zV6pj)6j)ra??g?{;DKXYmDVVl-DpO zv2oRb?z8U}S_OLb8}_jP{dUobI)TudUT_qbO$3 zQGxV4Ah^3~2L0q{WXzd%-mWD8xiaC|-6Uoe{5g_?nLXHtelM=Y|2rDCT zAT$CLnV0E>9TCEoXPq*;vfOYn>T+d_JIH5bY^;C1mI#T|@FW0Q;q|g*)L4czTV|0s zj4>nt_D7;{MF{|4YY|BgA*vYd3ujpUpl;5kJi)tG`m3dokd1WJZv+6oN`5Q zYqf885z&q>RZ*;;pdkY(9}b%J&fB2(2Q9aK6=ed+aUo4b1s-YY zY}1IN6_3;N%9byu(wC3;s3l^e7rb;V!-AP`uhUS{mEEfmahBV^fNU3~>|r#tWq7dS zB7e(+%oD$vWK!phh~+Jd6y5LOhnwep+Gl+s-c`qy-Qd>QPRl6jpBhYu@O*tub*Q{+ zaiw+In=o+)alBWtG0STMmfWK3!I89qe*wR->kobwj0ouq6_zCpPzAoNJ@eWVqJA(e zSy^~|SB@WYwYS+|NCB|DX8Z9MAb!xh^zmRm_})IK%C5i@-tQDEWcKZd_xtIRI4OL; z3KlRb`eI23+j9fKG|OO5#X$;BHN{iunmd^1p;0x`cZNEnZ7^$hb9M!=F3{ zo_Uhz{U1*We=fz{6$DZZOys*>9~?g14Su4T8%TgvGKw>v-afwBKfQepUV~9CbOuX( zKd|_Eskzs`HeNEh z_Gb3v2sYP5c^#;IlAYLDm2&{y%n)BOeft!C3|0irzM^tubHizIa$=C(56Vt3@VVUBA3+2WqjMtdW{tpXFoJJ=w%w>Sr^TS%#es zE93fHL?%7A_%;;=;%BF74|L8KJYA^>-L1{D&6Ba^?Cw`S*dO`9?jOF7dB@95(^-7* zsP>8HbruRLd=7$x$M{9gr?*d|RpR5iTVBuTzFVnG7F~)*-LV*OJMFKc__^ikRwJ$G zUT_LXFY27jKWYS`GO&40o&9X|Y4STSuYYn4bJO0Qn}Id?n73O#+!j^Ygg$TS zLSbvR-x^?fQjgvD+vDGjuTBIh;K6rN8VsuyK?7@YKp!E(y9TA(W9CuhKTI8UB=C@@ z7sEAC-tSz0E|0EzEF+#Mas%!t(v<72l3`+K-DN3Z9p!BG&d~W}<;MP(*}|XQqsXBe z?3P7N^;^LR)#K1+lL#KJHrP^C)R&B=k}fLI$5UsCDpmcYH6074N&wrR=it7&!bal| z`{1*h$kl@%R|+{v9qL{`GTM^nB-H=>>A$1-Xfp1c#n#C#<#qGNwqapL@YHYGP3g1? zcy|-3!S!@^2c}r?OHb8obmGuRAq6mTbi&YjR$RqAByQ@}GRM!~M61^fX__OAPl?>t6~*&Gu$=HCU6^j=vqRkG&=w|hwEPSeX0 zJuF|S1qA*chtBr{J!t};JT&JA%;`4J3>|GmI}d}zTEcjP?mgz%ui)2bCLA6oJ3n^z ztw&Q#wtQjGB=SWawbgyrqdXS3Dk3$ChONN#F2=6p%40cI=_?VK#~*ZKlVoc6#tQ@b z@y*I8Z|CHRBxfOfIH)LjC-{F`!Gk}~2F1a85$C&v&3s}-|F7x9gEzaJgoaCM1`VBF z)ThDI-PxZ%H|ZJEERHevog2<*oE!3esZK|8YmgV>N_Sn_Ark&aEGD?Ke{hm|Je@gA zh#$<4MEa(ZTt`{(2dkvh7Mkz~DjeGDN4)5>doL#LXZtt@-5F8{lMIVXz7(ZKr|Z|G z+l19e9$q~Vu1fOLh31>VJZ7o3FR%wxvVQ4K-Zj>+s_r0c2)-7e7|l#e4TwVfMa+Ee z>KzTCQ+NFO*?Z&9b4+W{o9iD#qP5S-g#_>aNc0DvWiM26*$2wLSR=)1!?An}!lT~VyELN{WUvJB&{ ze*LbIqxCSuxe(Eh82QHedAV`h9Hvkr7LLu?O_*q9poBv;{2G4P<|;ow z=dk^?DvIWkx@)K0wMZ)8j)$e0>C60Dn5xIttViSBFG*dWcq^f|Vt;18VT9H}7TPx# z?M;4qy5+xfxpba8f(X0yIg|OU_ElZRzvZ`d+H6f}gf!3G7@aRl6VfrN2!(duo;?F- zR6U-HT)(=JXBQO~xulysB5sj7uk>l-x10r?ur&(QrM&W}?GC(t2pSQdJln1dX0xoY zAG`?&bv{G0MepQ)e(JL@U3(5rG&XE9Dk`FJ?SY*(6=(?eZ64apK3)H^8P98yE(%sN ze)_OoA;vL@mF*)M>4ufKcE^TfVutu5rhRZ!%Ya?N?=guP9r z8!}awbGeD4Kwja@JHl~-yvDndt-I(^ri50i?kES=zK%Ir1^q~w(lA;vp>C}>6CuK~ zQyNs4Wt+k~V%gU_JCKntA-;+h{*HFkXP_UyIs65+ILyhw+{+TubH3{@C6~G zmbHa^m7k(VQ6EpALp(<5`YpGf(#fzKw=AVXoSB0>e4tnSZvqFt{YnOQ-Vdl-@zK~& zhU>mRCcYb{;6ZcEl{Xbap@;dTtXg(T=T5@mqfI=a!S#wQOHD9@e(6Zjz`p*3$&)Lg z?YjhyZf1<b5xJcy%hRCLbb1&Ze%I$~>Hi|xbyBZ5 zo#OcNU#bc#d_J3?y?=S?_tpRNbk(@QLWKx(VR1e#u6OCK-|7wo#78?MO$ZN77~%Z*5f_05c^3ZHK*TAx;#xrs+khIGLAd_|zl zi!+O5y2Az&j|Kwt*@1K+@aPF|UmF~&Z9!2UT*LGhk zEgN)^$iZq6i?3@fUw0K!nmRk6Wy=sOrg9n>nji-1J~7IDk;9J^(?|an@&0r{H;`A>}KJFH8RayBRKGS%t1*dQGJut2Ihj?n%zc!KzL1sR|>s1t* zAF-Wq+>spUGm=^yuVlaf3y|cjeArbGX5q@!ksFo{u7DL`*KT-1JULerQOIRque{dNAR3K}w z!z2(exd2O2(|jEc5x zcFqMJ(glZw^wY{8g&5Ji^Af`UtM)vdPQ23eUdGFzcBH(NjQyXmBVe?d^=)0 z=w@J-00j0INfzhqj}MqA*I)d$<(z2V29Y4DivS zc=*_8`dn8A@Yd+(Brjb%7_DAkyj9@g~ z-pMHLmtjl~yO!()-*9RFBK(_Zxn5#4V+K}CF{8N#G1W9^rL*f`eN$~&39lN>E}3*u z2Ep@m+ar%DcX`R6YPTSznxZPxR8Mk-AWWz|BS>9{Y_7r@7fE9HaL|phj7UCPtAEmW z;&joLv(aJx$!$&FM&GSgsVfLl3FKq_Nx)SGUSH5kpH-Mm2S%pl4pl6$uP~B-5Y-mX zMpm{OR7*hBi`@83V7eELIX!}JWMLR_9H9_l_eM>PbAe_bNvhfeH(z6q|IOGnDyI$B z@fPzaQ+AT?ZRlk@{;YJ-`1|#ees3B$MeEK|`NjB}D8}pyzw7{S(cR;*MB*7|g7AI> zkJ1G8&L&jjzSq($eLCfQVDo>`E@&0N1N;}aoQrCP9YB}fW2~Pd;5lMTyH{4|{|k`v zML?fT1dLCU?6IZY>74uAmsW+bvio(*i}skIG^KRSSR*&W`JKRI5cy_>!z9nc)DDB>10O9#q`HyNB-=eKw)~ciN(5o4 zu#+WMcAwW$e&^NJ@&h8Xv;P9~v@ZDbE?uzAY(EW##AAU}CD-eefe!Y(#v-X8%Awv< z{pAyB?Gxut=+mgAB<8`6blHqWFXV2yIsHoNwL}Y+?Y=>X2=TI*&iH$Cqe&5F{$QD^ z-_hL4g6F1<;ypX*loj8hUB5-T56oP`sKcZza?Y|W{M4S#5^PIC8w?RV3Xh=2z?^_( zEy50QNKyE5l=-^yuAeE(XA|mwO4#!cFX;AV{Teos&9sOw8t@2Puv1qzt0PAx-VQa2 zm=8MdK3Iu68{XuX%ACK3yRw=VYpy!&9yFXLr$k30;b*%^-JR8ggf-W`IB+bx>$R}< z-EkiA?=hmo9b${)PD8g{k=1g0mg(%bUGjNyaK@x)Ot7pdr3=3B5rHrDeH;EE%2F7) z&fGU8U%XwEvNLDuN-E*gy0zg=VO2LY;9<5^eoM55dOJ~+%V%M`H;Tr<_(qfAUSS{-> zGR{=8=tTv{E)c$N5y1S23{+u3V=1kVq+%vxVGP$&&ZJ0NWY)LlD8nV4D*oBaokr+k zQcN_;08!%3DOIub0RbWwlL_>&_*&k#ArXOVttohp&~iRuwbt;JQ{c)Yrwz(8l(@!PkguU2C;;n``~M8t4v2Xzom@P%r0Td z=c2uqBLA^Go#D8(u=}g40ZlYcs)U{V+m}{s;peygML+%7O;Q|APsY9;V@tXz!j{hb zOYX%yIKw1G&cihSeLMhccQnsaonboPM#aa3(eOY6%mC5|vi{ghn)C zxdp0$=wyUQ(D*!qGo5CmEBH|2K<*o4ZFT50OmBVe_P z_?kC9TG1J4O`ko0lxIjTav=8vOymfa1YkT860-}aj>&+6LRfY*x)5Xez3>DPrVVH; zr?`cYHAcWlfc`2j+A;3Fj>I?moXFVpf?V`Iyp14G#Y9wF3mCs8^D90LA})r<#*bwT z1o43gCg{v;YxG`{@Y|ynMgM53-0U+gO|kANB`RAyp-(8KO+;p~XbX|pvhKFWrRmGk z>tv~=%9@SN6l;8X7e%YIOro0fbW%mHiJgE<)m&l&!L24!^=ghB3{M9^UMZ5of@o=) zFIYxk7*gZVU^pV8AD`f3NKizwCi^f6bT0aTf;kxe)3?8yEgJ)t>KrEGlK}m4em;G2 zH+sF&vSzVTA7vU`_r-hQoculf2`+Ysatcib))WLo7cW8CBrpt3?ywzQqXCn;-#32& zHEC|zV_(5@@MLc^c2;CcHoLEkLhC0yS$_eLx9`7V1tR2Ee0cs0&~~cqXeCt%J&g}@ z%lvSdpPq8exEbYMyMIAcfQ>RxSO7H5@O4V7#*y;(?(Y ze~KWz_osQq2Gk!l#L2EnrCo>Yw!25V=&=O(NPj&0I#m+9QGU<=tQD0pCW{aQ!UHKq zx}vh88laV;a&0hI>&fsr0{3MiI6atulws!BbJLSdDI0Ma0m`6}8fhjYxVX41B`&&v zD_(8Z)(C0$PspE;CQqrN@KS4uhThTh(IDhB-N7VC7%1$zbf2QMY(D~`y|f{EUrF-| z@hH(ez~a0pEQ!*1BcUZ9?_|ju)P4~-9Qu9oq3=dZKGf2RWX&jPW=+FvZ)8DM0 zWI%~2_Wi?LKVc=iySO1E&&7A8l+J{dnHH@AOe7$&1`*`=&dLAaQr4CeL2wE6j z>`-;cPzhqy`0-K5(q`mhf8}OEPQ+C~!|kXBWLQ}|?3^6yEGmGSXtbYeofDFH0-9V} zEF;fX*(^){IG|BOJGe~$0{*R6`9azLa^HC!mxW603t55tujGYY5zrr|u51 zl@z}mu^HVlVoMpfkbqM935|^SoJ$5k{Zbe-Ek$aUTz!9b?fdRHo*>Ozv~9C-GmKoM z6LKwIUhw_a_{l2P@G3Ax)N|G1_Zk{jW3*p)eG!$aLV<+>KfPdZwto*r(k9GAPM{45b;U3j; zVGO+Ovdh-zJNH+@?MW76nqRo%Ul~UlJGCNIOp3$YWk}SK0XTk!llm7&V$k=L70XT@ zgH_UIK;=Eik>rcAKrKg1RMd;ESR<+xfWnb_KLaAvaL^~6u#qwFGnHAH?65cqu&jv8 z-ywy(^1vIShoyg4v0?ZsAaBP)fr-ML)`EgVXs#m^9sa9j7m1wc*SaevmlH(%9V0ce z>S{4A5xqnmKFdf1Qbk5=pP?vY%iQTfmer<>8wMt8{j26LC9k+Uhy+|`5;LOTP?))? zCbN433yIpvZPGJP)+6r}kQ6MSZ7b4VZd*VEDY1Gb$^xe17PT%TtCvfQU>+>M zcO1l!QO<}4{2?iLWkykhN%9KSijm85N+E8=<1J&*w|=92BvqQ%yt@d{&mOuV>o-8Y z@q8`oI&WEY_rIKwQyh}qRR=q+m_sr98XElP-;cG^^AnT697N4#$@IV6kJx8l`k2c! z3+|qRZvQJR?&f0%tVH{GG<+snv=(4C#lN}jbf!a$m^|0tuECs@(=_~ZE)eX3+2 z&Bs-@CN2`mP}mQy2L1CaduPaRy{FzUzlP<$-W^N1o@b^Mi613i@{C}wE%l1`n)#fX zJOrKhXO)KyK)*kT3A*Kb&2aLc&kM!>^RX&@$!zJgYxIjo??oL!pkLuOw#oOZLP`IZ z%c#;j9#-SE&vj!B0mmUn=cj2I_IUUlng7gpRE@Hg>v_TAeW1>?l9q!OMJ|PIjovqF zu+z8IDP|7P8^Y@oT`{bYyzBmV4}MswYR@-kJ4KI>&yqSk(D`84xX-KFyQ~n1*yrR* z;b|B&G`-J{R_g9z-6K`p%-#3LrKa*eqq|uTB{KxkqbD=8nx7Rf)G*ffkP<{SfiqIm zaGLR3QzNJnb_P5C3#j1T8Mpz{^-fTCIuLG``~~D}ozI_2-G9LI)4}Kr3Gu@We3o(x zt=9lIUAV8jX`ye?HWaf4cxkyc_1Be<$){~fvIn_uR)0#-wt{}`%_Dlda{Y}j?z@^s z016WxMT;ChksXl&YV=@fw5h^|!C~r92DXqXs!jg^)y1CD?yy1+-|`BgYAMNv&@-#?zXFefLBsSQPKMMWf zbmMm;PMI;`vnjFKzZp<9*yXEPt6P=Yki1T6zf`wd4NI6e26Idegz)6XU<)Gb=pt{} z$3Z>>M4(xHhGCj-MuMln>BR`BvQ_FUB(re!v8D+Z@Qn6b{5Yau)g_k7taYtJeg>ml zg;-aj4rChu)vh{;w-O^+e)u0FcU0Wytcq@6#@3pa(l91aV3vgdn+2U760ISJFoMtd zx&V`7H&;*Z9{s7w+v1a+r!jJQwAN(Y;6Qi^8<>50F+unEmkRoq1R^y?fRE|5PS{yI zqDoHSXnK0G{SSayN!-6Y+FbQF{#P=ua+$)QYm{tq=C38)PWBL0LYRLGXPRW!SbuQ7 z(ifIbo3Bmd`|0Wx5XWI>@zj%aTegU!G8i-r6S%{xc}^zf*0Li!AlKO*m~c9RZuC2Q z28RR=w;|w61;S_pq4U7Jm-+*pLoyzQeUwg%Ag*^)1DRj^su`jE9|j67%xnS;iFNMi z@NyTIZM#)vdFqgR&X)*SDM+FT#wZ#}&*iWy(5?l3hTdynW#oKhZi z-d)cr-(5qKgUl2o@!E!jj-LkFDt+b{9M=$CtNNAmV|c2Cg-A7G z{%H;*4E27{KylU|y4jI~9Awjgl5WOU_zY=#$6kQsv0-q(xpod$P&<-Hu-eg_++^B|9Zsv1=tC zO(hMRLZ--@=8MePsQfY{bwSu#*g340;ogXbX#si~WP@Z8_xw*I?1KdA&0605S^Q}u z_o)og@;Dfg0&2vldQYS>0uBc=t=&!lQdY~fRCFRT;rHRV0E@=G=5G}`J@Jf~bCJX7 zyl@~oh=^TPm?4$J@?!|$zP$b?32)3z1weAhvgkL*k)%{|b2XRB(%MlCDsUZ(V|>M! zBDfkA$@3eSF^!&CW)AID`Z_7aoox?_0N^4>Av*azwCy7aLb zPdK{C(&s6GBFanOn+(^B5dtZL8L9IB0+?{Pkaee`(aF%oDp9Gp+OfKZLCo11WD=K?bOfkn;=!(&)t0VGD8w$5)~X1f&2vj^Y?b9NCUiR--L827nm> z9>cx|3*7@Ok~737DcQ#Q^frBM`4mILiZ0R8ack?2jRax3{vuH$x~BNL2*2*1gIDUb z18mdJS5@Wr)ox_QlfavE*y)|tli%ZhCj2a2yD{h~B^Km&0)tZYHRZu7mHECOxjc?f zTu?OEMHDNBM-cm$E3=q)=GuOBm|!;%V2q$&`e94DDi$JjX)^y8psGVg3wYOY{UP-= zU<3Pe$h)xe2)Nj%$aQ<}NYrL796dc@lWg61H|5`3*C!}pOsPAreZ|Aw?;P?t{@0Z`Ql4Y&g22t8WFR4meLZ13 zeDR4hY7vYx4ODu?W|PA}<#%PoMMB0oI5yp0%i(;fYzZ)XS(gb*R7ekT&ix>*b1ISk zfARFzZ%se`_x~6JM{lFkF}fRRH*$2RNSB1P(u^KGI;5pR8U&@gLrO77MMR}b(C25b z_xHNKf5Cp(r59LEcIXZ1Z6h+5PuyZ9*wMD z)^GYN_b<0Usg5kaYw(YD_~E@jw?*_|E^A`W|6MCoNc{ZwpLMnVR$HaO2>>l+dd=CL z34W$Zwf9rw!g}4;2wSCRN=FsJ8U9i|Fbn z#Lnaxt$2saW{k}cQPP?~)ofVBPBTtgnNpd(7O6+kI88G~3sCJC;iI ziR`8M5i3qmgh?$ z4U~bztV9zxcT)7w-AA5y-vpmAMzkh@q8vz6Xm~7FO9!3hhL+G7Tp{}p;Eu72VYKua zS#uW_^98blnAWPi=F<6nYH30kMnNVJx0iA}6DWdAD>{32z7iGi1nec@qQ$g~fhIT} zAJ~zg>0z;|Fu=v0yUnSUm}Mc#*D`j;RpV3*!MJiAf{?nZljoc*(?;(&HDv##qY3iZ z(qrvG(O?<^b~}8;Ex_IoTN&-c_spJD7Q)VNRA*G5RKL--z}p{Rx%c+0{@Y!w)nMg2 z8ht8>raK${*>-X7@VCt2yg|mfN^v&LyD?CnN8C=VQav)5?J>5Zt7~(`*SGsrDfJ7> z)&IY7jCsCwGcMSkY1m{lu)aCtPSqvYu>L;; z&ftj>`PL&2LMJya&KTONh=7_XZOKT({7LpALQe4TU2ta<=ITEHGkv0v$6%mu$jn+# zEI%w>A^tggK69p}hzKo8z5azW5l64^H-U*D@Oibb@lUUlXJqy?79i}Umw!}rI^hXm z!|w6*XDR%O=FNH*c4KEsqcs{kNhm>kODK`TPHRUB=;1|=F+5%a(rA4rzM&YSoDhpf z`O<*;?8XI7-?gmha!QyHO{|WbBD@G^{@H&ck=-4rM)1NFxWwE%-ajhb?wV9`k>V`z z(I=+$ayM5xwm$ct0o;@Tg-$;&k0k#34-nq4I>&ThG328nx)bU$G zM3M*V?%D3yg2k2P?NKLnQynp4?C2qhoPVgP4ynxCw3D|FBZz{(+#_p4imd{ zT%(+`0rmc|_Mb=WvZHnW_{zCk55Z+b<2eJ1fkC1qNM(VtiO0+g54xvh{+KkyT6pu4 z0qAfXz#%z+*|q~itoEw7mW3x$i~6Hk+*@T}ifFl~1@`*u@W|cUp)F@V6r&~;Ns{>L z_Pn$H4mojzG-#RhPFGOnUEZL8V`karB?jw~v=NpqMy%z8s3b4r&|vx6$kR&LFTLb7 zz7ar*GR3GzWdfRsh3c0DYxTHlKQW9@%R-UPNibT*uxt{fqlJPlhiVnlfsSYj6isS? z002pX)G-5}bP`h4=ZqGW-CFT@*#T`sE)_ppV_Uw8>N^mPTC$xQyB7x2tDn-~P?W7rhd^y6e|jLCTMz-v21y+thM= zyl(L-iPXU|?JZ;4*;is-^yXs0pPO}$W3^n#iQZd9-Omw!i?Z?Z)Wy~5d$ur!wwZbE z)bNFgO&Zqgu}A*{gZ_o>&a0iE7-`hVj+UzES>TM3d_n1RdmT1euvn_Oy?oBUE zR+IZZ6VblvOG?Qa&PtQ|I#XIxXP*~D)pE&ZdTog5Iv%o+_uZ;?E@BR!ENzwEmwmqZ z^Wp4+KdQ`s8T&X#B#59*^Rtw$)*+4z5@dK%`Y`e#@!n^PRr`+N5@J=m5&AFx0p=lV zjyw8MoJ|kRX}qTugC<^A{)=o>Uypb$u{`}pZGmBW=!;(KKz9zkg2U)VKF{^x;jdos zM@fnEo>A5>%5JH*3&r91pZ=fNr1#)p{pNJy<(z|7pYV2Cx~c5`s~s8os=uVSe{}Pc zyx;aXl?1Ro@5aPkFL5;%erXusC3wXu+FeqfLTM3V!V{*B#z$sE8< z7zO#kibc_c$2LvcJlJCW`8>_G#l0G(;ba&y$+!0~++^3hg?`w-mB>?ZuGyz6Kif1( z1yvl9#`MI;so8gGnehwH=ps-(@GCri23xyFkg5FQL8M=94D|mV zzr2U(IT$goM`y2sJ^Jv<(^}-dcLe_7Qg_S_x%>B9;r|#;otrl|`pr>g7txjUre?f` zU%)y_a*yf4M4!{$7fD8`TIWyj8;|5`$F{MbmOOlYeSY#=nI!e>zjrB-()<-$IsOd{#sno2IjZeUi`qI5>&SM< zO8bUI^~|Q%?1sS5KIK8CfFDE|7#3pGQtWCvv8-bBvV0j~*dNs1#jEcx4@VS|nmnD- z!vGHV`0rERPKQ%X#8rO}^*EY#qGQ}rAqdYDp(5pd*+)*$d+aWb@IQ1rSISCl`!zA4 zVc37Bc>f`Q(b6{3%!T*cV_%u9KGy#Jh<#{^wa3>iv5Py$w%2Qv9*?b+@7B-0NUC{* z#P+3rEn{D?*nhi%-YA80DEtpmJ-gZefOnhE_WVzVA9)pAdNeGqiAQr6 zfvLx+Hm-!6y_*z`)1#yr2xn(ToE?mcUPw;Hqd}sW@8}A3e;j8yb}AZ_1b5KP1>_Iv zt6P;0vP1Jcsi&6x@8QrLL4N`55|0}t)orp>TFbu>F7sDjZu#6&iGIAjZYh4Ko zR5^+l>!$hy$$Z!}kFp2KfX9UjIT?Di6Q7ZDy^#<%fTyru*FwD6p3syFR?dg@R#c^@ zo(O+nZt&WUcuHsll{ltFOt#Sm3b&66433 z-?9@Gr!MqdU-`m1nkTl}$D6W$*+QlQ$L3xU9NV@1@&49+~L4B2onXey9U!Ehp`+Q|lt3W`?fV z(>Q%9j_S{*Ms~_zA-iW=_Xddx67SK{z=SxlahiKRck1`HwqV3bPiHXuLW#u0SlX#6 zJ#`||%=#Q-4*{x#tA`JTuQ|50gJjuWr1yHfd{EoY_RgNKuyxwv-ZVQI3`1*FcFccE zoL+pi{Ib`kxcB#;K-~psP>X_b*nOF?93O6A??1eAa21=nqv^}CuyE7svhzo{;qkGG zpmyXt+v6|S)SZMYO;2vO>=pOZBcFcUeQ>H2wl&jt>pOO}{OgNyOKyeQ;Yhb4j|PL= zk44U*rq3a?;Z9{Tr%?y?!)8+p0Y%As&~hr-X_UAd2|FXd)3_K{8G^q+2h6!O>+FFL zUG23Z60M9u)R@Tm87A9vx-!oGHc%GFd_+X$aK=ufpTd-*xHI*J)w%;JabdrKKN57H zBzXl!;QS<~7o}BfMk1p!M!?pJCo5?deBy0O_8cI#;Z;R=n69D6R)=W+TtGq_pq@Qc z@%Y$G zogB2;*|L^aPVAM#c2RR+M@Up^9wi-gg!7m>HLk!lx|m}_Ird#QI~3q~5Ur?P%Lf?= zb7SJ(LmGa{ptEA2*#IS?+XLOOvVLFwV;I2u=vx%Rw4LvnrS+J_u=d zH2l%t#-J_`6Wk{Dq>Aj^fV4{DH<%0*89i*}wi^|f;r6VDWH zc)%XF#a8)?{;ZxArNK$$nAW_J`Zt0?xOE>k`@}%2Hf1cdWMSkln&4_yGzvN|=Z4sz z?y8q5ojuN)RqFL_p0gJL9H>muh$(ApI7bBHHCTC-0-j(K5yF z&5PDW7h6_@MGr<-6go!Ta3T2nGhV@v$E+k!g1r~GB$#r@k;s*jNoUbhzV|}*4b0f52GmB2No_aO?Cf99iqMmRjNaWIKT!hvSQTl@De1OXYG*Nqq zWoFL9@ZIyY-|zp-F1%()X1!Mu81Vgm$YBygyu;1gUmqEXAB5Ik4bD!8eVh1LlkHf0 z5!M;eiuaQozumH)IG2{D13oIogpkU6GY3R9@i==lj4b7kJ1EMZ@Cm<}ZXEOG(jqxp z4>XnfWvH6m^33E7AeEut+{BSA@2Es%Ou_z1=G5?3(nm&>FY9%m#4*{ldPdz?J6fXJ z3_o^9naOI!u z^a|Q=E9ddEM^!}GkC8=DkKqt7DKm1?m>qSW-(0SSgM!PU%2U?|Ae+78;6eiEZ6K&r zSD`17C$*0Wwn!kCGWTMyp$sJZS^N^ROqVgM_8AftCD-*eYecygU7zFx|(|LHm-_w=Y`HaN+%lIspShM zB*Ya+L^2oF(j}{>DHK?h`d=%$OJGXW@O<3(3fcKlQslnR-P!Zoebx2-Q(#5J=EHs# z>)x<`hyI!Fj?4cpe$~+R9NkSU_qvT`nFuy_z4=nCo-1blukX*z9*p^Ld4CyidhZl_ zT;D9Wejbaq5#L1bT-*&L7DVb^CpXF)A8$@pU?0e^}f$Qx8}Wp|5{^S zq$>uexSd5?_9lLM8s53U_PG^B`0H-|t$Lr>^1N!>`MR2`tKPs11H;V^>^=ScpYqFl zO~1U+2|PSpuTf!J#c?@r{QdXnPO5a6c9>&MsrXsWRQ;Gt3 z!rxAi|CPTEyK$Wt`*^n5C!f}0heLR8ytq-a$k=C_TTaS*vL4A{Nu}{&@&WxiZF`eU zZt}_>x3ue(A@868|E7gq$o_1fclf{0Jg7%&(b|khvjJDhjw%Ya4~zXr&nBr~_67EQ zxykwGy!^TdkK&kHWULn5zf`iJB)ho2Z~jW}IX-%$q~MT~sy`4}q|UtZSJCFv$$m1@ zj>yan&{zn1L)7S5)cuWK%dm8iQqv2WVenZE`eK%J(b3^ar^75%Yh{YqflnCD$?!O0 zdd-s{8idL}WDmyIM_e#OV3P=DLi>S!3c$LkmXNH7>rhsy7u1#KEkk=&dd68&AP(=j`m?z_>*j#@x@eoF>BOZKE#WpCl2 z77vNj6p>0gtDgXdn!r15mi!~n-3zcoZw0%A#3z6tR>~tx zs|>J`9~`D@UccM@yuQEme^T6^b-?zxaOz~%JM_;*?QQp#eOd$M)%3^Orw?QwKR>+` zC=A-IHW+&D^SyxNozC=0-2{~7?#EeEd1${{UV5qGCsXg`F7MWd+O8e?cYluwjTg>t zO_!1d?{4q}Rt#NG$!|-xp8>U2Z{|Ycw{MzsmFgRA&eBe*q2|-(oA8&u>$do1u-Lof z(VGati9^A@$QPwG(bDKtwy*(pc~yrofrf*L`*y#Eht9mhJ*tV84XgEqUwretobM#R zx=?_5W8a0}6c2`Q?u@4T{RglXQA}NJbkY{N0R1dB`Nbta-GB7VI+`Wp-=niTr;(B9 zc}RH<5!Gbp4uyp8*lX(eLdA<;Ulv5#ClkVVBqw%xL9xXy9=Y>GH7=w!*8KjOvBW;;?CGV47cDKZlng8kPu4^b(^)mMWa2yHL9Zsh zo|y)ur0;v5`fqRE2aoj)^!?aZ@;wX6btlj3$W*pZ$R^CCn4vy8yeRrXDRo%2f51lJ zt^O~p*dfn=N#W+=a+30QFY@=_-hcUcj5FhBc<2_b_VWIG80*Bn&3#)Eg*2X|%Lk`G z^6}2)4dcB0*qh+E7uqTF;)4!RqDt>UQIhpd-h9!w4NhE!%RIk{*%)8 zh?33**~Pa2%L~IxNo`IJ(6{^zEMH0iC9VyTl|%f}CEp9pTx9_8rQ=Sfuzz?7w4>_G zeU(4~`pJoO(-f<|%oIFzjWvMd01yBO1hyCE`oQ&_BA-v3gZr54h>R#693ub(?1{#! zWtS0B`e`!AIw&-u>oJ6){d!Xl>yAuJ%B2@zu!OAKNM~{7b<>_RSYT>XTo&`UsA) zXH zPgb~1o<7ezI6KT!y1Vr~eSkCk`ju6_RG)V1OYfUa=-TfJU+HfJ-_IW_t)E9|u!LM~ z?!b`x#kbFQ_GupTEZrPj9=~TBcvxKAs}y!KZwU(9t=ZfhtupZs_PxgEAZJ7U8@){i z(yMn58Di#lBo+AT1{QQk9x8bnN``G6-`846%ZP@lcAU`#)Zph;E4&E0X7&sc2uIT( z%o8OU64E7v9H9b>_goaPAF{9Nj``F^g4{H9=T+$Y!RS#rRJzBYZ_w6~W+;=j#E*Yz z*TeVve)`3(!)pEeFYcXQ?f%=dK08%9Kc5$CE?sxSPJmP%9E>R4u-qJ<3_R2!yL@~S zj)4FAn)&_Y_uW7HMz^4*EY@8@3G%?h(LVZRnUY9_>x-8!ZP$0>FE&}I%OL1`61Wf|TAPVuTeY?fZGRbf11>U@qDB?*+6f7_MuI9hK= z>Ma*&>l3|Zt+5k|<*B7~mheN_`(|&TJ5fLg!Dv0pVrE*oJy*FvuXY(!l(vI+3K5gb zqHKcF1c6nQT^TWQ9HhiV)=2K-D5-m@Pxn}vmM$`emw{fWg!*CSeqROBJ7Z9GnMe3|s{~f)BDywF&(o_Sf z!F5-^C3eYxeU$lx?YvE9m0Rh0~UW23+~>0Il9_R{Cn7hMC5-eTIhv7_9<^FS%}!y6qDZ@+t|r_ zeP1d3gdMg2?)B=**-Um<@mOx_x_`BDTI&le_Dk=}g0HWW{FokG{yWLP>HqA`^}u*| zXJj*RJ@2*KtxIA+NK^R^z7uq(;itEpz#HKjm7`kC7rvOntUXrB4TT!I2=k1O@RxYn zG0g7e>cQXZKqc4Zn;%TaH~Rkj5f4?;EwQhc_b+NqPdGJdm)LCjDS8EID1ZnUSLzgA zkSs2O<oy{S5(%id#JAU1I`+)giQOT{?N%Jw_(^Joz zPVa&ulj&4htQg>C5LHIsCFMnP*=4_+?p3OqJ4F#!t}IKeO>QVOmdUZ8Z5?f ziLt|W7Gu$zI2@MRm4InkK$_pFv5c8VC6WGx!S*MiC$;u=JD;?;FOO4=h2rd+Sc? z3|+Uq9f(*?qN>Tlv%w|tLYnA{ue7ZRAyNSh_0yLkH4%M5zj_SB`a``x+T`v9#~ePA zh=jqYr{ZG$4nl4l$abk^KpbxKW=6Rkxbir6)oA{4nPWVpjHcYsSl zimg399z00t5bN3Ryln5S^2bmO z13oA9keWHU7?C+zkX8Srj$*1HiYA3~No;|61!?={E!}x;l=qHJN0}62fduhso=lnU zV^s?*S?Sa=F`0>NIeo0e?M}Gpoo@s=wR}*2%$7V#!i}WsE21>3#VcA{f^dex5dt&u z5sxL`H2GmiU1kh)OW|MvkrDWqGsUp^V$>(8GSlzGnCHranWCWtaDEcFCbcLFbBt&m zkx{1DBTGFq^H)3oaQ6yWtNgqGgYt};{f4ZqCIu*}3W&wCTkF5qglQR}s0nF~hhP+9 z46>Cz#QrQv9+t=ad`+d|A-wf8CPd=kF=}mDFg7+NUmfnyzCR=$g^D5_o_yp?osbFl z(ZQOIb`6$^fY~qXx-`Mf?6`bEd<7I*+^QlPB1U07M_7d(FYt4II2=MStph~Y=9s>~ zuWu%ve>#f3ctO)HW=chT#o0-&YV*|1Me(4Zdr#piS%7q;J7J-=>oTEI#xqMzgH`6e zk&dMdBeC?#&%DWG&x1DlTHRTXbmw{p^oKM~g#6RTU-nHgi)4Th_a9qkeDtO8W5BJlM@YrK$9`HgW*IR{e8 z?A4N*kD==3v;5N&2ovfKW-`dT1rF|k_oX3moMw{u^wv+WMlqq844ghZE%=)Anz~dx zWVVPo0c?JDNe=7(?B7i3qLdtl*4c?2$A_Hfj~cd$8rJb&$t!C5^AGp8hsVp_{RyvV zDDibwWeJ_V`FND{V_{==`uXEhi@R`dM*hPZUE9Xc=Z$EG$mXN2w5C>q{@{{q=zyZ; z{#Mn`Q2qUX6Q&{6B8LiV(!Kvjm#0VaatDu}t>Jt3pK3O}UeN}sE)=gCvW9c8M7;k> zNJs{MIib>0h#?x(ti;vO5=SE)K2Pb9^42!02q(6ma4JH!%Ji2C=Z)B*m|;9wgeAoQ zVXawg(b6wSD&Iu4JqUSI;bKT80kMM#3g;Id&vs3<3h4J zR0GyXEE(eb0fNkCW6I=22+V7shP^Y#ARsP~ZbvnN>(%t0Kcxn|@n#*9>;3Iw8_8#Z zfDC04zOi`ZsI#*x7#quDC#im|!~a9(g7X_=3X%X|Pz?Y8P`s&x4A&Z5llc1<{7Tl1 zk+L_7AvIRvM?8BJV|I4dB24wABMB`dbB_C)6tcsG%qMYJlVRW>dZR5^fUuK{u)<1} zq=2u^2dDyo5F*DH`OSpQQ2a)~siQGpmxB+mCq$T4wzddT4W~#B@$Y= zhfzPN(br9!;#7wHs77;Pk>x<^itW!TXgD*s4+XD*cvAL^XT1Y0wLC~R_EqDV>r4<^ zOosSsrr@Zh$!dlSGn1(>)`d&b^koeO_|v9`pG3I8AyU5GXDjNOQhfXGog=&5qXL}A zg9(_1#e=o0`oJX4t9R#-M;3>coZ3JA?yu)b-F}-Gy7;RTO~zBK5$sVpZa|^x@hU`n zP5T=Mo%v&Vhok|en1`b`{_`Mz*z@JOZJD&UkU{gRb=L!%sHEZ*{^W zl|Zvwb>aaG-x$Gmnw%t1hg|uIS{{ScW$?i&`x`4ZZ1sM$P=lkr!w3y|;ns6*W?6iD zHfF|gRQ2hbd%S+MTk+Tpb-RAgxrk7=NB(9!B&(1m;hlxYHe79l3YA@axno1|N-mk@ zS;ztT2RWokT|GbX*~;E07aC;*)mytcOqHt9`8zsw4j><80|sdT#z9m_I6GrBaAaj3 zfZq=kW*RTkVFF41MUm^yRJT+aI#;;7TA>LDmmT$9KKy!zd$Bv{du#MZ{kCd`fK~DB z=;f!)%}xO!4~_ZT&>gDz!cpx-p{IBe(3^$H_t)9SBiimEHvGw{NbX*n}JnvM?vw_^mBzj=P>)rtDhbg!y=TKA#AunTc0Bs^rGseZdgqEZ?O_y~+ z*2IN|KC64!kcim{tRx4*w^OnEWO$4iQ@WX7Bp(@rMZV%Fl@P%{iZsI6Z){ zgX=)NLoq~lv|c2Qjg*;t_$>!Y1~DVA)*c}xAI2CM_@f0h*PelWnVw7aO2Cb(3&|xg zK;|~2BNemj7JhHkUgUF^GgS{kb|z&-upO6;ah*=9G!@2B6Ie~&&h$}*y)S#s5C$%v zcK^XBb1vkt>uFI;_qa+Bm7>DX3y<5ZCOCumuLB@-kwZI10Taq1Y{ zw^grIX_~7EQh}fhmy>vHIDDfgC3f?#>N2m|&!XhEiKIvBZcQ$2-~n{JRo{Fo>^9;? zV`1<7^F)b3K@i8w>!x%6M)QCD0XOQ>0l&kp{;0EqT3H*uA6BglwTuNY6ILpmtXu!t z`EEQDG5%-4TVeJ5U_j^Q>Mr6r&amI6bo1ka_I<~q}vZ*pw@Lw^y|E|FXpr6stR#uCQ|MjEts)lqRhQLUU|enpJ3CeXbyR+XfG{)>MN8Gvu@-2 zxl?NZA2qD{cy@@1e@7UTG{^#zB7EL`q1Hwqa7-Gi2(HuiLGHK)w^?Qkpx-uC{ z_24QK_>=`4E}-Rvp?G>MNcb&g8jv6$N#xQ< zA3V{4#Ie~grWnBT25Uzoe>KUuA_~{1C10ep!5Px|lazfEbhuiGWKn~H5+byj%8My7 z(afUB_qIvPCV7?Z0<-}P1G3TO?DlD+P-5#SNPudbNN<AiK4h*V!!S*-(Y_8^)^=6XO0$PS&+ykKeL`h)KK|gj7JHF0R+or=S08#aYscLWx z8`|(;PM8mC_hEHBa@h=w8WBgruKwOdKbTv(8txCxks|#gh=R!`?(q|$KU)JE zUeU^l|M>N=_d=L9#H+hQ{C&_=kDp!!ivzVxoUO>|<)_xmN#I~tcgGA?6K%Y|KWuy` z07a#34l)G&Rk`bBb+<1+a^L~jpSSM~$nTMUgw8!#>y1utvu^5HuR6K<<#&l)JwM;{ zFX>h>4huH<^SRaEXV+#33FuqVV~Kw_5I!tbd7a!ez`bXI6~C^k*nhcE_+*!o%F$v2(2 z6bQ_Rw>?N*5yd#v0x=UT{DR^%6(0g~eXFD@3x+!EOx-9`^6j|B$|Ml686e1LnJOPy zJWdxh#7U=_&9J|xNe4Fow5UH56{7=NxfN_xzRS}}C!Pj?;zOD3P(sx$Wyuf(NYfb3 zJwx;n#^hCG^>b8>-IRy*q-wM*4;N+C6P!gO1L*UVEz(LRm*t48B0YpCSK%UAn&P#p z6cP`}dtDEmB%uLA!;*{|M zPK7n?p`v71v2muU7(5_bi@;E)!X(GHQrw}NH8a29Oe_mJ72UO03(KnOM9v_!v`|p{ zM5qjRyujo%2&@bzMOG#TD+AxwlE*k~x|9`-k~C+z>4 z9RC;JJJJsS``6a{kuP2u(HKekdx7uPn7ej5whcOZbtA``wS)QcM=}4fJMm&Irsg&E0nkQ#E9_=|l z<*{8|z?$M?P~4njWjT5GDs|q)8!x}30(21bKJeVsW2~gm-Gjd{bCM@Y(RqEYkO+2)LDr~u=ae*8Weg>K`hs2NHa>&g2W@6o+z#cq#ycuh!cK_3 zk1@t^<^O`R3-356wPxmS{fbUfR-cGASVBIhgC#wXt(L&VJ!D`uC7~t_ibFw}ReYW? z&Og&;)0q_Sc21mOP)!iz#^SlP{rTGod!^EaSk?kK@3SP;!t2UGy|ENk+ICPKFNJ2E z9F2q!AzO4&94WQa_k+sqwu^g-SS%pdQHlI}HdGg;NU~IX59!s#JMPo(Gn4C+m@UJ% z*d;9%Bcn4O3kz1&M6=LMB^szvD?`;1p#&l=xN;I+Lm6}#Qei2z9^Rmd@EfvM1po{C zsU6ItOWIZz8=>uJafNduF-tVBU8hCGHsV=GCR`Kk34t2&Q*dQ)BeA?%0uNvPx&fd;9 zmfuLa5M}2W36`HfJ`8p7C;4>xpr5oR?iHl~1|SoNo5m#h&j1907-fmi+Kd!<_~ctV*01OiHVR%s%J*P<{)2G?(R zh#5Zu2MNSV`BgK@8PM$9@WhPx_q18c9jj`XSgZv_vG{vaO-(?4GF}GeQNs3-qooHlPcJ|!ZK#s8;S9mBwHZo{I~#EB$!oTMaM%Bu7+VzF|{(Ujnwor&k6Zxw2$ zn`J-Q=1G`O(6dZB#w>iCx|z^1P@1sL3LMDzv>VJ6c+CAbqIBTuY;&0OKfpkUQXfZ9 zLsys#W$T$K`C7OF!nhkRoD=1n_7>a5Z{?{)%dOp>E{vW`# zsohO#!f$|M!+(FFS~)nVu&ML!LKx19xl4tYGe+T_mI}13)FYD(QfWkoi<%F@Rkf?D zQyusPikH}Ah4>QcVo!?EBKw<(W)Ji=C+un5rsXE^}!$w@Y_qu z9O&#+Zsqj&{Rd^k+lLMP%=++M;mz2xv8|ALC}HYJWhjT<1#VxB8ZVZ5kV&}QVE>y4`kd9eiDX`o^O@Dz< zM()j=Pa@!#x-0Ul^tQIPw1nS_3@BGNaabWa4noIOkWtBe%6mhCtu~2%gs?|2I}>Ty zv*KQHdy`^^?L0`4E<@$$ub2V@Zq-}nLPqdU64FZftPGb7r+*qozdR_jpFXQRq2WTY zSP!{4GsLUH`GuzjO`-?^4eW7HDaixU#<|LNexM;Jn?ZR7Y^Rkw$PuM7^a&X>QTt|Y zW@fQ0Cx@2CtPBTFTB|UF(OCw8V-P;zXbKvdpdwWxEP73N zHGrWVzUlq?YfuV6IKQUU=0(~H>A32bxt}Fb1H$|cOya?)Kd_d)w4B)Stv`@zMvjq= zw{q-H<%dp@61Pq^_om_=V%?FTSYllUG(X&epM|De)Pxe76y(Y60OfF>Hp_m;3{7A5 zmH7H=TQU^KBgCPi0Ndca1*Em_L?_|$!J8IMHRaU4uGZ|V3t1b#B3L~^OLM+wAI9=; zX3iE2)H!c1>hCr^(?yzI&R^W^8-j1JJ&YNAOd8=nrIDD5IS+x0M1y3_{K01&(=uYD z^dH%e-%R#xznEET7mOz%`=Lhz)EQ@l)D}_JrjUybr8;x(5tA7Mph0GYUVH0SG&B|V zQTZrRv#UQB5<`+Q5Sgv#aRM_VmlT-{@tmrpc1^AoBX)$b3fjiKw3vY(b2f{rQ(qBp zE^pp#_}M$ehDo^s&o>%xeyZkiYzyXQ5XV*%gY0F^;hQDZat~wv?NEg7=v4R~KKgXw zot(#OqzwuE>tQjz_AA8uV0w>~^8+~?hkeJHxO5aJM^1tUadS2hlLO6lzJnpjSY9gf zF)%SH6u(UjVUHd=j0HTAU^-A-)NuyFK~D9*YXQfBq!Uc+4<1Rq${m7Nd?47_LKw=Z zU}LPs=%KI=c_a=XS_Uo}E@}cJJ!II=C+eXz1l$jfi(6QvwX|p$p|mK}$SQ=;p2E7; z9yQ1e!f`4H z6OPdYz)ON9zZl+0EuhIPO(w4yp)flvlr&RFf=p|kd&kWdJn>PXi>*BKctz;kt* z4W`A2i?7u{>%eO(j4thnFsUY-Z&q?=yzFtJQ$#*3c|d0Yg+?nNj?pRf8PgeC-ni@& zDQV5Pl_X>|n~^ugy36A)0Y+d-B1Ag^u}#6=NbZ!>xn0TCQ5%)*VpPKGFa&`==Imjx zuJc8>8cK0G!?^%?PBYoDQHSapwP%@l{pcu;g$S+|KR#&ErWq^RsJi2Tc0%!+W27IGag~3{$~er1i-a|E=+97$71F zJ-=DGDk>|kms{)Y(3gLk5|_B7fTRhlymVgzS&oaBbVe8%Jh{d=lyJN%Sn^LCja3OyX5Oq<${Q+jdx=#)ws^8~ zMW6MgTjbx^irkm{4}jKy&c-O+C%KChNvBP*3@*VNWc!^3K(_|*heFFkTwZdT%;EMr z=E6S1`6^~IUOq&nA|+Yltrj{h&*8cJT}OZki^S<7n{!>+=Y+KAZ_2(KBvzG^g=iR1 zM$aJ1XxdRB+O?&I4r>)IJOsLqdKS56dvK0HjJkjTq$E&wXr-2hi)4$U^ydT~hrW2$ zk8&C|SwFS(0alTKy01+F-6hsVr(Yx{%kMusAW44=eLXz%dd7B6m94w)QSeia(g=^V zcfXj9OThk%Fxtz+;N$-6}&S}oW>shiZu4_;E5edQ}m02v~Bf*>~1 z$}No6^Rz*2Jb{&AwL|jn695k5S%Bm3brL~_%w=Uslj;OI@|m0*kaC1WAqrP1#|+2= zj0b{a?Z&&^FS8igIP(osw4DHjK(vqE5Sjf!+R%HZ4DKk4b9Qx~XCR%~j(APcXb(u2 zQ6m>NMO4pM9Y;1Tsl|}U2j>jeM2>u-sOn}6!5l=#@SnO7nJ@vNZbWuTQnhd` zT2_jfA}#(5K8GYsxdC65fjx{aiFk#`WQM@*z6Q;<4*J>;s#CYeCv|0Il1N8Gd`)Uc zO9R*Ns=%4nvZ&VkVc27`U3p|8<_-9-bX+ z^uGSFi^obe zBVZz|Vqhi?XX3Es&_B|a8g~VV=$ROeIP$pCk zsa}(QJ-|%0Oe$(lF*D|Pfi{k+ZB~|ah^`pDW_!J zC-qP!-TxVSMEo>9IwWoo;6@zmdTwiO4C933NtUzyTz;YH8?$+4_sa8JvEbmlJ=g1K z+U<6NjIn$1VUBEnTK4c&x;KRknxD0Ue@?qX>(c%zHbs0HzTGoDRe7RE=$TGWE7M_L zkA%JaW|GSv4auYFpl%ONYY8=59?M~~?S6;$Xtpi21uZplH4A+Y;n*Mh=e;LmyT-f` zG*%+(O$hXi_aUTa@4aTSM4QHOp)4v-clX2o*Ju;4prEyGaQHa%^54@!9({|;kNu?v zC|Zl4g3x0327g++Jqt+Rk`4(NAm9+CipY71B7oSMl-V%^M=@|#0jl5d0mQS*7FU27 z5R?(Xj?nF&rWUzV-D}P49j(T?sT2cxL8nBdaD(u(Ds*fM^U8?Xs9ODE6mEDa0cil3 z26o32I9q^qrBgVGK(URw0CDL`gC+5ua*Mc~_@?~YG!FOAl+*yeIbKu)6?HV)xvG$$IqJn#i$?jvk-?E*of z+(Q_gZ%Qo)5QacVPT&>+Jl8R^ zzPocS1cRd7Mc1z8XudS$<(`%8*UjEnTvZ)5@Ga=+-yHP4t`dqmYtQ%Ji+sLEf^>SP z+vVc2kSG2iiDm+z5L&pkiCoS3_9`naj}sM*%ZBj(Kb zbLl$Mewx1(@BQwMXVQ9Jku(wa<61e29&!e)c;N5X>({~g^XIlSlWw=I>r!d>VuiS} z{l0uAV>PJP(cqqX`FUf%pKd(3@ZdX-&au9pccb;p(UVoX@K61|6Cm*?lf0#~K_@8AAn%Eftn=a~NR3ODwj&;91uwe?()+l+L= z9o=L1?>{{G;&-1u{l0t54Q~FdzOsDb>&bJ!Kkpb?sRQ02Lx^f!#SuA2a_Okw(3_Td z^TJ~(Oc{J7Koo<9loDTr5X_K^RL>juk*ZlzLfHr@1(^~ZD&!!bq#ziW1DV1z_(}BB zw~&S+n5e+W#1H}^voHi>O;MWiz{9o80LIZkVY6#qzf7WB4QMdoc7R)^lMUtCDdF&xR91fL5ek}LvX@m**XcBVx&4L zGR$FwZ7hZ-bS5MTm#TD7yLnTAfJ0b~EYZm(mcm5S(H1b03?!Lb?Ls`w$moVHLFBb7 zWgKN;nuie#CMu@Je@lJ(7-ra*X30mXH+V*sA;y9Dysbx7WnVw=%Fwh@!2}2>z{v!x zHGp4Y9d09r2$?MjR$z<{oB~9UG9spXN!QCz`Qf4Tn(uo4j+mxSSUY|>Joo$f>0#^n z{_{(>i8!;{h!~zWu-UHchrYf+MM*}zr=@h{w|KGmIdCT4oI&2~-&4+C)Kf=|M9ne8y(S~%XRq3@pnHTbfP6%}B49p9Poaqg`NurC|e(ou#c=`Oh0CAKf{&a7^HEqMHY3TGv(}VvJ6cuGwL~4U zelvqk6-S%c(rlznBjccGblteu?FChpRbWdlE6vNoB8~25vqN4 zuV&}lsF(9UY-}{Cv-kB|Y#14R91P;HtcVo|%mr`l-xq7<*tFv zZ@bmve6k8R_V9G>wdZ7Wy=pHhFE7*1iJkPDgOjTep1mt=^AXu27G1dPeB4ezJEXrj z-~HZu*Uw$~Pjdvqdfdf92e?f7@qSk}6zOR2-2AlL=0coha}GStC1b=4WM(XaIpgBeRr9VhL1}V^Xp( zKv3w3D2EMogoI5H!z#cm0t6$l05r485`a1W*GfU&A`r&{z`+?v5rR*eK_Uuu7iJ$&)d7sAB%`tQ7JU%qTw9)B~_zWp~*Gjp#l zy*_oXrv7~TV$>Svymx_)n4n96w6|M5yKCDx2hBWpy?-Ay@3=e(GmC!5>Y_Klrvcxu z$V%H3CYsdYlr%peNccDa00001;LD=q0wY*pd;`xeWQ6Zcogw#=!gOm3zNb_ZJO^j@ zFgqtEf&@{VF9M|VDAD)?poz1y#DxmhMT>)9#oFL%%k|(1gJkRaRmaSP==Axo2`53% z4p0CBq5vwv<0j}mdo;;ltzfZCC>wc;<%M8jfcnZMZf#%e-*P@(Kc5AOT~+)1*YzXY zr_Y~Rf{p#Wc!yi|N8#6q@b`|HKR>_52oq$RpMPF`aGCQo-NzL@iwU^r4fH)h;x07$ zx*)7j&!lqer_PtDM9lH+r*E&PntQ4A+bpqD)$-&Lyu06D%~sB=<#B$>pfrgcr)sQ_6JKmiUOiWq?* z@*z|f2nb+7yG0EPf^HI4VARlntr7&mXpvKa5>P?{2?-=BOSPngCOzQ|ETBL@EEwfPn4N7T_AG+K-U6t+nsuFPQZ32r79}fLQ3SNb7Nu;lzlc&oT4=)MpI~Xsw{1N+2 zrgmGcsr2$CPaXUsT!QmtQ1Uej#DDC0WoR?=T!9{-FFEjkmjZ}NkQ-QQ6_)QOUuH;v z&c6rB-b2d#Ecs&i#_#!HE+34Se;%1HGxPBuOte0iSANmYrVS-1)epZ5%zia#9IW^e zO@NtTYo}`Cj(#&PEL)O!aDO=k8~c3u-S57CzX&zVlhOXZbKxrX4fp=O`{Te0TD?WR zyZ2z}<+$YMUAXJd5mCtRr0O;EYq;Ww5ar*_cAA?>%WqwN+-j$NVy_O~ja?S8{NW{@ z{{TF`CQH3@H8mwva&+Ua7Y7nf+3VUhGp;&hZw=#Gk(h}g-xDhiKuI-G2tW#m5W*^w znD#-DItde-sZhf4ivYEnqzZ8;7*c3-qyP~p08kMK%EMv{6h;+U5aAHWhoY?{l*oZf zWS{|MIf_v8Lx6%2a)eAUdtj}xFRrCqO~^&l#6UJlwNjoNB{2w~OLE9<2#cH^t{9yV z0{~1?0Fsdg0;CL(Wrc?bOhQDVk~(Z4fdIe=9|5ifE+Q*7f%J5_FqVKy;giy=mC2AY zu$Zu=rBJ2NOp>L7Ra7rZF$5;qp-`}Zkt2PL4g!y{1FTDH{v{W)8HA})NubCcScz;f z=$J%eeuMT=p%4a)k}}T2kHMQestN`r2N~8+a(bU%eg60oYo0F;jwl~vu1vDON%Xq= z`nkYpi`KQ%&qvZ<1Ij#EF!E>YS@T_SVXC8~p1Yp9>Bf5B1Xxl4AOMjBST7STS|ij` z_-z1*0Kj5JFq_W-!ePV=FS-(iq9eip0LX}fSv5&KK`JneirbFlcb$vk#wGJcy-z|f z9oRkygZt^FgMM7x>>o{e6gKl@%P} z`L}WbcdJ0N^1{_eLyl+Ot_SYr6Id%KMRQM=sb-$MI3ry@F(7DmOe3g8iAPGP4zidE`sM{6PV)v1raZUl0j+z1>Gq6|a0bV+8hsW8;Mv>*u%fDCxPkYHQL2n-1N%8`)M}MZ_y~E#e!$t+BW?AI2 z5elT6zyOC>(X?0qCQmy8C5%rqL>kLj$vSkoIrymGDX=;gvbb3 z23~?tVFFWeAyOnoQehxeB!pci0>KhN3T!}NK@@|LoDzASvXb((EyZ)2{|kJRV_b2qEoSxmu#;ERU?g-ay_rXNEt!?QP{bFl9h|v=ke|`-ptjExB zkV4%#S!rRuKc1ZVLeB@9%J;Z~i6Q~LiS^(UL7>5n7Kmx&aA*u?cSXS|AwI4Fj04Mz zsxVLo01Qq%C3K|Y??6IS)u9Wh|n)AN4y z{Hb4`n*H!8mZTk2bAx1+RP(L#JbL3qd=E$QeU!1UvFqE`Sam@RBvc zWHFJda1bJx9eOGE_*my4WZ=uDOjdqe(Mqj?Fi^!Z6ftg!w82S5@%0OFA1*$1`(y=g zUSB?Ue=o`YzpPh4{knfXbzMdS?|jimYM6@xl3-TSJMWvhoATmsA002BBVRS;g04WF z6%o1YoJ^p{In~9Udh%naK}@`0&!0Qo@i)5qVzUKmxsSoSnBQ`GKC$@sUj3k$Dw(nP zYC1*UXngbK`EioeTC2vjE&6N=IGo>V@4s#N)@cO9ZH`y#}xq;)DTk5b zA#sa=0E*tXl2I$*1Hf7pN~9bjq^yG~!V9X%3m7K-r3}$PGvokO^qfjE(h4ZImc_vs z6o?=Z130n)3V^Z@QGpOx=}E@7WgrK3OhOWtnvHUk9)hUQWXX#{396tU_o`cfZ79%Q-Xywa1z>xbZ0}dLI41s-9%X8a;lLcI%T7 zueT)Gez7>9$DH2@29C#%*wMwwK3bNTZr5w%aYtN9I?`MaW~ODAX#_I*IK=A zw^z$0ecjJH>Cb*9ZNq>7uM6APwA1AffbR9%t5Qk!CO{j(SrO)DIIXrihmP}TK&g_U z>ZZ8jA~$(H^FPIFuNc{H<$6>B(rZ{ToWPvTH_w|1M51D|oY0D(w?Z-;duEei<(D}#y~h6^Gdkb*=M z4hWbHtaTO=6zL`)Cq@Wel!2K3u;R(U!^1x$& zl%DjI2@SS{5Xfv~uo5A|jY1~0s&2~MhGotHRAMAC6e(Fm*cMZ9ft16*nE;TRAr{)B zYA_t@&S&ObR|u(TnEG%%2!4T3h%zFG^%BR+!+{Dj7c(TvS>{{k6d`fgp!!ZtS{IFu zU>qtBEG=Z^NhC;CBtR+z+!*E#gDAO!KuW0KI~ul_cFKB!x~LB;i>{ zHFT!98DhOP{)75~_B!Fz_oJyDdv}za*ZZ>n0EyUf=aJI9ydmcO5;Oj?S2#74CL04IYcl1dU8D5QoaBprq{o2o*NYwP~-fJvKrCQXTgP$muw zuU&JaoEL#5nGyLR8*Ui*V<)&;1_<`|k zdM5($_4E7qB(8pkpY@6z!dju{UwGj4#aC~dIw|(E%v~8b%+BWK0z2ImTe3`QdZcr? zyJwGi9{A9`zHt4rVybSv-U2&M*6?HJJb&Idh@Bfrr-ZSs+0U&4PY_n`jc%afd&{K^ z{PpeV`En_~vd>LdKg9sFk4j%Ie<0^k@85SFpFU(8=A{Z zfRwW$Re-4r1C^00A+S<;2_{;jla?RZTgjdb3nkAWZXy#gZQy#q84~sJ8I&Law1m*C zkOXyd1e1|O$XP-{0GV>|kpwcvr7jFAU;yNn#8d$(P&5n*s1{_huq+LjxlAEod}dnc z7;qLA$0o^=e_E&0^)qErg;knf77}7|m>~dCfR$bb*MpsxpIM}oDlKtjZia&n6#+bK z0Cp4z006=uEU7WQ{-Pem@)sKNd`~#!+6CuY?rWI)mHXvS1>OGuj}#BF*A-d$<)7R0 z+d3=Kx|7|jkcqyT^WQiRS0*#h=g(g(!ShJx00wKu3oczaelm3 z`HG*N9eI1;a>U@ z{{TC%i3wgG!AD=57{9=L_iL*eur2S$mw&fSL*o8I$0FS=X2}4f%UA`7>WDV{{Gt{ zot5*O>GHU&WkPGF_ai?_XRa#Ur0`s^JbT{YgBER>{QJK(6H{r@KC|=XCMmwXFS&ml zShxQF0C=bI+vh*?AftTz`R!Rd@7L$^?|uM!$i~m%zmp<`zQlLn^ZsX?QFrOV@40Sz zZVMhYG1?*#jy5kA)YFp;hfnHfdy0!{GG^D#e*65o^~DhnKW|4**VYJ`Ui@!w^+dXA zac?MCeSLYZCit?{_1C98ZKH&qFhP@P8;GuWemh_`D`|S?LUoRPCB$kxA2@1Qp5!5(+?kNQu!kR4Hg^X=D~1|Lw?W6FZBrn2)xCN|Zm{e9&reR@%la2VgO(~h z`ftuSF_Q%pP2ZZ_6Zy(_+#A;Vc}+}tVb=cuiq{=KjpdG!ES&US$4Kvs3~Zq5MQS;} zsTAkWk(TjY`}HHvr_)IR2L0pt__)1ad{cWbywtzPJC12p`*zL&zEkb<%ddyezww$P zovBc}I?rEhSe`iLzeI}edls+Z#`W~~;-fYMUo$>`HPf~PMI+4h-lhKlx^<6JbE;qK zwv1VpeLHc_xx?!dF20fMdw(-HnyKbJAv>Q>LllkB`ShK0l2u1$Zu@-H2;c-8)p0uV zt~d9^o$s%0eCy8`%TpC)S6@0#{N6?DukZVpyS!PM@2;~<^HuNWy+6My;?3&4prO4x zt#$SOabn;5{o-<}X&XW!0J{R@?{;ACK%;+<_L;ff(~3J3rV3P6Aqc9hOb znV3$}CQ9OZxd98VTE|SBj{ug$ z=3JKAVmcam<%zkEUAeLmbZ%jn&ZoEX+yaLp8jR~#)aW$&U2L$c^VXfeNr~hU8LS*F zP%xF-%O2UhqF84e^v{Y*r9o24tNsn^3_aTzS4Ifsk%Tob!KxxhzXwFL{r;IGJ$w4_ z9d!9_fE^Z>=M(Gp@&FSaSAUa@_l-s@$7AG2Xr7NuP~Xpdnix+We^}Jdxmb1jXd|ch zeTa!4V@2lAFi!^Ai?|&*Q%hNYAJ-r`F-}Yx}kDaDIMkqV{m;1$=bE9I+ zrcntD3S$HWae}As;AyMVzry!#t|}!Uu&7Ry1nmN#;5WqkO$S zd-~~MpU-sP#6dh5?{SEiX| zyi+sHM<6pA{^Y)ly>b!_#l1as=aNLtb!f>b(y7*I*Q(4$rx&NRdGzMDzHwK+Y5Wek^shgk_v!DOLG|g_{(Z4R+(r9#`SLL( z7uWdn`+YO#pSRCn1=CS%l{)91y*b5=zWj%0d`H_EPnTF>i5rK@e_ZG1&u^tlo^8Y( z9(cQU{x-XtgzUl3SqV;#+)~M|d+nBiwCu!>88Or8=J{`Jn5y36vr>e>9Df}J7i3iS zZP|L`-;9C1Ct0|eeEVG10cTa(_ry=un&!qLyVvs{FRnz7&m1#N^!Kf!q8*Sxozml`tzi|ZG6blZ-cpGx%>W=#P;S79ka8qe z84?IY0t+Y++!R4DuNNhWzOk}I*E0}A5x3wsL_+SOVp{y_q%DsN2P0vQj=UAO8R?ByDU$v&Db{N(+#wF*&5-6+kN)3hx6tE?lWr&&~hD?EXUd7m7O5_J>B5H(3 zIRq#kV8MujYP&;obr0I-BT2QH(Hg!5^Xui8nwEd>JpFZ&D>dGHxYwawGGLQk56Xa2 zB}_zqpaqFJFbx3onGm!i%af!5Ohp$+t>b3Xq7K5qffmps?hnmhD_yX$9RiqVQ6KbSs7@NHMn=*>s9#P81{ZSEb9 ze>*qB7}^W_GoznfdEqg8`QMK_-#Nf~y?c3l*5;tsJ>Q=E@fGu{T{`~&-0rQs&Z1H{ zJzYb|jXgoc%=yt;o;8LaPeKnc?Gkmdm78(Ul?Dj`OC(^3g^scY1_I!&SyysOWo2h4 z);ZDN&)L0WZTk>!(4Os_lbxX1RI^-dx*K; zMh!0Os>|$N=YKRIuNvT~ZxbQ`mZdTSQaoC>4Pu(?bo5WQ9xsS|QNF zz?lst%+7#qRI8>Skz|RqDpF*cL?dBRqDqEzrbZz(Yia;9U^!u92Q6#{P-N4Z&`Fq8 zz9StQ8BwK%E1U|C$lORIV5m_5lJw?%IKN%?YO|*6x!zx- zd~!_KA{l59#Jx&ZSdo{aQb}^D@{I@SBuOMxDJXJTlw?L5&ST;ta{AA_m1QqUDU8o8s-@qnu$m{ zH^T>ecgDJLy+HSa#QK3Njd?EkVKjjaL1fB_WFuy^yZ$1{hYB73=~nO>Gutxn^~ZWX z!sdE^%qA-Kgdo&9 z$Y(Zj3x%8tL;yHQCmC;xl|}LcM`m}k2(kNWnScMYFMe@=ZZ7Qzb)~})r$%? zM67%HzSHI9Ju=tC*-mGF zy)K}dj3QiDZFZSD49BHmOOHCfo>Oytdv#&on691s9CeK9k`7dX^{!@my>fLGf)oo7 zbrpCU#1=*pMZ7?S0Eq%nVv(JI8bZ=?A*FI3LtrwC1eVw)8GvvM11Tm+U`)*xDxwf} zn!pwafLN7MvPwHg42tU#lH`dI02aw2IxztyFk_+!0u{s|U|^RAKurk{Ax^YKsR9yn zEP*Ap0z?1|iI^B!VnAgAn6efj14Shl2%IPcXqGp0n4t<4Bv@LI41Of4PgUmM2VsSs z!_gAfm0Td3ZJrg;1jI*Hdd6&yFJ(&|Wz=w$qRGkUN;);Zt@$WekxezQj(z*W=;+jw zCwqAB^~ea@3+2|jRdqPJlcEnv>)hX*Yn%Wn$gPG{0p;HXl<@G7g9!YNO8)>Y>iP)t zgfygtOce>6X7kL%iD;y*Hq3GTdVVD?NYm0zr0>7O_q@qQo~?6c9eVwr>wdT~sqe*f zKcA0)rn%pL3Ge>^I)6NSV#m*sivrBMH3rK3!um^&<-T2$s<`8)T;w9O)K8uHEtBly z1iq2z_u$`1xHK-;&HUv2g!|+LH?J(}0NDAy{{Y9$V?h;$NJbkZJey>>1-y`w)nc2n zHtb)7!^p%4d(GFc@%8qMn;gWxLl^_>PyPNsD+DAJ&!Hva(hel8x4&h?#t~YE78oF2 zC6p&p!yRGii4^4~xKz-S$sQZT$X>t>@chDFX_UVGz@fwIv~nMN5wL8)pU6a-s0IxJ z99IxqpW^|T;EuKESJ&rGAtbBVWdL|?w+J*Ai%u9kNzQUba}+#6s8d6MJj^NzHIS3E zRV4+Vu|rV177H4uJ7{rt;8|phOjSI*r!D6k&rgFkL^4HJ>~zQ|pFW>8+t0;K9jDhv zuU&V%PZ>>is5$)+QFll|BjKR8%>N;x9L96q1#PU)s40zxVg;4l)7 zNtDe&8B6u?>FfnSS3J{iIh!hOUP3Q_x36QsFj68@Hh?!g{WDwb^ znjs5T2oP~Aj?gHssPyF~NFg?il?($iSXoy^L}U~WH3JhmNVpaWLRliT5jr0K0AIi; zf(vRa)fvRl%9Xj|LK3d*UGQ-67TS8|-q7y+t6tW}ktZPEJ(`!9J8z3|+tuFD-n;t4 z&E9Q^d0CzLJ6|Wyc;37nJN)*Hj%Bx=pWjdUFw3{ghNqHuzpn{!_2H^6baU<$8g(v) z#DSz_sDlZ_65T*DX!;nKFG0`|4T#wP0F8+-is>MR0H7fhI!Ve{0Oe@L<3PUAenG`d zPU4bm#60rp-%5{Ks)^PWXG9kN0KxLdDVt_q$ujW3uPdmkeeGaSB zuRguw6gQH!iJxxU`g!%l2jdl)oBKmwZ~HE7{%g~pBk_!So9O*h&?BD0!NjvV?v+vH zJWWL7)?hAu=VwYbT^huNwNb~bTTaAltBMFbsVcsIC1dLsA3EdOLJ}v9x|xmkp1I!o zpUxK&3bt_|i2NR51w5Q#SD48&{{Ye>g?r3L+OLS?UXOqKkxNs}UdXR3S$FUD`R9v} z&2_X!58NCrPB>Y=0cI<51|Zp1VinBEBtLQyF zX+W%*)!&E}$W;`ESDd_purgU4=hRqXPn=1nYVT|!*dv3v?4Jv{D#J!H1v7_2*kcmR zK~sL8&3X8#XK&}MPabpA6eO=y;tj;d@>f-!de+WknDsvv{PXthJo>YU54X?f7i-e; zNeT%ow>siAv)?OIdfk+>q+}$r_~R`uo0JKL9iUP+5m`4;B6r%lG}*%mxN$;DnBbW6 z;Qs)VOy@0wvvR&yd{V`cd2b?MH8&=@a5uQ;ARC@0z2Rry0q7NbpIiHFsxS{XHLX0+ z7d@ptRTAA{bVFX{P3x;;8t0#KPMh=lU`4$95zlUct;2@ohZEH0)L$3xr2@?9PdL7X zvHt*LA$1U@@N5c=oIEUqKuv`Kp=w&q2r4|Fpe-bTlfaw^z*bAb5rDl+XeS8a0S54* z2!>t*z*GPt0V2U-En)^xp)hR(QyGrh5+#sJLWW34Dp*G(JQ#_B6C)*v6kTCsq9i0B z0_G%*mXbih2~+~afH5M#q_8DW0G6RN6ox7Yaakh^S$|ArJzk&;+XVF+8c543iu!jIn{jal=*@LstM4fZf9+ zy<@-UagY{xhjDw2yH$=E=MmK`mGAO*$ue#v>A@2x2WaTEG0Xe>{`KF_=f7N4nJ4k( z<^KR@G?iYQOWGsd>#I}BGu8h9k-qx2@_OGFb@%p8PPnxi3a(i5E0%6jPX#*bn6A5s zzkCAMPrDyaG3?esM(>ioaC4g`cz(O|uJzKgWd(GW4Ut^Ewe4_meL8vM^?UySE-D^4 zESVN{_36aUa==Rp0U;WQ78Kqwr%JRH29Tx!U{sfc6C}DDx&9#_=X^F((KNwJ&tdNW z06j2tB-%@PO95o41)!9O=#|~3RjX>THKG6r1Sgq(@!o&01{KL9{w!qcJvQVW<=eh? z&q|GJTg5y49lYJ^q~`kk`S|K)!1dC4Z}IP+NcqX~ojA&g3-y_QK3(1zPYV&{>+8p- zDv#tMskqCcWMRd?&uijY8(4 zS-+xvd1(w(u>#MTt?XzkbKi4v&sp!H_xbKt3p|mpua`f~%wUr?y4Q-u|% z?oT!U0B_p{tkG2`yRqHvg@f@sJjsv>9% zdB~&4+5r+wA%H(r$s#EVl}Rz00!;)Hkdg>OcO9Z4S{P}T040f0Xxv8Ff@)(7!Vsm4 zAt(@=ERvFhmC7JGa&|LQB0#|o_83g!2#ky&6%q-!O$OMiPbMTOIkA-zH~?NUMu}W) z&=polZD(`VdVM{z>f^d~1mat*!M)|3RL9@3HWk-du(C}yq)G=Hx$DwcGF7+J)5>{Y zcQ1Lr*ZkwoBDbVpe|YCvZ+*OR5nuKq=JGKK-r4wHH3vw@k*cB&i7?S4=(bQ}E$$H3 znEuThdSTBjhc^))Zfa^dg|}07JD*)eef$lf1_8hkFdHZ&9*jgK1GE+kOA4G|oeTt_ z2#hF*rQ)#z$PY%3qT(eYJrO?n@#Q)WDnuSgJmvi|ybfCin_)yHMirw9P`>~ahz9Hg zK`0TW*`par92AkVTx(ok1ia1mj`5F+o%`3HUfeUnRrLJrIUDBs<2AmwuTL`lxy3W~ zwduDey_jO3-)H&jlk?}t+dT3|p8o)i`gqAltJllt(+!g=!fR!npM0A@YK^yVuyi+-SK=`-xc^yrmm=Xv$sa2n<7^XGBEgaDyp zL4-mQ>%g{=x@YM2cEpMM@3L_>h^d6zU0@}>viHcSnctU|x98i#gZgUsGk!!)EhnpschTXgTt&#yQC0D0#pcl~_a=K<>U{{G&2P$kA! z=Uu*g_JVc;e{ZRNQ+3aZHL~V6Uyr#yYJ%Tw@#j@uxRsgTMAqT*?~gq1*VjG9j%TZI z2i4XqYS+u{?XF`am}{B&RQ;TS_U`WQbGdlwy6*S-PdP|^L27RP?+Lwb z%&%GoD{`{2P}kQOOkWIanqb=9bYd=Y2i?@$PX?lTRk$-K^$YaBJ}KtzF|mGc(k9|b z^dhEkkSMjL_tR1D=K~q0PCk6;kkb(&iBOLU0M$$y2Ix-EQ;<}=RU1>eXAo&aLIL8tASe(~5L&X3=&5EjLQ785wN~pmGMc)VfZzl-62LP77!*-9 zgrsg&n<2r1fh;7-T9s%UAxT9BWfcrJXm$!2S|5bMwK^s2V_{6GOqG>-nwsT$_j1HV zH7NI<{{V-}6R9E!MRrJHRQGiTeKqD}y=WHSwC6h$71QP9?2EQ~I;iM(tm(aHQ2Bj( zRGCEE7ZVcC*Jk&~X9(Lf=~33b;HjLxR#~0~;p*t>&=zpb`D=08ap&FUGeI;@B38m^ zmQ~TJnZ>>s{&!J7XK{WFnB(vN06zZ!NTN5r{GYU!jzzm$hCHX}d7MrlOGJ}dVS3Cm z_j0mQ4ME3rYI#mi22@i$e;l5epoD?l(0WRj!wr=pCOS%pk%B0fl?(+86et2w#Xop+ zT)fNLc-GVr%SY$cA>SRr8~*^a(s~@)HICfuyB`Vb`|6E! zeG~cKNFdkO@7DhSs=}A2s^UtwgZ+CMUFiQEkBJDn%w#&Yoi>X8^Yzk+!bLnpR);1Tl5#BuE?m}wJn>PoP z-tG(U*CujGJzt!B>)_Y3{bZDDm#_8r^4K58UuRLzmn34XzdISw?oZ#-zqWk&7^~F3 zQfq8HXzMkIB4G6X3|V^L+q6aVO^*&tzn`4D{v^cFQPb9o*R$oUTAn^heNH3#k?q0r z=iNsek70|QePXwZ6ZwfQeL0w|3rv zx{K=**GNg62d~GS&-0}M{{X+APkdE=$4uB8=XF!>)9ah?;2$@V_?VwYaYX39OY+{h z-&|JgXX(}nja1z5xbFGpdH0+H&yT4xdiV0hOFn-(^vN}+?mv3fmDfrLH`AwoK>I#! z%eK%GA_B(pJHrVi6x z2?^+9NS$5HeSHt1Gm>(a=15qBeBYf-)uH!qQpndg^__`{&|M69YIU%8*DKnPx$*plRcUprlMBJz(MFn{I&L`wS+s&H|uG?f4-0I?xVk)o4(o$ zOba$JA(hE85=#Rr6oV5=Dv%LCk&#lU#XRavNKg=>At9r{tk5J5Z8|e7f+{CX?gBU7 z1T!OQ0S=O}xE>fL6uwH<2s$YBOnb9UaFqc#N991(B_O7fk(8?{RDehclM!}IyNz$w zi#INrCW_|OZ=%dGTHuns3`E!uo~B*8<(LLFFvZMVO?P_qHhvgA`Rv5C*O+I$$r%;z zaW0GNaC&3Y&VBXHqM?iP!zg_2BFOxi9L)uK!z62%pSDV^9D}0CMt1@mn5lDnv^k>b zsq}&vctULT?HxR*+d957ZE?-D)#p-^-_@5rug+&d!L$0#gZSwmntS%hJpTX~ytCE$ zKWg;FK3r^`Cv0=vD{x{v=TXslk7vsH#XPe-`;RZ$=3^Yu+h;#W=960Pt?#0^IKOyd z-%LZ+d7n3Z&(7R^c%HhN^{)N0s3W7PvFXzLO!UX!=kb3|O(eOZD19Gi%3?a?CZcD6 zrRC~sBDanuwmx=`E;7f~eRKyh{hTK2-w^3&`KBM=Mc03k^21ISkNZjVbWTgwy!bzi zQ2czZxHNToReHL+=drH^1MGFhR$uw$^Xr3i>)(D&;-5`^Z+|;rgU)99^S$aC@^^#R zy!<^ow=6X?>0aOT_q&{uW9J{v_0`EJ?oaXj_v6Fl=SS7$jtkeX_QUb!dj9~(^2L^1 zq7JORZ?E6(^FPL&_xbn8Cc4L+!xLwCi9MD*ZaT-2-m1OaW$*Ne?-S?0e3|=uWiWcb zIQ9B&f>`eL>HTll9tMVwIp^NG9PI)_%8feh<@N20)%SUSIQlvW%+qxqSIE7TFjVWY z)xMwGivIxEcYmGvYAJbrb@jOO?{l{xklvTegYUK_j94cXS^9Lxk4E3%=k3nB{Hy+Tde3I@W@pxU{C1DVBJmwP z6O*4$dBqO0(d#hxCviP8UAH%3^JR9fs;Nd!4wZd+K}^PpX;OJ}WgYs@ls!1bCFXln z`@QVGm6LGSQZ703XU~q3s{{WF3L*-mN#{f#*C9mfA z^T|vQc|>lwZ$ea+JmVLJ{Hv#&^q6^s#0FlVOJOmKzEr38GaIOPoSb>fq2;V6IF&H|M`l5<4ce!OrC{`d@auGo*pKp5$ z%#ec(6B7_H2Ww%JuX~a=so$h=DU7V`n7+K*PjxPLlj%ISZl1GS_koc46A-@L!)2Eb z6y&zP^hNVC%gxSmam@Qg@r$J&e>?c!Y%-=Jd~QSJUk-2SO1$ZvZS|g+V;mJT@_kP? zH4=KICwZ#!h~GtXCb;u{pO1HrqJ1X)Nhh^qW<4G11~~Nxed*=-_{#&0`Jcz7#ZIw( zW$n%0uC6*&W51i2*IqyDWXu}u@8x>V5MJ-Q=igesq{L${InbdTvLPOXU1H=l72D1F zuN^8N*54|5cYV10t}lDDTjTJY-mxydt6Z9nX#OrPw%h>?@UE?w=oqha+mE`-asL>De87@SQ8ZDzg5Cjo{9;AJ6gA zr=w`DN$Ko81z&1mU968GVmfi>tIO#>K7BjGXg2d-NSVJrV`fnXzES@GV}iE<^L1U$ zujdw9+w(a5di>}3&VJuMd2-mCSzBg(D!&xQK_PRXc)kx-s&$gg^S_ z3QajS-(Tlme%ms2#Qi2?eD>ow4k~YtuKqKN1mep-3_*k6`0=tV?;iW(@AqNIbSJO9 zaQ$&+)2Tf=N0QvnfE^#VS$wOe_VBjPo4-Cde-U~a)Um|VzTSmSr<{XL-%a#;oxIX9 zTccerVtSJ4>eJmmP}cif6&6?gdb*glV{e@O>S{51Usb=n@w1<40pbq%awd#MVtye}j zS5ol$>AQRVe);qM{Q6}5eSUf4HA|iO*LjJJ4;ad3Na2p3cg$4t!eV<|-!=4E$eEGq z%!(vIi~yQ?Y$nN@lntSwk%e$OWn+)jB!nP^0$?yTQcZwLLZqb_NQyzs5J-;|EhHsz zn_-M#76S_qByo|x86XgKAT!xlS1#PkXQG$vp3J4nFw)k^xY)K{+O{brnZ_{5`$sHP*g5cY$^@ZS9GRg>f%+H^k&ybQ8-`7#!=eLo6+&t;#c2H-Y zNx~k|cIz|w@_^SHI_(~jY>H|_Dza~F^ib)P%@A%0-p5Ae-_u7JybV{KaYQJua+ve^UKTgn*&{c=a(}hmDirU zoPSxfj*l;w*3O;nA6;m_u?Kx~tXB0oI`!?+IA-T+P1Lnj<(vnTe0-lcr;JeCSp7el z{{Xn2P7lw|F1ZC8{`~#K=J7&T`(J&x{2W<4L`I*kktbXj5`!AopLHjeXYwnSr`mbt zpFYdi7?ZCaRXm?A9N|6sd3Sxfb;SaHopEKHy`5P&6bu)~#~Nc_vXrq7V~->$%S^-w zgBnY=(M0s35U<@#49(byY-1ObZAy}zyflYwF*NqE`+S$*^SsyJ)$i)up65Bw zIp_bImO|A;c}f);APyBz6BvmOG{QzJw!?@n732IkK4;(3)I>IT*Hax;@yTsyXA~yW zL91OHIFb|frd@e6zn4#IUIV=d0IHp??LYc9ZnZkU1wkf`*UgqXmyi4J47NQ1efhyO z)nw`|)~&iztWZ%+cAA=kq~z~oTsE;uT05tY(hl#IkFK3c$yM)6OjeW;ZMSRP@R`vr z60~LK^icH3Gf|L2NZiYCo!jxjG1ZSZ=RT-9)f&`C9M1misQ58FMoqfcVejhu>E){4 z?3=~Cncd`OIfc1!BF)v`A?DFk!jGTH`E^^p8U-USV2VD}E_Zs>MSrA1>bZe(m<_W$ z@EI^oKHwiDD>i%NceBOaB0N+OP%NZA2L4mzZ34G#k%VXUX0MDjJA#v%>TAQaEiXqN zk`8>9Y4RB(t9fuqTXxWCL;Q_~c=bSc<7}RbdERpFn3!*Hr?}GwwK?mwqu18~E&d<$+h!@*^x}F%X z1<6EoM8Ks zxJBDMZWKU%>)l@78!;!ziDsq@93NC2pr0L2Hm(r*!;<~alLx<};H{&U`jDUPNwk7= zV{}}LKi{>*vO8zliO4#}^8R|n5$GSq{ z)tg#BRt=TI7lX;waASM$pU7W+K@(w*w{;J?Ru`i%m|~rIJU+#Y9N^L)8ntgs5Cp^1 zWd9e?D*;_L##C3W77x@F{npPROT);>HzSjwxvNcu{DP4Z7tUm#-mstDZy*oO+~?zw zy0mw&)3b-dHQE#;MP!lb!r%QpP5`BCfqx%9ot^i*K&c_mJcNjNE=IPZ_m!qza1A2X!U(<9C-bRW<&H{3UQxXL$)7duD7` z6Vq~Uag))r`(P+2#WHl}?Q%WHz_8*^%T&wb&uPP58yliQD-j2~+Adil>0H4xudkck zcoNU&EJ};7oXPFMMAzoGg}on^lv?3y@Q=lYkOxo4?RNZNS7)tbW* zOryyLEFk1+j_~LYmgc5#4^4%4sH}zU&T;zo!?O~RA<}ZuSV8tRo8t7WVcngi=~pgk zXA>hV4RJoz=Na3x<$pEvQzQ!|$g#-v zh^tp67DxtqyiZZ;Rf_p*se9qxe`dxF)c;iH<193pIeQ~B1R4p$2stZ-1JDGYny3Eq zQpLNJT16vv0e-gp8-k}{X|YzvPQ7WeP<=-gAP-Ih4tBQY7ccAm%pHT7Zji4@O8tkk z`0no~UrQkOyEX>Mxl{W9#LN}22@^-Q4X1_OW1eX1MOEu@v=XbZv9Tq7jF>{lC%xg5 z?q_iqLciDYa|76M0v@D!n5Calanrc30#w6Ni3Z%FEZWg8%ZuEL&EvAru$dl(mlvR= zs8%OMnO8FIU=Lk5semLLQnh8XKHCjV{ipmvnCxC)tFu=QH3G-%8nuSy2aw#DZIJ+Z zuimnrEdI=(rZUMx$Krv)zRfi8L`sZt$t7?mQ&H^@Ky#c48Q}r(LJEf{%|-1~=9cXp z&Nn+YxKN}n6{M$wlo(2~Ip0(`Wo|B;J<}hr{Kml@qgylXkh;&~Yf9(57snF4!O=_1 z8k=a3?5pNP+Y72z+1|_mTU=Dg9GEA?Dz1tdc_-C*tDgXhGdTV5g1R>MeK=LkKW-() zYo@~Gq)l?!Z{S@nlmGmY`}#)V`9@O+QUn(19*iT9)^!0qZSFxfqp7SPMg-9J6-T2s za7kVQS{7F)mRKjYLf_X#U6?ennDjA|1^$iwJO|*o#$=9oG&v34nqU+6&Jgp4qi3X) z0lY>%`k$mJzbnI_1LEhVA!{JEYV6S%$rvVpGcgV^p#TXwU@dR=TSgb-M6QJh_uxHyf9_K2J%~DSiv|L#Q%jm(1IV5Er>r$gyL-~Wq3fRO2Ole*%*_!C(P$%ch?vq z*P&NG+xs^$J1EP;jn!1BkCWhnY>QjOdO>p8U=(z`MQ>GA|KOlJWJ0+OMlg!!NH4$FA0aRAEYJ* zTwWmcJuNDgLA64G=Az-W8ds-2=@%pzRv`n7KTajqxRLa@&D_lHLg)gX(|}h@%Eo%) zbbT%f08GtY)xLyK2G@8(;se0kId`aYCBWM@nYz(t9xQHnBicxBA)_=w#?1F)_cZ7G zwWT)A86&}l5o_nvYeX+%XV6Ie0v5{wxLFARR*Ny&zpAQJMZ$4DeYjHpnrzcvl3|Lq z=s~}7|Lk>f*1&CDsEJN9oEVj%$koXqS|a62TXR%>$BGz^31;)YuEaM{UnhL=Dw5Ov z5u1VUmEceu-h%H7JGWS;COkW~3v6m#wDG|zk3XBsyHu}m606eBL2zV_7mOa=d4`zl zq=^*U`M|-vUyx5L%Y7r*tieD&7H-GqEYG_SSo1jM|JJ>DwB_VSrrV~>X~BKi9C-Bs zR>gAd5E02+zC7m|5SL(U+-Nxk+QB>wnsehwgL{R^cv3b|;VU+t7xr;H<=E7?== zg1V?x+YyB*RHxhatN6QL$B;eQwJmI$_WfTGE|)hE4+`cwpLGH-aWP~tB-bo7kb~L6 waUTAKkJ6dD#-wA8gsH<7i2SR8|B9K&b~qOoG+ILA{p}OL3g*A1k57L52Sowq=>Px# literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/fr-FR/images/phoneScreenshots/notifications.png b/fastlane/metadata/android/fr-FR/images/phoneScreenshots/notifications.png new file mode 100644 index 0000000000000000000000000000000000000000..8e302188c97e90d919971029e552354e46eaaaf0 GIT binary patch literal 317628 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

NGPtanh`oORK0fArS>M#pUVV31(8R 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�h# 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

xp%2yea{85*zi`BPL)Md!I682k36=Zv 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 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/fr-FR/short_description.txt b/fastlane/metadata/android/fr-FR/short_description.txt new file mode 100644 index 0000000000..2984f2c4c8 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/short_description.txt @@ -0,0 +1 @@ +Nostr Client pour Android \ No newline at end of file From fc2408b526a4c74c6cbbace43b41774da36b0aaa Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Fri, 12 May 2023 13:32:08 -0400 Subject: [PATCH 062/171] Correcting NPE from failing to load the thumbnail --- .../amethyst/ui/actions/NewPostView.kt | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt index 5795091163..393aea7ec9 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt @@ -3,6 +3,7 @@ package com.vitorpamplona.amethyst.ui.actions import android.graphics.Bitmap import android.net.Uri import android.os.Build +import android.util.Log import android.util.Size import android.widget.Toast import androidx.compose.foundation.BorderStroke @@ -82,6 +83,7 @@ fun NewPostView(onClose: () -> Unit, baseReplyTo: Note? = null, quote: Note? = n val keyboardController = LocalSoftwareKeyboardController.current val scroolState = rememberScrollState() + val scope = rememberCoroutineScope() LaunchedEffect(Unit) { postViewModel.load(account, baseReplyTo, quote) @@ -218,6 +220,11 @@ fun NewPostView(onClose: () -> Unit, baseReplyTo: Note? = null, quote: Note? = n }, onCancel = { postViewModel.contentToAddUrl = null + }, + onError = { + scope.launch { + postViewModel.imageUploadingError.emit(it) + } } ) } @@ -641,7 +648,8 @@ fun ImageVideoDescription( uri: Uri, defaultServer: ServersAvailable, onAdd: (String, ServersAvailable) -> Unit, - onCancel: () -> Unit + onCancel: () -> Unit, + onError: (String) -> Unit ) { val resolver = LocalContext.current.contentResolver val mediaType = resolver.getType(uri) ?: "" @@ -749,7 +757,12 @@ fun ImageVideoDescription( LaunchedEffect(key1 = uri) { scope.launch(Dispatchers.IO) { - bitmap = resolver.loadThumbnail(uri, Size(1200, 1000), null) + try { + bitmap = resolver.loadThumbnail(uri, Size(1200, 1000), null) + } catch (e: Exception) { + onError("Unable to load file") + Log.e("NewPostView", "Couldn't create thumbnail for $uri") + } } } From db9a0ebfa11fdb08b1c032164bcf93a244576972 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Fri, 12 May 2023 14:13:08 -0400 Subject: [PATCH 063/171] Protects against exceptions when creating keys with invalid bytearrays. --- .../vitorpamplona/amethyst/model/Account.kt | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index fe5cbba79c..bf66a5f436 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -877,23 +877,28 @@ class Account( null } - if (altPrivateKeyToUse != null && altPubkeyToUse != null) { - val altPubKeyFromPrivate = Utils.pubkeyCreate(altPrivateKeyToUse).toHexKey() + try { + if (altPrivateKeyToUse != null && altPubkeyToUse != null) { + val altPubKeyFromPrivate = Utils.pubkeyCreate(altPrivateKeyToUse).toHexKey() - if (altPubKeyFromPrivate == event.pubKey) { - val result = event.getPrivateZapEvent(altPrivateKeyToUse, altPubkeyToUse) + if (altPubKeyFromPrivate == event.pubKey) { + val result = event.getPrivateZapEvent(altPrivateKeyToUse, altPubkeyToUse) - if (result == null) { - Log.w( - "Private ZAP Decrypt", - "Fail to decrypt Zap from ${note.author?.toBestDisplayName()} ${note.idNote()}" - ) + if (result == null) { + Log.w( + "Private ZAP Decrypt", + "Fail to decrypt Zap from ${note.author?.toBestDisplayName()} ${note.idNote()}" + ) + } + result + } else { + null } - result } else { null } - } else { + } catch (e: Exception) { + Log.e("Account", "Failed to create pubkey for ZapRequest ${event.id}", e) null } } From 754ac9894b329c9cbd72b7d67eb9e14da9112510 Mon Sep 17 00:00:00 2001 From: Pextar <129750633+Pextar@users.noreply.github.com> Date: Fri, 12 May 2023 20:38:08 +0200 Subject: [PATCH 064/171] Delete values-sv --- app/src/main/res/values-sv | 1 - 1 file changed, 1 deletion(-) delete mode 100644 app/src/main/res/values-sv diff --git a/app/src/main/res/values-sv b/app/src/main/res/values-sv deleted file mode 100644 index 8b13789179..0000000000 --- a/app/src/main/res/values-sv +++ /dev/null @@ -1 +0,0 @@ - From 8fc0f5a8b8fdda9d2629832ef37e5655122adddf Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Fri, 12 May 2023 16:50:26 -0400 Subject: [PATCH 065/171] Removing shadowed variable --- .../com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt index 456bec7125..86dd8e0557 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt @@ -276,8 +276,8 @@ private fun AuthorPictureAndComment( (zapRequest.event as? LnZapRequestEvent)?.let { val decryptedContent = accountViewModel.decryptZap(zapRequest) if (decryptedContent != null) { - val author = LocalCache.getOrCreateUser(decryptedContent.pubKey) - content = Pair(author, decryptedContent.content) + val newAuthor = LocalCache.getOrCreateUser(decryptedContent.pubKey) + content = Pair(newAuthor, decryptedContent.content) } else { if (!zapRequest.event?.content().isNullOrBlank()) { content = Pair(author, zapRequest.event?.content()) From b51186de301e341bcd4c6191db3ac5ee29820101 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Fri, 12 May 2023 17:18:56 -0400 Subject: [PATCH 066/171] updated secp lib --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index c2aa849c9e..29060a9147 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,7 +115,7 @@ dependencies { implementation "androidx.biometric:biometric-ktx:1.2.0-alpha05" // Bitcoin secp256k1 bindings to Android - implementation 'fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.9.0' + implementation 'fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.10.0' // Nostr Base Protocol implementation('com.github.vitorpamplona.NostrPostr:nostrpostrlib:master-SNAPSHOT') { From 5db04ef2b038d32853876fb228a4e9d037f0b284 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sat, 13 May 2023 12:46:11 -0400 Subject: [PATCH 067/171] Allows the RichTextViewer to render before resolving urls. --- .../amethyst/ui/components/RichTextViewer.kt | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt index bc02931e50..2a497f1a08 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt @@ -44,11 +44,14 @@ import com.vitorpamplona.amethyst.service.nip19.Nip19 import com.vitorpamplona.amethyst.ui.note.NoteCompose import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.net.MalformedURLException import java.net.URISyntaxException import java.net.URL import java.util.regex.Pattern +import kotlin.time.ExperimentalTime +import kotlin.time.measureTimedValue val imageExtensions = listOf("png", "jpg", "gif", "bmp", "jpeg", "webp", "svg") val videoExtensions = listOf("mp4", "avi", "wmv", "mpg", "amv", "webm", "mov", "mp3") @@ -106,11 +109,12 @@ fun RichTextViewer( class RichTextViewerState( val content: String, - val urlSet: LinkedHashSet, + val urlSet: Set, val imagesForPager: Map, val imageList: List ) +@OptIn(ExperimentalTime::class) @Composable private fun RenderRegular( content: String, @@ -121,11 +125,13 @@ private fun RenderRegular( navController: NavController ) { var processedState by remember { - mutableStateOf(null) + mutableStateOf(RichTextViewerState(content, emptySet(), emptyMap(), emptyList())) } + val scope = rememberCoroutineScope() + LaunchedEffect(key1 = content) { - withContext(Dispatchers.IO) { + scope.launch(Dispatchers.IO) { val urls = UrlDetector(content, UrlDetectorOptions.Default).detect() val urlSet = urls.mapTo(LinkedHashSet(urls.size)) { it.originalUrl } val imagesForPager = urlSet.mapNotNull { fullUrl -> @@ -140,7 +146,8 @@ private fun RenderRegular( }.associateBy { it.url } val imageList = imagesForPager.values.toList() - processedState = RichTextViewerState(content, urlSet, imagesForPager, imageList) + if (urlSet.isNotEmpty()) + processedState = RichTextViewerState(content, urlSet, imagesForPager, imageList) } } From ea4e3e75d6549d02b2b6c4e43f40a0e4cbd83f58 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sat, 13 May 2023 12:46:34 -0400 Subject: [PATCH 068/171] Formatting --- .../vitorpamplona/amethyst/ui/components/RichTextViewer.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt index 2a497f1a08..17d165a3d1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt @@ -51,7 +51,6 @@ import java.net.URISyntaxException import java.net.URL import java.util.regex.Pattern import kotlin.time.ExperimentalTime -import kotlin.time.measureTimedValue val imageExtensions = listOf("png", "jpg", "gif", "bmp", "jpeg", "webp", "svg") val videoExtensions = listOf("mp4", "avi", "wmv", "mpg", "amv", "webm", "mov", "mp3") @@ -125,7 +124,7 @@ private fun RenderRegular( navController: NavController ) { var processedState by remember { - mutableStateOf(RichTextViewerState(content, emptySet(), emptyMap(), emptyList())) + mutableStateOf(RichTextViewerState(content, emptySet(), emptyMap(), emptyList())) } val scope = rememberCoroutineScope() @@ -146,8 +145,9 @@ private fun RenderRegular( }.associateBy { it.url } val imageList = imagesForPager.values.toList() - if (urlSet.isNotEmpty()) + if (urlSet.isNotEmpty()) { processedState = RichTextViewerState(content, urlSet, imagesForPager, imageList) + } } } From 3e69b81d81fb3b9a1a11cf5c043f9cb831ee2d45 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sat, 13 May 2023 12:46:57 -0400 Subject: [PATCH 069/171] Moves aspect ratio to the appropriate composable --- .../amethyst/ui/components/ZoomableContentView.kt | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableContentView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableContentView.kt index 5c34d567fa..bdecb38e27 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableContentView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableContentView.kt @@ -271,10 +271,6 @@ private fun UrlImageView( mutableStateOf(null) } - val ratio = remember { - aspectRatio(content.dim) - } - LaunchedEffect(key1 = content.url, key2 = imageState) { if (imageState is AsyncImagePainter.State.Success) { scope.launch(Dispatchers.IO) { @@ -284,10 +280,10 @@ private fun UrlImageView( } BoxWithConstraints(contentAlignment = Alignment.Center) { - val myModifier = mainImageModifier.also { - if (ratio != null) { - it.aspectRatio(ratio, maxHeight.isFinite) - } + val myModifier = mainImageModifier.run { + aspectRatio(content.dim)?.let { ratio -> + this.aspectRatio(ratio, maxHeight.isFinite) + } ?: this } val contentScale = if (maxHeight.isFinite) ContentScale.Fit else ContentScale.FillWidth From 6842d12b399182fe75b926be2213fd6c7350bec4 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sat, 13 May 2023 12:49:48 -0400 Subject: [PATCH 070/171] Turn FollowList into a ViewModel and a LocalCache LiveData into a SharedFlow (it was killing some coroutines that were supposed to finish) --- .../amethyst/model/LocalCache.kt | 11 +- .../ui/actions/JoinUserOrChannelView.kt | 13 +-- .../amethyst/ui/components/BundledUpdate.kt | 23 ++-- .../amethyst/ui/navigation/AppBottomBar.kt | 15 +-- .../amethyst/ui/navigation/AppTopBar.kt | 106 +++++++++++++----- .../amethyst/ui/screen/CardFeedViewModel.kt | 23 ++-- .../amethyst/ui/screen/FeedViewModel.kt | 25 +++-- .../amethyst/ui/screen/LnZapFeedViewModel.kt | 13 ++- .../amethyst/ui/screen/UserFeedViewModel.kt | 14 ++- .../amethyst/ui/screen/loggedIn/MainScreen.kt | 11 +- .../ui/screen/loggedIn/SearchScreen.kt | 14 +-- 11 files changed, 167 insertions(+), 101 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index 38f50ab203..7f7800a058 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -2,7 +2,6 @@ package com.vitorpamplona.amethyst.model import android.util.Log import androidx.core.net.toUri -import androidx.lifecycle.LiveData import com.fasterxml.jackson.databind.DeserializationFeature import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.vitorpamplona.amethyst.Amethyst @@ -11,6 +10,8 @@ import com.vitorpamplona.amethyst.service.relays.Relay import com.vitorpamplona.amethyst.ui.components.BundledInsert import fr.acinq.secp256k1.Hex import kotlinx.coroutines.* +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.asSharedFlow import nostr.postr.toNpub import java.io.ByteArrayInputStream import java.io.File @@ -969,16 +970,16 @@ object LocalCache { } } -class LocalCacheLiveData : LiveData>(setOf()) { +class LocalCacheLiveData { + private val _newEventBundles = MutableSharedFlow>() + val newEventBundles = _newEventBundles.asSharedFlow() // read-only public view // Refreshes observers in batches. private val bundler = BundledInsert(300, Dispatchers.IO) fun invalidateData(newNote: Note) { bundler.invalidateList(newNote) { bundledNewNotes -> - if (hasActiveObservers()) { - postValue(bundledNewNotes) - } + _newEventBundles.emit(bundledNewNotes) } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/JoinUserOrChannelView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/JoinUserOrChannelView.kt index 51dc0461d2..310eed8d11 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/JoinUserOrChannelView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/JoinUserOrChannelView.kt @@ -137,9 +137,6 @@ private fun RenderSeach( val onlineSearch = NostrSearchEventOrUserDataSource - val dbState = LocalCache.live.observeAsState() - val db = dbState.value ?: return - val lifeCycleOwner = LocalLifecycleOwner.current // Create a channel for processing search queries. @@ -147,10 +144,12 @@ private fun RenderSeach( Channel(Channel.CONFLATED) } - LaunchedEffect(db) { - withContext(Dispatchers.IO) { - if (searchBarViewModel.isSearching()) { - searchBarViewModel.invalidateData() + LaunchedEffect(Unit) { + scope.launch(Dispatchers.IO) { + LocalCache.live.newEventBundles.collect { + if (searchBarViewModel.isSearching()) { + searchBarViewModel.invalidateData() + } } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/BundledUpdate.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/BundledUpdate.kt index ea6dff88f1..05651dcbc4 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/BundledUpdate.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/BundledUpdate.kt @@ -8,8 +8,8 @@ import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import java.util.concurrent.LinkedBlockingQueue import java.util.concurrent.atomic.AtomicBoolean -import java.util.concurrent.atomic.AtomicReference /** * This class is designed to have a waiting time between two calls of invalidate @@ -54,23 +54,26 @@ class BundledInsert( val dispatcher: CoroutineDispatcher = Dispatchers.Default ) { private var onlyOneInBlock = AtomicBoolean() - private var atomicSet = AtomicReference>(setOf()) - - fun invalidateList(newObject: T, onUpdate: (Set) -> Unit) { - atomicSet.updateAndGet() { - it + newObject - } + private var queue = LinkedBlockingQueue() + fun invalidateList(newObject: T, onUpdate: suspend (Set) -> Unit) { + queue.put(newObject) if (onlyOneInBlock.getAndSet(true)) { return } val scope = CoroutineScope(Job() + dispatcher) - scope.launch { + scope.launch(Dispatchers.IO) { try { - onUpdate(atomicSet.getAndSet(emptySet())) + val mySet = mutableSetOf() + queue.drainTo(mySet) + onUpdate(mySet) + delay(delay) - onUpdate(atomicSet.getAndSet(emptySet())) + + mySet.clear() + queue.drainTo(mySet) + onUpdate(mySet) } finally { withContext(NonCancellable) { onlyOneInBlock.set(false) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt index 26f8721111..0d715b80e1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt @@ -41,7 +41,6 @@ import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import kotlin.time.ExperimentalTime val bottomNavigationItems = listOf( Route.Home, @@ -136,9 +135,10 @@ fun AppBottomBar(navController: NavHostController, accountViewModel: AccountView } } -@OptIn(ExperimentalTime::class) @Composable private fun NotifiableIcon(route: Route, selected: Boolean, accountViewModel: AccountViewModel) { + val scope = rememberCoroutineScope() + Box(Modifier.size(if ("Home" == route.base) 25.dp else 23.dp)) { Icon( painter = painterResource(id = route.icon), @@ -150,15 +150,10 @@ private fun NotifiableIcon(route: Route, selected: Boolean, accountViewModel: Ac val accountState by accountViewModel.accountLiveData.observeAsState() val account = accountState?.account ?: return - // Notification - val dbState = LocalCache.live.observeAsState() - val db = dbState.value ?: return - val notifState = NotificationCache.live.observeAsState() val notif = notifState.value ?: return var hasNewItems by remember { mutableStateOf(false) } - val scope = rememberCoroutineScope() LaunchedEffect(key1 = notif) { scope.launch(Dispatchers.IO) { @@ -166,9 +161,11 @@ private fun NotifiableIcon(route: Route, selected: Boolean, accountViewModel: Ac } } - LaunchedEffect(key1 = db) { + LaunchedEffect(Unit) { scope.launch(Dispatchers.IO) { - hasNewItems = route.hasNewItems(account, notif.cache, db) + LocalCache.live.newEventBundles.collect { + hasNewItems = route.hasNewItems(account, notif.cache, it) + } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt index b18aefcda3..1ebe2c4329 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt @@ -24,7 +24,6 @@ import androidx.compose.material.TopAppBar import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState @@ -40,6 +39,8 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavHostController import coil.Coil @@ -71,43 +72,45 @@ import com.vitorpamplona.amethyst.ui.components.RobohashAsyncImageProxy import com.vitorpamplona.amethyst.ui.screen.RelayPoolViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.SpinnerSelectionDialog +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @Composable -fun AppTopBar(navController: NavHostController, scaffoldState: ScaffoldState, accountViewModel: AccountViewModel) { +fun AppTopBar(followLists: FollowListViewModel, navController: NavHostController, scaffoldState: ScaffoldState, accountViewModel: AccountViewModel) { when (currentRoute(navController)?.substringBefore("?")) { // Route.Profile.route -> TopBarWithBackButton(navController) - Route.Home.base -> HomeTopBar(scaffoldState, accountViewModel) - Route.Video.base -> StoriesTopBar(scaffoldState, accountViewModel) - Route.Notification.base -> NotificationTopBar(scaffoldState, accountViewModel) + Route.Home.base -> HomeTopBar(followLists, scaffoldState, accountViewModel) + Route.Video.base -> StoriesTopBar(followLists, scaffoldState, accountViewModel) + Route.Notification.base -> NotificationTopBar(followLists, scaffoldState, accountViewModel) else -> MainTopBar(scaffoldState, accountViewModel) } } @Composable -fun StoriesTopBar(scaffoldState: ScaffoldState, accountViewModel: AccountViewModel) { +fun StoriesTopBar(followLists: FollowListViewModel, scaffoldState: ScaffoldState, accountViewModel: AccountViewModel) { GenericTopBar(scaffoldState, accountViewModel) { account -> - FollowList(account.defaultStoriesFollowList, account.userProfile(), true) { listName -> + FollowList(followLists, account.defaultStoriesFollowList, account.userProfile(), true) { listName -> account.changeDefaultStoriesFollowList(listName) } } } @Composable -fun HomeTopBar(scaffoldState: ScaffoldState, accountViewModel: AccountViewModel) { +fun HomeTopBar(followLists: FollowListViewModel, scaffoldState: ScaffoldState, accountViewModel: AccountViewModel) { GenericTopBar(scaffoldState, accountViewModel) { account -> - FollowList(account.defaultHomeFollowList, account.userProfile(), false) { listName -> + FollowList(followLists, account.defaultHomeFollowList, account.userProfile(), false) { listName -> account.changeDefaultHomeFollowList(listName) } } } @Composable -fun NotificationTopBar(scaffoldState: ScaffoldState, accountViewModel: AccountViewModel) { +fun NotificationTopBar(followLists: FollowListViewModel, scaffoldState: ScaffoldState, accountViewModel: AccountViewModel) { GenericTopBar(scaffoldState, accountViewModel) { account -> - FollowList(account.defaultNotificationFollowList, account.userProfile(), true) { listName -> + FollowList(followLists, account.defaultNotificationFollowList, account.userProfile(), true) { listName -> account.changeDefaultNotificationFollowList(listName) } } @@ -237,30 +240,19 @@ private fun LoggedInUserPictureDrawer( } @Composable -fun FollowList(listName: String, loggedIn: User, withGlobal: Boolean, onChange: (String) -> Unit) { - // Notification - val dbState = LocalCache.live.observeAsState() - val db = dbState.value ?: return - +fun FollowList(followListsModel: FollowListViewModel, listName: String, loggedIn: User, withGlobal: Boolean, onChange: (String) -> Unit) { val kind3Follow = Pair(KIND3_FOLLOWS, stringResource(id = R.string.follow_list_kind3follows)) val globalFollow = Pair(GLOBAL_FOLLOWS, stringResource(id = R.string.follow_list_global)) val defaultOptions = if (withGlobal) listOf(kind3Follow, globalFollow) else listOf(kind3Follow) - var followLists by remember { mutableStateOf(defaultOptions) } - val followNames = remember { derivedStateOf { followLists.map { it.second } } } + val followLists = remember(followListsModel.followLists) { + (defaultOptions + followListsModel.followLists) + } - LaunchedEffect(key1 = db) { - withContext(Dispatchers.IO) { - followLists = defaultOptions + LocalCache.addressables.mapNotNull { - val event = (it.value.event as? PeopleListEvent) - // Has to have an list - if (event != null && event.pubKey == loggedIn.pubkeyHex && (event.tags.size > 1 || event.content.length > 50)) { - Pair(event.dTag(), event.dTag()) - } else { - null - } - }.sortedBy { it.second } + val followNames = remember(followLists) { + derivedStateOf { + followLists.map { it.second } } } @@ -273,6 +265,62 @@ fun FollowList(listName: String, loggedIn: User, withGlobal: Boolean, onChange: ) } +class FollowListViewModel : ViewModel() { + var followLists by mutableStateOf>>(emptyList()) + var account: Account? = null + + fun load(account: Account?) { + this.account = account + refresh() + } + + fun refresh() { + val scope = CoroutineScope(Job() + Dispatchers.Default) + scope.launch { + refreshFollows() + } + } + + private suspend fun refreshFollows() { + val myAccount = account ?: return + + val newFollowLists = LocalCache.addressables.mapNotNull { + val event = (it.value.event as? PeopleListEvent) + // Has to have an list + if (event != null && event.pubKey == myAccount.userProfile().pubkeyHex && (event.tags.size > 1 || event.content.length > 50)) { + Pair(event.dTag(), event.dTag()) + } else { + null + } + }.sortedBy { it.second } + + withContext(Dispatchers.Main) { + if (followLists != newFollowLists) { + followLists = newFollowLists + } + } + } + + var collectorJob: Job? = null + + init { + collectorJob = viewModelScope.launch(Dispatchers.IO) { + LocalCache.live.newEventBundles.collect { newNotes -> + newNotes.forEach { + if (it.event is PeopleListEvent) { + refresh() + } + } + } + } + } + + override fun onCleared() { + collectorJob?.cancel() + super.onCleared() + } +} + @Composable fun SimpleTextSpinner( placeholder: String, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt index 70c152010d..47feb186d1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt @@ -3,6 +3,7 @@ package com.vitorpamplona.amethyst.ui.screen import android.util.Log import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.Note @@ -222,17 +223,19 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { } } - private val cacheListener: (Set) -> Unit = { newNotes -> - if (localFilter is AdditiveFeedFilter && _feedContent.value is CardFeedState.Loaded) { - invalidateInsertData(newNotes) - } else { - // Refresh Everything - invalidateData() - } - } + var collectorJob: Job? = null init { - LocalCache.live.observeForever(cacheListener) + collectorJob = viewModelScope.launch(Dispatchers.IO) { + LocalCache.live.newEventBundles.collect { newNotes -> + if (localFilter is AdditiveFeedFilter && _feedContent.value is CardFeedState.Loaded) { + invalidateInsertData(newNotes) + } else { + // Refresh Everything + invalidateData() + } + } + } } fun clear() { @@ -242,7 +245,7 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { override fun onCleared() { clear() - LocalCache.live.removeObserver(cacheListener) + collectorJob?.cancel() super.onCleared() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt index 1e512b4ace..a3f3da1a54 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt @@ -2,6 +2,7 @@ package com.vitorpamplona.amethyst.ui.screen import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.ui.components.BundledInsert @@ -124,21 +125,23 @@ abstract class FeedViewModel(val localFilter: FeedFilter) : ViewModel() { } } - private val cacheListener: (Set) -> Unit = { newNotes -> - if (localFilter is AdditiveFeedFilter && _feedContent.value is FeedState.Loaded) { - invalidateInsertData(newNotes) - } else { - // Refresh Everything - invalidateData() + var collectorJob: Job? = null + + init { + collectorJob = viewModelScope.launch(Dispatchers.IO) { + LocalCache.live.newEventBundles.collect { newNotes -> + if (localFilter is AdditiveFeedFilter && _feedContent.value is FeedState.Loaded) { + invalidateInsertData(newNotes) + } else { + // Refresh Everything + invalidateData() + } + } } } - init { - LocalCache.live.observeForever(cacheListener) - } - override fun onCleared() { - LocalCache.live.removeObserver(cacheListener) + collectorJob?.cancel() super.onCleared() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedViewModel.kt index 8c6806de81..f89aaaeb65 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedViewModel.kt @@ -2,6 +2,7 @@ package com.vitorpamplona.amethyst.ui.screen import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.ui.components.BundledUpdate @@ -67,16 +68,18 @@ open class LnZapFeedViewModel(val dataSource: FeedFilter>) : Vi bundler.invalidate() } - private val cacheListener: (Set) -> Unit = { newNotes -> - invalidateData() - } + var collectorJob: Job? = null init { - LocalCache.live.observeForever(cacheListener) + collectorJob = viewModelScope.launch(Dispatchers.IO) { + LocalCache.live.newEventBundles.collect { newNotes -> + invalidateData() + } + } } override fun onCleared() { - LocalCache.live.removeObserver(cacheListener) + collectorJob?.cancel() super.onCleared() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/UserFeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/UserFeedViewModel.kt index aae7fd3581..3b0173753f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/UserFeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/UserFeedViewModel.kt @@ -2,8 +2,8 @@ package com.vitorpamplona.amethyst.ui.screen import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.vitorpamplona.amethyst.model.LocalCache -import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.ui.components.BundledUpdate import com.vitorpamplona.amethyst.ui.dal.FeedFilter @@ -72,16 +72,18 @@ open class UserFeedViewModel(val dataSource: FeedFilter) : ViewModel() { bundler.invalidate() } - private val cacheListener: (Set) -> Unit = { newNotes -> - invalidateData() - } + var collectorJob: Job? = null init { - LocalCache.live.observeForever(cacheListener) + collectorJob = viewModelScope.launch(Dispatchers.IO) { + LocalCache.live.newEventBundles.collect { newNotes -> + invalidateData() + } + } } override fun onCleared() { - LocalCache.live.removeObserver(cacheListener) + collectorJob?.cancel() super.onCleared() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt index 54579a4d4f..e230e9d42a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt @@ -20,8 +20,11 @@ import androidx.compose.material.rememberScaffoldState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier +import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavHostController import androidx.navigation.compose.rememberNavController import com.vitorpamplona.amethyst.ui.buttons.ChannelFabColumn @@ -50,6 +53,12 @@ fun MainScreen(accountViewModel: AccountViewModel, accountStateViewModel: Accoun skipHalfExpanded = true ) + val accountState by accountViewModel.accountLiveData.observeAsState() + val account = remember(accountState) { accountState?.account } + + val followLists: FollowListViewModel = viewModel() + followLists.load(account) + ModalBottomSheetLayout( sheetState = sheetState, sheetContent = { @@ -64,7 +73,7 @@ fun MainScreen(accountViewModel: AccountViewModel, accountStateViewModel: Accoun AppBottomBar(navController, accountViewModel) }, topBar = { - AppTopBar(navController, scaffoldState, accountViewModel) + AppTopBar(followLists, navController, scaffoldState, accountViewModel) }, drawerContent = { DrawerContent(navController, scaffoldState, sheetState, accountViewModel) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt index 3a69e0a2d7..0a4bdedd13 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt @@ -191,19 +191,17 @@ private fun SearchBar(accountViewModel: AccountViewModel, navController: NavCont val onlineSearch = NostrSearchEventOrUserDataSource - val dbState = LocalCache.live.observeAsState() - val db = dbState.value ?: return - // Create a channel for processing search queries. val searchTextChanges = remember { CoroutineChannel(CoroutineChannel.CONFLATED) } - LaunchedEffect(db) { - withContext(Dispatchers.IO) { - if (searchBarViewModel.isSearching()) { - println("Search Active") - searchBarViewModel.invalidateData() + LaunchedEffect(Unit) { + scope.launch(Dispatchers.IO) { + LocalCache.live.newEventBundles.collect { + if (searchBarViewModel.isSearching()) { + searchBarViewModel.invalidateData() + } } } } From d2610032172bb26083d61ae2b8a09378b001d565 Mon Sep 17 00:00:00 2001 From: vivganes Date: Sun, 14 May 2023 23:39:42 +0530 Subject: [PATCH 071/171] fix #407 correct non-english hashtags --- .../vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt index 0a4bdedd13..9cd24bf61a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt @@ -335,7 +335,7 @@ private fun SearchBar(accountViewModel: AccountViewModel, navController: NavCont } } -val hashtagSearch = Pattern.compile("(?:\\s|\\A)#([A-Za-z0-9_\\-]+)") +val hashtagSearch = Pattern.compile("(?:\\s|\\A)#([^\\s!@#\$%^&*()=+./,\\[{\\]};:'\"?><]+)") fun findHashtags(content: String): List { val matcher = hashtagSearch.matcher(content) From f84501e40f777f35c74c79ebdd74a01598794971 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 14 May 2023 17:03:46 -0400 Subject: [PATCH 072/171] Improvements to Poll Caching system: Fixes https://github.com/vitorpamplona/amethyst/issues/406 --- .../com/vitorpamplona/amethyst/model/Note.kt | 6 +- .../amethyst/ui/components/BundledUpdate.kt | 6 +- .../amethyst/ui/note/PollNote.kt | 122 ++++++++---------- .../amethyst/ui/note/PollNoteViewModel.kt | 57 +++++--- 4 files changed, 104 insertions(+), 87 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt index c391efeb60..e8920e69f1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt @@ -411,9 +411,9 @@ class NoteLiveSet(u: Note) { class NoteLiveData(val note: Note) : LiveData(NoteState(note)) { // Refreshes observers in batches. private val bundler = BundledUpdate(300, Dispatchers.IO) { - if (hasActiveObservers()) { - postValue(NoteState(note)) - } + // if (hasObservers()) { + postValue(NoteState(note)) + // } } fun invalidateData() { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/BundledUpdate.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/BundledUpdate.kt index 05651dcbc4..2a1036fb9b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/BundledUpdate.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/BundledUpdate.kt @@ -71,9 +71,9 @@ class BundledInsert( delay(delay) - mySet.clear() - queue.drainTo(mySet) - onUpdate(mySet) + val mySet2 = mutableSetOf() + queue.drainTo(mySet2) + onUpdate(mySet2) } finally { withContext(NonCancellable) { onlyOneInBlock.set(false) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNote.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNote.kt index d5cbcd80b1..12342c2925 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNote.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNote.kt @@ -28,6 +28,7 @@ import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import androidx.compose.ui.window.Popup +import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.Note @@ -37,7 +38,6 @@ import com.vitorpamplona.amethyst.ui.theme.BitcoinOrange import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import java.math.BigDecimal import java.util.* import kotlin.math.roundToInt @@ -49,19 +49,45 @@ fun PollNote( accountViewModel: AccountViewModel, navController: NavController ) { - val zapsState by baseNote.live().zaps.observeAsState() - val zappedNote = zapsState?.note ?: return - val accountState by accountViewModel.accountLiveData.observeAsState() - val account = accountState?.account ?: return + val account = remember(accountState) { accountState?.account } ?: return - val pollViewModel = PollNoteViewModel() - pollViewModel.load(account, zappedNote) + val pollViewModel: PollNoteViewModel = viewModel() - pollViewModel.pollEvent?.pollOptions()?.forEach { poll_op -> + LaunchedEffect(key1 = baseNote) { + pollViewModel.load(account, baseNote) + } + + PollNote( + baseNote = baseNote, + pollViewModel = pollViewModel, + canPreview = canPreview, + backgroundColor = backgroundColor, + accountViewModel = accountViewModel, + navController = navController + ) +} + +@Composable +fun PollNote( + baseNote: Note, + pollViewModel: PollNoteViewModel, + canPreview: Boolean, + backgroundColor: Color, + accountViewModel: AccountViewModel, + navController: NavController +) { + val zapsState by baseNote.live().zaps.observeAsState() + + LaunchedEffect(key1 = zapsState) { + withContext(Dispatchers.IO) { + pollViewModel.refreshTallies() + } + } + + pollViewModel.tallies.forEach { poll_op -> OptionNote( - poll_op.key, - poll_op.value, + poll_op, pollViewModel, baseNote, accountViewModel, @@ -74,8 +100,7 @@ fun PollNote( @Composable private fun OptionNote( - optionNumber: Int, - optionText: String, + poolOption: PollOption, pollViewModel: PollNoteViewModel, baseNote: Note, accountViewModel: AccountViewModel, @@ -88,32 +113,17 @@ private fun OptionNote( modifier = Modifier.padding(vertical = 3.dp) ) { if (!pollViewModel.canZap()) { - val defaultColor = MaterialTheme.colors.primary.copy(alpha = 0.32f) - var optionTally by remember { mutableStateOf(Pair(BigDecimal.ZERO, defaultColor)) } - - LaunchedEffect(key1 = optionNumber, key2 = pollViewModel) { - withContext(Dispatchers.IO) { - val myTally = pollViewModel.optionVoteTally(optionNumber) - val color = if ( - pollViewModel.consensusThreshold != null && - myTally >= pollViewModel.consensusThreshold!! - ) { - Color.Green.copy(alpha = 0.32f) - } else { - defaultColor - } - - if (myTally > optionTally.first || color != optionTally.second) { - optionTally = Pair(myTally, color) - } - } + val color = if (poolOption.consensusThreadhold) { + Color.Green.copy(alpha = 0.32f) + } else { + MaterialTheme.colors.primary.copy(alpha = 0.32f) } ZapVote( baseNote, + poolOption, accountViewModel, pollViewModel, - optionNumber, nonClickablePrepend = { Box( Modifier @@ -121,14 +131,14 @@ private fun OptionNote( .clip(shape = RoundedCornerShape(15.dp)) .border( 2.dp, - optionTally.second, + color, RoundedCornerShape(15.dp) ) ) { LinearProgressIndicator( modifier = Modifier.matchParentSize(), - color = optionTally.second, - progress = optionTally.first.toFloat() + color = color, + progress = poolOption.tally.toFloat() ) Row( @@ -141,7 +151,7 @@ private fun OptionNote( .width(40.dp) ) { Text( - text = "${(optionTally.first.toFloat() * 100).roundToInt()}%", + text = "${(poolOption.tally.toFloat() * 100).roundToInt()}%", fontWeight = FontWeight.Bold ) } @@ -152,7 +162,7 @@ private fun OptionNote( .padding(15.dp) ) { TranslatableRichTextViewer( - optionText, + poolOption.descriptor, canPreview, Modifier, pollViewModel.pollEvent?.tags(), @@ -170,9 +180,9 @@ private fun OptionNote( } else { ZapVote( baseNote, + poolOption, accountViewModel, pollViewModel, - optionNumber, nonClickablePrepend = {}, clickablePrepend = { Box( @@ -186,7 +196,7 @@ private fun OptionNote( ) ) { TranslatableRichTextViewer( - optionText, + poolOption.descriptor, canPreview, Modifier.padding(15.dp), pollViewModel.pollEvent?.tags(), @@ -205,9 +215,9 @@ private fun OptionNote( @OptIn(ExperimentalFoundationApi::class) fun ZapVote( baseNote: Note, + poolOption: PollOption, accountViewModel: AccountViewModel, pollViewModel: PollNoteViewModel, - pollOption: Int, modifier: Modifier = Modifier, nonClickablePrepend: @Composable () -> Unit, clickablePrepend: @Composable () -> Unit @@ -264,7 +274,7 @@ fun ZapVote( ) .show() } - } else if (pollViewModel.isVoteAmountAtomic() && pollViewModel.isPollOptionZappedBy(pollOption, accountViewModel.userProfile())) { + } else if (pollViewModel.isVoteAmountAtomic() && poolOption.zappedByLoggedIn) { // only allow one vote per option when min==max, i.e. atomic vote amount specified scope.launch { Toast @@ -281,7 +291,7 @@ fun ZapVote( accountViewModel.zap( baseNote, account.zapAmountChoices.first() * 1000, - pollOption, + poolOption.option, "", context, onError = { @@ -311,7 +321,7 @@ fun ZapVote( baseNote, accountViewModel, pollViewModel, - pollOption, + poolOption.option, onDismiss = { wantsToZap = false zappingProgress = 0f @@ -335,17 +345,7 @@ fun ZapVote( clickablePrepend() - var optionWasZappedByLoggedInUser by remember { mutableStateOf(false) } - - LaunchedEffect(key1 = zapsState) { - withContext(Dispatchers.IO) { - if (!optionWasZappedByLoggedInUser) { - optionWasZappedByLoggedInUser = pollViewModel.isPollOptionZappedBy(pollOption, accountViewModel.userProfile()) - } - } - } - - if (optionWasZappedByLoggedInUser) { + if (poolOption.zappedByLoggedIn) { zappingProgress = 1f Icon( imageVector = Icons.Default.Bolt, @@ -372,20 +372,10 @@ fun ZapVote( } } - var wasZappedByLoggedInUser by remember { mutableStateOf(false) } - - LaunchedEffect(key1 = zapsState) { - withContext(Dispatchers.IO) { - if (!wasZappedByLoggedInUser) { - wasZappedByLoggedInUser = accountViewModel.calculateIfNoteWasZappedByAccount(zappedNote) - } - } - } - // only show tallies after a user has zapped note - if (baseNote.author == accountViewModel.userProfile() || wasZappedByLoggedInUser) { + if (baseNote.author == accountViewModel.userProfile() || pollViewModel.wasZappedByLoggedInAccount) { Text( - showAmount(pollViewModel.zappedPollOptionAmount(pollOption)), + showAmount(poolOption.zappedValue), fontSize = 14.sp, color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f), modifier = modifier diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNoteViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNoteViewModel.kt index 73c2738062..fa142446ba 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNoteViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNoteViewModel.kt @@ -1,5 +1,9 @@ package com.vitorpamplona.amethyst.ui.note +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.User @@ -8,19 +12,30 @@ import java.math.BigDecimal import java.math.RoundingMode import java.util.* -class PollNoteViewModel { +data class PollOption( + val option: Int, + val descriptor: String, + val zappedValue: BigDecimal, + val tally: BigDecimal, + val consensusThreadhold: Boolean, + val zappedByLoggedIn: Boolean +) + +class PollNoteViewModel : ViewModel() { var account: Account? = null private var pollNote: Note? = null var pollEvent: PollNoteEvent? = null - private var pollOptions: Map? = null + var pollOptions: Map? = null var valueMaximum: Int? = null var valueMinimum: Int? = null private var closedAt: Int? = null var consensusThreshold: BigDecimal? = null var totalZapped: BigDecimal = BigDecimal.ZERO - var wasZappedByAuthor: Boolean = false + var wasZappedByLoggedInAccount: Boolean = false + + var tallies by mutableStateOf>(emptyList()) fun load(acc: Account, note: Note?) { account = acc @@ -32,15 +47,35 @@ class PollNoteViewModel { consensusThreshold = pollEvent?.getTagInt(CONSENSUS_THRESHOLD)?.toFloat()?.div(100)?.toBigDecimal() closedAt = pollEvent?.getTagInt(CLOSED_AT) + refreshTallies() + } + + fun refreshTallies() { totalZapped = totalZapped() - wasZappedByAuthor = note?.let { account?.calculateIfNoteWasZappedByAccount(it) } ?: false + wasZappedByLoggedInAccount = pollNote?.let { account?.calculateIfNoteWasZappedByAccount(it) } ?: false + + tallies = pollOptions?.keys?.map { + val zappedInOption = zappedPollOptionAmount(it) + + val myTally = if (totalZapped.compareTo(BigDecimal.ZERO) > 0) { + zappedInOption.divide(totalZapped, 2, RoundingMode.HALF_UP) + } else { + BigDecimal.ZERO + } + + val zappedByLoggedIn = account?.userProfile()?.let { it1 -> isPollOptionZappedBy(it, it1) } ?: false + + val consensus = consensusThreshold != null && myTally >= consensusThreshold!! + + PollOption(it, pollOptions?.get(it) ?: "", zappedInOption, myTally, consensus, zappedByLoggedIn) + } ?: emptyList() } fun canZap(): Boolean { val account = account ?: return false val user = account.userProfile() ?: return false val note = pollNote ?: return false - return user != note.author && !wasZappedByAuthor + return user != note.author && !wasZappedByLoggedInAccount } fun isVoteAmountAtomic() = valueMaximum != null && valueMinimum != null && valueMinimum == valueMaximum @@ -88,14 +123,6 @@ class PollNoteViewModel { return false } - fun optionVoteTally(op: Int): BigDecimal { - return if (totalZapped.compareTo(BigDecimal.ZERO) > 0) { - zappedPollOptionAmount(op).divide(totalZapped, 2, RoundingMode.HALF_UP) - } else { - BigDecimal.ZERO - } - } - fun isPollOptionZappedBy(option: Int, user: User): Boolean { return pollNote!!.zaps .any { @@ -105,7 +132,7 @@ class PollNoteViewModel { } } - fun zappedPollOptionAmount(option: Int): BigDecimal { + private fun zappedPollOptionAmount(option: Int): BigDecimal { return pollNote?.zaps?.values?.sumOf { val event = it?.event as? LnZapEvent if (event?.zappedPollOption() == option) { @@ -116,7 +143,7 @@ class PollNoteViewModel { } ?: BigDecimal(0) } - fun totalZapped(): BigDecimal { + private fun totalZapped(): BigDecimal { return pollNote?.zaps?.values?.sumOf { val zapEvent = (it?.event as? LnZapEvent) From f40b6c394ca0439e18710e46da66672a0978b256 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 14 May 2023 17:22:22 -0400 Subject: [PATCH 073/171] v0.46.2 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 29060a9147..b413c2b859 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 155 - versionName "0.46.1" + versionCode 156 + versionName "0.46.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From cf9395d5e3827df2b65eaf498a018a166bc91d79 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 14 May 2023 18:12:04 -0400 Subject: [PATCH 074/171] Avoids Notification duplicates --- .../EventNotificationConsumer.kt | 4 ++-- .../notifications/NotificationUtils.kt | 20 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/EventNotificationConsumer.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/EventNotificationConsumer.kt index fd06198ae7..03be8b972a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/EventNotificationConsumer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/EventNotificationConsumer.kt @@ -46,7 +46,7 @@ class EventNotificationConsumer(private val applicationContext: Context) { val user = note.author?.toBestDisplayName() ?: "" val userPicture = note.author?.profilePicture() val noteUri = note.toNEvent() - notificationManager().sendDMNotification(content, user, userPicture, noteUri, applicationContext) + notificationManager().sendDMNotification(event.id, content, user, userPicture, noteUri, applicationContext) } } } @@ -88,7 +88,7 @@ class EventNotificationConsumer(private val applicationContext: Context) { } val userPicture = senderInfo?.first?.profilePicture() val noteUri = "nostr:Notifications" - notificationManager().sendZapNotification(content, title, userPicture, noteUri, applicationContext) + notificationManager().sendZapNotification(event.id, content, title, userPicture, noteUri, applicationContext) } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/NotificationUtils.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/NotificationUtils.kt index d8d5d5d0b7..36a5bcb847 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/NotificationUtils.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/notifications/NotificationUtils.kt @@ -15,10 +15,6 @@ import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.ui.MainActivity object NotificationUtils { - - // Notification ID. - private var notificationId = 0 - private var dmChannel: NotificationChannel? = null private var zapChannel: NotificationChannel? = null @@ -63,6 +59,7 @@ object NotificationUtils { } fun NotificationManager.sendZapNotification( + id: String, messageBody: String, messageTitle: String, pictureUrl: String?, @@ -72,10 +69,11 @@ object NotificationUtils { val zapChannel = getOrCreateZapChannel(applicationContext) val channelId = applicationContext.getString(R.string.app_notification_zaps_channel_id) - sendNotification(messageBody, messageTitle, pictureUrl, uri, channelId, applicationContext) + sendNotification(id, messageBody, messageTitle, pictureUrl, uri, channelId, applicationContext) } fun NotificationManager.sendDMNotification( + id: String, messageBody: String, messageTitle: String, pictureUrl: String?, @@ -85,10 +83,11 @@ object NotificationUtils { val dmChannel = getOrCreateDMChannel(applicationContext) val channelId = applicationContext.getString(R.string.app_notification_dms_channel_id) - sendNotification(messageBody, messageTitle, pictureUrl, uri, channelId, applicationContext) + sendNotification(id, messageBody, messageTitle, pictureUrl, uri, channelId, applicationContext) } fun NotificationManager.sendNotification( + id: String, messageBody: String, messageTitle: String, pictureUrl: String?, @@ -104,6 +103,7 @@ object NotificationUtils { val imageLoader = ImageLoader(applicationContext) val imageResult = imageLoader.executeBlocking(request) sendNotification( + id = id, messageBody = messageBody, messageTitle = messageTitle, picture = imageResult.drawable as? BitmapDrawable, @@ -113,6 +113,7 @@ object NotificationUtils { ) } else { sendNotification( + id = id, messageBody = messageBody, messageTitle = messageTitle, picture = null, @@ -124,6 +125,7 @@ object NotificationUtils { } private fun NotificationManager.sendNotification( + id: String, messageBody: String, messageTitle: String, picture: BitmapDrawable?, @@ -137,7 +139,7 @@ object NotificationUtils { val contentPendingIntent = PendingIntent.getActivity( applicationContext, - notificationId, + id.hashCode(), contentIntent, PendingIntent.FLAG_MUTABLE ) @@ -171,9 +173,7 @@ object NotificationUtils { .setPriority(NotificationCompat.PRIORITY_HIGH) .setAutoCancel(true) - notify(notificationId, builder.build()) - - notificationId++ + notify(id.hashCode(), builder.build()) } /** From c3a31fd31369465099d97a1a4278913184f8555c Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 14 May 2023 18:20:28 -0400 Subject: [PATCH 075/171] Update PRIVACY.md Adds the collection of the push notification token to the Privacy.MD --- PRIVACY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVACY.md b/PRIVACY.md index 7c481a0c4d..50504e609e 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -4,7 +4,7 @@ Effective as of Jan 20, 2023 for the distributed applications in the Play Store The Amethyst app for Android does not collect or process any personal information from its users. The app is used to connect to third-party Nostr servers (also called Relays) that may or may not collect personal information and are not covered by this privacy policy. Each third-party relay server comes equipped with its own privacy policy and terms of use that can be viewed through the app or through that server's website. The developers of this open source project or maintainers of the distribution channels (app stores) do not have access to the data located in the user's phone. Accounts are fully maintained by the user. We do not have control over them. -Data from connected accounts is only stored locally on the device when it is required for functionality and performance of Amethyst. This data is strictly confidental and cannot be accessed by other apps (on non-rooted devices). Phone data can be deleted by clearing Amethyst's local storage or uninstalling the app. +The app may collect a per-device token, your public key and a preferred Relay to connect to and provide push notification services through Google's Firebase Cloud Messaging. Other than that, the data from connected accounts is only stored locally on the device when it is required for functionality and performance of Amethyst. This data is strictly confidental and cannot be accessed by other apps (on non-rooted devices). Phone data can be deleted by clearing Amethyst's local storage or uninstalling the app. You cannot use the Amethyst app for Android to submit Objectionable Content to relays. Objectionable Content includes, but is not limited to: (i) sexually explicit materials; (ii) obscene, defamatory, libelous, slanderous, violent and/or unlawful content or profanity; (iii) content that infringes upon the rights of any third party, including copyright, trademark, privacy, publicity or other personal or proprietary right, or that is deceptive or fraudulent; (iv) content that promotes the use or sale of illegal or regulated substances, tobacco products, ammunition and/or firearms; and (v) illegal content related to gambling. From e5ff92c8045cbf03f2ee2db77d5ecb9bdc3f8ad7 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 14 May 2023 18:21:33 -0400 Subject: [PATCH 076/171] v0.46.3 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b413c2b859..b6f37be86b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 156 - versionName "0.46.2" + versionCode 157 + versionName "0.46.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From 814d05812aed8efa17863e6ac49802de7b3c7ffb Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 14 May 2023 18:59:33 -0400 Subject: [PATCH 077/171] Fixes image cropping opening the image dialog. --- .../amethyst/ui/components/ZoomableContentView.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableContentView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableContentView.kt index bdecb38e27..6eed487723 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableContentView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableContentView.kt @@ -219,7 +219,7 @@ private fun LocalImageView( it.aspectRatio(ratio, maxHeight.isFinite) } } - val contentScale = if (maxHeight.isFinite) ContentScale.Fit else ContentScale.FillWidth + val contentScale = if (maxHeight.isFinite) ContentScale.Inside else ContentScale.FillWidth if (content.localFile != null && content.localFile.exists()) { AsyncImage( @@ -285,7 +285,7 @@ private fun UrlImageView( this.aspectRatio(ratio, maxHeight.isFinite) } ?: this } - val contentScale = if (maxHeight.isFinite) ContentScale.Fit else ContentScale.FillWidth + val contentScale = if (maxHeight.isFinite) ContentScale.Inside else ContentScale.FillWidth AsyncImage( model = content.url, From 1c76b7a35c7b5ac2e18972ee540cf052daab203a Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 14 May 2023 18:59:49 -0400 Subject: [PATCH 078/171] Testing a not cropping version for videos. --- .../java/com/vitorpamplona/amethyst/ui/components/VideoView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt index 7a6441fcbe..11f0f70c50 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt @@ -89,7 +89,7 @@ fun VideoView(videoUri: Uri, description: String? = null, onDialog: ((Boolean) - ExoPlayer.Builder(context).build().apply { repeatMode = Player.REPEAT_MODE_ALL - videoScalingMode = C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING + videoScalingMode = C.VIDEO_SCALING_MODE_SCALE_TO_FIT volume = 0f if (videoUri.scheme?.startsWith("file") == true) { setMediaItem(media) From bbea28c6dfa3c416a59beaaf574b752a5836c0b9 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 14 May 2023 19:04:34 -0400 Subject: [PATCH 079/171] 0.46.4 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b6f37be86b..ffb3e068cd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 157 - versionName "0.46.3" + versionCode 158 + versionName "0.46.4" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From bf2949717c771af17d6e8aaf993094785826fcee Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 14 May 2023 20:24:11 -0400 Subject: [PATCH 080/171] Makes sure to only change the visible status when needed. --- .../com/vitorpamplona/amethyst/ui/components/VideoView.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt index 11f0f70c50..af8444a1fa 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt @@ -175,7 +175,10 @@ fun Modifier.onVisibilityChanges(onVisibilityChanges: (Boolean) -> Unit): Modifi } onGloballyPositioned { coordinates -> - isVisible = coordinates.isCompletelyVisible(view) + val newIsVisible = coordinates.isCompletelyVisible(view) + if (isVisible != newIsVisible) { + isVisible = newIsVisible + } } } From 0406632e9d814c0903f768c3b6492b298d37be4c Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 14 May 2023 20:24:41 -0400 Subject: [PATCH 081/171] Moves internal content changes to derived states. --- .../ui/components/ExpandableRichTextViewer.kt | 13 +++++++++---- .../amethyst/ui/components/RichTextViewer.kt | 2 -- .../ui/components/TranslatableRichTextViewer.kt | 9 +++++++-- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt index ba0d79464f..6488a63b88 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt @@ -13,6 +13,7 @@ import androidx.compose.material.ButtonDefaults import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -50,10 +51,14 @@ fun ExpandableRichTextViewer( minOf(firstSpaceAfterCut, firstNewLineAfterCut) } - val text = if (showFullText) { - content - } else { - content.take(whereToCut) + val text by remember { + derivedStateOf { + if (showFullText) { + content + } else { + content.take(whereToCut) + } + } } Box { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt index 17d165a3d1..a833e977da 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt @@ -50,7 +50,6 @@ import java.net.MalformedURLException import java.net.URISyntaxException import java.net.URL import java.util.regex.Pattern -import kotlin.time.ExperimentalTime val imageExtensions = listOf("png", "jpg", "gif", "bmp", "jpeg", "webp", "svg") val videoExtensions = listOf("mp4", "avi", "wmv", "mpg", "amv", "webm", "mov", "mp3") @@ -113,7 +112,6 @@ class RichTextViewerState( val imageList: List ) -@OptIn(ExperimentalTime::class) @Composable private fun RenderRegular( content: String, diff --git a/app/src/play/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt b/app/src/play/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt index 4c6e17a6ce..f7b6a1d150 100644 --- a/app/src/play/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt +++ b/app/src/play/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt @@ -14,6 +14,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Check import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf @@ -56,7 +57,7 @@ fun TranslatableRichTextViewer( var langSettingsPopupExpanded by remember { mutableStateOf(false) } val accountState by accountViewModel.accountLanguagesLiveData.observeAsState() - val account = accountState?.account ?: return + val account = remember(accountState) { accountState?.account } ?: return val scope = rememberCoroutineScope() @@ -78,7 +79,11 @@ fun TranslatableRichTextViewer( } } - val toBeViewed = if (showOriginal) content else translatedTextState.value.result ?: content + val toBeViewed by remember { + derivedStateOf { + if (showOriginal) content else translatedTextState.value.result ?: content + } + } Column() { ExpandableRichTextViewer( From 7cf0291b5a1657729b80411241a68b5809d8cdc0 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 14 May 2023 21:05:58 -0400 Subject: [PATCH 082/171] Applies remember functions to more parameters. --- .../amethyst/ui/components/UrlPreviewCard.kt | 13 ++++++++----- .../amethyst/ui/components/VideoView.kt | 4 ++-- .../amethyst/ui/components/ZoomableContentView.kt | 14 +++++++++----- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreviewCard.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreviewCard.kt index 561d86ab3c..88de0195be 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreviewCard.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreviewCard.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color @@ -41,13 +42,15 @@ fun UrlPreviewCard( ) ) { Column { - val validatedUrl = URL(previewInfo.url) + val validatedUrl = remember { URL(previewInfo.url) } // correctly treating relative images - val imageUrl = if (previewInfo.image.startsWith("/")) { - URL(validatedUrl, previewInfo.image).toString() - } else { - previewInfo.image + val imageUrl = remember { + if (previewInfo.image.startsWith("/")) { + URL(validatedUrl, previewInfo.image).toString() + } else { + previewInfo.image + } } AsyncImage( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt index af8444a1fa..40d1b72c7e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt @@ -116,9 +116,9 @@ fun VideoView(videoUri: Uri, description: String? = null, onDialog: ((Boolean) - .defaultMinSize(minHeight = 70.dp) .align(Alignment.Center) .onVisibilityChanges { visible -> - if (visible) { + if (visible && !exoPlayer.isPlaying) { exoPlayer.play() - } else { + } else if (!visible && exoPlayer.isPlaying) { exoPlayer.pause() } }, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableContentView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableContentView.kt index 6eed487723..d54b41ecce 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableContentView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableContentView.kt @@ -280,12 +280,16 @@ private fun UrlImageView( } BoxWithConstraints(contentAlignment = Alignment.Center) { - val myModifier = mainImageModifier.run { - aspectRatio(content.dim)?.let { ratio -> - this.aspectRatio(ratio, maxHeight.isFinite) - } ?: this + val myModifier = remember { + mainImageModifier.run { + aspectRatio(content.dim)?.let { ratio -> + this.aspectRatio(ratio, maxHeight.isFinite) + } ?: this + } + } + val contentScale = remember { + if (maxHeight.isFinite) ContentScale.Inside else ContentScale.FillWidth } - val contentScale = if (maxHeight.isFinite) ContentScale.Inside else ContentScale.FillWidth AsyncImage( model = content.url, From 4a8680e5824936c2f3762c81fad6283ae3e7ae0a Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 14 May 2023 21:06:06 -0400 Subject: [PATCH 083/171] 0.46.5 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ffb3e068cd..cdfdbec466 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 158 - versionName "0.46.4" + versionCode 159 + versionName "0.46.5" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From 32913915ce38e516d95011ddc651673efb8c03da Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 14 May 2023 22:22:22 -0400 Subject: [PATCH 084/171] Making sure remember does not interfere with translations. --- .../amethyst/ui/components/ExpandableRichTextViewer.kt | 2 +- .../ui/components/TranslatableRichTextViewer.kt | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt index 6488a63b88..8d622093f6 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt @@ -51,7 +51,7 @@ fun ExpandableRichTextViewer( minOf(firstSpaceAfterCut, firstNewLineAfterCut) } - val text by remember { + val text by remember(content) { derivedStateOf { if (showFullText) { content diff --git a/app/src/play/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt b/app/src/play/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt index f7b6a1d150..8e55bfcca1 100644 --- a/app/src/play/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt +++ b/app/src/play/java/com/vitorpamplona/amethyst/ui/components/TranslatableRichTextViewer.kt @@ -49,7 +49,7 @@ fun TranslatableRichTextViewer( accountViewModel: AccountViewModel, navController: NavController ) { - val translatedTextState = remember { + var translatedTextState by remember { mutableStateOf(ResultOrError(content, null, null, null)) } @@ -73,7 +73,7 @@ fun TranslatableRichTextViewer( val preference = account.preferenceBetween(task.result.sourceLang!!, task.result.targetLang!!) showOriginal = preference == task.result.sourceLang } - translatedTextState.value = task.result + translatedTextState = task.result } } } @@ -81,7 +81,7 @@ fun TranslatableRichTextViewer( val toBeViewed by remember { derivedStateOf { - if (showOriginal) content else translatedTextState.value.result ?: content + if (showOriginal) content else translatedTextState.result ?: content } } @@ -96,8 +96,8 @@ fun TranslatableRichTextViewer( navController ) - val target = translatedTextState.value.targetLang - val source = translatedTextState.value.sourceLang + val target = translatedTextState.targetLang + val source = translatedTextState.sourceLang if (source != null && target != null) { if (source != target) { From db6ebe609c0b6dcaf77b7fd6c275f094df44ce60 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 14 May 2023 22:22:53 -0400 Subject: [PATCH 085/171] Forces aspect ratio while obeying maxWidth and Height of the frame. --- .../ui/components/ZoomableContentView.kt | 40 ++++++++++++------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableContentView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableContentView.kt index d54b41ecce..055f31624a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableContentView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableContentView.kt @@ -17,9 +17,11 @@ import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.pager.PagerState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape @@ -209,17 +211,21 @@ private fun LocalImageView( mutableStateOf(null) } - val ratio = remember { - aspectRatio(content.dim) - } - BoxWithConstraints(contentAlignment = Alignment.Center) { - val myModifier = mainImageModifier.also { - if (ratio != null) { - it.aspectRatio(ratio, maxHeight.isFinite) - } + val myModifier = remember { + mainImageModifier + .widthIn(max = maxWidth) + .heightIn(max = maxHeight) + .run { + aspectRatio(content.dim)?.let { ratio -> + this.aspectRatio(ratio, false) + } ?: this + } + } + + val contentScale = remember { + if (maxHeight.isFinite) ContentScale.Fit else ContentScale.FillWidth } - val contentScale = if (maxHeight.isFinite) ContentScale.Inside else ContentScale.FillWidth if (content.localFile != null && content.localFile.exists()) { AsyncImage( @@ -281,14 +287,18 @@ private fun UrlImageView( BoxWithConstraints(contentAlignment = Alignment.Center) { val myModifier = remember { - mainImageModifier.run { - aspectRatio(content.dim)?.let { ratio -> - this.aspectRatio(ratio, maxHeight.isFinite) - } ?: this - } + mainImageModifier + .widthIn(max = maxWidth) + .heightIn(max = maxHeight) + .run { + aspectRatio(content.dim)?.let { ratio -> + this.aspectRatio(ratio, false) + } ?: this + } } + val contentScale = remember { - if (maxHeight.isFinite) ContentScale.Inside else ContentScale.FillWidth + if (maxHeight.isFinite) ContentScale.Fit else ContentScale.FillWidth } AsyncImage( From c973d941cc4669e6b1928ea6b2ba82ecf176bc0a Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 14 May 2023 22:23:37 -0400 Subject: [PATCH 086/171] v0.46.6 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index cdfdbec466..666eae2452 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 159 - versionName "0.46.5" + versionCode 160 + versionName "0.46.6" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From 32927040e30e366374c9ec32c7c46a973d0c7ea0 Mon Sep 17 00:00:00 2001 From: greenart7c3 <115044884+greenart7c3@users.noreply.github.com> Date: Mon, 15 May 2023 11:17:42 -0300 Subject: [PATCH 087/171] add longPress to edit tor/orbot settings --- .../amethyst/ui/navigation/DrawerContent.kt | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) 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 a25d4c8e2c..8b0501619f 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 @@ -1,9 +1,11 @@ package com.vitorpamplona.amethyst.ui.navigation +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable +import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -294,6 +296,12 @@ fun ListContent( title = textTorProxy, icon = R.drawable.ic_tor, tint = MaterialTheme.colors.onBackground, + onLongClick = { + coroutineScope.launch { + scaffoldState.drawerState.close() + } + conectOrbotDialogOpen = true + }, onClick = { if (checked) { disconnectTorDialog = true @@ -401,12 +409,16 @@ fun NavigationRow( }) } +@OptIn(ExperimentalFoundationApi::class) @Composable -fun IconRow(title: String, icon: Int, tint: Color, onClick: () -> Unit) { +fun IconRow(title: String, icon: Int, tint: Color, onClick: () -> Unit, onLongClick: (() -> Unit)? = null) { Row( modifier = Modifier .fillMaxWidth() - .clickable(onClick = onClick) + .combinedClickable( + onClick = onClick, + onLongClick = onLongClick + ) ) { Row( modifier = Modifier From 817a9c3e8d21ff94151287121a7ac6078d98053b Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 15 May 2023 11:15:32 -0400 Subject: [PATCH 088/171] Adds support for AudioTrack Types from (https://zapstr.live/) --- .../amethyst/model/LocalCache.kt | 13 +++ .../amethyst/service/NostrGlobalDataSource.kt | 3 +- .../service/NostrHashtagDataSource.kt | 3 +- .../amethyst/service/NostrHomeDataSource.kt | 5 +- .../service/NostrSingleEventDataSource.kt | 7 +- .../service/NostrUserProfileDataSource.kt | 2 +- .../amethyst/service/model/AudioTrackEvent.kt | 61 +++++++++++ .../service/model/BadgeDefinitionEvent.kt | 6 +- .../service/model/BadgeProfilesEvent.kt | 6 +- .../amethyst/service/model/Event.kt | 6 + .../service/model/GeneralListEvent.kt | 6 +- .../service/model/LnZapRequestEvent.kt | 2 +- .../service/model/LongTextNoteEvent.kt | 6 +- .../amethyst/service/model/MuteListEvent.kt | 6 +- .../amethyst/service/model/ReactionEvent.kt | 2 +- .../amethyst/service/model/ReportEvent.kt | 2 +- .../amethyst/service/model/RepostEvent.kt | 2 +- .../amethyst/ui/components/VideoView.kt | 50 ++++++++- .../amethyst/ui/dal/GlobalFeedFilter.kt | 2 +- .../ui/dal/HomeNewThreadFeedFilter.kt | 3 +- .../amethyst/ui/note/NoteCompose.kt | 103 ++++++++++++++++++ .../amethyst/ui/screen/ThreadFeedView.kt | 3 + 22 files changed, 266 insertions(+), 33 deletions(-) create mode 100644 app/src/main/java/com/vitorpamplona/amethyst/service/model/AudioTrackEvent.kt diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index 7f7800a058..ed3e9d0cf5 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -281,6 +281,18 @@ object LocalCache { refreshObservers(note) } + private fun consume(event: AudioTrackEvent) { + val note = getOrCreateAddressableNote(event.address()) + val author = getOrCreateUser(event.pubKey) + + // Already processed this event. + if (note.event != null) return + + note.loadEvent(event, author, emptyList()) + + refreshObservers(note) + } + fun consume(event: BadgeDefinitionEvent) { val note = getOrCreateAddressableNote(event.address()) val author = getOrCreateUser(event.pubKey) @@ -920,6 +932,7 @@ object LocalCache { try { when (event) { + is AudioTrackEvent -> consume(event) is BadgeAwardEvent -> consume(event) is BadgeDefinitionEvent -> consume(event) is BadgeProfilesEvent -> consume(event) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrGlobalDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrGlobalDataSource.kt index ebf3425dbb..735036304b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrGlobalDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrGlobalDataSource.kt @@ -1,5 +1,6 @@ package com.vitorpamplona.amethyst.service +import com.vitorpamplona.amethyst.service.model.AudioTrackEvent import com.vitorpamplona.amethyst.service.model.ChannelMessageEvent import com.vitorpamplona.amethyst.service.model.HighlightEvent import com.vitorpamplona.amethyst.service.model.LongTextNoteEvent @@ -13,7 +14,7 @@ object NostrGlobalDataSource : NostrDataSource("GlobalFeed") { fun createGlobalFilter() = TypedFilter( types = setOf(FeedType.GLOBAL), filter = JsonFilter( - kinds = listOf(TextNoteEvent.kind, PollNoteEvent.kind, ChannelMessageEvent.kind, LongTextNoteEvent.kind, HighlightEvent.kind), + kinds = listOf(TextNoteEvent.kind, PollNoteEvent.kind, ChannelMessageEvent.kind, AudioTrackEvent.kind, LongTextNoteEvent.kind, HighlightEvent.kind), limit = 200 ) ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHashtagDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHashtagDataSource.kt index e4233c1067..9b278e09c1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHashtagDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHashtagDataSource.kt @@ -3,6 +3,7 @@ package com.vitorpamplona.amethyst.service import androidx.compose.ui.text.capitalize import com.vitorpamplona.amethyst.service.model.ChannelMessageEvent import com.vitorpamplona.amethyst.service.model.LongTextNoteEvent +import com.vitorpamplona.amethyst.service.model.PollNoteEvent import com.vitorpamplona.amethyst.service.model.TextNoteEvent import com.vitorpamplona.amethyst.service.relays.COMMON_FEED_TYPES import com.vitorpamplona.amethyst.service.relays.JsonFilter @@ -25,7 +26,7 @@ object NostrHashtagDataSource : NostrDataSource("SingleHashtagFeed") { hashToLoad.capitalize() ) ), - kinds = listOf(TextNoteEvent.kind, ChannelMessageEvent.kind, LongTextNoteEvent.kind), + kinds = listOf(TextNoteEvent.kind, ChannelMessageEvent.kind, LongTextNoteEvent.kind, LongTextNoteEvent.kind, PollNoteEvent.kind), limit = 200 ) ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt index d831512057..a4277b5766 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt @@ -2,6 +2,7 @@ package com.vitorpamplona.amethyst.service import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.UserState +import com.vitorpamplona.amethyst.service.model.AudioTrackEvent import com.vitorpamplona.amethyst.service.model.HighlightEvent import com.vitorpamplona.amethyst.service.model.LongTextNoteEvent import com.vitorpamplona.amethyst.service.model.PollNoteEvent @@ -56,7 +57,7 @@ object NostrHomeDataSource : NostrDataSource("HomeFeed") { return TypedFilter( types = setOf(FeedType.FOLLOWS), filter = JsonFilter( - kinds = listOf(TextNoteEvent.kind, LongTextNoteEvent.kind, PollNoteEvent.kind, HighlightEvent.kind), + kinds = listOf(TextNoteEvent.kind, LongTextNoteEvent.kind, PollNoteEvent.kind, HighlightEvent.kind, AudioTrackEvent.kind), authors = followSet, limit = 400, since = latestEOSEs.users[account.userProfile()]?.followList?.get(account.defaultHomeFollowList)?.relayList @@ -72,7 +73,7 @@ object NostrHomeDataSource : NostrDataSource("HomeFeed") { return TypedFilter( types = setOf(FeedType.FOLLOWS), filter = JsonFilter( - kinds = listOf(TextNoteEvent.kind, LongTextNoteEvent.kind, HighlightEvent.kind), + kinds = listOf(TextNoteEvent.kind, LongTextNoteEvent.kind, HighlightEvent.kind, AudioTrackEvent.kind), tags = mapOf( "t" to hashToLoad.map { listOf(it, it.lowercase(), it.uppercase(), it.capitalize()) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt index e1b663965f..41edd2886b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt @@ -29,7 +29,7 @@ object NostrSingleEventDataSource : NostrDataSource("SingleEventFeed") { ReactionEvent.kind, RepostEvent.kind, ReportEvent.kind, LnZapEvent.kind, LnZapRequestEvent.kind, BadgeAwardEvent.kind, BadgeDefinitionEvent.kind, BadgeProfilesEvent.kind, - PollNoteEvent.kind + PollNoteEvent.kind, AudioTrackEvent.kind ), tags = mapOf("a" to listOf(aTag.toTag())), since = it.lastReactionsDownloadTime @@ -80,7 +80,8 @@ object NostrSingleEventDataSource : NostrDataSource("SingleEventFeed") { LnZapEvent.kind, LnZapRequestEvent.kind, PollNoteEvent.kind, - HighlightEvent.kind + HighlightEvent.kind, + AudioTrackEvent.kind ), tags = mapOf("e" to listOf(it.idHex)), since = it.lastReactionsDownloadTime @@ -119,7 +120,7 @@ object NostrSingleEventDataSource : NostrDataSource("SingleEventFeed") { BadgeDefinitionEvent.kind, BadgeAwardEvent.kind, BadgeProfilesEvent.kind, PrivateDmEvent.kind, FileHeaderEvent.kind, FileStorageEvent.kind, FileStorageHeaderEvent.kind, - HighlightEvent.kind + HighlightEvent.kind, AudioTrackEvent.kind ), ids = interestedEvents.toList() ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt index 49d4e2bc46..2246c7c805 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt @@ -28,7 +28,7 @@ object NostrUserProfileDataSource : NostrDataSource("UserProfileFeed") { TypedFilter( types = COMMON_FEED_TYPES, filter = JsonFilter( - kinds = listOf(TextNoteEvent.kind, RepostEvent.kind, LongTextNoteEvent.kind, PollNoteEvent.kind, HighlightEvent.kind), + kinds = listOf(TextNoteEvent.kind, RepostEvent.kind, LongTextNoteEvent.kind, AudioTrackEvent.kind, PollNoteEvent.kind, HighlightEvent.kind), authors = listOf(it.pubkeyHex), limit = 200 ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/AudioTrackEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/AudioTrackEvent.kt new file mode 100644 index 0000000000..82dc30aa0f --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/AudioTrackEvent.kt @@ -0,0 +1,61 @@ +package com.vitorpamplona.amethyst.service.model + +import com.vitorpamplona.amethyst.model.HexKey +import com.vitorpamplona.amethyst.model.toHexKey +import nostr.postr.Utils +import java.util.Date + +class AudioTrackEvent( + id: HexKey, + pubKey: HexKey, + createdAt: Long, + tags: List>, + content: String, + sig: HexKey +) : Event(id, pubKey, createdAt, kind, tags, content, sig), AddressableEvent { + + override fun dTag() = tags.firstOrNull { it.size > 1 && it[0] == "d" }?.get(1) ?: "" + override fun address() = ATag(kind, pubKey, dTag(), null) + + fun participants() = tags.filter { it.size > 1 && it[0] == "p" }.map { Participant(it[1], it.getOrNull(2)) } + fun type() = tags.firstOrNull { it.size > 1 && it[0] == TYPE }?.get(1) + fun price() = tags.firstOrNull { it.size > 1 && it[0] == PRICE }?.get(1) + fun cover() = tags.firstOrNull { it.size > 1 && it[0] == COVER }?.get(1) + fun subject() = tags.firstOrNull { it.size > 1 && it[0] == SUBJECT }?.get(1) + fun media() = tags.firstOrNull { it.size > 1 && it[0] == MEDIA }?.get(1) + + companion object { + const val kind = 31337 + + private const val TYPE = "c" + private const val PRICE = "price" + private const val COVER = "cover" + private const val SUBJECT = "subject" + private const val MEDIA = "media" + + fun create( + type: String, + media: String, + price: String? = null, + cover: String? = null, + subject: String? = null, + privateKey: ByteArray, + createdAt: Long = Date().time / 1000 + ): AudioTrackEvent { + val tags = listOfNotNull( + listOf(MEDIA, media), + listOf(TYPE, type), + price?.let { listOf(PRICE, it) }, + cover?.let { listOf(COVER, it) }, + subject?.let { listOf(SUBJECT, it) } + ) + + val pubKey = Utils.pubkeyCreate(privateKey).toHexKey() + val id = generateId(pubKey, createdAt, kind, tags, "") + val sig = Utils.sign(id, privateKey) + return AudioTrackEvent(id.toHexKey(), pubKey, createdAt, tags, "", sig.toHexKey()) + } + } +} + +data class Participant(val key: String, val role: String?) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeDefinitionEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeDefinitionEvent.kt index 42f5598775..5e8be53504 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeDefinitionEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeDefinitionEvent.kt @@ -9,9 +9,9 @@ class BadgeDefinitionEvent( tags: List>, content: String, sig: HexKey -) : Event(id, pubKey, createdAt, kind, tags, content, sig) { - fun dTag() = tags.firstOrNull { it.size > 1 && it[0] == "d" }?.get(1) ?: "" - fun address() = ATag(kind, pubKey, dTag(), null) +) : Event(id, pubKey, createdAt, kind, tags, content, sig), AddressableEvent { + override fun dTag() = tags.firstOrNull { it.size > 1 && it[0] == "d" }?.get(1) ?: "" + override fun address() = ATag(kind, pubKey, dTag(), null) fun name() = tags.firstOrNull { it.size > 1 && it[0] == "name" }?.get(1) fun thumb() = tags.firstOrNull { it.size > 1 && it[0] == "thumb" }?.get(1) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeProfilesEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeProfilesEvent.kt index 4995c413ba..f616bb7a44 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeProfilesEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeProfilesEvent.kt @@ -9,7 +9,7 @@ class BadgeProfilesEvent( tags: List>, content: String, sig: HexKey -) : Event(id, pubKey, createdAt, kind, tags, content, sig) { +) : Event(id, pubKey, createdAt, kind, tags, content, sig), AddressableEvent { fun badgeAwardEvents() = tags.filter { it.firstOrNull() == "e" }.mapNotNull { it.getOrNull(1) } fun badgeAwardDefinitions() = tags.filter { it.firstOrNull() == "a" }.mapNotNull { val aTagValue = it.getOrNull(1) @@ -18,8 +18,8 @@ class BadgeProfilesEvent( if (aTagValue != null) ATag.parse(aTagValue, relay) else null } - fun dTag() = tags.filter { it.firstOrNull() == "d" }.mapNotNull { it.getOrNull(1) }.firstOrNull() ?: "" - fun address() = ATag(kind, pubKey, dTag(), null) + override fun dTag() = tags.filter { it.firstOrNull() == "d" }.mapNotNull { it.getOrNull(1) }.firstOrNull() ?: "" + override fun address() = ATag(kind, pubKey, dTag(), null) companion object { const val kind = 30008 diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt index 6747b1f13e..38a99ac765 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt @@ -220,6 +220,7 @@ open class Event( fun fromJson(json: JsonElement, lenient: Boolean = false): Event = gson.fromJson(json, Event::class.java).getRefinedEvent(lenient) fun Event.getRefinedEvent(lenient: Boolean = false): Event = when (kind) { + AudioTrackEvent.kind -> AudioTrackEvent(id, pubKey, createdAt, tags, content, sig) BadgeAwardEvent.kind -> BadgeAwardEvent(id, pubKey, createdAt, tags, content, sig) BadgeDefinitionEvent.kind -> BadgeDefinitionEvent(id, pubKey, createdAt, tags, content, sig) BadgeProfilesEvent.kind -> BadgeProfilesEvent(id, pubKey, createdAt, tags, content, sig) @@ -282,3 +283,8 @@ open class Event( } } } + +interface AddressableEvent { + fun dTag(): String + fun address(): ATag +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/GeneralListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/GeneralListEvent.kt index cbb8b2facb..57cadcd66c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/GeneralListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/GeneralListEvent.kt @@ -14,9 +14,9 @@ abstract class GeneralListEvent( tags: List>, content: String, sig: HexKey -) : Event(id, pubKey, createdAt, kind, tags, content, sig) { - fun dTag() = tags.filter { it.firstOrNull() == "d" }.mapNotNull { it.getOrNull(1) }.firstOrNull() ?: "" - fun address() = ATag(kind, pubKey, dTag(), null) +) : Event(id, pubKey, createdAt, kind, tags, content, sig), AddressableEvent { + override fun dTag() = tags.filter { it.firstOrNull() == "d" }.mapNotNull { it.getOrNull(1) }.firstOrNull() ?: "" + override fun address() = ATag(kind, pubKey, dTag(), null) fun category() = dTag() fun bookmarkedPosts() = taggedEvents() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapRequestEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapRequestEvent.kt index 8586849a6a..eeb2bb81a5 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapRequestEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapRequestEvent.kt @@ -71,7 +71,7 @@ class LnZapRequestEvent( listOf("p", originalNote.pubKey()), listOf("relays") + relays ) - if (originalNote is LongTextNoteEvent) { + if (originalNote is AddressableEvent) { tags = tags + listOf(listOf("a", originalNote.address().toTag())) } if (pollOption != null && pollOption >= 0) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LongTextNoteEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LongTextNoteEvent.kt index 46f136248b..529c96fd3b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LongTextNoteEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LongTextNoteEvent.kt @@ -12,9 +12,9 @@ class LongTextNoteEvent( tags: List>, content: String, sig: HexKey -) : BaseTextNoteEvent(id, pubKey, createdAt, kind, tags, content, sig) { - fun dTag() = tags.filter { it.firstOrNull() == "d" }.mapNotNull { it.getOrNull(1) }.firstOrNull() ?: "" - fun address() = ATag(kind, pubKey, dTag(), null) +) : BaseTextNoteEvent(id, pubKey, createdAt, kind, tags, content, sig), AddressableEvent { + override fun dTag() = tags.filter { it.firstOrNull() == "d" }.mapNotNull { it.getOrNull(1) }.firstOrNull() ?: "" + override fun address() = ATag(kind, pubKey, dTag(), null) fun topics() = tags.filter { it.firstOrNull() == "t" }.mapNotNull { it.getOrNull(1) } fun title() = tags.filter { it.firstOrNull() == "title" }.mapNotNull { it.getOrNull(1) }.firstOrNull() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/MuteListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/MuteListEvent.kt index a9f639a367..9774888362 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/MuteListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/MuteListEvent.kt @@ -15,9 +15,9 @@ class MuteListEvent( tags: List>, content: String, sig: HexKey -) : Event(id, pubKey, createdAt, kind, tags, content, sig) { - fun dTag() = tags.filter { it.firstOrNull() == "d" }.mapNotNull { it.getOrNull(1) }.firstOrNull() ?: "" - fun address() = ATag(kind, pubKey, dTag(), null) +) : Event(id, pubKey, createdAt, kind, tags, content, sig), AddressableEvent { + override fun dTag() = tags.filter { it.firstOrNull() == "d" }.mapNotNull { it.getOrNull(1) }.firstOrNull() ?: "" + override fun address() = ATag(kind, pubKey, dTag(), null) fun plainContent(privKey: ByteArray): String? { return try { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt index 13188520c4..91b34d4e72 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt @@ -32,7 +32,7 @@ class ReactionEvent( val pubKey = Utils.pubkeyCreate(privateKey).toHexKey() var tags = listOf(listOf("e", originalNote.id()), listOf("p", originalNote.pubKey())) - if (originalNote is LongTextNoteEvent) { + if (originalNote is AddressableEvent) { tags = tags + listOf(listOf("a", originalNote.address().toTag())) } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReportEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReportEvent.kt index d3bd9dd97a..b05e55870c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReportEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReportEvent.kt @@ -63,7 +63,7 @@ class ReportEvent( val pubKey = Utils.pubkeyCreate(privateKey).toHexKey() var tags: List> = listOf(reportPostTag, reportAuthorTag) - if (reportedPost is LongTextNoteEvent) { + if (reportedPost is AddressableEvent) { tags = tags + listOf(listOf("a", reportedPost.address().toTag())) } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt index d5e0f1eb91..c00c67617e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt @@ -36,7 +36,7 @@ class RepostEvent( val pubKey = Utils.pubkeyCreate(privateKey).toHexKey() var tags: List> = boostedPost.tags().plus(listOf(replyToPost, replyToAuthor)) - if (boostedPost is LongTextNoteEvent) { + if (boostedPost is AddressableEvent) { tags = tags + listOf(listOf("a", boostedPost.address().toTag())) } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt index 40d1b72c7e..909b366a71 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/VideoView.kt @@ -1,6 +1,8 @@ package com.vitorpamplona.amethyst.ui.components +import android.graphics.drawable.Drawable import android.net.Uri +import android.util.Log import android.view.View import android.view.ViewGroup import android.widget.FrameLayout @@ -28,6 +30,7 @@ import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment @@ -46,6 +49,8 @@ import androidx.compose.ui.viewinterop.AndroidView import androidx.core.net.toUri import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver +import coil.imageLoader +import coil.request.ImageRequest import com.google.android.exoplayer2.C import com.google.android.exoplayer2.ExoPlayer import com.google.android.exoplayer2.MediaItem @@ -55,6 +60,8 @@ import com.google.android.exoplayer2.source.ProgressiveMediaSource import com.google.android.exoplayer2.ui.AspectRatioFrameLayout import com.google.android.exoplayer2.ui.StyledPlayerView import com.vitorpamplona.amethyst.VideoCache +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import java.io.File public var muted = mutableStateOf(true) @@ -62,20 +69,55 @@ public var muted = mutableStateOf(true) @Composable fun VideoView(localFile: File?, description: String? = null, onDialog: ((Boolean) -> Unit)? = null) { if (localFile != null) { - VideoView(localFile.toUri(), description, onDialog) + VideoView(localFile.toUri(), description, null, onDialog) } } @Composable fun VideoView(videoUri: String, description: String? = null, onDialog: ((Boolean) -> Unit)? = null) { - VideoView(Uri.parse(videoUri), description, onDialog) + VideoView(Uri.parse(videoUri), description, null, onDialog) } @Composable -fun VideoView(videoUri: Uri, description: String? = null, onDialog: ((Boolean) -> Unit)? = null) { +fun VideoView(videoUri: String, description: String? = null, thumbUri: String, onDialog: ((Boolean) -> Unit)? = null) { + var loadingFinished by remember { mutableStateOf>(Pair(false, null)) } + + val context = LocalContext.current + val scope = rememberCoroutineScope() + + LaunchedEffect(Unit) { + scope.launch(Dispatchers.IO) { + try { + val request = ImageRequest.Builder(context).data(thumbUri).build() + val myCover = context.imageLoader.execute(request).drawable + if (myCover != null) { + loadingFinished = Pair(true, myCover) + } else { + loadingFinished = Pair(true, null) + } + } catch (e: Exception) { + Log.e("VideoView", "Fail to load cover $thumbUri", e) + loadingFinished = Pair(true, null) + } + } + } + + if (loadingFinished.first) { + if (loadingFinished.second != null) { + VideoView(Uri.parse(videoUri), description, loadingFinished.second, onDialog) + } else { + VideoView(videoUri, description, onDialog) + } + } +} + +@Composable +fun VideoView(videoUri: Uri, description: String? = null, thumb: Drawable? = null, onDialog: ((Boolean) -> Unit)? = null) { val context = LocalContext.current val lifecycleOwner = rememberUpdatedState(LocalLifecycleOwner.current) + println("loading audio with artwork $thumb") + val exoPlayer = remember(videoUri) { val mediaBuilder = MediaItem.Builder().setUri(videoUri) @@ -130,6 +172,7 @@ fun VideoView(videoUri: Uri, description: String? = null, onDialog: ((Boolean) - ViewGroup.LayoutParams.WRAP_CONTENT ) controllerAutoShow = false + thumb?.let { defaultArtwork = thumb } hideController() resizeMode = if (maxHeight.isFinite) AspectRatioFrameLayout.RESIZE_MODE_FIT else AspectRatioFrameLayout.RESIZE_MODE_FIXED_WIDTH onDialog?.let { innerOnDialog -> @@ -146,7 +189,6 @@ fun VideoView(videoUri: Uri, description: String? = null, onDialog: ((Boolean) - muted.value = !muted.value } } - ) { val observer = LifecycleEventObserver { _, event -> when (event) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/GlobalFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/GlobalFeedFilter.kt index aa37f11abf..e048b2e356 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/GlobalFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/GlobalFeedFilter.kt @@ -27,7 +27,7 @@ object GlobalFeedFilter : AdditiveFeedFilter() { return collection .asSequence() .filter { - it.event is BaseTextNoteEvent && it.replyTo.isNullOrEmpty() + (it.event is BaseTextNoteEvent || it.event is AudioTrackEvent) && it.replyTo.isNullOrEmpty() } .filter { val channel = it.channelHex() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeNewThreadFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeNewThreadFeedFilter.kt index fcd1750209..055513180e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeNewThreadFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeNewThreadFeedFilter.kt @@ -3,6 +3,7 @@ package com.vitorpamplona.amethyst.ui.dal import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.service.model.AudioTrackEvent import com.vitorpamplona.amethyst.service.model.HighlightEvent import com.vitorpamplona.amethyst.service.model.LongTextNoteEvent import com.vitorpamplona.amethyst.service.model.PollNoteEvent @@ -30,7 +31,7 @@ object HomeNewThreadFeedFilter : AdditiveFeedFilter() { return collection .asSequence() .filter { it -> - (it.event is TextNoteEvent || it.event is RepostEvent || it.event is LongTextNoteEvent || it.event is PollNoteEvent || it.event is HighlightEvent) && + (it.event is TextNoteEvent || it.event is RepostEvent || it.event is LongTextNoteEvent || it.event is PollNoteEvent || it.event is HighlightEvent || it.event is AudioTrackEvent) && (it.author?.pubkeyHex in followingKeySet || (it.event?.isTaggedHashes(followingTagSet) ?: false)) && // && account.isAcceptable(it) // This filter follows only. No need to check if acceptable it.author?.let { !account.isHidden(it.pubkeyHex) } ?: true && diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index d1d224dbb3..f028c90253 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -66,6 +66,7 @@ import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.capitalize import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow @@ -87,6 +88,7 @@ import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.NoteState import com.vitorpamplona.amethyst.model.User +import com.vitorpamplona.amethyst.service.model.AudioTrackEvent import com.vitorpamplona.amethyst.service.model.BadgeAwardEvent import com.vitorpamplona.amethyst.service.model.BadgeDefinitionEvent import com.vitorpamplona.amethyst.service.model.ChannelCreateEvent @@ -97,6 +99,7 @@ import com.vitorpamplona.amethyst.service.model.FileHeaderEvent import com.vitorpamplona.amethyst.service.model.FileStorageHeaderEvent import com.vitorpamplona.amethyst.service.model.HighlightEvent import com.vitorpamplona.amethyst.service.model.LongTextNoteEvent +import com.vitorpamplona.amethyst.service.model.Participant import com.vitorpamplona.amethyst.service.model.PeopleListEvent import com.vitorpamplona.amethyst.service.model.PollNoteEvent import com.vitorpamplona.amethyst.service.model.PrivateDmEvent @@ -113,6 +116,7 @@ import com.vitorpamplona.amethyst.ui.components.RobohashAsyncImage import com.vitorpamplona.amethyst.ui.components.RobohashAsyncImageProxy import com.vitorpamplona.amethyst.ui.components.RobohashFallbackAsyncImage import com.vitorpamplona.amethyst.ui.components.TranslatableRichTextViewer +import com.vitorpamplona.amethyst.ui.components.VideoView import com.vitorpamplona.amethyst.ui.components.ZoomableContent import com.vitorpamplona.amethyst.ui.components.ZoomableContentView import com.vitorpamplona.amethyst.ui.components.ZoomableLocalImage @@ -132,6 +136,7 @@ import nostr.postr.toNpub import java.io.File import java.math.BigDecimal import java.net.URL +import java.util.Locale import kotlin.time.ExperimentalTime import kotlin.time.measureTimedValue @@ -376,6 +381,10 @@ fun NoteComposeInner( RenderPeopleList(noteState, backgroundColor, accountViewModel, navController) } + is AudioTrackEvent -> { + RenderAudioTrack(note, loggedIn, accountViewModel, navController) + } + is PrivateDmEvent -> { RenderPrivateMessage(note, makeItShort, isAcceptableAndCanPreview.second, backgroundColor, accountViewModel, navController) } @@ -868,6 +877,25 @@ private fun RenderRepost( } } +@Composable +private fun RenderAudioTrack( + note: Note, + loggedIn: User, + accountViewModel: AccountViewModel, + navController: NavController +) { + val noteEvent = note.event as? AudioTrackEvent ?: return + + AudioTrackHeader(noteEvent, note, loggedIn, navController) + + ReactionsRow(note, accountViewModel, navController) + + Divider( + modifier = Modifier.padding(top = 10.dp), + thickness = 0.25.dp + ) +} + @Composable private fun RenderLongFormContent( note: Note, @@ -1553,6 +1581,81 @@ fun FileStorageHeaderDisplay(baseNote: Note) { } } +@Composable +fun AudioTrackHeader(noteEvent: AudioTrackEvent, note: Note, loggedIn: User, navController: NavController) { + val media = remember { noteEvent.media() } + val cover = remember { noteEvent.cover() } + val subject = remember { noteEvent.subject() } + val content = remember { noteEvent.content() } + val participants = remember { noteEvent.participants() } + + var participantUsers by remember { mutableStateOf>>(emptyList()) } + + LaunchedEffect(key1 = participants) { + withContext(Dispatchers.IO) { + participantUsers = participants.mapNotNull { part -> LocalCache.checkGetOrCreateUser(part.key)?.let { Pair(part, it) } } + } + } + + Row(modifier = Modifier.padding(top = 5.dp)) { + Column(modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) { + Row() { + subject?.let { + Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.padding(top = 5.dp, bottom = 5.dp)) { + Text( + text = it, + fontWeight = FontWeight.Bold, + maxLines = 3, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.fillMaxWidth() + ) + } + } + } + + participantUsers.forEach { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(top = 5.dp, start = 10.dp, end = 10.dp).clickable { + navController.navigate("User/${it.second.pubkeyHex}") + } + ) { + UserPicture(it.second, loggedIn, 25.dp) + Spacer(Modifier.width(5.dp)) + UsernameDisplay(it.second, Modifier.weight(1f)) + Spacer(Modifier.width(5.dp)) + it.first.role?.let { + Text( + text = it.capitalize(Locale.ROOT), + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f), + maxLines = 1 + ) + } + } + } + + media?.let { media -> + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(10.dp) + ) { + cover?.let { cover -> + VideoView( + videoUri = media, + description = noteEvent.subject(), + thumbUri = cover + ) + } + ?: VideoView( + videoUri = media, + noteEvent.subject() + ) + } + } + } + } +} + @Composable private fun LongFormHeader(noteEvent: LongTextNoteEvent, note: Note, loggedIn: User) { Row( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt index 63fb4d985e..b0909124e2 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt @@ -53,6 +53,7 @@ import androidx.navigation.NavController import coil.compose.AsyncImage import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.service.model.AudioTrackEvent import com.vitorpamplona.amethyst.service.model.BadgeDefinitionEvent import com.vitorpamplona.amethyst.service.model.HighlightEvent import com.vitorpamplona.amethyst.service.model.LongTextNoteEvent @@ -352,6 +353,8 @@ fun NoteMaster( Column() { if (noteEvent is PeopleListEvent) { DisplayPeopleList(noteState, MaterialTheme.colors.background, accountViewModel, navController) + } else if (noteEvent is AudioTrackEvent) { + AudioTrackHeader(noteEvent, note, account.userProfile(), navController) } else if (noteEvent is HighlightEvent) { DisplayHighlight( noteEvent.quote(), From 595cab363021d10246016c81f33773f27e265ba0 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 15 May 2023 11:16:50 -0400 Subject: [PATCH 089/171] v0.47.0 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 666eae2452..a1cf46a63f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 160 - versionName "0.46.6" + versionCode 161 + versionName "0.47.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From e07b4d49ef46e21676db034df71483ff4561eff5 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 15 May 2023 13:10:33 -0400 Subject: [PATCH 090/171] Fixes NPE on opening the QuickAction on a "Post Not Found" event. --- .../com/vitorpamplona/amethyst/ui/note/NoteQuickActionMenu.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 67517b5438..6ed81cf8e2 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 @@ -128,7 +128,7 @@ fun NoteQuickActionMenu(note: Note, popupExpanded: Boolean, onDismiss: () -> Uni if (popupExpanded) { val isOwnNote = accountViewModel.isLoggedUser(note.author) - val isFollowingUser = !isOwnNote && accountViewModel.isFollowing(note.author!!) + val isFollowingUser = !isOwnNote && accountViewModel.isFollowing(note.author) Popup(onDismissRequest = onDismiss) { Card( From 426a495eb47bc30872686a67b789fdd57b278535 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 15 May 2023 13:17:31 -0400 Subject: [PATCH 091/171] Adds zapstr.live and listr.lol as shareable links --- .../vitorpamplona/amethyst/ui/note/NoteQuickActionMenu.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 6ed81cf8e2..8cd9c51af3 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 @@ -62,6 +62,8 @@ import androidx.core.graphics.ColorUtils import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.AddressableNote import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.service.model.AudioTrackEvent +import com.vitorpamplona.amethyst.service.model.PeopleListEvent import com.vitorpamplona.amethyst.ui.components.SelectTextDialog import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.ReportNoteDialog @@ -81,8 +83,12 @@ val externalLinkForNote = { note: Note -> if (note is AddressableNote) { if (note.event?.getReward() != null) { "https://nostrbounties.com/b/${note.address().toNAddr()}" + } else if (note.event is PeopleListEvent) { + "https://listr.lol/a/${note.address()?.toNAddr()}" + } else if (note.event is AudioTrackEvent) { + "https://zapstr.live/?track=${note.address()?.toNAddr()}" } else { - "https://habla.news/a/${note.address().toNAddr()}" + "https://habla.news/a/${note.address()?.toNAddr()}" } } else { "https://snort.social/e/${note.toNEvent()}" From 1db6b4793f5e73b439ca7a5863a49c221a5aaf8e Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 15 May 2023 13:25:21 -0400 Subject: [PATCH 092/171] Adds NIP-94 shareable link to filestr --- .../vitorpamplona/amethyst/ui/note/NoteQuickActionMenu.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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 8cd9c51af3..02369406b0 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 @@ -63,6 +63,7 @@ import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.AddressableNote import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.service.model.AudioTrackEvent +import com.vitorpamplona.amethyst.service.model.FileHeaderEvent import com.vitorpamplona.amethyst.service.model.PeopleListEvent import com.vitorpamplona.amethyst.ui.components.SelectTextDialog import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel @@ -91,7 +92,11 @@ val externalLinkForNote = { note: Note -> "https://habla.news/a/${note.address()?.toNAddr()}" } } else { - "https://snort.social/e/${note.toNEvent()}" + if (note.event is FileHeaderEvent) { + "https://filestr.vercel.app/e/${note.toNEvent()}" + } else { + "https://snort.social/e/${note.toNEvent()}" + } } } From e0b9120e173e8d963eec14c01cf31d9034746923 Mon Sep 17 00:00:00 2001 From: Pextar <129750633+Pextar@users.noreply.github.com> Date: Mon, 15 May 2023 20:06:08 +0200 Subject: [PATCH 093/171] Create values-sv --- app/src/main/res/values-sv | 408 +++++++++++++++++++++++++++++++++++++ 1 file changed, 408 insertions(+) create mode 100644 app/src/main/res/values-sv diff --git a/app/src/main/res/values-sv b/app/src/main/res/values-sv new file mode 100644 index 0000000000..abf3d1b94c --- /dev/null +++ b/app/src/main/res/values-sv @@ -0,0 +1,408 @@ + + Amethyst + Amethyst Debug + Point to the QR Code + Visa QR + Profilbild + Scanna QR + Visa ändå + Inlägget flaggades som olämpligt av + Inlägg hittades inte + Kanal bild + Refererad händelse hittades inte + Kunde inte dekryptera meddelandet + Grupp bild + Explicit Innehåll + Spam + Imitation + Olagligt beteende + Okänd + Relä ikon + Okänd användare + Kopiera Text + Kopiera användarens ID + Kopiera anteckningens ID + Sänd ut + Begär radering + + Rapportera Spam / Scam + Rapportera identitetsstöld + Rapportera explicit innehåll + Rapportera olagligt beteende + Logga in med en privat nyckel för att kunna svara + Logga in med en privat nyckel för att kunna boosta inlägg + Logga in med en privat nyckel för att gilla inlägg + Ingen konfiguration av Zap-belopp. Tryck länge för att ändra + Logga in med en privat nyckel för att kunna skicka Zaps + Zaps + Antal visningar + Boost + boosted + Citera + Nytt belopp i Sats + Lägg till + "Svarar till " + " och " + "i kanalen " + Profil Banner + " Följer" + " Följare" + Profil + Säkerhets Filter + Logga ut + Visa mer + Lightning Faktura + Betala + Lightning Dricks + Notering till mottagaren + Tack så mycket! + Summa i Sats + Skicka Sats + "Fel vid analys av förhandsvisning för %1$s : %2$s" + "Förhandsgranska kortbild för %1$s" + Ny kanal + Kanal Namn + Min fantastiska grupp + Bild Url + Beskrivning + "Om oss.. " + Vad tänker du på? + Dela + Spara + Skapa + Avbryt + Det gick inte att ladda upp bilden + Relä Adress + Inlägg + Bytes + Errors + Hem Flöde + Privata Meddelande Flöde + Publik Chat Flöde + Globalt Flöde + Sök i Flödet + Lägg till Relä + Visningsnamn + Mitt visningsnamn + Användarnamn + Mitt användarnamn + Om mig + Avatar URL + Banner URL + Websida URL + LN Adress + LN URL (Utdaterad) + Bild sparad till galleriet + Misslyckades att spara bilden + Ladda upp bilden + Laddar upp… + Användaren har inte en Lightningadressinställning för att ta emot sats + "svara här.. " + Kopierar antecknings-ID till urklipp för delning + Kopiera kanal-ID (anteckningen) till Urklipp + Redigerar kanalmetadata + Gå med + Känd + Nya förfrågningar + Blockerade användare + Nya trådar + konversationer + Anteckningar + Svar + "Följer" + "Rapporter" + Fler alternativ + " Reläer" + Websida + Lightning Adress + Kopierar Nsec ID (ditt lösenord) till urklipp för säkerhetskopiering + Kopiera hemlig nyckel till urklipp + Kopierar den publika nyckeln till urklipp för delning + Kopiera Public Key (NPub) till Urklipp + Skicka ett direkt meddelande + Redigerar användarens metadata + Följ + Följ tillbaka + Sluta blockera + Kopiera Användarens ID + Sluta blockera Användare + "npub, hex, användarnamn " + Rensa + App Logo + nsec / npub / hex privat nyckel + Visa lösenord + Göm lösenord + Ogiltig nyckel + "Jag accepterar " + villkor + Godkännande av villkor krävs + Nyckel krävs + Inloggning + Skapa en ny nyckel + Ladda flöde + "Det gick inte att läsa in svar: " + Försök igen + Flöde är tomt. + Uppdatera + Skapad + med beskrivning av + och bild + ändra chat namn till + beskrivning till + och bild till + Lämna + Sluta följa + Kanal skapad + "Kanalinformation ändrad till" + Publik Chat + mottagna inlägg + Ta bort + sats + Auto + översatt från + till + Visa i %1$s first + Översätt alltid till %1$s + Översätt aldrig från %1$s + NIP-05 + LNURL... + aldrig + nu + h + m + d + Naket + Svordomar / Hatiskt tal + Anmäl hattal + Rapportera nakenhet/porr + andras + Markera alla kända som lästa + Markera alla nya som lästa + Markera allt som läst + Backup-nycklar + + ## Nyckelsäkerhetskopiering och säkerhetstips + \n\nDitt konto är skyddat av en hemlig nyckel. Nyckeln är en lång slumpmässig sträng som börjar med **nsec1**. Alla som har tillgång till din hemliga nyckel kan publicera innehåll med din identitet. + \n\n- Lägg **inte** in din hemliga nyckel på någon webbplats eller programvara som du inte litar på. + \n- Amethyst-utvecklare kommer **aldrig** att be dig om din hemliga nyckel. + \n- **Behåll en säker säkerhetskopia av din hemliga nyckel för kontoåterställning. Vi rekommenderar att du använder en lösenordshanterare. + Hemlig nyckel (nsec) kopierad till urklipp + Kopiera min hemliga nyckel + Autentisering misslyckades + Error + "Skapad av %1$s" + "Tilldelad Badge för %1$s" + Du har blivit tilldelad en ny Badge + Badge utmärkelse tilldelas + Kopierade anteckningstext till urklipp + Kopierade författarens @npub till urklipp + Kopierade antecknings-ID (@note1) till urklipp + Välj Text + Github Gist med bevis + Telegram + Mastodon antecknings ID med bevis + Twitter Status med bevis + https://gist.github.com/<user>/<gist> + https://t.me/<proof post> + https://<server>/<user>/<proof post> + https://twitter.com/<user>/status/<proof post> + "<Kan inte dekryptera privat meddelande>\n\nDu citerades i en privat/krypterad konversation mellan %1$s och %2$s." + Lägg till nytt konto + Konton + Välj konto + Lägg till nytt konto + Aktivt konto + Har privat nyckel + Läs bara, ingen privat nyckel + Back + Välj + Dela webbläsarlänk + Dela + Användar ID + Antecknings ID + Kopiera Text + Radera + Sluta följa + Följ + Begär radering + Amethyst kommer att begära att din anteckning tas bort från de reläer du för närvarande är ansluten till. Det finns ingen garanti för att din anteckning kommer att raderas permanent från dessa reläer eller från andra reläer där den kan lagras. + Blockera + Radera + Blockera + Rapportera + Radera + Visa inte igen + Spam eller scams + Svordomar eller hatiskt beteende + Skadlig identitetsstöld + Nakenhet eller grafiskt innehåll + Olagligt beteende + Blockering av en användare kommer att dölja deras innehåll i din app. Dina anteckningar är fortfarande offentliga, inklusive för personer du blockerar. Blockerade användare listas på skärmen Säkerhetsfilter. + + Rapportera missbruk + Alla rapporter som publiceras kommer att vara offentliga. + Ge eventuellt ytterligare sammanhang om din rapport... + Ytterligare sammanhang + Anledning + Välj anledning… + Skicka rapport + Blockera och rapportera + Blockera + + Bokmärken + Privata Bokmärken + Publika Bokmärken + Lägg till i Privata Bokmärken + Lägg till i Publika Bokmärken + Ta bort från Privata Bokmärken + Ta bort från Publika Bokmärken + + Wallet Connect Service + Tillåter en Nostr Secret att betala zaps utan att lämna appen. Håll hemligheten säker och använd ett privat relä om möjligt + Wallet Connect Pubkey + Wallet Connect Relay + Wallet Connect Secret + Visa secret key + nsec / hex privat nyckel + + Pantbelopp i Sats + Dela Poll + Obligatoriska fält: + Zap mottagare + Beskrivning av primär omröstning… + Alternativ %s + Beskrivning av omröstningsalternativ + Valfria fält: + Minsta Zap + Maximal Zap + Konsensus + (0–100)% + Avsluta efter + dagar + Omröstningen är stängd för nya röster + Zap belopp + Endast en röst per användare tillåts i denna typ av omröstning + + "Letar efter Event %1$s" + + Lägg till ett offentligt meddelande + Lägg till ett privat meddelande + Lägg till ett fakturameddelande + + Tack för allt ditt arbete! + + Skapa och lägg till + Omröstningsskapare kan inte rösta i sina egna omröstningar. + #zappoll + + Bilden är densamma sedan inlägget + Bilden har ändrats. Användaren kanske inte har sett förändringen + + Lägg till Bild + Lägg till Video + Lägg till Dokument + + Lägg till Meddelande + Beskrivning av innehållet + En blå båt på en vit sandstrand vid solnedgången + + Zap Typ + Zap Typ för alla alternativ + + Publik + Alla kan se transaktionen och meddelandet + + Privat + Avsändare och mottagare kan se varandra och läsa meddelandet + + Anonym + Mottagaren och allmänheten vet inte vem som skickade betalningen + + Ingen Zap + Inga spår i Nostr, bara i Lightning + + + Fil Server + LnAdress or @Användare + + imgur.com - betrodd + Imgur kan ändra filen + + nostrimg.com - betrodd + NostrImg kan ändra filen + + nostr.build - betrodd + Nostr.build kan ändra filen + + nostrfiles.dev - betrodd + Nostrfiles.dev kan ändra filen + + + Verifierbar Imgur (NIP-94) + Kontrollerar om Imgur modifierat filen. Nytt NIP: andra klienter kanske inte ser det + + Verifierbar NostrImg (NIP-94) + Kontrollerar om NostrImg modifierat filen. Nytt NIP: andra klienter kanske inte ser det + + Verifierbar Nostr.build (NIP-94) + Kontrollerar om Nostr.build modifierat filen. Nytt NIP: andra klienter kanske inte ser det + + Verifierbar Nostrfiles.dev (NIP-94) + Kontrollerar om Nostrfiles.dev modifierat filen. Nytt NIP: andra klienter kanske inte ser det + + + Dina Reläer (NIP-95) + Filer är värd för dina reläer. Nytt NIP: kontrollera om de stöder + + Tor/Orbot Inställningar + Anslut via dina Orbot-inställiningar + + Koppla från Orbot/Tor? + Dina data kommer omedelbart att överföras till det vanliga nätverket + Ja + Nej + + + Följ lista + Alla följare + Global + + ## Anslut genom Tor med Orbot + \n\n1. Installera [Orbot](https://play.google.com/store/apps/details?id=org.torproject.android) + \n2. Starta Orbot + \n3. Kontrollera Socks-porten i Orbot. Standarden använder 9050 + \n4. Ändra vid behov porten i Orbot + \n5. Konfigurera Socks-porten på den här skärmen + \n6. Tryck på knappen Aktivera för att använda Orbot som proxy + Orbot Socks Port + Ogiltigt portnummer + Använd Orbot + Koppla ifrån Tor/Orbot + + Standardkanal-ID + Ny notifikation har kommit + + PrivataMeddelandID + Privata Meddelade + Meddelar dig när ett privat meddelande kommer + + ZapsID + Zaps Mottaget + Meddela dig när någon zappar dig + %1$s sats + Från %1$s + till %1$s + + Meddela: + + Gå med i konversation + Användare eller grupp ID + npub, nevent or hex + Skapa + Gå med + + + + + + From 6a696bfa398c291a4ce59e24ade7d3c3b04abe2b Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 15 May 2023 14:09:43 -0400 Subject: [PATCH 094/171] Adds a 5 minute expiration time for ImageErrors --- .../amethyst/ui/components/RobohashAsyncImage.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt index 06519d8305..b5d08d1675 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt @@ -16,6 +16,7 @@ import coil.compose.AsyncImage import coil.compose.AsyncImagePainter import coil.compose.rememberAsyncImagePainter import coil.size.Size +import java.util.Date @Composable fun RobohashAsyncImage( @@ -58,7 +59,7 @@ fun RobohashAsyncImage( ) } -var imageErrors = setOf() +var imageErrors = mapOf() @Composable fun RobohashFallbackAsyncImage( @@ -73,7 +74,9 @@ fun RobohashFallbackAsyncImage( colorFilter: ColorFilter? = null, filterQuality: FilterQuality = DrawScope.DefaultFilterQuality ) { - if (imageErrors.contains(model)) { + val errorCache = remember(imageErrors) { imageErrors[model] } + + if (errorCache != null && (Date().time / 1000) - errorCache < (60 * 5)) { RobohashAsyncImage( robot = robot, robotSize = robotSize, @@ -110,7 +113,7 @@ fun RobohashFallbackAsyncImage( colorFilter = colorFilter, filterQuality = filterQuality, onError = { - imageErrors = imageErrors + model + imageErrors = imageErrors + Pair(model, Date().time / 1000) } ) } From fc56f3988e2e895f414efacba634f7459e9a44ed Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 15 May 2023 21:26:59 -0400 Subject: [PATCH 095/171] Support for NIP-30 --- .../amethyst/service/NIP30Parser.kt | 32 ++ .../amethyst/ui/actions/NewPostView.kt | 5 +- .../amethyst/ui/components/ClickableRoute.kt | 323 +++++++++++++++++- .../amethyst/ui/components/RichTextViewer.kt | 47 ++- .../ui/navigation/AccountSwitchBottomSheet.kt | 6 +- .../amethyst/ui/navigation/DrawerContent.kt | 27 +- .../ui/note/ChatroomMessageCompose.kt | 69 ++-- .../amethyst/ui/note/NoteCompose.kt | 14 +- .../amethyst/ui/note/ReplyInformation.kt | 11 +- .../amethyst/ui/note/UsernameDisplay.kt | 42 +-- .../amethyst/ui/qrcode/ShowQRDialog.kt | 9 +- .../ui/screen/loggedIn/ProfileScreen.kt | 28 +- .../amethyst/service/Nip30Test.kt | 58 ++++ 13 files changed, 557 insertions(+), 114 deletions(-) create mode 100644 app/src/main/java/com/vitorpamplona/amethyst/service/NIP30Parser.kt create mode 100644 app/src/test/java/com/vitorpamplona/amethyst/service/Nip30Test.kt diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NIP30Parser.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NIP30Parser.kt new file mode 100644 index 0000000000..0bc3157568 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NIP30Parser.kt @@ -0,0 +1,32 @@ +package com.vitorpamplona.amethyst.service + +import java.util.regex.Pattern + +class NIP30Parser { + val customEmojiPattern: Pattern = Pattern.compile("\\:([A-Za-z0-9_\\-]+)\\:", Pattern.CASE_INSENSITIVE) + + fun buildArray(input: String): List { + val matcher = customEmojiPattern.matcher(input) + val list = mutableListOf() + while (matcher.find()) { + list.add(matcher.group()) + } + + if (list.isEmpty()) { + return listOf(input) + } + + val regularChars = input.split(customEmojiPattern.toRegex()) + + var finalList = mutableListOf() + var index = 0 + for (e in regularChars) { + finalList.add(e) + if (index < list.size) { + finalList.add(list[index]) + } + index++ + } + return finalList + } +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt index 393aea7ec9..a663d5d1e8 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt @@ -380,8 +380,9 @@ fun Notifying(baseMentions: List?, onClick: (User) -> Unit) { onClick(myUser) } ) { - Text( - "✖ ${myUser.toBestDisplayName()}", + CreateTextWithEmoji( + text = "✖ ${myUser.toBestDisplayName()}", + tags = myUser.info?.latestMetadata?.tags, color = Color.White, textAlign = TextAlign.Center ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ClickableRoute.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ClickableRoute.kt index c94931a409..8f2b3368b8 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ClickableRoute.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ClickableRoute.kt @@ -1,6 +1,14 @@ package com.vitorpamplona.amethyst.ui.components +import androidx.compose.foundation.gestures.detectTapGestures +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.BasicText import androidx.compose.foundation.text.ClickableText +import androidx.compose.foundation.text.InlineTextContent +import androidx.compose.foundation.text.appendInlineContent +import androidx.compose.material.LocalContentAlpha +import androidx.compose.material.LocalContentColor import androidx.compose.material.LocalTextStyle import androidx.compose.material.MaterialTheme import androidx.compose.material.Text @@ -11,12 +19,31 @@ import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.graphics.takeOrElse +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.Placeholder +import androidx.compose.ui.text.PlaceholderVerticalAlign +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.TextLayoutResult +import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.withStyle +import androidx.compose.ui.unit.TextUnit +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import androidx.navigation.NavController +import coil.compose.AsyncImage import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.User +import com.vitorpamplona.amethyst.service.NIP30Parser import com.vitorpamplona.amethyst.service.model.ChannelCreateEvent import com.vitorpamplona.amethyst.service.model.PrivateDmEvent import com.vitorpamplona.amethyst.service.nip19.Nip19 @@ -64,28 +91,28 @@ private fun DisplayEvent( if (note.event is ChannelCreateEvent) { CreateClickableText( note.idDisplayNote(), - nip19.additionalChars, + "${nip19.additionalChars} ", "Channel/${nip19.hex}", navController ) } else if (note.event is PrivateDmEvent) { CreateClickableText( note.idDisplayNote(), - nip19.additionalChars, + "${nip19.additionalChars} ", "Room/${note.author?.pubkeyHex}", navController ) } else if (channel != null) { CreateClickableText( channel.toBestDisplayName(), - nip19.additionalChars, + "${nip19.additionalChars} ", "Channel/${note.channel()?.idHex}", navController ) } else { CreateClickableText( note.idDisplayNote(), - nip19.additionalChars, + "${nip19.additionalChars} ", "Event/${nip19.hex}", navController ) @@ -114,34 +141,34 @@ private fun DisplayNote( noteBase?.let { val noteState by it.live().metadata.observeAsState() - val note = noteState?.note ?: return + val note = remember(noteState) { noteState?.note } ?: return val channel = note.channel() if (note.event is ChannelCreateEvent) { CreateClickableText( note.idDisplayNote(), - nip19.additionalChars, + "${nip19.additionalChars} ", "Channel/${nip19.hex}", navController ) } else if (note.event is PrivateDmEvent) { CreateClickableText( note.idDisplayNote(), - nip19.additionalChars, + "${nip19.additionalChars} ", "Room/${note.author?.pubkeyHex}", navController ) } else if (channel != null) { CreateClickableText( channel.toBestDisplayName(), - nip19.additionalChars, + "${nip19.additionalChars} ", "Channel/${note.channel()?.idHex}", navController ) } else { CreateClickableText( note.idDisplayNote(), - nip19.additionalChars, + "${nip19.additionalChars} ", "Note/${nip19.hex}", navController ) @@ -174,7 +201,7 @@ private fun DisplayAddress( CreateClickableText( note.idDisplayNote(), - nip19.additionalChars, + "${nip19.additionalChars} ", "Note/${nip19.hex}", navController ) @@ -202,14 +229,19 @@ private fun DisplayUser( userBase?.let { val userState by it.live().metadata.observeAsState() - val user = userState?.user ?: return + val route = remember { "User/${it.pubkeyHex}" } + val userDisplayName = remember(userState) { userState?.user?.toBestDisplayName() } + val userTags = remember(userState) { userState?.user?.info?.latestMetadata?.tags } - CreateClickableText( - user.toBestDisplayName(), - nip19.additionalChars, - "User/${nip19.hex}", - navController - ) + if (userDisplayName != null) { + CreateClickableTextWithEmoji( + clickablePart = userDisplayName, + suffix = "${nip19.additionalChars} ", + tags = userTags, + route = route, + navController = navController + ) + } } if (userBase == null) { @@ -231,9 +263,264 @@ fun CreateClickableText(clickablePart: String, suffix: String, route: String, na withStyle( LocalTextStyle.current.copy(color = MaterialTheme.colors.onBackground).toSpanStyle() ) { - append("$suffix ") + append(suffix) } }, onClick = { navController.navigate(route) } ) } + +@Composable +fun CreateTextWithEmoji( + text: String, + tags: List>?, + color: Color = Color.Unspecified, + textAlign: TextAlign? = null, + fontWeight: FontWeight? = null, + fontSize: TextUnit = TextUnit.Unspecified, + maxLines: Int = Int.MAX_VALUE, + overflow: TextOverflow = TextOverflow.Clip, + modifier: Modifier = Modifier +) { + val emojis = remember { + tags?.filter { it.size > 2 && it[0] == "emoji" }?.associate { ":${it[1]}:" to it[2] } ?: emptyMap() + } + + CreateTextWithEmoji(text, emojis, color, textAlign, fontWeight, fontSize, maxLines, overflow, modifier) +} + +@Composable +fun CreateTextWithEmoji( + text: String, + emojis: Map, + color: Color = Color.Unspecified, + textAlign: TextAlign? = null, + fontWeight: FontWeight? = null, + fontSize: TextUnit = TextUnit.Unspecified, + maxLines: Int = Int.MAX_VALUE, + overflow: TextOverflow = TextOverflow.Clip, + modifier: Modifier = Modifier +) { + val textColor = color.takeOrElse { + LocalTextStyle.current.color.takeOrElse { + LocalContentColor.current.copy(alpha = LocalContentAlpha.current) + } + } + + if (emojis.isEmpty()) { + Text( + text = text, + color = textColor, + textAlign = textAlign, + fontWeight = fontWeight, + fontSize = fontSize, + maxLines = maxLines, + overflow = overflow, + modifier = modifier + ) + } else { + val myList = remember { + assembleAnnotatedList(text, emojis) + } + + val style = LocalTextStyle.current.merge( + TextStyle( + color = textColor, + textAlign = textAlign, + fontWeight = fontWeight, + fontSize = fontSize + ) + ).toSpanStyle() + + InLineIconRenderer(myList, style, maxLines, overflow, modifier) + } +} + +@Composable +fun CreateClickableTextWithEmoji( + clickablePart: String, + tags: List>?, + style: TextStyle, + onClick: (Int) -> Unit +) { + val emojis = remember(tags) { + tags?.filter { it.size > 2 && it[0] == "emoji" }?.associate { ":${it[1]}:" to it[2] } ?: emptyMap() + } + + if (emojis.isEmpty()) { + ClickableText( + AnnotatedString(clickablePart), + style = style, + onClick = onClick + ) + } else { + val myList = remember { + assembleAnnotatedList(clickablePart, emojis) + } + + ClickableInLineIconRenderer(myList, style.toSpanStyle()) { + onClick(it) + } + } +} + +@Composable +fun CreateClickableTextWithEmoji( + clickablePart: String, + suffix: String, + tags: List>?, + fontWeight: FontWeight = FontWeight.Normal, + route: String, + navController: NavController +) { + val emojis = remember(tags) { + tags?.filter { it.size > 2 && it[0] == "emoji" }?.associate { ":${it[1]}:" to it[2] } ?: emptyMap() + } + + if (emojis.isEmpty()) { + CreateClickableText(clickablePart, suffix, route, navController) + } else { + val myList = remember { + assembleAnnotatedList(clickablePart, emojis) + } + + ClickableInLineIconRenderer(myList, LocalTextStyle.current.copy(color = MaterialTheme.colors.primary, fontWeight = fontWeight).toSpanStyle()) { + navController.navigate(route) + } + + val myList2 = remember { + assembleAnnotatedList(suffix, emojis) + } + + InLineIconRenderer(myList2, LocalTextStyle.current.copy(color = MaterialTheme.colors.onBackground, fontWeight = fontWeight).toSpanStyle()) + } +} + +fun assembleAnnotatedList(text: String, emojis: Map): List { + return NIP30Parser().buildArray(text).map { + val url = emojis[it] + if (url != null) { + ImageUrlType(url) + } else { + TextType(it) + } + } +} + +open class Renderable() +class TextType(val text: String) : Renderable() +class ImageUrlType(val url: String) : Renderable() + +@Composable +fun ClickableInLineIconRenderer(wordsInOrder: List, style: SpanStyle, onClick: (Int) -> Unit) { + val inlineContent = wordsInOrder.mapIndexedNotNull { idx, value -> + if (value is ImageUrlType) { + Pair( + "inlineContent$idx", + InlineTextContent( + Placeholder( + width = 17.sp, + height = 17.sp, + placeholderVerticalAlign = PlaceholderVerticalAlign.Center + ) + ) { + AsyncImage( + model = value.url, + contentDescription = null, + modifier = Modifier.fillMaxSize().padding(1.dp), + colorFilter = ColorFilter.tint(style.color) + ) + } + ) + } else { + null + } + }.associate { it.first to it.second } + + val annotatedText = buildAnnotatedString { + wordsInOrder.forEachIndexed { idx, value -> + withStyle( + style + ) { + if (value is TextType) { + append(value.text) + } else if (value is ImageUrlType) { + appendInlineContent("inlineContent$idx", "[icon]") + } + } + } + } + + val layoutResult = remember { mutableStateOf(null) } + val pressIndicator = Modifier.pointerInput(onClick) { + detectTapGestures { pos -> + layoutResult.value?.let { layoutResult -> + onClick(layoutResult.getOffsetForPosition(pos)) + } + } + } + + BasicText( + text = annotatedText, + modifier = pressIndicator, + inlineContent = inlineContent, + onTextLayout = { + layoutResult.value = it + } + ) +} + +@Composable +fun InLineIconRenderer( + wordsInOrder: List, + style: SpanStyle, + maxLines: Int = Int.MAX_VALUE, + overflow: TextOverflow = TextOverflow.Clip, + modifier: Modifier = Modifier +) { + val inlineContent = wordsInOrder.mapIndexedNotNull { idx, value -> + if (value is ImageUrlType) { + Pair( + "inlineContent$idx", + InlineTextContent( + Placeholder( + width = 17.sp, + height = 17.sp, + placeholderVerticalAlign = PlaceholderVerticalAlign.Center + ) + ) { + AsyncImage( + model = value.url, + contentDescription = null, + modifier = Modifier.fillMaxSize().padding(1.dp), + colorFilter = ColorFilter.tint(style.color) + ) + } + ) + } else { + null + } + }.associate { it.first to it.second } + + val annotatedText = buildAnnotatedString { + wordsInOrder.forEachIndexed { idx, value -> + withStyle( + style + ) { + if (value is TextType) { + append(value.text) + } else if (value is ImageUrlType) { + appendInlineContent("inlineContent$idx", "[icon]") + } + } + } + } + + Text( + text = annotatedText, + inlineContent = inlineContent, + maxLines = maxLines, + overflow = overflow, + modifier = modifier + ) +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt index a833e977da..1e5c2f5d10 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt @@ -109,7 +109,8 @@ class RichTextViewerState( val content: String, val urlSet: Set, val imagesForPager: Map, - val imageList: List + val imageList: List, + val customEmoji: Map ) @Composable @@ -122,7 +123,7 @@ private fun RenderRegular( navController: NavController ) { var processedState by remember { - mutableStateOf(RichTextViewerState(content, emptySet(), emptyMap(), emptyList())) + mutableStateOf(RichTextViewerState(content, emptySet(), emptyMap(), emptyList(), emptyMap())) } val scope = rememberCoroutineScope() @@ -143,8 +144,10 @@ private fun RenderRegular( }.associateBy { it.url } val imageList = imagesForPager.values.toList() - if (urlSet.isNotEmpty()) { - processedState = RichTextViewerState(content, urlSet, imagesForPager, imageList) + val emojiMap = tags?.filter { it.size > 2 && it[0] == "emoji" }?.associate { ":${it[1]}:" to it[2] } ?: emptyMap() + + if (urlSet.isNotEmpty() || emojiMap.isNotEmpty()) { + processedState = RichTextViewerState(content, urlSet, imagesForPager, imageList, emojiMap) } } } @@ -167,6 +170,8 @@ private fun RenderRegular( ZoomableContentView(img, state.imageList) } else if (state.urlSet.contains(word)) { UrlPreview(word, "$word ") + } else if (state.customEmoji.any { word.contains(it.key) }) { + RenderCustomEmoji(word, state.customEmoji) } else if (word.startsWith("lnbc", true)) { MayBeInvoicePreview(word) } else if (word.startsWith("lnurl", true)) { @@ -235,6 +240,8 @@ private fun RenderRegular( style = LocalTextStyle.current.copy(textDirection = TextDirection.Content) ) } + } else if (state.customEmoji.any { word.contains(it.key) }) { + RenderCustomEmoji(word, state.customEmoji) } else if (Patterns.EMAIL_ADDRESS.matcher(word).matches()) { ClickableEmail(word) } else if (Patterns.PHONE.matcher(word).matches() && word.length > 6) { @@ -293,6 +300,14 @@ private fun RenderRegular( } } +@Composable +fun RenderCustomEmoji(word: String, customEmoji: Map) { + CreateTextWithEmoji( + text = "$word ", + emojis = customEmoji + ) +} + @Composable private fun RenderContentAsMarkdown(content: String, backgroundColor: Color) { val myMarkDownStyle = richTextDefaults.copy( @@ -600,8 +615,10 @@ fun TagLink(word: String, tags: List>, canPreview: Boolean, backgro var baseUserPair by remember { mutableStateOf?>(null) } var baseNotePair by remember { mutableStateOf?>(null) } + val scope = rememberCoroutineScope() + LaunchedEffect(key1 = word) { - withContext(Dispatchers.IO) { + scope.launch(Dispatchers.IO) { val matcher = tagIndex.matcher(word) val (index, suffix) = try { matcher.find() @@ -630,8 +647,24 @@ fun TagLink(word: String, tags: List>, canPreview: Boolean, backgro } baseUserPair?.let { - ClickableUserTag(it.first, navController) - Text(text = "${it.second} ") + val innerUserState by it.first.live().metadata.observeAsState() + val displayName = remember(innerUserState) { + innerUserState?.user?.toBestDisplayName() ?: "" + } + val route = remember(innerUserState) { + "User/${it.first.pubkeyHex}" + } + val userTags = remember(innerUserState) { + innerUserState?.user?.info?.latestMetadata?.tags + } + + CreateClickableTextWithEmoji( + clickablePart = displayName, + suffix = "${it.second} ", + tags = userTags, + route = route, + navController = navController + ) } baseNotePair?.let { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AccountSwitchBottomSheet.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AccountSwitchBottomSheet.kt index d50ce32bcf..8cb995ace6 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AccountSwitchBottomSheet.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AccountSwitchBottomSheet.kt @@ -45,6 +45,7 @@ import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.decodePublicKey import com.vitorpamplona.amethyst.model.toHexKey +import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji import com.vitorpamplona.amethyst.ui.components.ResizeImage import com.vitorpamplona.amethyst.ui.components.RobohashAsyncImageProxy import com.vitorpamplona.amethyst.ui.note.toShortenHex @@ -149,7 +150,10 @@ fun AccountSwitchBottomSheet( val npubShortHex = acc.npub.toShortenHex() user.bestDisplayName()?.let { - Text(it) + CreateTextWithEmoji( + text = it, + tags = user.info?.latestMetadata?.tags + ) } Text(npubShortHex) 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 8b0501619f..31166e172f 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 @@ -58,6 +58,7 @@ import com.vitorpamplona.amethyst.ServiceManager import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.HttpClient +import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji import com.vitorpamplona.amethyst.ui.components.ResizeImage import com.vitorpamplona.amethyst.ui.components.RobohashAsyncImageProxy import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountBackupDialog @@ -168,8 +169,9 @@ fun ProfileContent( }) ) if (accountUser.bestDisplayName() != null) { - Text( - accountUser.bestDisplayName() ?: "", + CreateTextWithEmoji( + text = accountUser.bestDisplayName() ?: "", + tags = accountUser.info?.latestMetadata?.tags, modifier = Modifier .padding(top = 7.dp) .clickable(onClick = { @@ -185,19 +187,22 @@ fun ProfileContent( ) } if (accountUser.bestUsername() != null) { - Text( - " @${accountUser.bestUsername()}", + CreateTextWithEmoji( + text = " @${accountUser.bestUsername()}", + tags = accountUser.info?.latestMetadata?.tags, color = Color.LightGray, modifier = Modifier .padding(top = 15.dp) - .clickable(onClick = { - accountUser.let { - navController.navigate("User/${it.pubkeyHex}") + .clickable( + onClick = { + accountUser.let { + navController.navigate("User/${it.pubkeyHex}") + } + coroutineScope.launch { + scaffoldState.drawerState.close() + } } - coroutineScope.launch { - scaffoldState.drawerState.close() - } - }) + ) ) } Row( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt index 21e7bb60c3..3c6936b231 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt @@ -58,6 +58,8 @@ import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.service.model.ChannelCreateEvent import com.vitorpamplona.amethyst.service.model.ChannelMessageEvent import com.vitorpamplona.amethyst.service.model.ChannelMetadataEvent +import com.vitorpamplona.amethyst.ui.components.CreateClickableTextWithEmoji +import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji import com.vitorpamplona.amethyst.ui.components.ResizeImage import com.vitorpamplona.amethyst.ui.components.RobohashAsyncImageProxy import com.vitorpamplona.amethyst.ui.components.RobohashFallbackAsyncImage @@ -218,14 +220,13 @@ fun ChatroomMessageCompose( }) ) - Text( - " ${author.toBestDisplayName()}", + CreateClickableTextWithEmoji( + clickablePart = " ${author.toBestDisplayName()}", + suffix = "", + tags = author.info?.latestMetadata?.tags, fontWeight = FontWeight.Bold, - modifier = Modifier.clickable(onClick = { - author.let { - navController.navigate("User/${it.pubkeyHex}") - } - }) + route = "User/${author.pubkeyHex}", + navController = navController ) } } @@ -251,33 +252,39 @@ fun ChatroomMessageCompose( val event = note.event if (event is ChannelCreateEvent) { val channelInfo = event.channelInfo() - Text( - text = note.author?.toBestDisplayName() - .toString() + " ${stringResource(R.string.created)} " + ( - channelInfo.name - ?: "" - ) + " ${stringResource(R.string.with_description_of)} '" + ( - channelInfo.about - ?: "" - ) + "', ${stringResource(R.string.and_picture)} '" + ( - channelInfo.picture - ?: "" - ) + "'" + val text = note.author?.toBestDisplayName() + .toString() + " ${stringResource(R.string.created)} " + ( + channelInfo.name + ?: "" + ) + " ${stringResource(R.string.with_description_of)} '" + ( + channelInfo.about + ?: "" + ) + "', ${stringResource(R.string.and_picture)} '" + ( + channelInfo.picture + ?: "" + ) + "'" + + CreateTextWithEmoji( + text = text, + tags = note.author?.info?.latestMetadata?.tags ) } else if (event is ChannelMetadataEvent) { val channelInfo = event.channelInfo() - Text( - text = note.author?.toBestDisplayName() - .toString() + " ${stringResource(R.string.changed_chat_name_to)} '" + ( - channelInfo.name - ?: "" - ) + "$', {stringResource(R.string.description_to)} '" + ( - channelInfo.about - ?: "" - ) + "', ${stringResource(R.string.and_picture_to)} '" + ( - channelInfo.picture - ?: "" - ) + "'" + val text = note.author?.toBestDisplayName() + .toString() + " ${stringResource(R.string.changed_chat_name_to)} '" + ( + channelInfo.name + ?: "" + ) + "', ${stringResource(R.string.description_to)} '" + ( + channelInfo.about + ?: "" + ) + "', ${stringResource(R.string.and_picture_to)} '" + ( + channelInfo.picture + ?: "" + ) + "'" + + CreateTextWithEmoji( + text = text, + tags = note.author?.info?.latestMetadata?.tags ) } else { val eventContent = accountViewModel.decrypt(note) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index f028c90253..c93ff6bec5 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -109,7 +109,7 @@ import com.vitorpamplona.amethyst.service.model.ReportedKey import com.vitorpamplona.amethyst.service.model.RepostEvent import com.vitorpamplona.amethyst.service.model.TextNoteEvent import com.vitorpamplona.amethyst.ui.components.ClickableUrl -import com.vitorpamplona.amethyst.ui.components.CreateClickableText +import com.vitorpamplona.amethyst.ui.components.CreateClickableTextWithEmoji import com.vitorpamplona.amethyst.ui.components.ObserveDisplayNip05Status import com.vitorpamplona.amethyst.ui.components.ResizeImage import com.vitorpamplona.amethyst.ui.components.RobohashAsyncImage @@ -1245,13 +1245,15 @@ fun DisplayHighlight( val userState by userBase.live().metadata.observeAsState() val route = remember { "User/${userBase.pubkeyHex}" } val userDisplayName = remember(userState) { userState?.user?.toBestDisplayName() } + val userTags = remember(userState) { userState?.user?.info?.latestMetadata?.tags } if (userDisplayName != null) { - CreateClickableText( - userDisplayName, - "", - route, - navController + CreateClickableTextWithEmoji( + clickablePart = userDisplayName, + suffix = "", + tags = userTags, + route = route, + navController = navController ) } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReplyInformation.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReplyInformation.kt index 18446bf039..2d7ab31a40 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReplyInformation.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReplyInformation.kt @@ -18,6 +18,7 @@ import androidx.navigation.NavController import com.google.accompanist.flowlayout.FlowRow import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.* +import com.vitorpamplona.amethyst.ui.components.CreateClickableTextWithEmoji import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -59,8 +60,9 @@ fun ReplyInformation(replyTo: List?, dupMentions: List?, account: Ac val innerUser = innerUserState?.user innerUser?.let { myUser -> - ClickableText( - AnnotatedString("$prefix@${myUser.toBestDisplayName()}"), + CreateClickableTextWithEmoji( + clickablePart = "$prefix@${myUser.toBestDisplayName()}", + tags = myUser.info?.latestMetadata?.tags, style = LocalTextStyle.current.copy(color = MaterialTheme.colors.primary.copy(alpha = 0.52f), fontSize = 13.sp), onClick = { onUserTagClick(myUser) } ) @@ -196,8 +198,9 @@ fun ReplyInformationChannel( val innerUser = innerUserState?.user innerUser?.let { myUser -> - ClickableText( - AnnotatedString("$prefix@${myUser.toBestDisplayName()}"), + CreateClickableTextWithEmoji( + clickablePart = "$prefix@${myUser.toBestDisplayName()}", + tags = myUser.info?.latestMetadata?.tags, style = LocalTextStyle.current.copy(color = MaterialTheme.colors.primary.copy(alpha = 0.52f), fontSize = 13.sp), onClick = { onUserTagClick(myUser) } ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UsernameDisplay.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UsernameDisplay.kt index 836d1aa8bc..a6a59f32b5 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UsernameDisplay.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UsernameDisplay.kt @@ -5,34 +5,31 @@ import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.User +import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji @Composable fun NoteUsernameDisplay(baseNote: Note, weight: Modifier = Modifier) { val noteState by baseNote.live().metadata.observeAsState() - val note = noteState?.note ?: return + val author = remember(noteState) { noteState?.note?.author } ?: return - val author = note.author - - if (author != null) { - UsernameDisplay(author, weight) - } + UsernameDisplay(author, weight) } @Composable fun UsernameDisplay(baseUser: User, weight: Modifier = Modifier) { val userState by baseUser.live().metadata.observeAsState() - val user = userState?.user ?: return + val bestUserName = remember(userState) { userState?.user?.bestUsername() } + val bestDisplayName = remember(userState) { userState?.user?.bestDisplayName() } + val npubDisplay = remember { baseUser.pubkeyDisplayHex() } + val tags = remember(userState) { userState?.user?.info?.latestMetadata?.tags } - val bestUserName = user.bestUsername() - val bestDisplayName = user.bestDisplayName() - val npubDisplay = user.pubkeyDisplayHex() - - UserNameDisplay(bestUserName, bestDisplayName, npubDisplay, weight) + UserNameDisplay(bestUserName, bestDisplayName, npubDisplay, tags, weight) } @Composable @@ -40,31 +37,36 @@ private fun UserNameDisplay( bestUserName: String?, bestDisplayName: String?, npubDisplay: String, + tags: List>?, modifier: Modifier ) { if (bestUserName != null && bestDisplayName != null) { - Text( - bestDisplayName, + CreateTextWithEmoji( + text = bestDisplayName, + tags = tags, fontWeight = FontWeight.Bold ) - Text( - "@$bestUserName", + CreateTextWithEmoji( + text = "@$bestUserName", + tags = tags, color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f), maxLines = 1, overflow = TextOverflow.Ellipsis, modifier = modifier ) } else if (bestDisplayName != null) { - Text( - bestDisplayName, + CreateTextWithEmoji( + text = bestDisplayName, + tags = tags, fontWeight = FontWeight.Bold, maxLines = 1, overflow = TextOverflow.Ellipsis, modifier = modifier ) } else if (bestUserName != null) { - Text( - "@$bestUserName", + CreateTextWithEmoji( + text = "@$bestUserName", + tags = tags, fontWeight = FontWeight.Bold, maxLines = 1, overflow = TextOverflow.Ellipsis, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/qrcode/ShowQRDialog.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/qrcode/ShowQRDialog.kt index 30a7ba6b9a..32d64d4da4 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/qrcode/ShowQRDialog.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/qrcode/ShowQRDialog.kt @@ -34,6 +34,7 @@ import androidx.compose.ui.window.DialogProperties import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.ui.actions.CloseButton +import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji import com.vitorpamplona.amethyst.ui.components.ResizeImage import com.vitorpamplona.amethyst.ui.components.RobohashAsyncImageProxy import com.vitorpamplona.amethyst.ui.qrcode.NIP19QrCodeScanner @@ -83,10 +84,10 @@ fun ShowQRDialog(user: User, onScan: (String) -> Unit, onClose: () -> Unit) { .background(MaterialTheme.colors.background) ) } - Row(horizontalArrangement = Arrangement.Center, modifier = Modifier.fillMaxWidth()) { - Text( - user.bestDisplayName() ?: "", - modifier = Modifier.padding(top = 5.dp), + Row(horizontalArrangement = Arrangement.Center, modifier = Modifier.fillMaxWidth().padding(top = 5.dp)) { + CreateTextWithEmoji( + text = user.bestDisplayName() ?: user.bestUsername() ?: "", + tags = user.info?.latestMetadata?.tags, fontWeight = FontWeight.Bold, fontSize = 18.sp ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt index 2069612c77..485892a660 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt @@ -64,6 +64,7 @@ import com.vitorpamplona.amethyst.service.model.PayInvoiceErrorResponse import com.vitorpamplona.amethyst.service.model.PayInvoiceSuccessResponse import com.vitorpamplona.amethyst.service.model.ReportEvent import com.vitorpamplona.amethyst.ui.actions.NewUserMetadataView +import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji import com.vitorpamplona.amethyst.ui.components.DisplayNip05ProfileStatus import com.vitorpamplona.amethyst.ui.components.InvoiceRequest import com.vitorpamplona.amethyst.ui.components.ResizeImage @@ -470,29 +471,36 @@ private fun ProfileActions( private fun DrawAdditionalInfo(baseUser: User, account: Account, accountViewModel: AccountViewModel, navController: NavController) { val userState by baseUser.live().metadata.observeAsState() val user = remember(userState) { userState?.user } ?: return + val tags = remember(userState) { userState?.user?.info?.latestMetadata?.tags } val uri = LocalUriHandler.current val clipboardManager = LocalClipboardManager.current val context = LocalContext.current val scope = rememberCoroutineScope() - Row(verticalAlignment = Alignment.Bottom) { - user.bestDisplayName()?.let { - Text( - it, - modifier = Modifier.padding(top = 7.dp), + (user.bestDisplayName() ?: user.bestUsername())?.let { + Row(verticalAlignment = Alignment.Bottom, modifier = Modifier.padding(top = 7.dp)) { + CreateTextWithEmoji( + text = it, + tags = tags, fontWeight = FontWeight.Bold, fontSize = 25.sp ) } } - Row(verticalAlignment = Alignment.CenterVertically) { + + if (user.bestDisplayName() != null) { user.bestUsername()?.let { - Text( - "@$it", - color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f), + Row( + verticalAlignment = Alignment.CenterVertically, modifier = Modifier.padding(top = 1.dp, bottom = 1.dp) - ) + ) { + CreateTextWithEmoji( + text = "@$it", + tags = tags, + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) + } } } diff --git a/app/src/test/java/com/vitorpamplona/amethyst/service/Nip30Test.kt b/app/src/test/java/com/vitorpamplona/amethyst/service/Nip30Test.kt new file mode 100644 index 0000000000..29016a0d1e --- /dev/null +++ b/app/src/test/java/com/vitorpamplona/amethyst/service/Nip30Test.kt @@ -0,0 +1,58 @@ +package com.vitorpamplona.amethyst.service + +import junit.framework.TestCase.assertEquals +import org.junit.Test + +class Nip30Test { + @Test() + fun parseEmoji() { + val input = "Alex Gleason :soapbox:" + + assertEquals( + listOf("Alex Gleason ", ":soapbox:", ""), + NIP30Parser().buildArray(input) + ) + } + + @Test() + fun parseEmojiInverted() { + val input = ":soapbox:Alex Gleason" + + assertEquals( + listOf("", ":soapbox:", "Alex Gleason"), + NIP30Parser().buildArray(input) + ) + } + + @Test() + fun parseEmoji2() { + val input = "Hello :gleasonator: \uD83D\uDE02 :ablobcatrainbow: :disputed: yolo" + + assertEquals( + listOf("Hello ", ":gleasonator:", " 😂 ", ":ablobcatrainbow:", " ", ":disputed:", " yolo"), + NIP30Parser().buildArray(input) + ) + + println(NIP30Parser().buildArray(input).joinToString(",")) + } + + @Test() + fun parseEmoji3() { + val input = "hello vitor: how can I help:" + + assertEquals( + listOf("hello vitor: how can I help:"), + NIP30Parser().buildArray(input) + ) + } + + @Test() + fun parseJapanese() { + val input = "\uD883\uDEDE\uD883\uDEDE麺の:x30EDE:。:\uD883\uDEDE:(Violation of NIP-30)" + + assertEquals( + listOf("\uD883\uDEDE\uD883\uDEDE麺の", ":x30EDE:", "。:\uD883\uDEDE:(Violation of NIP-30)"), + NIP30Parser().buildArray(input) + ) + } +} From a2a9d04e1eae03be09f59871daa8bead06c998b7 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 15 May 2023 21:35:55 -0400 Subject: [PATCH 096/171] v0.48.0 --- README.md | 16 ++++++++++++---- app/build.gradle | 4 ++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 4ecf0974d7..f5374fa5ea 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Or get the latest APK from the [Releases Section](https://github.com/vitorpamplo # Current Features -- [x] Event Builders / WebSocket Subscriptions (NIP-01, NIP-15) +- [x] Event Builders / WebSocket Subscriptions (NIP-01) - [x] Home Feed - [x] Notifications Feed - [x] Global Feed @@ -34,7 +34,8 @@ Or get the latest APK from the [Releases Section](https://github.com/vitorpamplo - [x] Lightning Tips - [x] Zaps (private, public, anon, non-zap) (NIP-57) - [x] URI Support (NIP-21) -- [x] Event Deletion (NIP-09: like, boost, text notes and reports) +- [x] Created_at Limits (NIP-22) +- [x] Event Deletion (NIP-09) - [x] Identity Verification (NIP-05) - [x] Long-form Content (NIP-23) - [x] Parameterized Replaceable Events (NIP-33) @@ -54,13 +55,18 @@ Or get the latest APK from the [Releases Section](https://github.com/vitorpamplo - [x] Markdown Support - [x] Relay Authentication (NIP-42) - [x] Content stored in relays themselves (NIP-95) +- [x] Custom Emoji (NIP-30) +- [x] Text Note References (NIP-27) +- [x] Audio Tracks (zapstr.live) (NIP-TBD) +- [x] Push Notifications (Zaps and Messages) +- [x] Generic Tags (NIP-12) +- [ ] Marketplace (NIP-15) - [ ] Image/Video Capture in the app - [ ] Local Database - [ ] View Individual Reactions (Like, Boost, Zaps, Reports) per Post - [ ] Bookmarks, Pinned Posts, Muted Events (NIP-51) - [ ] Sensitive Content (NIP-36) - [ ] Relay Pages (NIP-11) -- [ ] Generic Tags (NIP-12) - [ ] Proof of Work in the Phone (NIP-13, NIP-20) - [ ] Events with a Subject (NIP-14) - [ ] Workspaces @@ -69,8 +75,10 @@ Or get the latest APK from the [Releases Section](https://github.com/vitorpamplo - [ ] Relay List Metadata (NIP-65) - [ ] Signing Requests (NIP-46) - [ ] Delegated Event Signing (NIP-26) -- [ ] Account Creation / Backup Guidance (NIP-06) +- [ ] Account Creation / Backup Guidance +- [ ] Mnemonic seed phrase (NIP-06) - [ ] Message Sent feedback (NIP-20) +- [ ] OpenTimestamps Attestations (NIP-03) # Development Overview diff --git a/app/build.gradle b/app/build.gradle index a1cf46a63f..5d5882c9d5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 161 - versionName "0.47.0" + versionCode 162 + versionName "0.48.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From 7c21f077db8884c75286651c3d97af20a5fab226 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 15 May 2023 22:18:12 -0400 Subject: [PATCH 097/171] Support for PinStr (33888) --- .../amethyst/model/LocalCache.kt | 13 ++ .../amethyst/service/NostrGlobalDataSource.kt | 3 +- .../amethyst/service/NostrHomeDataSource.kt | 5 +- .../service/NostrSingleEventDataSource.kt | 7 +- .../service/NostrUserProfileDataSource.kt | 2 +- .../amethyst/service/model/Event.kt | 1 + .../amethyst/service/model/PinListEvent.kt | 41 ++++++ .../amethyst/ui/note/NoteCompose.kt | 126 +++++++++++++++++- .../amethyst/ui/screen/ThreadFeedView.kt | 3 + 9 files changed, 190 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/com/vitorpamplona/amethyst/service/model/PinListEvent.kt diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index ed3e9d0cf5..4973cac35e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -281,6 +281,18 @@ object LocalCache { refreshObservers(note) } + private fun consume(event: PinListEvent) { + val note = getOrCreateAddressableNote(event.address()) + val author = getOrCreateUser(event.pubKey) + + // Already processed this event. + if (note.event != null) return + + note.loadEvent(event, author, emptyList()) + + refreshObservers(note) + } + private fun consume(event: AudioTrackEvent) { val note = getOrCreateAddressableNote(event.address()) val author = getOrCreateUser(event.pubKey) @@ -961,6 +973,7 @@ object LocalCache { is LongTextNoteEvent -> consume(event, relay) is MetadataEvent -> consume(event) is PrivateDmEvent -> consume(event, relay) + is PinListEvent -> consume(event) is PeopleListEvent -> consume(event) is ReactionEvent -> consume(event) is RecommendRelayEvent -> consume(event) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrGlobalDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrGlobalDataSource.kt index 735036304b..cec80961fb 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrGlobalDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrGlobalDataSource.kt @@ -4,6 +4,7 @@ import com.vitorpamplona.amethyst.service.model.AudioTrackEvent import com.vitorpamplona.amethyst.service.model.ChannelMessageEvent import com.vitorpamplona.amethyst.service.model.HighlightEvent import com.vitorpamplona.amethyst.service.model.LongTextNoteEvent +import com.vitorpamplona.amethyst.service.model.PinListEvent import com.vitorpamplona.amethyst.service.model.PollNoteEvent import com.vitorpamplona.amethyst.service.model.TextNoteEvent import com.vitorpamplona.amethyst.service.relays.FeedType @@ -14,7 +15,7 @@ object NostrGlobalDataSource : NostrDataSource("GlobalFeed") { fun createGlobalFilter() = TypedFilter( types = setOf(FeedType.GLOBAL), filter = JsonFilter( - kinds = listOf(TextNoteEvent.kind, PollNoteEvent.kind, ChannelMessageEvent.kind, AudioTrackEvent.kind, LongTextNoteEvent.kind, HighlightEvent.kind), + kinds = listOf(TextNoteEvent.kind, PollNoteEvent.kind, ChannelMessageEvent.kind, AudioTrackEvent.kind, PinListEvent.kind, LongTextNoteEvent.kind, HighlightEvent.kind), limit = 200 ) ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt index a4277b5766..850b37069f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt @@ -5,6 +5,7 @@ import com.vitorpamplona.amethyst.model.UserState import com.vitorpamplona.amethyst.service.model.AudioTrackEvent import com.vitorpamplona.amethyst.service.model.HighlightEvent import com.vitorpamplona.amethyst.service.model.LongTextNoteEvent +import com.vitorpamplona.amethyst.service.model.PinListEvent import com.vitorpamplona.amethyst.service.model.PollNoteEvent import com.vitorpamplona.amethyst.service.model.TextNoteEvent import com.vitorpamplona.amethyst.service.relays.EOSEAccount @@ -57,7 +58,7 @@ object NostrHomeDataSource : NostrDataSource("HomeFeed") { return TypedFilter( types = setOf(FeedType.FOLLOWS), filter = JsonFilter( - kinds = listOf(TextNoteEvent.kind, LongTextNoteEvent.kind, PollNoteEvent.kind, HighlightEvent.kind, AudioTrackEvent.kind), + kinds = listOf(TextNoteEvent.kind, LongTextNoteEvent.kind, PollNoteEvent.kind, HighlightEvent.kind, AudioTrackEvent.kind, PinListEvent.kind), authors = followSet, limit = 400, since = latestEOSEs.users[account.userProfile()]?.followList?.get(account.defaultHomeFollowList)?.relayList @@ -73,7 +74,7 @@ object NostrHomeDataSource : NostrDataSource("HomeFeed") { return TypedFilter( types = setOf(FeedType.FOLLOWS), filter = JsonFilter( - kinds = listOf(TextNoteEvent.kind, LongTextNoteEvent.kind, HighlightEvent.kind, AudioTrackEvent.kind), + kinds = listOf(TextNoteEvent.kind, LongTextNoteEvent.kind, HighlightEvent.kind, AudioTrackEvent.kind, PinListEvent.kind), tags = mapOf( "t" to hashToLoad.map { listOf(it, it.lowercase(), it.uppercase(), it.capitalize()) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt index 41edd2886b..3fce56a25d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt @@ -29,7 +29,7 @@ object NostrSingleEventDataSource : NostrDataSource("SingleEventFeed") { ReactionEvent.kind, RepostEvent.kind, ReportEvent.kind, LnZapEvent.kind, LnZapRequestEvent.kind, BadgeAwardEvent.kind, BadgeDefinitionEvent.kind, BadgeProfilesEvent.kind, - PollNoteEvent.kind, AudioTrackEvent.kind + PollNoteEvent.kind, AudioTrackEvent.kind, PinListEvent.kind ), tags = mapOf("a" to listOf(aTag.toTag())), since = it.lastReactionsDownloadTime @@ -81,7 +81,8 @@ object NostrSingleEventDataSource : NostrDataSource("SingleEventFeed") { LnZapRequestEvent.kind, PollNoteEvent.kind, HighlightEvent.kind, - AudioTrackEvent.kind + AudioTrackEvent.kind, + PinListEvent.kind ), tags = mapOf("e" to listOf(it.idHex)), since = it.lastReactionsDownloadTime @@ -120,7 +121,7 @@ object NostrSingleEventDataSource : NostrDataSource("SingleEventFeed") { BadgeDefinitionEvent.kind, BadgeAwardEvent.kind, BadgeProfilesEvent.kind, PrivateDmEvent.kind, FileHeaderEvent.kind, FileStorageEvent.kind, FileStorageHeaderEvent.kind, - HighlightEvent.kind, AudioTrackEvent.kind + HighlightEvent.kind, AudioTrackEvent.kind, PinListEvent.kind ), ids = interestedEvents.toList() ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt index 2246c7c805..5b9df58264 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrUserProfileDataSource.kt @@ -28,7 +28,7 @@ object NostrUserProfileDataSource : NostrDataSource("UserProfileFeed") { TypedFilter( types = COMMON_FEED_TYPES, filter = JsonFilter( - kinds = listOf(TextNoteEvent.kind, RepostEvent.kind, LongTextNoteEvent.kind, AudioTrackEvent.kind, PollNoteEvent.kind, HighlightEvent.kind), + kinds = listOf(TextNoteEvent.kind, RepostEvent.kind, LongTextNoteEvent.kind, AudioTrackEvent.kind, PinListEvent.kind, PollNoteEvent.kind, HighlightEvent.kind), authors = listOf(it.pubkeyHex), limit = 200 ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt index 38a99ac765..91b825e8df 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt @@ -244,6 +244,7 @@ open class Event( LongTextNoteEvent.kind -> LongTextNoteEvent(id, pubKey, createdAt, tags, content, sig) MetadataEvent.kind -> MetadataEvent(id, pubKey, createdAt, tags, content, sig) PeopleListEvent.kind -> PeopleListEvent(id, pubKey, createdAt, tags, content, sig) + PinListEvent.kind -> PinListEvent(id, pubKey, createdAt, tags, content, sig) PollNoteEvent.kind -> PollNoteEvent(id, pubKey, createdAt, tags, content, sig) PrivateDmEvent.kind -> PrivateDmEvent(id, pubKey, createdAt, tags, content, sig) ReactionEvent.kind -> ReactionEvent(id, pubKey, createdAt, tags, content, sig) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PinListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PinListEvent.kt new file mode 100644 index 0000000000..100aaf9818 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PinListEvent.kt @@ -0,0 +1,41 @@ +package com.vitorpamplona.amethyst.service.model + +import com.vitorpamplona.amethyst.model.HexKey +import com.vitorpamplona.amethyst.model.toHexKey +import nostr.postr.Utils +import java.util.Date + +class PinListEvent( + id: HexKey, + pubKey: HexKey, + createdAt: Long, + tags: List>, + content: String, + sig: HexKey +) : Event(id, pubKey, createdAt, kind, tags, content, sig), AddressableEvent { + + override fun dTag() = tags.firstOrNull { it.size > 1 && it[0] == "d" }?.get(1) ?: "" + override fun address() = ATag(kind, pubKey, dTag(), null) + + fun pins() = tags.filter { it.size > 1 && it[0] == "pin" }.map { it[1] } + + companion object { + const val kind = 33888 + + fun create( + pins: List, + privateKey: ByteArray, + createdAt: Long = Date().time / 1000 + ): PinListEvent { + val tags = mutableListOf>() + pins.forEach { + tags.add(listOf("pin", it)) + } + + val pubKey = Utils.pubkeyCreate(privateKey).toHexKey() + val id = generateId(pubKey, createdAt, kind, tags, "") + val sig = Utils.sign(id, privateKey) + return PinListEvent(id.toHexKey(), pubKey, createdAt, tags, "", sig.toHexKey()) + } + } +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index c93ff6bec5..e660f95695 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -40,6 +40,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Bolt import androidx.compose.material.icons.filled.ExpandMore import androidx.compose.material.icons.filled.MoreVert +import androidx.compose.material.icons.filled.PushPin import androidx.compose.material.lightColors import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -51,6 +52,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment +import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Brush @@ -66,7 +68,6 @@ import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString -import androidx.compose.ui.text.capitalize import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow @@ -101,6 +102,7 @@ import com.vitorpamplona.amethyst.service.model.HighlightEvent import com.vitorpamplona.amethyst.service.model.LongTextNoteEvent import com.vitorpamplona.amethyst.service.model.Participant import com.vitorpamplona.amethyst.service.model.PeopleListEvent +import com.vitorpamplona.amethyst.service.model.PinListEvent import com.vitorpamplona.amethyst.service.model.PollNoteEvent import com.vitorpamplona.amethyst.service.model.PrivateDmEvent import com.vitorpamplona.amethyst.service.model.ReactionEvent @@ -385,6 +387,10 @@ fun NoteComposeInner( RenderAudioTrack(note, loggedIn, accountViewModel, navController) } + is PinListEvent -> { + RenderPinListEvent(noteState, backgroundColor, accountViewModel, navController) + } + is PrivateDmEvent -> { RenderPrivateMessage(note, makeItShort, isAcceptableAndCanPreview.second, backgroundColor, accountViewModel, navController) } @@ -877,6 +883,116 @@ private fun RenderRepost( } } +@Composable +private fun RenderPinListEvent( + noteState: NoteState?, + backgroundColor: Color, + accountViewModel: AccountViewModel, + navController: NavController +) { + val noteEvent = noteState?.note?.event as? PinListEvent ?: return + + PinListHeader(noteState, backgroundColor, accountViewModel, navController) + + ReactionsRow(noteState?.note, accountViewModel, navController) + + Divider( + modifier = Modifier.padding(top = 10.dp), + thickness = 0.25.dp + ) +} + +@Composable +fun PinListHeader( + noteState: NoteState?, + backgroundColor: Color, + accountViewModel: AccountViewModel, + navController: NavController +) { + val note = remember(noteState) { noteState?.note } ?: return + val noteEvent = note.event as? PinListEvent ?: return + + var pins by remember { mutableStateOf>(noteEvent.pins()) } + + var expanded by remember { + mutableStateOf(false) + } + + val pinsToShow = if (expanded) { + pins + } else { + pins.take(3) + } + + Text( + text = "#${noteEvent.dTag()}", + fontWeight = FontWeight.Bold, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier + .fillMaxWidth() + .padding(5.dp), + textAlign = TextAlign.Center + ) + + Box { + FlowRow(modifier = Modifier.padding(top = 5.dp)) { + pinsToShow.forEach { pin -> + Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = CenterVertically) { + Icon( + imageVector = Icons.Default.PushPin, + contentDescription = null, + tint = MaterialTheme.colors.onBackground.copy(0.12f), + modifier = Modifier.size(15.dp) + ) + + Spacer(modifier = Modifier.width(5.dp)) + + TranslatableRichTextViewer( + content = pin, + canPreview = true, + tags = emptyList(), + backgroundColor = backgroundColor, + accountViewModel = accountViewModel, + navController = navController + ) + } + } + } + + if (pins.size > 3 && !expanded) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center, + modifier = Modifier + .align(Alignment.BottomCenter) + .fillMaxWidth() + .background( + brush = Brush.verticalGradient( + colors = listOf( + backgroundColor.copy(alpha = 0f), + backgroundColor + ) + ) + ) + ) { + Button( + modifier = Modifier.padding(top = 10.dp), + onClick = { expanded = !expanded }, + shape = RoundedCornerShape(20.dp), + colors = ButtonDefaults.buttonColors( + backgroundColor = MaterialTheme.colors.primary.copy(alpha = 0.32f) + .compositeOver(MaterialTheme.colors.background) + ), + contentPadding = PaddingValues(vertical = 6.dp, horizontal = 16.dp) + ) { + Text(text = stringResource(R.string.show_more), color = Color.White) + } + } + } + } +} + @Composable private fun RenderAudioTrack( note: Note, @@ -1618,9 +1734,11 @@ fun AudioTrackHeader(noteEvent: AudioTrackEvent, note: Note, loggedIn: User, nav participantUsers.forEach { Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(top = 5.dp, start = 10.dp, end = 10.dp).clickable { - navController.navigate("User/${it.second.pubkeyHex}") - } + modifier = Modifier + .padding(top = 5.dp, start = 10.dp, end = 10.dp) + .clickable { + navController.navigate("User/${it.second.pubkeyHex}") + } ) { UserPicture(it.second, loggedIn, 25.dp) Spacer(Modifier.width(5.dp)) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt index b0909124e2..cc1d47a351 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt @@ -58,6 +58,7 @@ import com.vitorpamplona.amethyst.service.model.BadgeDefinitionEvent import com.vitorpamplona.amethyst.service.model.HighlightEvent import com.vitorpamplona.amethyst.service.model.LongTextNoteEvent import com.vitorpamplona.amethyst.service.model.PeopleListEvent +import com.vitorpamplona.amethyst.service.model.PinListEvent import com.vitorpamplona.amethyst.service.model.PollNoteEvent import com.vitorpamplona.amethyst.ui.components.ObserveDisplayNip05Status import com.vitorpamplona.amethyst.ui.components.TranslatableRichTextViewer @@ -355,6 +356,8 @@ fun NoteMaster( DisplayPeopleList(noteState, MaterialTheme.colors.background, accountViewModel, navController) } else if (noteEvent is AudioTrackEvent) { AudioTrackHeader(noteEvent, note, account.userProfile(), navController) + } else if (noteEvent is PinListEvent) { + PinListHeader(noteState, MaterialTheme.colors.background, accountViewModel, navController) } else if (noteEvent is HighlightEvent) { DisplayHighlight( noteEvent.quote(), From 3558bab7861e24f9f75e4eea266f47ce73e53bc7 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 15 May 2023 22:18:21 -0400 Subject: [PATCH 098/171] v0.49.0 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5d5882c9d5..382c6af861 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 162 - versionName "0.48.0" + versionCode 163 + versionName "0.49.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From d29e6b4d0be69b8a18f683998914cd2ffec14c2d Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 08:32:03 -0400 Subject: [PATCH 099/171] Better shade for Pins --- .../main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index e660f95695..da08295a05 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -942,7 +942,7 @@ fun PinListHeader( Icon( imageVector = Icons.Default.PushPin, contentDescription = null, - tint = MaterialTheme.colors.onBackground.copy(0.12f), + tint = MaterialTheme.colors.onBackground.copy(0.32f), modifier = Modifier.size(15.dp) ) From 14e670cd9a953aeedf7690ae88e7621a3bd0577d Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 08:32:25 -0400 Subject: [PATCH 100/171] Avoid color-filtering the emoji --- .../vitorpamplona/amethyst/ui/components/ClickableRoute.kt | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ClickableRoute.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ClickableRoute.kt index 8f2b3368b8..022a413438 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ClickableRoute.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ClickableRoute.kt @@ -21,7 +21,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.takeOrElse import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.text.AnnotatedString @@ -427,8 +426,7 @@ fun ClickableInLineIconRenderer(wordsInOrder: List, style: SpanStyle AsyncImage( model = value.url, contentDescription = null, - modifier = Modifier.fillMaxSize().padding(1.dp), - colorFilter = ColorFilter.tint(style.color) + modifier = Modifier.fillMaxSize().padding(1.dp) ) } ) @@ -492,8 +490,7 @@ fun InLineIconRenderer( AsyncImage( model = value.url, contentDescription = null, - modifier = Modifier.fillMaxSize().padding(1.dp), - colorFilter = ColorFilter.tint(style.color) + modifier = Modifier.fillMaxSize().padding(1.dp) ) } ) From 332490376b7ca459cbd6170b3b82613b6f6942aa Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 08:52:59 -0400 Subject: [PATCH 101/171] Adjustments to Markdown detection and rendering. --- .../vitorpamplona/amethyst/ui/components/RichTextViewer.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt index 1e5c2f5d10..b2f1b86746 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt @@ -81,7 +81,8 @@ fun isMarkdown(content: String): Boolean { content.startsWith("# ") || content.contains("##") || content.contains("__") || - content.contains("```") + content.contains("```") || + content.contains("](") } @Composable @@ -413,7 +414,7 @@ private fun RenderContentAsMarkdown(content: String, backgroundColor: Color) { private fun getDisplayNameFromNip19(nip19: Nip19.Return): String? { if (nip19.type == Nip19.Type.USER) { - return LocalCache.users[nip19.hex]?.bestDisplayName() + return LocalCache.users[nip19.hex]?.toBestDisplayName() } else if (nip19.type == Nip19.Type.NOTE) { return LocalCache.notes[nip19.hex]?.idDisplayNote() } else if (nip19.type == Nip19.Type.ADDRESS) { From 17fbf8c01f6d555ce2b57d3c15576016ed7c69aa Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 09:47:10 -0400 Subject: [PATCH 102/171] BugFix for incorrect caching of NIP95 --- .../amethyst/model/LocalCache.kt | 20 +++--- .../amethyst/ui/note/NoteCompose.kt | 68 ++++++++++--------- 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index 4973cac35e..7c70b64ac6 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -1,7 +1,6 @@ package com.vitorpamplona.amethyst.model import android.util.Log -import androidx.core.net.toUri import com.fasterxml.jackson.databind.DeserializationFeature import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.vitorpamplona.amethyst.Amethyst @@ -763,19 +762,18 @@ object LocalCache { note.addRelay(relay) } - val file = File(Amethyst.instance.applicationContext.externalCacheDir, "NIP95") - - if (!file.exists()) { - try { - val cachePath = File(Amethyst.instance.applicationContext.externalCacheDir, "NIP95") - cachePath.mkdirs() - val stream = FileOutputStream(File(cachePath, event.id)) + try { + val cachePath = File(Amethyst.instance.applicationContext.externalCacheDir, "NIP95") + cachePath.mkdirs() + val file = File(cachePath, event.id) + if (!file.exists()) { + val stream = FileOutputStream(file) stream.write(event.decode()) stream.close() - Log.e("EventLogger", "Saved to disk as ${File(cachePath, event.id).toUri()}") - } catch (e: IOException) { - Log.e("FileSotrageEvent", "FileStorageEvent save to disk error: " + event.id, e) + // Log.i("FileStorageEvent", "Saved to disk as ${File(cachePath, event.id).toUri()}") } + } catch (e: IOException) { + Log.e("FileStorageEvent", "FileStorageEvent save to disk error: " + event.id, e) } // Already processed this event. diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index da08295a05..cc7723a6f3 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -1657,45 +1657,47 @@ fun FileStorageHeaderDisplay(baseNote: Note) { } } - val noteState = fileNote?.live()?.metadata?.observeAsState() - val note = noteState?.value?.note + fileNote?.let { fileNote2 -> + val noteState by fileNote2.live().metadata.observeAsState() + val note = remember(noteState) { noteState?.note } - var content by remember { mutableStateOf(null) } + var content by remember { mutableStateOf(null) } - LaunchedEffect(key1 = eventHeader.id, key2 = noteState, key3 = note?.event) { - withContext(Dispatchers.IO) { - val uri = "nostr:" + baseNote.toNEvent() - val localDir = note?.idHex?.let { File(File(appContext.externalCacheDir, "NIP95"), it) } - val blurHash = eventHeader.blurhash() - val dimensions = eventHeader.dimensions() - val description = eventHeader.content - val mimeType = eventHeader.mimeType() + LaunchedEffect(key1 = eventHeader.id, key2 = noteState, key3 = note?.event) { + withContext(Dispatchers.IO) { + val uri = "nostr:" + baseNote.toNEvent() + val localDir = note?.idHex?.let { File(File(appContext.externalCacheDir, "NIP95"), it) } + val blurHash = eventHeader.blurhash() + val dimensions = eventHeader.dimensions() + val description = eventHeader.content + val mimeType = eventHeader.mimeType() - content = if (mimeType?.startsWith("image") == true) { - ZoomableLocalImage( - localFile = localDir, - mimeType = mimeType, - description = description, - blurhash = blurHash, - dim = dimensions, - isVerified = true, - uri = uri - ) - } else { - ZoomableLocalVideo( - localFile = localDir, - mimeType = mimeType, - description = description, - dim = dimensions, - isVerified = true, - uri = uri - ) + content = if (mimeType?.startsWith("image") == true) { + ZoomableLocalImage( + localFile = localDir, + mimeType = mimeType, + description = description, + blurhash = blurHash, + dim = dimensions, + isVerified = true, + uri = uri + ) + } else { + ZoomableLocalVideo( + localFile = localDir, + mimeType = mimeType, + description = description, + dim = dimensions, + isVerified = true, + uri = uri + ) + } } } - } - content?.let { - ZoomableContentView(content = it, listOf(it)) + content?.let { + ZoomableContentView(content = it, listOf(it)) + } } } From 4bf76d1b79afceebba8805a2741c47f3329bb4fd Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 09:47:18 -0400 Subject: [PATCH 103/171] v0.49.1 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 382c6af861..c2338ee4e7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 163 - versionName "0.49.0" + versionCode 164 + versionName "0.49.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From f2d87b78b1b882f048ceb3efde7d02e6d8a1b6e4 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 10:12:31 -0400 Subject: [PATCH 104/171] Fixing emoji's on chat handles --- .../amethyst/ui/components/ClickableRoute.kt | 94 ++++++++++--------- .../ui/note/ChatroomMessageCompose.kt | 1 + 2 files changed, 52 insertions(+), 43 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ClickableRoute.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ClickableRoute.kt index 022a413438..9bd2753fb9 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ClickableRoute.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ClickableRoute.kt @@ -89,31 +89,31 @@ private fun DisplayEvent( if (note.event is ChannelCreateEvent) { CreateClickableText( - note.idDisplayNote(), - "${nip19.additionalChars} ", - "Channel/${nip19.hex}", - navController + clickablePart = "@${note.idDisplayNote()}", + suffix = "${nip19.additionalChars} ", + route = "Channel/${nip19.hex}", + navController = navController ) } else if (note.event is PrivateDmEvent) { CreateClickableText( - note.idDisplayNote(), - "${nip19.additionalChars} ", - "Room/${note.author?.pubkeyHex}", - navController + clickablePart = "@${note.idDisplayNote()}", + suffix = "${nip19.additionalChars} ", + route = "Room/${note.author?.pubkeyHex}", + navController = navController ) } else if (channel != null) { CreateClickableText( - channel.toBestDisplayName(), - "${nip19.additionalChars} ", - "Channel/${note.channel()?.idHex}", - navController + clickablePart = channel.toBestDisplayName(), + suffix = "${nip19.additionalChars} ", + route = "Channel/${note.channel()?.idHex}", + navController = navController ) } else { CreateClickableText( - note.idDisplayNote(), - "${nip19.additionalChars} ", - "Event/${nip19.hex}", - navController + clickablePart = "@${note.idDisplayNote()}", + suffix = "${nip19.additionalChars} ", + route = "Event/${nip19.hex}", + navController = navController ) } } @@ -145,31 +145,31 @@ private fun DisplayNote( if (note.event is ChannelCreateEvent) { CreateClickableText( - note.idDisplayNote(), - "${nip19.additionalChars} ", - "Channel/${nip19.hex}", - navController + clickablePart = "@${note.idDisplayNote()}", + suffix = "${nip19.additionalChars} ", + route = "Channel/${nip19.hex}", + navController = navController ) } else if (note.event is PrivateDmEvent) { CreateClickableText( - note.idDisplayNote(), - "${nip19.additionalChars} ", - "Room/${note.author?.pubkeyHex}", - navController + clickablePart = "@${note.idDisplayNote()}", + suffix = "${nip19.additionalChars} ", + route = "Room/${note.author?.pubkeyHex}", + navController = navController ) } else if (channel != null) { CreateClickableText( - channel.toBestDisplayName(), - "${nip19.additionalChars} ", - "Channel/${note.channel()?.idHex}", - navController + clickablePart = channel.toBestDisplayName(), + suffix = "${nip19.additionalChars} ", + route = "Channel/${note.channel()?.idHex}", + navController = navController ) } else { CreateClickableText( - note.idDisplayNote(), - "${nip19.additionalChars} ", - "Note/${nip19.hex}", - navController + clickablePart = "@${note.idDisplayNote()}", + suffix = "${nip19.additionalChars} ", + route = "Note/${nip19.hex}", + navController = navController ) } } @@ -199,10 +199,10 @@ private fun DisplayAddress( val note = noteState?.note ?: return CreateClickableText( - note.idDisplayNote(), - "${nip19.additionalChars} ", - "Note/${nip19.hex}", - navController + clickablePart = "@${note.idDisplayNote()}", + suffix = "${nip19.additionalChars} ", + route = "Note/${nip19.hex}", + navController = navController ) } @@ -251,16 +251,23 @@ private fun DisplayUser( } @Composable -fun CreateClickableText(clickablePart: String, suffix: String, route: String, navController: NavController) { +fun CreateClickableText( + clickablePart: String, + suffix: String, + overrideColor: Color? = null, + fontWeight: FontWeight = FontWeight.Normal, + route: String, + navController: NavController +) { ClickableText( text = buildAnnotatedString { withStyle( - LocalTextStyle.current.copy(color = MaterialTheme.colors.primary).toSpanStyle() + LocalTextStyle.current.copy(color = overrideColor ?: MaterialTheme.colors.primary, fontWeight = fontWeight).toSpanStyle() ) { - append("@$clickablePart") + append(clickablePart) } withStyle( - LocalTextStyle.current.copy(color = MaterialTheme.colors.onBackground).toSpanStyle() + LocalTextStyle.current.copy(color = overrideColor ?: MaterialTheme.colors.onBackground, fontWeight = fontWeight).toSpanStyle() ) { append(suffix) } @@ -368,6 +375,7 @@ fun CreateClickableTextWithEmoji( clickablePart: String, suffix: String, tags: List>?, + overrideColor: Color? = null, fontWeight: FontWeight = FontWeight.Normal, route: String, navController: NavController @@ -377,13 +385,13 @@ fun CreateClickableTextWithEmoji( } if (emojis.isEmpty()) { - CreateClickableText(clickablePart, suffix, route, navController) + CreateClickableText(clickablePart, suffix, overrideColor, fontWeight, route, navController) } else { val myList = remember { assembleAnnotatedList(clickablePart, emojis) } - ClickableInLineIconRenderer(myList, LocalTextStyle.current.copy(color = MaterialTheme.colors.primary, fontWeight = fontWeight).toSpanStyle()) { + ClickableInLineIconRenderer(myList, LocalTextStyle.current.copy(color = overrideColor ?: MaterialTheme.colors.primary, fontWeight = fontWeight).toSpanStyle()) { navController.navigate(route) } @@ -391,7 +399,7 @@ fun CreateClickableTextWithEmoji( assembleAnnotatedList(suffix, emojis) } - InLineIconRenderer(myList2, LocalTextStyle.current.copy(color = MaterialTheme.colors.onBackground, fontWeight = fontWeight).toSpanStyle()) + InLineIconRenderer(myList2, LocalTextStyle.current.copy(color = overrideColor ?: MaterialTheme.colors.onBackground, fontWeight = fontWeight).toSpanStyle()) } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt index 3c6936b231..ffb7dbea5c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt @@ -225,6 +225,7 @@ fun ChatroomMessageCompose( suffix = "", tags = author.info?.latestMetadata?.tags, fontWeight = FontWeight.Bold, + overrideColor = MaterialTheme.colors.onBackground, route = "User/${author.pubkeyHex}", navController = navController ) From 1767d4a3a3eea446bf0b5db4dc20b4acd2a9166a Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 10:24:05 -0400 Subject: [PATCH 105/171] Enabling a log to help NIP95 relay developers track what the app is doing with their images. --- .../main/java/com/vitorpamplona/amethyst/model/LocalCache.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index 7c70b64ac6..d53a73a75c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -770,7 +770,7 @@ object LocalCache { val stream = FileOutputStream(file) stream.write(event.decode()) stream.close() - // Log.i("FileStorageEvent", "Saved to disk as ${File(cachePath, event.id).toUri()}") + Log.i("FileStorageEvent", "NIP95 File received from ${relay?.url} and saved to disk as $file") } } catch (e: IOException) { Log.e("FileStorageEvent", "FileStorageEvent save to disk error: " + event.id, e) From 1d5ff5bea9d3f0685e92839c764a0a6224239f8f Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 10:24:45 -0400 Subject: [PATCH 106/171] v0.49.2 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c2338ee4e7..2e3b151c79 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 164 - versionName "0.49.1" + versionCode 165 + versionName "0.49.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From 76df70c6f67880dd552c7671a3969686db83c1d3 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 11:10:17 -0400 Subject: [PATCH 107/171] Making sure filters return similar orders when two posts are published at the same time. --- .../main/java/com/vitorpamplona/amethyst/model/Channel.kt | 2 +- .../amethyst/ui/dal/BookmarkPrivateFeedFilter.kt | 2 +- .../amethyst/ui/dal/BookmarkPublicFeedFilter.kt | 2 +- .../vitorpamplona/amethyst/ui/dal/ChannelFeedFilter.kt | 4 ++-- .../vitorpamplona/amethyst/ui/dal/ChatroomFeedFilter.kt | 4 ++-- .../amethyst/ui/dal/ChatroomListKnownFeedFilter.kt | 6 +++--- .../amethyst/ui/dal/ChatroomListNewFeedFilter.kt | 4 ++-- .../vitorpamplona/amethyst/ui/dal/HashtagFeedFilter.kt | 2 +- .../amethyst/ui/dal/HomeConversationsFeedFilter.kt | 2 +- .../amethyst/ui/dal/HomeNewThreadFeedFilter.kt | 2 +- .../amethyst/ui/dal/NotificationFeedFilter.kt | 2 +- .../vitorpamplona/amethyst/ui/dal/PeopleListFeedFilter.kt | 2 +- .../amethyst/ui/dal/UserProfileBookmarksFeedFilter.kt | 2 +- .../amethyst/ui/dal/UserProfileConversationsFeedFilter.kt | 2 +- .../amethyst/ui/dal/UserProfileNewThreadFeedFilter.kt | 2 +- .../amethyst/ui/dal/UserProfileReportsFeedFilter.kt | 2 +- .../vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt | 8 ++++---- .../amethyst/ui/screen/loggedIn/SearchScreen.kt | 2 +- 18 files changed, 26 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Channel.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Channel.kt index 7716d04cc5..ceae0d7297 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Channel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Channel.kt @@ -57,7 +57,7 @@ class Channel(val idHex: String) { fun pruneOldAndHiddenMessages(account: Account): Set { val important = notes.values .filter { it.author?.let { it1 -> account.isHidden(it1) } == false } - .sortedBy { it.createdAt() } + .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) .reversed() .take(1000) .toSet() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPrivateFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPrivateFeedFilter.kt index 7f049c8820..49cb27fbb2 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPrivateFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPrivateFeedFilter.kt @@ -19,7 +19,7 @@ object BookmarkPrivateFeedFilter : FeedFilter() { ?.map { LocalCache.getOrCreateAddressableNote(it) } ?: emptyList() return notes.plus(addresses).toSet() - .sortedBy { it.createdAt() } + .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) .reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPublicFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPublicFeedFilter.kt index 3bc368f1f2..779be607e0 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPublicFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/BookmarkPublicFeedFilter.kt @@ -14,7 +14,7 @@ object BookmarkPublicFeedFilter : FeedFilter() { val addresses = bookmarks?.taggedAddresses()?.map { LocalCache.getOrCreateAddressableNote(it) } ?: emptyList() return notes.plus(addresses).toSet() - .sortedBy { it.createdAt() } + .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) .reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChannelFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChannelFeedFilter.kt index 74a104ae40..21ea7ef48d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChannelFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChannelFeedFilter.kt @@ -21,7 +21,7 @@ object ChannelFeedFilter : AdditiveFeedFilter() { return channel.notes .values .filter { account.isAcceptable(it) } - .sortedBy { it.createdAt() } + .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) .reversed() } @@ -35,6 +35,6 @@ object ChannelFeedFilter : AdditiveFeedFilter() { } override fun sort(collection: Set): List { - return collection.sortedBy { it.createdAt() }.reversed() + return collection.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomFeedFilter.kt index 3cdb265f7e..2aa617fe01 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomFeedFilter.kt @@ -28,7 +28,7 @@ object ChatroomFeedFilter : AdditiveFeedFilter() { return messages.roomMessages .filter { myAccount.isAcceptable(it) } - .sortedBy { it.createdAt() } + .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) .reversed() } @@ -50,6 +50,6 @@ object ChatroomFeedFilter : AdditiveFeedFilter() { } override fun sort(collection: Set): List { - return collection.sortedBy { it.createdAt() }.reversed() + return collection.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListKnownFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListKnownFeedFilter.kt index 812872134a..66d44afe4c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListKnownFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListKnownFeedFilter.kt @@ -19,20 +19,20 @@ object ChatroomListKnownFeedFilter : FeedFilter() { val privateMessages = messagingWith.mapNotNull { it -> privateChatrooms[it] ?.roomMessages - ?.sortedBy { it.createdAt() } + ?.sortedWith(compareBy({ it.createdAt() }, { it.idHex })) ?.lastOrNull { it.event != null } } val publicChannels = account.followingChannels().map { it -> it.notes.values .filter { account.isAcceptable(it) } - .sortedBy { it.createdAt() } + .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) .lastOrNull { it.event != null } } return (privateMessages + publicChannels) .filterNotNull() - .sortedBy { it.createdAt() } + .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) .reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListNewFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListNewFeedFilter.kt index 4ca7334e58..a69e6c60d3 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListNewFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/ChatroomListNewFeedFilter.kt @@ -19,12 +19,12 @@ object ChatroomListNewFeedFilter : FeedFilter() { val privateMessages = messagingWith.mapNotNull { it -> privateChatrooms[it] ?.roomMessages - ?.sortedBy { it.createdAt() } + ?.sortedWith(compareBy({ it.createdAt() }, { it.idHex })) ?.lastOrNull { it.event != null } } return privateMessages - .sortedBy { it.createdAt() } + .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) .reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HashtagFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HashtagFeedFilter.kt index 97775bfb99..5f5106c848 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HashtagFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HashtagFeedFilter.kt @@ -44,6 +44,6 @@ object HashtagFeedFilter : AdditiveFeedFilter() { } override fun sort(collection: Set): List { - return collection.sortedBy { it.createdAt() }.reversed() + return collection.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeConversationsFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeConversationsFeedFilter.kt index a5cda41b9c..e7bf4b9ae2 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeConversationsFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeConversationsFeedFilter.kt @@ -34,6 +34,6 @@ object HomeConversationsFeedFilter : AdditiveFeedFilter() { } override fun sort(collection: Set): List { - return collection.sortedBy { it.createdAt() }.reversed() + return collection.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeNewThreadFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeNewThreadFeedFilter.kt index 055513180e..6519bc6349 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeNewThreadFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HomeNewThreadFeedFilter.kt @@ -41,6 +41,6 @@ object HomeNewThreadFeedFilter : AdditiveFeedFilter() { } override fun sort(collection: Set): List { - return collection.sortedBy { it.createdAt() }.reversed() + return collection.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/NotificationFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/NotificationFeedFilter.kt index ea06b0771d..4aad1f4816 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/NotificationFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/NotificationFeedFilter.kt @@ -41,7 +41,7 @@ object NotificationFeedFilter : AdditiveFeedFilter() { } override fun sort(collection: Set): List { - return collection.sortedBy { it.createdAt() }.reversed() + return collection.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() } fun tagsAnEventByUser(note: Note, author: User): Boolean { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/PeopleListFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/PeopleListFeedFilter.kt index 11263ffc8d..46bf82fe98 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/PeopleListFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/PeopleListFeedFilter.kt @@ -19,7 +19,7 @@ object PeopleListFeedFilter : FeedFilter() { .toSet() return lists - .sortedBy { it.createdAt() } + .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) .reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileBookmarksFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileBookmarksFeedFilter.kt index b2c0829fa1..837b77f122 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileBookmarksFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileBookmarksFeedFilter.kt @@ -25,7 +25,7 @@ object UserProfileBookmarksFeedFilter : FeedFilter() { return (notes + addresses) .filter { account.isAcceptable(it) } - .sortedBy { it.createdAt() } + .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) .reversed() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileConversationsFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileConversationsFeedFilter.kt index 681865c78b..8d8f559c25 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileConversationsFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileConversationsFeedFilter.kt @@ -16,7 +16,7 @@ object UserProfileConversationsFeedFilter : FeedFilter() { override fun feed(): List { return user?.notes ?.filter { account?.isAcceptable(it) == true && !it.isNewThread() } - ?.sortedBy { it.createdAt() } + ?.sortedWith(compareBy({ it.createdAt() }, { it.idHex })) ?.reversed() ?: emptyList() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileNewThreadFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileNewThreadFeedFilter.kt index 13d1974210..87e2e642a2 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileNewThreadFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileNewThreadFeedFilter.kt @@ -23,7 +23,7 @@ object UserProfileNewThreadFeedFilter : FeedFilter() { return user?.notes ?.plus(longFormNotes) ?.filter { account?.isAcceptable(it) == true && it.isNewThread() } - ?.sortedBy { it.createdAt() } + ?.sortedWith(compareBy({ it.createdAt() }, { it.idHex })) ?.reversed() ?: emptyList() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileReportsFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileReportsFeedFilter.kt index 50716ac5b4..12badf519b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileReportsFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/UserProfileReportsFeedFilter.kt @@ -14,7 +14,7 @@ object UserProfileReportsFeedFilter : FeedFilter() { return user?.reports ?.values ?.flatten() - ?.sortedBy { it.createdAt() } + ?.sortedWith(compareBy({ it.createdAt() }, { it.idHex })) ?.reversed() ?: emptyList() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt index 47feb186d1..075419debf 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt @@ -59,7 +59,7 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { if (newCards.isNotEmpty()) { lastNotes = notes lastAccount = (localFilter as? NotificationFeedFilter)?.account - updateFeed((oldNotesState.feed.value + newCards).distinctBy { it.id() }.sortedBy { it.createdAt() }.reversed()) + updateFeed((oldNotesState.feed.value + newCards).distinctBy { it.id() }.sortedWith(compareBy({ it.createdAt() }, { it.id() })).reversed()) } } else { val cards = convertToCard(notes) @@ -129,7 +129,7 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { val reactionsInCard = reactionsPerEvent[baseNote] ?: emptyList() val zapsInCard = zapsPerEvent[baseNote] ?: emptyMap() - val singleList = (boostsInCard + zapsInCard.values + reactionsInCard).sortedBy { it.createdAt() }.reversed() + val singleList = (boostsInCard + zapsInCard.values + reactionsInCard).sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() singleList.chunked(50).map { chunk -> MultiSetCard( baseNote, @@ -157,7 +157,7 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { } } - return (multiCards + textNoteCards + userZaps).sortedBy { it.createdAt() }.reversed() + return (multiCards + textNoteCards + userZaps).sortedWith(compareBy({ it.createdAt() }, { it.id() })).reversed() } private fun updateFeed(notes: List) { @@ -190,7 +190,7 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { if (newCards.isNotEmpty()) { lastNotes = lastNotesCopy + newItems lastAccount = (localFilter as? NotificationFeedFilter)?.account - updateFeed((oldNotesState.feed.value + newCards).distinctBy { it.id() }.sortedBy { it.createdAt() }.reversed()) + updateFeed((oldNotesState.feed.value + newCards).distinctBy { it.id() }.sortedWith(compareBy({ it.createdAt() }, { it.id() })).reversed()) } } else { // Refresh Everything diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt index 9cd24bf61a..d37de7787c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt @@ -157,7 +157,7 @@ class SearchBarViewModel : ViewModel() { hashtagResults.value = findHashtags(searchValue) searchResults.value = LocalCache.findUsersStartingWith(searchValue) - searchResultsNotes.value = LocalCache.findNotesStartingWith(searchValue).sortedBy { it.createdAt() }.reversed() + searchResultsNotes.value = LocalCache.findNotesStartingWith(searchValue).sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() searchResultsChannels.value = LocalCache.findChannelsStartingWith(searchValue) } From 9e93a35ee7d16aed6b3c1d443d06cbe55a655695 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 11:30:43 -0400 Subject: [PATCH 108/171] Parsing NIP-19 to improve search results. --- .../com/vitorpamplona/amethyst/model/Hex.kt | 17 +++++++++++ .../amethyst/model/LocalCache.kt | 29 +++++++++++++++++++ .../NostrSearchEventOrUserDataSource.kt | 12 +++----- 3 files changed, 50 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Hex.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Hex.kt index a9ab40817d..612f1fdb58 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Hex.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Hex.kt @@ -50,6 +50,23 @@ fun decodePublicKey(key: String): ByteArray { } } +fun decodePublicKeyAsHexOrNull(key: String): HexKey? { + return try { + val parsed = Nip19.uriToRoute(key) + val pubKeyParsed = parsed?.hex + + if (key.startsWith("nsec")) { + Persona(privKey = key.bechToBytes()).pubKey.toHexKey() + } else if (pubKeyParsed != null) { + pubKeyParsed + } else { + Hex.decode(key).toHexKey() + } + } catch (e: Exception) { + null + } +} + data class DirtyKeyInfo(val key: Nip19.Return, val restOfWord: String) fun parseDirtyWordForKey(mightBeAKey: String): DirtyKeyInfo? { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index d53a73a75c..088a811c02 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -5,12 +5,15 @@ import com.fasterxml.jackson.databind.DeserializationFeature import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.vitorpamplona.amethyst.Amethyst import com.vitorpamplona.amethyst.service.model.* +import com.vitorpamplona.amethyst.service.nip19.Nip19 import com.vitorpamplona.amethyst.service.relays.Relay import com.vitorpamplona.amethyst.ui.components.BundledInsert import fr.acinq.secp256k1.Hex import kotlinx.coroutines.* import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow +import nostr.postr.Persona +import nostr.postr.bechToBytes import nostr.postr.toNpub import java.io.ByteArrayInputStream import java.io.File @@ -833,6 +836,12 @@ object LocalCache { } fun findUsersStartingWith(username: String): List { + val key = decodePublicKeyAsHexOrNull(username) + + if (key != null && users[key] != null) { + return listOfNotNull(users[key]) + } + return users.values.filter { (it.anyNameStartsWith(username)) || it.pubkeyHex.startsWith(username, true) || @@ -841,6 +850,16 @@ object LocalCache { } fun findNotesStartingWith(text: String): List { + val key = try { + Nip19.uriToRoute(text)?.hex ?: Hex.decode(text).toHexKey() + } catch (e: Exception) { + null + } + + if (key != null && (notes[key] ?: addressables[key]) != null) { + return listOfNotNull(notes[key] ?: addressables[key]) + } + return notes.values.filter { (it.event is TextNoteEvent && it.event?.content()?.contains(text, true) ?: false) || (it.event is PollNoteEvent && it.event?.content()?.contains(text, true) ?: false) || @@ -856,6 +875,16 @@ object LocalCache { } fun findChannelsStartingWith(text: String): List { + val key = try { + Nip19.uriToRoute(text)?.hex ?: Hex.decode(text).toHexKey() + } catch (e: Exception) { + null + } + + if (key != null && channels[key] != null) { + return listOfNotNull(channels[key]) + } + return channels.values.filter { it.anyNameStartsWith(text) || it.idHex.startsWith(text, true) || diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSearchEventOrUserDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSearchEventOrUserDataSource.kt index f2656f9497..958335ad30 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSearchEventOrUserDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSearchEventOrUserDataSource.kt @@ -1,11 +1,14 @@ package com.vitorpamplona.amethyst.service import com.vitorpamplona.amethyst.model.decodePublicKey +import com.vitorpamplona.amethyst.model.toHexKey import com.vitorpamplona.amethyst.service.model.* +import com.vitorpamplona.amethyst.service.nip19.Nip19 import com.vitorpamplona.amethyst.service.relays.COMMON_FEED_TYPES import com.vitorpamplona.amethyst.service.relays.FeedType import com.vitorpamplona.amethyst.service.relays.JsonFilter import com.vitorpamplona.amethyst.service.relays.TypedFilter +import fr.acinq.secp256k1.Hex import nostr.postr.bechToBytes import nostr.postr.toHex @@ -19,15 +22,8 @@ object NostrSearchEventOrUserDataSource : NostrDataSource("SingleEventFeed") { } val hexToWatch = try { - if (mySearchString.startsWith("npub") || mySearchString.startsWith("nsec")) { - decodePublicKey(mySearchString).toHex() - } else if (mySearchString.startsWith("note")) { - mySearchString.bechToBytes().toHex() - } else { - mySearchString - } + Nip19.uriToRoute(mySearchString)?.hex ?: Hex.decode(mySearchString).toHexKey() } catch (e: Exception) { - // Usually when people add an incomplete npub or note. null } From 7a14a1ab26a79fa6aa2904566b074bbf694d9baa Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 11:30:54 -0400 Subject: [PATCH 109/171] Formatting --- .../main/java/com/vitorpamplona/amethyst/model/LocalCache.kt | 2 -- .../amethyst/service/NostrSearchEventOrUserDataSource.kt | 3 --- 2 files changed, 5 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index 088a811c02..16257be07c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -12,8 +12,6 @@ import fr.acinq.secp256k1.Hex import kotlinx.coroutines.* import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow -import nostr.postr.Persona -import nostr.postr.bechToBytes import nostr.postr.toNpub import java.io.ByteArrayInputStream import java.io.File diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSearchEventOrUserDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSearchEventOrUserDataSource.kt index 958335ad30..12325a438a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSearchEventOrUserDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSearchEventOrUserDataSource.kt @@ -1,6 +1,5 @@ package com.vitorpamplona.amethyst.service -import com.vitorpamplona.amethyst.model.decodePublicKey import com.vitorpamplona.amethyst.model.toHexKey import com.vitorpamplona.amethyst.service.model.* import com.vitorpamplona.amethyst.service.nip19.Nip19 @@ -9,8 +8,6 @@ import com.vitorpamplona.amethyst.service.relays.FeedType import com.vitorpamplona.amethyst.service.relays.JsonFilter import com.vitorpamplona.amethyst.service.relays.TypedFilter import fr.acinq.secp256k1.Hex -import nostr.postr.bechToBytes -import nostr.postr.toHex object NostrSearchEventOrUserDataSource : NostrDataSource("SingleEventFeed") { private var searchString: String? = null From 3950517743aa396e9393cf98611708d1abe87c57 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 12:20:27 -0400 Subject: [PATCH 110/171] Improves rendering performance for chats. --- .../ui/note/ChatroomMessageCompose.kt | 660 +++++++++++------- 1 file changed, 398 insertions(+), 262 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt index ffb7dbea5c..a20a887be7 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt @@ -27,6 +27,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ChevronRight import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf @@ -45,6 +46,7 @@ import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.platform.UriHandler import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.IntSize @@ -55,9 +57,12 @@ import com.google.accompanist.flowlayout.FlowRow import com.vitorpamplona.amethyst.NotificationCache import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.model.User +import com.vitorpamplona.amethyst.service.model.AudioTrackEvent import com.vitorpamplona.amethyst.service.model.ChannelCreateEvent import com.vitorpamplona.amethyst.service.model.ChannelMessageEvent import com.vitorpamplona.amethyst.service.model.ChannelMetadataEvent +import com.vitorpamplona.amethyst.service.model.EventInterface import com.vitorpamplona.amethyst.ui.components.CreateClickableTextWithEmoji import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji import com.vitorpamplona.amethyst.ui.components.ResizeImage @@ -67,6 +72,7 @@ import com.vitorpamplona.amethyst.ui.components.TranslatableRichTextViewer import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext val ChatBubbleShapeMe = RoundedCornerShape(15.dp, 15.dp, 3.dp, 15.dp) val ChatBubbleShapeThem = RoundedCornerShape(3.dp, 15.dp, 15.dp, 15.dp) @@ -82,320 +88,416 @@ fun ChatroomMessageCompose( navController: NavController, onWantsToReply: (Note) -> Unit ) { - val noteState by baseNote.live().metadata.observeAsState() - val note = noteState?.note - val accountState by accountViewModel.accountLiveData.observeAsState() - val account = accountState?.account ?: return + val account = remember(accountState) { accountState?.account } ?: return + val loggedIn = remember(accountState) { accountState?.account?.userProfile() } ?: return + + val noteState by baseNote.live().metadata.observeAsState() + val note = remember(noteState) { noteState?.note } val noteReportsState by baseNote.live().reports.observeAsState() - val noteForReports = noteReportsState?.note ?: return + val noteForReports = remember(noteReportsState) { noteReportsState?.note } ?: return - val accountUser = account.userProfile() + val noteEvent = note?.event var popupExpanded by remember { mutableStateOf(false) } - var showHiddenNote by remember { mutableStateOf(false) } - val context = LocalContext.current.applicationContext - val scope = rememberCoroutineScope() + if (noteEvent == null) { + BlankNote(Modifier.combinedClickable( + onClick = { }, + onLongClick = { popupExpanded = true } + )) - if (note?.event == null) { - BlankNote(Modifier) - } else if (!account.isAcceptable(noteForReports) && !showHiddenNote) { - if (!account.isHidden(noteForReports.author!!)) { - HiddenNote( - account.getRelevantReports(noteForReports), - account.userProfile(), - Modifier, - innerQuote, - navController, - onClick = { showHiddenNote = true } - ) + note?.let { + NoteQuickActionMenu(it, popupExpanded, { popupExpanded = false }, accountViewModel) } } else { - var backgroundBubbleColor: Color - var alignment: Arrangement.Horizontal - var shape: Shape + var showHiddenNote by remember { mutableStateOf(false) } + var isAcceptableAndCanPreview by remember { mutableStateOf(Pair(true, true)) } - val grayTint = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + LaunchedEffect(key1 = noteReportsState, key2 = accountState) { + withContext(Dispatchers.IO) { + account.userProfile().let { loggedIn -> + val newCanPreview = note.author === loggedIn || + (note.author?.let { loggedIn.isFollowingCached(it) } ?: true) || + !(noteForReports.hasAnyReports()) - if (note.author == accountUser) { - backgroundBubbleColor = MaterialTheme.colors.primary.copy(alpha = 0.32f) - alignment = Arrangement.End - shape = ChatBubbleShapeMe - } else { - backgroundBubbleColor = MaterialTheme.colors.onSurface.copy(alpha = 0.12f) - alignment = Arrangement.Start - shape = ChatBubbleShapeThem - } + val newIsAcceptable = account.isAcceptable(noteForReports) - if (parentBackgroundColor != null) { - backgroundBubbleColor = backgroundBubbleColor.compositeOver(parentBackgroundColor) - } else { - backgroundBubbleColor = backgroundBubbleColor.compositeOver(MaterialTheme.colors.background) - } - - var isNew by remember { mutableStateOf(false) } - - LaunchedEffect(key1 = routeForLastRead) { - routeForLastRead?.let { - scope.launch(Dispatchers.IO) { - val lastTime = NotificationCache.load(it) - - val createdAt = note.createdAt() - if (createdAt != null) { - NotificationCache.markAsRead(it, createdAt) - isNew = createdAt > lastTime + if (newIsAcceptable != isAcceptableAndCanPreview.first && newCanPreview != isAcceptableAndCanPreview.second) { + isAcceptableAndCanPreview = Pair(newIsAcceptable, newCanPreview) } } } } - Column() { - val modif = if (innerQuote) { - Modifier.padding(top = 10.dp, end = 5.dp) - } else { - Modifier - .fillMaxWidth(1f) - .padding( - start = 12.dp, - end = 12.dp, - top = 5.dp, - bottom = 5.dp - ) + if (!isAcceptableAndCanPreview.first && !showHiddenNote) { + if (!account.isHidden(noteForReports.author!!)) { + HiddenNote( + account.getRelevantReports(noteForReports), + account.userProfile(), + Modifier, + innerQuote, + navController, + onClick = { showHiddenNote = true } + ) } - Row( - modifier = modif, - horizontalArrangement = alignment - ) { - var availableBubbleSize by remember { mutableStateOf(IntSize.Zero) } - val modif2 = if (innerQuote) Modifier else Modifier.fillMaxWidth(0.85f) + } else { + val backgroundBubbleColor: Color + val alignment: Arrangement.Horizontal + val shape: Shape + + if (note.author == loggedIn) { + backgroundBubbleColor = MaterialTheme.colors.primary.copy(alpha = 0.32f) + .compositeOver(parentBackgroundColor ?: MaterialTheme.colors.background) + + alignment = Arrangement.End + shape = ChatBubbleShapeMe + } else { + backgroundBubbleColor = MaterialTheme.colors.onSurface.copy(alpha = 0.12f) + .compositeOver(parentBackgroundColor ?: MaterialTheme.colors.background) + + alignment = Arrangement.Start + shape = ChatBubbleShapeThem + } + + val scope = rememberCoroutineScope() + + LaunchedEffect(key1 = routeForLastRead) { + routeForLastRead?.let { + scope.launch(Dispatchers.IO) { + val lastTime = NotificationCache.load(it) + + val createdAt = note.createdAt() + if (createdAt != null) { + NotificationCache.markAsRead(it, createdAt) + } + } + } + } + + Column() { + val modif = remember { + if (innerQuote) { + Modifier.padding(top = 10.dp, end = 5.dp) + } else { + Modifier + .fillMaxWidth(1f) + .padding( + start = 12.dp, + end = 12.dp, + top = 5.dp, + bottom = 5.dp + ) + } + } Row( - horizontalArrangement = alignment, - modifier = modif2.onSizeChanged { - availableBubbleSize = it - } + modifier = modif, + horizontalArrangement = alignment ) { - Surface( - color = backgroundBubbleColor, - shape = shape, - modifier = Modifier - .combinedClickable( - onClick = { }, - onLongClick = { popupExpanded = true } - ) + var availableBubbleSize by remember { mutableStateOf(IntSize.Zero) } + val modif2 = if (innerQuote) Modifier else Modifier.fillMaxWidth(0.85f) + + Row( + horizontalArrangement = alignment, + modifier = modif2.onSizeChanged { + availableBubbleSize = it + } ) { - var bubbleSize by remember { mutableStateOf(IntSize.Zero) } - - Column( + Surface( + color = backgroundBubbleColor, + shape = shape, modifier = Modifier - .padding(start = 10.dp, end = 5.dp, bottom = 5.dp) - .onSizeChanged { - bubbleSize = it - } + .combinedClickable( + onClick = { }, + onLongClick = { popupExpanded = true } + ) ) { - val authorState by note.author!!.live().metadata.observeAsState() - val author = authorState?.user!! + var bubbleSize by remember { mutableStateOf(IntSize.Zero) } - if (innerQuote || author != accountUser && note.event is ChannelMessageEvent) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = alignment, - modifier = Modifier.padding(top = 5.dp) - ) { - RobohashAsyncImageProxy( - robot = author.pubkeyHex, - model = ResizeImage(author.profilePicture(), 25.dp), - contentDescription = stringResource(id = R.string.profile_image), - modifier = Modifier - .width(25.dp) - .height(25.dp) - .clip(shape = CircleShape) - .clickable(onClick = { - author.let { - navController.navigate("User/${it.pubkeyHex}") - } - }) - ) - - CreateClickableTextWithEmoji( - clickablePart = " ${author.toBestDisplayName()}", - suffix = "", - tags = author.info?.latestMetadata?.tags, - fontWeight = FontWeight.Bold, - overrideColor = MaterialTheme.colors.onBackground, - route = "User/${author.pubkeyHex}", - navController = navController - ) - } - } - - val replyTo = note.replyTo - if (!innerQuote && !replyTo.isNullOrEmpty()) { - Row(verticalAlignment = Alignment.CenterVertically) { - replyTo.toSet().mapIndexed { _, note -> - ChatroomMessageCompose( - note, - null, - innerQuote = true, - parentBackgroundColor = backgroundBubbleColor, - accountViewModel = accountViewModel, - navController = navController, - onWantsToReply = onWantsToReply - ) - } - } - } - - Row(verticalAlignment = Alignment.CenterVertically) { - val event = note.event - if (event is ChannelCreateEvent) { - val channelInfo = event.channelInfo() - val text = note.author?.toBestDisplayName() - .toString() + " ${stringResource(R.string.created)} " + ( - channelInfo.name - ?: "" - ) + " ${stringResource(R.string.with_description_of)} '" + ( - channelInfo.about - ?: "" - ) + "', ${stringResource(R.string.and_picture)} '" + ( - channelInfo.picture - ?: "" - ) + "'" - - CreateTextWithEmoji( - text = text, - tags = note.author?.info?.latestMetadata?.tags - ) - } else if (event is ChannelMetadataEvent) { - val channelInfo = event.channelInfo() - val text = note.author?.toBestDisplayName() - .toString() + " ${stringResource(R.string.changed_chat_name_to)} '" + ( - channelInfo.name - ?: "" - ) + "', ${stringResource(R.string.description_to)} '" + ( - channelInfo.about - ?: "" - ) + "', ${stringResource(R.string.and_picture_to)} '" + ( - channelInfo.picture - ?: "" - ) + "'" - - CreateTextWithEmoji( - text = text, - tags = note.author?.info?.latestMetadata?.tags - ) - } else { - val eventContent = accountViewModel.decrypt(note) - - val canPreview = note.author == accountUser || - (note.author?.let { accountUser.isFollowingCached(it) } ?: true) || - !noteForReports.hasAnyReports() - - if (eventContent != null) { - TranslatableRichTextViewer( - eventContent, - canPreview, - Modifier.padding(top = 5.dp), - note.event?.tags(), - backgroundBubbleColor, - accountViewModel, - navController - ) - } else { - TranslatableRichTextViewer( - stringResource(R.string.could_not_decrypt_the_message), - true, - Modifier.padding(top = 5.dp), - note.event?.tags(), - backgroundBubbleColor, - accountViewModel, - navController - ) - } - } - } - - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween, + Column( modifier = Modifier - .padding(top = 5.dp) - .then( - with(LocalDensity.current) { - Modifier.widthIn( - bubbleSize.width.toDp(), - availableBubbleSize.width.toDp() + .padding(start = 10.dp, end = 5.dp, bottom = 5.dp) + .onSizeChanged { + bubbleSize = it + } + ) { + if ((innerQuote || note.author != loggedIn) && noteEvent is ChannelMessageEvent) { + DrawAuthorInfo( + baseNote, + alignment, + navController + ) + } + + val replyTo = note.replyTo + if (!innerQuote && !replyTo.isNullOrEmpty()) { + Row(verticalAlignment = Alignment.CenterVertically) { + replyTo.toSet().mapIndexed { _, note -> + ChatroomMessageCompose( + note, + null, + innerQuote = true, + parentBackgroundColor = backgroundBubbleColor, + accountViewModel = accountViewModel, + navController = navController, + onWantsToReply = onWantsToReply ) } - ) - ) { - Row() { - Text( - timeAgoShort(note.createdAt(), context), - color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f), - fontSize = 12.sp - ) - - RelayBadges(note) - - Spacer(modifier = Modifier.width(10.dp)) + } } - Row() { - LikeReaction(baseNote, grayTint, accountViewModel) - Spacer(modifier = Modifier.width(5.dp)) - ZapReaction(baseNote, grayTint, accountViewModel) - Spacer(modifier = Modifier.width(5.dp)) - ReplyReaction(baseNote, grayTint, accountViewModel, showCounter = false) { - onWantsToReply(baseNote) + Row(verticalAlignment = Alignment.CenterVertically) { + when (noteEvent) { + is ChannelCreateEvent -> { + RenderCreateChannelNote(note) + } + + is ChannelMetadataEvent -> { + RenderChangeChannelMetadataNote(note) + } + + else -> { + RenderRegularTextNote( + note, + loggedIn, + isAcceptableAndCanPreview.second, + backgroundBubbleColor, + accountViewModel, + navController + ) + } } } + + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier + .padding(top = 5.dp) + .then( + with(LocalDensity.current) { + Modifier.widthIn( + bubbleSize.width.toDp(), + availableBubbleSize.width.toDp() + ) + } + ) + ) { + StatusRow( + baseNote, + accountViewModel, + onWantsToReply + ) + } } } } - } - NoteQuickActionMenu(note, popupExpanded, { popupExpanded = false }, accountViewModel) + NoteQuickActionMenu( + note, + popupExpanded, + { popupExpanded = false }, + accountViewModel + ) + } } } } } +@Composable +private fun StatusRow( + baseNote: Note, + accountViewModel: AccountViewModel, + onWantsToReply: (Note) -> Unit +) { + val grayTint = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + val time = remember { baseNote.createdAt() ?: 0 } + + Row() { + ChatTimeAgo(time) + RelayBadges(baseNote) + Spacer(modifier = Modifier.width(10.dp)) + } + + Row() { + LikeReaction(baseNote, grayTint, accountViewModel) + Spacer(modifier = Modifier.width(5.dp)) + ZapReaction(baseNote, grayTint, accountViewModel) + Spacer(modifier = Modifier.width(5.dp)) + ReplyReaction(baseNote, grayTint, accountViewModel, showCounter = false) { + onWantsToReply(baseNote) + } + } +} + +@Composable +fun ChatTimeAgo(time: Long) { + val context = LocalContext.current + + var timeStr by remember { mutableStateOf("") } + + LaunchedEffect(key1 = time) { + withContext(Dispatchers.IO) { + timeStr = timeAgoShort(time, context = context) + } + } + + Text( + timeStr, + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f), + fontSize = 12.sp + ) +} + +@Composable +private fun RenderRegularTextNote( + note: Note, + loggedIn: User, + canPreview: Boolean, + backgroundBubbleColor: Color, + accountViewModel: AccountViewModel, + navController: NavController +) { + val tags = remember { note.event?.tags() } + val eventContent = remember { accountViewModel.decrypt(note) } + val modifier = remember { Modifier.padding(top = 5.dp) } + + if (eventContent != null) { + TranslatableRichTextViewer( + eventContent, + canPreview, + modifier, + tags, + backgroundBubbleColor, + accountViewModel, + navController + ) + } else { + TranslatableRichTextViewer( + stringResource(R.string.could_not_decrypt_the_message), + true, + modifier, + tags, + backgroundBubbleColor, + accountViewModel, + navController + ) + } +} + +@Composable +private fun RenderChangeChannelMetadataNote( + note: Note +) { + val noteEvent = note.event as? ChannelMetadataEvent ?: return + + val channelInfo = noteEvent.channelInfo() + val text = note.author?.toBestDisplayName() + .toString() + " ${stringResource(R.string.changed_chat_name_to)} '" + ( + channelInfo.name + ?: "" + ) + "', ${stringResource(R.string.description_to)} '" + ( + channelInfo.about + ?: "" + ) + "', ${stringResource(R.string.and_picture_to)} '" + ( + channelInfo.picture + ?: "" + ) + "'" + + CreateTextWithEmoji( + text = text, + tags = note.author?.info?.latestMetadata?.tags + ) +} + +@Composable +private fun RenderCreateChannelNote(note: Note) { + val noteEvent = note.event as? ChannelCreateEvent ?: return + val channelInfo = remember { noteEvent.channelInfo() } + + val text = note.author?.toBestDisplayName() + .toString() + " ${stringResource(R.string.created)} " + ( + channelInfo.name + ?: "" + ) + " ${stringResource(R.string.with_description_of)} '" + ( + channelInfo.about + ?: "" + ) + "', ${stringResource(R.string.and_picture)} '" + ( + channelInfo.picture + ?: "" + ) + "'" + + CreateTextWithEmoji( + text = text, + tags = note.author?.info?.latestMetadata?.tags + ) +} + +@Composable +private fun DrawAuthorInfo( + baseNote: Note, + alignment: Arrangement.Horizontal, + navController: NavController +) { + val userState by baseNote.author!!.live().metadata.observeAsState() + + val pubkeyHex = remember { baseNote.author?.pubkeyHex } ?: return + val route = remember { "User/$pubkeyHex" } + val userDisplayName = remember(userState) { userState?.user?.toBestDisplayName() } + val userProfilePicture = remember(userState) { ResizeImage(userState?.user?.profilePicture(), 25.dp) } + val userTags = remember(userState) { userState?.user?.info?.latestMetadata?.tags } + + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = alignment, + modifier = Modifier.padding(top = 5.dp) + ) { + RobohashAsyncImageProxy( + robot = pubkeyHex, + model = userProfilePicture, + contentDescription = stringResource(id = R.string.profile_image), + modifier = Modifier + .width(25.dp) + .height(25.dp) + .clip(shape = CircleShape) + .clickable(onClick = { + navController.navigate(route) + }) + ) + + CreateClickableTextWithEmoji( + clickablePart = " $userDisplayName", + suffix = "", + tags = userTags, + fontWeight = FontWeight.Bold, + overrideColor = MaterialTheme.colors.onBackground, + route = route, + navController = navController + ) + } +} + @Composable private fun RelayBadges(baseNote: Note) { val noteRelaysState by baseNote.live().relays.observeAsState() - val noteRelays = noteRelaysState?.note?.relays ?: emptySet() + val noteRelays = remember(noteRelaysState) { noteRelaysState?.note?.relays ?: emptySet() } + val noteRelaysSimple = remember(noteRelaysState) { noteRelaysState?.note?.relays?.take(3) ?: emptySet() } var expanded by remember { mutableStateOf(false) } - val relaysToDisplay = if (expanded) noteRelays else noteRelays.take(3) - - val uri = LocalUriHandler.current + val relaysToDisplay by remember { + derivedStateOf { + if (expanded) noteRelays else noteRelaysSimple + } + } FlowRow(Modifier.padding(start = 10.dp)) { relaysToDisplay.forEach { - val url = it.removePrefix("wss://").removePrefix("ws://") - Box( - Modifier - .size(15.dp) - .padding(1.dp) - ) { - RobohashFallbackAsyncImage( - robot = "https://$url/favicon.ico", - robotSize = 15.dp, - model = "https://$url/favicon.ico", - contentDescription = stringResource(id = R.string.relay_icon), - colorFilter = ColorFilter.colorMatrix(ColorMatrix().apply { setToSaturation(0f) }), - modifier = Modifier - .fillMaxSize(1f) - .clip(shape = CircleShape) - .background(MaterialTheme.colors.background) - .clickable(onClick = { uri.openUri("https://$url") }) - ) - } + RenderRelay(it) } if (noteRelays.size > 3 && !expanded) { @@ -413,3 +515,37 @@ private fun RelayBadges(baseNote: Note) { } } } + +@Composable +private fun RenderRelay(dirtyUrl: String) { + val uri = LocalUriHandler.current + val website = remember { + val cleanUrl = dirtyUrl.removePrefix("wss://").removePrefix("ws://") + "https://$cleanUrl" + } + val iconUrl = remember { + val cleanUrl = dirtyUrl.removePrefix("wss://").removePrefix("ws://") + "https://$cleanUrl/favicon.ico" + } + + Box( + remember { + Modifier + .size(15.dp) + .padding(1.dp) + } + ) { + RobohashFallbackAsyncImage( + robot = iconUrl, + robotSize = 15.dp, + model = iconUrl, + contentDescription = stringResource(id = R.string.relay_icon), + colorFilter = ColorFilter.colorMatrix(ColorMatrix().apply { setToSaturation(0f) }), + modifier = Modifier + .fillMaxSize(1f) + .clip(shape = CircleShape) + .background(MaterialTheme.colors.background) + .clickable(onClick = { uri.openUri(website) }) + ) + } +} From cf5f345d545290d6cfe4a4baddf3486b240da0c9 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 12:20:35 -0400 Subject: [PATCH 111/171] Formatting --- .../ui/note/ChatroomMessageCompose.kt | 54 +++++++++---------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt index a20a887be7..167ebc19b1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt @@ -46,7 +46,6 @@ import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalUriHandler -import androidx.compose.ui.platform.UriHandler import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.IntSize @@ -58,11 +57,9 @@ import com.vitorpamplona.amethyst.NotificationCache import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.User -import com.vitorpamplona.amethyst.service.model.AudioTrackEvent import com.vitorpamplona.amethyst.service.model.ChannelCreateEvent import com.vitorpamplona.amethyst.service.model.ChannelMessageEvent import com.vitorpamplona.amethyst.service.model.ChannelMetadataEvent -import com.vitorpamplona.amethyst.service.model.EventInterface import com.vitorpamplona.amethyst.ui.components.CreateClickableTextWithEmoji import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji import com.vitorpamplona.amethyst.ui.components.ResizeImage @@ -103,10 +100,12 @@ fun ChatroomMessageCompose( var popupExpanded by remember { mutableStateOf(false) } if (noteEvent == null) { - BlankNote(Modifier.combinedClickable( - onClick = { }, - onLongClick = { popupExpanded = true } - )) + BlankNote( + Modifier.combinedClickable( + onClick = { }, + onLongClick = { popupExpanded = true } + ) + ) note?.let { NoteQuickActionMenu(it, popupExpanded, { popupExpanded = false }, accountViewModel) @@ -119,8 +118,8 @@ fun ChatroomMessageCompose( withContext(Dispatchers.IO) { account.userProfile().let { loggedIn -> val newCanPreview = note.author === loggedIn || - (note.author?.let { loggedIn.isFollowingCached(it) } ?: true) || - !(noteForReports.hasAnyReports()) + (note.author?.let { loggedIn.isFollowingCached(it) } ?: true) || + !(noteForReports.hasAnyReports()) val newIsAcceptable = account.isAcceptable(noteForReports) @@ -142,7 +141,6 @@ fun ChatroomMessageCompose( onClick = { showHiddenNote = true } ) } - } else { val backgroundBubbleColor: Color val alignment: Arrangement.Horizontal @@ -398,15 +396,15 @@ private fun RenderChangeChannelMetadataNote( val channelInfo = noteEvent.channelInfo() val text = note.author?.toBestDisplayName() .toString() + " ${stringResource(R.string.changed_chat_name_to)} '" + ( - channelInfo.name - ?: "" - ) + "', ${stringResource(R.string.description_to)} '" + ( - channelInfo.about - ?: "" - ) + "', ${stringResource(R.string.and_picture_to)} '" + ( - channelInfo.picture - ?: "" - ) + "'" + channelInfo.name + ?: "" + ) + "', ${stringResource(R.string.description_to)} '" + ( + channelInfo.about + ?: "" + ) + "', ${stringResource(R.string.and_picture_to)} '" + ( + channelInfo.picture + ?: "" + ) + "'" CreateTextWithEmoji( text = text, @@ -421,15 +419,15 @@ private fun RenderCreateChannelNote(note: Note) { val text = note.author?.toBestDisplayName() .toString() + " ${stringResource(R.string.created)} " + ( - channelInfo.name - ?: "" - ) + " ${stringResource(R.string.with_description_of)} '" + ( - channelInfo.about - ?: "" - ) + "', ${stringResource(R.string.and_picture)} '" + ( - channelInfo.picture - ?: "" - ) + "'" + channelInfo.name + ?: "" + ) + " ${stringResource(R.string.with_description_of)} '" + ( + channelInfo.about + ?: "" + ) + "', ${stringResource(R.string.and_picture)} '" + ( + channelInfo.picture + ?: "" + ) + "'" CreateTextWithEmoji( text = text, From 27182a77a437c6a504580a53d8175af45616be15 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 12:25:16 -0400 Subject: [PATCH 112/171] v0.49.3 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2e3b151c79..36cd3b7cb4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 165 - versionName "0.49.2" + versionCode 166 + versionName "0.49.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From dd8b208a0d6227592f51f123ecb754030784dae5 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 17:52:39 -0400 Subject: [PATCH 113/171] Avoiding creating a lnurl link with just those words --- .../vitorpamplona/amethyst/service/lnurl/LnWithdrawalUtil.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/lnurl/LnWithdrawalUtil.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/lnurl/LnWithdrawalUtil.kt index bc5d600838..47183238e7 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/lnurl/LnWithdrawalUtil.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/lnurl/LnWithdrawalUtil.kt @@ -4,7 +4,7 @@ import java.util.regex.Pattern object LnWithdrawalUtil { private val withdrawalPattern = Pattern.compile( - "lnurl.*", + "lnurl.+", Pattern.CASE_INSENSITIVE ) From d6c29667925428e1816dc2e83ead705a458d55b8 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 17:53:02 -0400 Subject: [PATCH 114/171] Adds color to relay icons --- .../main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index cc7723a6f3..bfdcfb7dc1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -1941,7 +1941,7 @@ private fun RelayIconCompose(url: String) { .clickable(onClick = { uri.openUri("https://$url") }) } val colorFilter = remember { - ColorFilter.colorMatrix(ColorMatrix().apply { setToSaturation(0f) }) + ColorFilter.colorMatrix(ColorMatrix().apply { setToSaturation(0.5f) }) } Box(boxModifier) { From 389afcb6003e31e3c8c39d400d1f459ae8e5322a Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 17:53:15 -0400 Subject: [PATCH 115/171] Fixes Robohash dependency in size --- .../vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt index b5d08d1675..c387bfa5d9 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt @@ -37,7 +37,7 @@ fun RobohashAsyncImage( robotSize.roundToPx() } - val imageRequest = remember(size, robot) { + val imageRequest = remember(robotSize, robot) { Robohash.imageRequest( context, robot, From 135596591a48766d266869dda0a3e4718aade8eb Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 17:53:36 -0400 Subject: [PATCH 116/171] Optimizes the code for chat bubble rendering --- .../ui/note/ChatroomMessageCompose.kt | 79 ++++++++++++------- 1 file changed, 50 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt index 167ebc19b1..bba8478648 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt @@ -315,18 +315,18 @@ private fun StatusRow( val grayTint = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) val time = remember { baseNote.createdAt() ?: 0 } - Row() { + Row(verticalAlignment = Alignment.CenterVertically) { ChatTimeAgo(time) RelayBadges(baseNote) Spacer(modifier = Modifier.width(10.dp)) } - Row() { + Row(verticalAlignment = Alignment.CenterVertically) { LikeReaction(baseNote, grayTint, accountViewModel) Spacer(modifier = Modifier.width(5.dp)) ZapReaction(baseNote, grayTint, accountViewModel) Spacer(modifier = Modifier.width(5.dp)) - ReplyReaction(baseNote, grayTint, accountViewModel, showCounter = false) { + ReplyReaction(baseNote, grayTint, accountViewModel, showCounter = false, iconSize = 16.dp) { onWantsToReply(baseNote) } } @@ -479,17 +479,29 @@ private fun DrawAuthorInfo( } } +data class RelayBadgesState( + val shouldDisplayExpandButton: Boolean, + val noteRelays: List, + val noteRelaysSimple: List +) + @Composable private fun RelayBadges(baseNote: Note) { val noteRelaysState by baseNote.live().relays.observeAsState() - val noteRelays = remember(noteRelaysState) { noteRelaysState?.note?.relays ?: emptySet() } - val noteRelaysSimple = remember(noteRelaysState) { noteRelaysState?.note?.relays?.take(3) ?: emptySet() } + + val state: RelayBadgesState by remember(noteRelaysState) { + val newShouldDisplayExpandButton = (noteRelaysState?.note?.relays?.size ?: 0) > 3 + val noteRelays = noteRelaysState?.note?.relays?.toList() ?: emptyList() + val noteRelaysSimple = noteRelaysState?.note?.relays?.take(3)?.toList() ?: emptyList() + + mutableStateOf(RelayBadgesState(newShouldDisplayExpandButton, noteRelays, noteRelaysSimple)) + } var expanded by remember { mutableStateOf(false) } val relaysToDisplay by remember { derivedStateOf { - if (expanded) noteRelays else noteRelaysSimple + if (expanded) state.noteRelays else state.noteRelaysSimple } } @@ -497,19 +509,19 @@ private fun RelayBadges(baseNote: Note) { relaysToDisplay.forEach { RenderRelay(it) } + } - if (noteRelays.size > 3 && !expanded) { - IconButton( - modifier = Modifier.then(Modifier.size(15.dp)), - onClick = { expanded = true } - ) { - Icon( - imageVector = Icons.Default.ChevronRight, - null, - modifier = Modifier.size(15.dp), - tint = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) - ) - } + if (state.shouldDisplayExpandButton && !expanded) { + IconButton( + modifier = Modifier.then(Modifier.size(15.dp)), + onClick = { expanded = true } + ) { + Icon( + imageVector = Icons.Default.ChevronRight, + null, + modifier = Modifier.size(15.dp), + tint = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) } } } @@ -526,24 +538,33 @@ private fun RenderRelay(dirtyUrl: String) { "https://$cleanUrl/favicon.ico" } + val clickableModifier = remember { + Modifier + .size(15.dp) + .padding(1.dp) + .clickable(onClick = { uri.openUri(website) }) + } + + val colorFilter = remember { + ColorFilter.colorMatrix(ColorMatrix().apply { setToSaturation(0.5f) }) + } + + val iconModifier = remember { + Modifier + .fillMaxSize(1f) + .clip(shape = CircleShape) + } + Box( - remember { - Modifier - .size(15.dp) - .padding(1.dp) - } + modifier = clickableModifier ) { RobohashFallbackAsyncImage( robot = iconUrl, robotSize = 15.dp, model = iconUrl, contentDescription = stringResource(id = R.string.relay_icon), - colorFilter = ColorFilter.colorMatrix(ColorMatrix().apply { setToSaturation(0f) }), - modifier = Modifier - .fillMaxSize(1f) - .clip(shape = CircleShape) - .background(MaterialTheme.colors.background) - .clickable(onClick = { uri.openUri(website) }) + colorFilter = colorFilter, + modifier = iconModifier.background(MaterialTheme.colors.background) ) } } From 1519e70b24691d127b85f2521dc02ce2016b61d6 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 18:03:24 -0400 Subject: [PATCH 117/171] Increasing size of the "More Options" button in the Video Feed. --- .../vitorpamplona/amethyst/ui/screen/loggedIn/VideoScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/VideoScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/VideoScreen.kt index 4ae9fef50e..7dc3d86dc2 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/VideoScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/VideoScreen.kt @@ -275,7 +275,7 @@ private fun RenderVideoOrPictureNote( Icon( imageVector = Icons.Default.MoreVert, null, - modifier = Modifier.size(15.dp), + modifier = Modifier.size(20.dp), tint = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) ) From 5a3cf4040210aefd7217e301ad93c7953635f9cc Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 18:43:58 -0400 Subject: [PATCH 118/171] Adds online search when typing the username in the new Post field. --- .../amethyst/ui/actions/JoinUserOrChannelView.kt | 1 + .../vitorpamplona/amethyst/ui/actions/NewPostView.kt | 8 ++++++++ .../amethyst/ui/actions/NewPostViewModel.kt | 11 +++++++++-- .../amethyst/ui/screen/loggedIn/SearchScreen.kt | 5 ++++- 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/JoinUserOrChannelView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/JoinUserOrChannelView.kt index 310eed8d11..eda028bf0b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/JoinUserOrChannelView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/JoinUserOrChannelView.kt @@ -75,6 +75,7 @@ import kotlinx.coroutines.withContext @Composable fun JoinUserOrChannelView(onClose: () -> Unit, account: Account, navController: NavController) { val searchBarViewModel: SearchBarViewModel = viewModel() + searchBarViewModel.account = account Dialog( onDismissRequest = { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt index a663d5d1e8..dc8a01489e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt @@ -25,6 +25,7 @@ import androidx.compose.material.icons.filled.CurrencyBitcoin import androidx.compose.material.icons.outlined.ArrowForwardIos import androidx.compose.material.icons.outlined.Bolt import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState @@ -62,6 +63,7 @@ import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.User +import com.vitorpamplona.amethyst.service.NostrSearchEventOrUserDataSource import com.vitorpamplona.amethyst.ui.components.* import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.TextSpinner @@ -95,6 +97,12 @@ fun NewPostView(onClose: () -> Unit, baseReplyTo: Note? = null, quote: Note? = n } } + DisposableEffect(Unit) { + onDispose { + NostrSearchEventOrUserDataSource.clear() + } + } + Dialog( onDismissRequest = { onClose() }, properties = DialogProperties( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt index a74a15d7a9..69f207596f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt @@ -14,6 +14,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.vitorpamplona.amethyst.model.* import com.vitorpamplona.amethyst.service.FileHeader +import com.vitorpamplona.amethyst.service.NostrSearchEventOrUserDataSource import com.vitorpamplona.amethyst.service.model.PrivateDmEvent import com.vitorpamplona.amethyst.service.model.TextNoteEvent import com.vitorpamplona.amethyst.ui.components.isValidURL @@ -188,6 +189,8 @@ open class NewPostViewModel : ViewModel() { userSuggestions = emptyList() userSuggestionAnchor = null userSuggestionsMainMessage = null + + NostrSearchEventOrUserDataSource.clear() } open fun findUrlInMessage(): String? { @@ -211,8 +214,10 @@ open class NewPostViewModel : ViewModel() { userSuggestionAnchor = it.selection userSuggestionsMainMessage = true if (lastWord.startsWith("@") && lastWord.length > 2) { - userSuggestions = LocalCache.findUsersStartingWith(lastWord.removePrefix("@")) + userSuggestions = LocalCache.findUsersStartingWith(lastWord.removePrefix("@")).sortedWith(compareBy({ account?.isFollowing(it) }, { it.toBestDisplayName() })).reversed() + println("AAAA" + lastWord.removePrefix("@") + userSuggestions.size) } else { + NostrSearchEventOrUserDataSource.clear() userSuggestions = emptyList() } } @@ -225,8 +230,10 @@ open class NewPostViewModel : ViewModel() { userSuggestionAnchor = it.selection userSuggestionsMainMessage = false if (lastWord.startsWith("@") && lastWord.length > 2) { - userSuggestions = LocalCache.findUsersStartingWith(lastWord.removePrefix("@")) + NostrSearchEventOrUserDataSource.search(lastWord.removePrefix("@")) + userSuggestions = LocalCache.findUsersStartingWith(lastWord.removePrefix("@")).sortedWith(compareBy({ account?.isFollowing(it) }, { it.toBestDisplayName() })).reversed() } else { + NostrSearchEventOrUserDataSource.clear() userSuggestions = emptyList() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt index d37de7787c..320e913c0e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt @@ -131,6 +131,8 @@ fun SearchScreen( } class SearchBarViewModel : ViewModel() { + var account: Account? = null + var searchValue by mutableStateOf("") val searchResults = mutableStateOf>(emptyList()) val searchResultsNotes = mutableStateOf>(emptyList()) @@ -156,7 +158,7 @@ class SearchBarViewModel : ViewModel() { } hashtagResults.value = findHashtags(searchValue) - searchResults.value = LocalCache.findUsersStartingWith(searchValue) + searchResults.value = LocalCache.findUsersStartingWith(searchValue).sortedWith(compareBy({ account?.isFollowing(it) }, { it.toBestDisplayName() })).reversed() searchResultsNotes.value = LocalCache.findNotesStartingWith(searchValue).sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed() searchResultsChannels.value = LocalCache.findChannelsStartingWith(searchValue) } @@ -185,6 +187,7 @@ class SearchBarViewModel : ViewModel() { @Composable private fun SearchBar(accountViewModel: AccountViewModel, navController: NavController) { val searchBarViewModel: SearchBarViewModel = viewModel() + searchBarViewModel.account = accountViewModel.accountLiveData.value?.account val scope = rememberCoroutineScope() val listState = rememberLazyListState() From bb9fa8e14437cfddbae5c04614c987903ffa4b85 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 18:51:08 -0400 Subject: [PATCH 119/171] Adding the missing search element --- .../com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt index 69f207596f..c221152611 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt @@ -214,8 +214,8 @@ open class NewPostViewModel : ViewModel() { userSuggestionAnchor = it.selection userSuggestionsMainMessage = true if (lastWord.startsWith("@") && lastWord.length > 2) { + NostrSearchEventOrUserDataSource.search(lastWord.removePrefix("@")) userSuggestions = LocalCache.findUsersStartingWith(lastWord.removePrefix("@")).sortedWith(compareBy({ account?.isFollowing(it) }, { it.toBestDisplayName() })).reversed() - println("AAAA" + lastWord.removePrefix("@") + userSuggestions.size) } else { NostrSearchEventOrUserDataSource.clear() userSuggestions = emptyList() From 6aadf8a883f0e2d0a4470fb4041dbaedde04d133 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 19:00:44 -0400 Subject: [PATCH 120/171] 0.49.4 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 36cd3b7cb4..fb00fb23e5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 166 - versionName "0.49.3" + versionCode 167 + versionName "0.49.4" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From cb421968899aee4844681ea2e2e5299aa9d5b621 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 16 May 2023 22:41:47 -0400 Subject: [PATCH 121/171] Adds reaction watch. --- app/build.gradle | 10 +- .../service/NostrAccountDataSource.kt | 2 +- .../amethyst/ui/note/UserReactionsRow.kt | 245 ++++++++++++++++++ .../ui/screen/loggedIn/NotificationScreen.kt | 180 +++++++++++++ build.gradle | 1 + 5 files changed, 435 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserReactionsRow.kt diff --git a/app/build.gradle b/app/build.gradle index fb00fb23e5..0d44082828 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 167 - versionName "0.49.4" + versionCode 168 + versionName "0.50.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { @@ -177,6 +177,12 @@ dependencies { playImplementation platform('com.google.firebase:firebase-bom:32.0.0') playImplementation 'com.google.firebase:firebase-messaging-ktx' + // Charts + implementation "com.patrykandpatrick.vico:core:${vico_version}" + implementation "com.patrykandpatrick.vico:compose:${vico_version}" + implementation "com.patrykandpatrick.vico:views:${vico_version}" + implementation "com.patrykandpatrick.vico:compose-m2:${vico_version}" + // Automatic memory leak detection debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.10' diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt index aba906e2a7..8a2ceeceef 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt @@ -95,7 +95,7 @@ object NostrAccountDataSource : NostrDataSource("AccountData") { BadgeAwardEvent.kind ), tags = mapOf("p" to listOf(account.userProfile().pubkeyHex)), - limit = 400, + limit = 4000, since = latestEOSEs.users[account.userProfile()]?.followList?.get(account.defaultNotificationFollowList)?.relayList ) ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserReactionsRow.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserReactionsRow.kt new file mode 100644 index 0000000000..5203edd1a3 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserReactionsRow.kt @@ -0,0 +1,245 @@ +package com.vitorpamplona.amethyst.ui.note + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.material.Icon +import androidx.compose.material.Text +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Bolt +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment.Companion.CenterVertically +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import androidx.navigation.NavController +import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.model.LocalCache +import com.vitorpamplona.amethyst.model.User +import com.vitorpamplona.amethyst.service.model.LnZapEvent +import com.vitorpamplona.amethyst.service.model.ReactionEvent +import com.vitorpamplona.amethyst.service.model.RepostEvent +import com.vitorpamplona.amethyst.service.model.TextNoteEvent +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel +import com.vitorpamplona.amethyst.ui.theme.BitcoinOrange +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch +import java.math.BigDecimal +import java.time.Instant +import java.time.LocalDateTime +import java.time.ZoneId +import java.time.format.DateTimeFormatter + +@Composable +fun UserReactionsRow(model: UserReactionsViewModel, accountViewModel: AccountViewModel, navController: NavController, onClick: () -> Unit) { + Row(verticalAlignment = CenterVertically, modifier = Modifier.clickable(onClick = onClick).padding(10.dp)) { + Text( + text = "Today", + fontWeight = FontWeight.Bold, + fontSize = 18.sp, + modifier = Modifier.width(65.dp) + ) + + Row(verticalAlignment = CenterVertically, modifier = Modifier.weight(1f)) { + UserReplyReaction(model.replies[model.today]) + } + + Row(verticalAlignment = CenterVertically, modifier = Modifier.weight(1f)) { + UserBoostReaction(model.boosts[model.today]) + } + + Row(verticalAlignment = CenterVertically, modifier = Modifier.weight(1f)) { + UserLikeReaction(model.replies[model.today]) + } + + Row(verticalAlignment = CenterVertically, modifier = Modifier.weight(1f)) { + UserZapReaction(model.zaps[model.today]) + } + } +} + +class UserReactionsViewModel : ViewModel() { + var user: User? = null + + var reactions by mutableStateOf>(emptyMap()) + var boosts by mutableStateOf>(emptyMap()) + var zaps by mutableStateOf>(emptyMap()) + var replies by mutableStateOf>(emptyMap()) + + val sdf = DateTimeFormatter.ofPattern("yyyy-MM-dd") // SimpleDateFormat() + val today = sdf.format(LocalDateTime.now()) + + fun load(baseUser: User) { + user = baseUser + reactions = emptyMap() + boosts = emptyMap() + zaps = emptyMap() + replies = emptyMap() + } + + fun refresh() { + val scope = CoroutineScope(Job() + Dispatchers.Default) + scope.launch { + refreshSuspended() + } + } + + fun formatDate(createAt: Long): String { + return sdf.format( + Instant.ofEpochSecond(createAt) + .atZone(ZoneId.systemDefault()) + .toLocalDateTime() + ) + } + + fun refreshSuspended() { + val currentUser = user?.pubkeyHex ?: return + + val reactions = mutableMapOf() + val boosts = mutableMapOf() + val zaps = mutableMapOf() + val replies = mutableMapOf() + + LocalCache.notes.values.forEach { + val noteEvent = it.event + if (noteEvent is ReactionEvent) { + if (noteEvent.isTaggedUser(currentUser)) { + val netDate = formatDate(noteEvent.createdAt) + reactions[netDate] = (reactions[netDate] ?: 0) + 1 + } + } + if (noteEvent is RepostEvent) { + if (noteEvent.isTaggedUser(currentUser)) { + val netDate = formatDate(noteEvent.createdAt) + boosts[netDate] = (boosts[netDate] ?: 0) + 1 + } + } + if (noteEvent is LnZapEvent) { + if (noteEvent.isTaggedUser(currentUser)) { + val netDate = formatDate(noteEvent.createdAt) + zaps[netDate] = (zaps[netDate] ?: BigDecimal.ZERO) + (noteEvent.amount ?: BigDecimal.ZERO) + } + } + if (noteEvent is TextNoteEvent) { + if (noteEvent.isTaggedUser(currentUser)) { + val netDate = formatDate(noteEvent.createdAt) + replies[netDate] = (replies[netDate] ?: 0) + 1 + } + } + } + + this.reactions = reactions + this.replies = replies + this.zaps = zaps + this.boosts = boosts + } + + var collectorJob: Job? = null + + init { + collectorJob = viewModelScope.launch(Dispatchers.IO) { + LocalCache.live.newEventBundles.collect { newNotes -> + refresh() + } + } + } + + override fun onCleared() { + collectorJob?.cancel() + super.onCleared() + } +} + +@Composable +fun UserReplyReaction( + replyCount: Int? +) { + Icon( + painter = painterResource(R.drawable.ic_comment), + null, + modifier = Modifier.size(20.dp), + tint = Color.Cyan + ) + + Spacer(modifier = Modifier.width(10.dp)) + + Text( + showCount(replyCount), + fontWeight = FontWeight.Bold, + fontSize = 18.sp + ) +} + +@Composable +fun UserBoostReaction( + boostCount: Int? +) { + Icon( + painter = painterResource(R.drawable.ic_retweeted), + null, + modifier = Modifier.size(20.dp), + tint = Color.Unspecified + ) + + Spacer(modifier = Modifier.width(10.dp)) + + Text( + showCount(boostCount), + fontWeight = FontWeight.Bold, + fontSize = 18.sp + ) +} + +@Composable +fun UserLikeReaction( + likeCount: Int? +) { + Icon( + painter = painterResource(R.drawable.ic_liked), + null, + modifier = Modifier.size(20.dp), + tint = Color.Unspecified + ) + + Spacer(modifier = Modifier.width(10.dp)) + + Text( + showCount(likeCount), + fontWeight = FontWeight.Bold, + fontSize = 18.sp + ) +} + +@Composable +fun UserZapReaction( + amount: BigDecimal? +) { + Icon( + imageVector = Icons.Default.Bolt, + contentDescription = stringResource(R.string.zaps), + modifier = Modifier.size(20.dp), + tint = BitcoinOrange + ) + + Spacer(modifier = Modifier.width(8.dp)) + + Text( + showAmount(amount), + fontWeight = FontWeight.Bold, + fontSize = 18.sp + ) +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt index 9046a15694..aab31e69eb 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt @@ -1,25 +1,64 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.padding +import androidx.compose.material.Divider import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.unit.dp import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController +import com.patrykandpatrick.vico.compose.axis.horizontal.bottomAxis +import com.patrykandpatrick.vico.compose.axis.vertical.endAxis +import com.patrykandpatrick.vico.compose.axis.vertical.startAxis +import com.patrykandpatrick.vico.compose.chart.Chart +import com.patrykandpatrick.vico.compose.chart.line.lineChart +import com.patrykandpatrick.vico.compose.component.shape.shader.fromBrush +import com.patrykandpatrick.vico.compose.style.ProvideChartStyle +import com.patrykandpatrick.vico.core.DefaultAlpha +import com.patrykandpatrick.vico.core.axis.AxisPosition +import com.patrykandpatrick.vico.core.axis.formatter.AxisValueFormatter +import com.patrykandpatrick.vico.core.chart.composed.ComposedChartEntryModel +import com.patrykandpatrick.vico.core.chart.composed.plus +import com.patrykandpatrick.vico.core.chart.line.LineChart +import com.patrykandpatrick.vico.core.chart.values.ChartValues +import com.patrykandpatrick.vico.core.component.shape.shader.DynamicShaders +import com.patrykandpatrick.vico.core.entry.ChartEntryModel +import com.patrykandpatrick.vico.core.entry.ChartEntryModelProducer +import com.patrykandpatrick.vico.core.entry.composed.plus +import com.patrykandpatrick.vico.core.entry.entryOf import com.vitorpamplona.amethyst.service.NostrAccountDataSource import com.vitorpamplona.amethyst.ui.dal.NotificationFeedFilter import com.vitorpamplona.amethyst.ui.navigation.Route +import com.vitorpamplona.amethyst.ui.note.UserReactionsRow +import com.vitorpamplona.amethyst.ui.note.UserReactionsViewModel +import com.vitorpamplona.amethyst.ui.note.showAmount +import com.vitorpamplona.amethyst.ui.note.showCount import com.vitorpamplona.amethyst.ui.screen.CardFeedView import com.vitorpamplona.amethyst.ui.screen.NotificationViewModel import com.vitorpamplona.amethyst.ui.screen.ScrollStateKeys +import com.vitorpamplona.amethyst.ui.theme.BitcoinOrange +import kotlinx.coroutines.launch +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter +import kotlin.math.roundToInt @Composable fun NotificationScreen( @@ -61,6 +100,7 @@ fun NotificationScreen( Column( modifier = Modifier.padding(vertical = 0.dp) ) { + SummaryBar(accountViewModel, navController) CardFeedView( viewModel = notifFeedViewModel, accountViewModel = accountViewModel, @@ -72,3 +112,143 @@ fun NotificationScreen( } } } + +@Composable +fun SummaryBar(accountViewModel: AccountViewModel, navController: NavController) { + val accountState by accountViewModel.accountLiveData.observeAsState() + val accountUser = remember(accountState) { accountState?.account?.userProfile() } ?: return + + val model: UserReactionsViewModel = viewModel() + + var chartModel by remember(accountState) { mutableStateOf?>(null) } + var axisLabels by remember(accountState) { mutableStateOf>(emptyList()) } + + val scope = rememberCoroutineScope() + + var showChart by remember { + mutableStateOf(false) + } + + LaunchedEffect(accountUser.pubkeyHex) { + scope.launch { + model.load(accountUser) + model.refreshSuspended() + val day = 24 * 60 * 60L + val now = LocalDateTime.now() + val displayAxisFormatter = DateTimeFormatter.ofPattern("EEE") + + val dataAxisLabels = listOf(6, 5, 4, 3, 2, 1, 0).map { model.sdf.format(now.minusSeconds(day * it)) } + axisLabels = listOf(6, 5, 4, 3, 2, 1, 0).map { displayAxisFormatter.format(now.minusSeconds(day * it)) } + + val listOfCountCurves = listOf( + dataAxisLabels.mapIndexed { index, dateStr -> entryOf(index, model.replies[dateStr]?.toFloat() ?: 0f) }, + dataAxisLabels.mapIndexed { index, dateStr -> entryOf(index, model.boosts[dateStr]?.toFloat() ?: 0f) }, + dataAxisLabels.mapIndexed { index, dateStr -> entryOf(index, model.reactions[dateStr]?.toFloat() ?: 0f) } + ) + + val listOfValueCurves = listOf( + dataAxisLabels.mapIndexed { index, dateStr -> entryOf(index, model.zaps[dateStr]?.toFloat() ?: 0f) } + ) + + val chartEntryModelProducer1 = ChartEntryModelProducer(listOfCountCurves).getModel() + val chartEntryModelProducer2 = ChartEntryModelProducer(listOfValueCurves).getModel() + + chartModel = chartEntryModelProducer1.plus(chartEntryModelProducer2) + } + } + + UserReactionsRow(model, accountViewModel, navController) { + showChart = !showChart + } + + val lineChartCount = + lineChart( + lines = listOf(Color.Cyan, Color.Green, Color.Red).map { lineChartColor -> + LineChart.LineSpec( + lineColor = lineChartColor.toArgb(), + lineBackgroundShader = DynamicShaders.fromBrush( + Brush.verticalGradient( + listOf( + lineChartColor.copy(DefaultAlpha.LINE_BACKGROUND_SHADER_START), + lineChartColor.copy(DefaultAlpha.LINE_BACKGROUND_SHADER_END) + ) + ) + ) + ) + }, + targetVerticalAxisPosition = AxisPosition.Vertical.Start + ) + + val lineChartZaps = + lineChart( + lines = listOf(BitcoinOrange).map { lineChartColor -> + LineChart.LineSpec( + lineColor = lineChartColor.toArgb(), + lineBackgroundShader = DynamicShaders.fromBrush( + Brush.verticalGradient( + listOf( + lineChartColor.copy(DefaultAlpha.LINE_BACKGROUND_SHADER_START), + lineChartColor.copy(DefaultAlpha.LINE_BACKGROUND_SHADER_END) + ) + ) + ) + ) + }, + targetVerticalAxisPosition = AxisPosition.Vertical.End + ) + + chartModel?.let { + if (showChart) { + Row(modifier = Modifier.padding(vertical = 10.dp, horizontal = 20.dp).clickable(onClick = { showChart = !showChart })) { + ProvideChartStyle() { + Chart( + chart = remember(lineChartCount, lineChartZaps) { + lineChartCount.plus(lineChartZaps) + }, + model = it, + startAxis = startAxis( + valueFormatter = CountAxisValueFormatter() + ), + endAxis = endAxis( + valueFormatter = AmountAxisValueFormatter() + ), + bottomAxis = bottomAxis( + valueFormatter = LabelValueFormatter(axisLabels) + ) + ) + } + } + } + } + + Divider( + thickness = 0.25.dp + ) +} + +class LabelValueFormatter(val axisLabels: List) : AxisValueFormatter { + override fun formatValue( + value: Float, + chartValues: ChartValues + ): String { + return axisLabels[value.roundToInt()] + } +} + +class CountAxisValueFormatter() : AxisValueFormatter { + override fun formatValue( + value: Float, + chartValues: ChartValues + ): String { + return showCount(value.roundToInt()) + } +} + +class AmountAxisValueFormatter() : AxisValueFormatter { + override fun formatValue( + value: Float, + chartValues: ChartValues + ): String { + return showAmount(value.toBigDecimal()) + } +} diff --git a/build.gradle b/build.gradle index 09111b5782..4d3a662e08 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,7 @@ buildscript { room_version = "2.4.3" accompanist_version = '0.30.0' coil_version = '2.3.0' + vico_version = '1.6.5' } dependencies { classpath 'com.google.gms:google-services:4.3.15' From 0823f2e7b5548dd83531a3431f7e692553971910 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 17 May 2023 09:34:21 -0400 Subject: [PATCH 122/171] Additive rendering of statistics --- .../amethyst/ui/navigation/AppNavigation.kt | 18 +- .../amethyst/ui/note/UserReactionsRow.kt | 162 ++++++++++++++---- .../ui/screen/loggedIn/NotificationScreen.kt | 81 +++------ 3 files changed, 172 insertions(+), 89 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt index 512e6c8e25..d1005265bb 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt @@ -8,6 +8,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavHostController @@ -18,6 +19,7 @@ import com.vitorpamplona.amethyst.ui.dal.HomeConversationsFeedFilter import com.vitorpamplona.amethyst.ui.dal.HomeNewThreadFeedFilter import com.vitorpamplona.amethyst.ui.dal.NotificationFeedFilter import com.vitorpamplona.amethyst.ui.dal.VideoFeedFilter +import com.vitorpamplona.amethyst.ui.note.UserReactionsViewModel import com.vitorpamplona.amethyst.ui.screen.NostrGlobalFeedViewModel import com.vitorpamplona.amethyst.ui.screen.NostrHomeFeedViewModel import com.vitorpamplona.amethyst.ui.screen.NostrHomeRepliesFeedViewModel @@ -37,6 +39,8 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.ProfileScreen import com.vitorpamplona.amethyst.ui.screen.loggedIn.SearchScreen import com.vitorpamplona.amethyst.ui.screen.loggedIn.ThreadScreen import com.vitorpamplona.amethyst.ui.screen.loggedIn.VideoScreen +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch @OptIn(ExperimentalFoundationApi::class) @Composable @@ -50,7 +54,8 @@ fun AppNavigation( // Avoids creating ViewModels for performance reasons (up to 1 second delays) val accountState by accountViewModel.accountLiveData.observeAsState() - val account = accountState?.account ?: return + val account = remember(accountState) { accountState?.account } ?: return + val accountHex = remember(accountState) { accountState?.account?.userProfile()?.pubkeyHex } HomeNewThreadFeedFilter.account = account HomeConversationsFeedFilter.account = account @@ -67,6 +72,16 @@ fun AppNavigation( NotificationFeedFilter.account = account val notifFeedViewModel: NotificationViewModel = viewModel() + val userReactionsStatsModel: UserReactionsViewModel = viewModel() + val scope = rememberCoroutineScope() + + LaunchedEffect(accountHex) { + scope.launch(Dispatchers.IO) { + userReactionsStatsModel.load(account.userProfile()) + userReactionsStatsModel.initializeSuspend() + } + } + NavHost(navController, startDestination = Route.Home.route) { Route.Video.let { route -> composable(route.route, route.arguments, content = { @@ -135,6 +150,7 @@ fun AppNavigation( NotificationScreen( notifFeedViewModel = notifFeedViewModel, + userReactionsStatsModel = userReactionsStatsModel, accountViewModel = accountViewModel, navController = navController, scrollToTop = scrollToTop diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserReactionsRow.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserReactionsRow.kt index 5203edd1a3..8eb5f573f7 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserReactionsRow.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserReactionsRow.kt @@ -25,8 +25,15 @@ import androidx.compose.ui.unit.sp import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.navigation.NavController +import com.patrykandpatrick.vico.core.chart.composed.ComposedChartEntryModel +import com.patrykandpatrick.vico.core.entry.ChartEntryModel +import com.patrykandpatrick.vico.core.entry.ChartEntryModelProducer +import com.patrykandpatrick.vico.core.entry.composed.plus +import com.patrykandpatrick.vico.core.entry.entryOf import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.LocalCache +import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.model.LnZapEvent import com.vitorpamplona.amethyst.service.model.ReactionEvent @@ -34,7 +41,6 @@ import com.vitorpamplona.amethyst.service.model.RepostEvent import com.vitorpamplona.amethyst.service.model.TextNoteEvent import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.theme.BitcoinOrange -import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.launch @@ -63,7 +69,7 @@ fun UserReactionsRow(model: UserReactionsViewModel, accountViewModel: AccountVie } Row(verticalAlignment = CenterVertically, modifier = Modifier.weight(1f)) { - UserLikeReaction(model.replies[model.today]) + UserLikeReaction(model.reactions[model.today]) } Row(verticalAlignment = CenterVertically, modifier = Modifier.weight(1f)) { @@ -80,22 +86,21 @@ class UserReactionsViewModel : ViewModel() { var zaps by mutableStateOf>(emptyMap()) var replies by mutableStateOf>(emptyMap()) + var takenIntoAccount = setOf() + val sdf = DateTimeFormatter.ofPattern("yyyy-MM-dd") // SimpleDateFormat() val today = sdf.format(LocalDateTime.now()) + var chartModel by mutableStateOf?>(null) + var axisLabels by mutableStateOf>(emptyList()) + fun load(baseUser: User) { user = baseUser reactions = emptyMap() boosts = emptyMap() zaps = emptyMap() replies = emptyMap() - } - - fun refresh() { - val scope = CoroutineScope(Job() + Dispatchers.Default) - scope.launch { - refreshSuspended() - } + takenIntoAccount = emptySet() } fun formatDate(createAt: Long): String { @@ -106,46 +111,133 @@ class UserReactionsViewModel : ViewModel() { ) } - fun refreshSuspended() { + fun initializeSuspend() { val currentUser = user?.pubkeyHex ?: return val reactions = mutableMapOf() val boosts = mutableMapOf() val zaps = mutableMapOf() val replies = mutableMapOf() + val takenIntoAccount = mutableSetOf() LocalCache.notes.values.forEach { val noteEvent = it.event - if (noteEvent is ReactionEvent) { - if (noteEvent.isTaggedUser(currentUser)) { - val netDate = formatDate(noteEvent.createdAt) - reactions[netDate] = (reactions[netDate] ?: 0) + 1 - } - } - if (noteEvent is RepostEvent) { - if (noteEvent.isTaggedUser(currentUser)) { - val netDate = formatDate(noteEvent.createdAt) - boosts[netDate] = (boosts[netDate] ?: 0) + 1 - } - } - if (noteEvent is LnZapEvent) { - if (noteEvent.isTaggedUser(currentUser)) { - val netDate = formatDate(noteEvent.createdAt) - zaps[netDate] = (zaps[netDate] ?: BigDecimal.ZERO) + (noteEvent.amount ?: BigDecimal.ZERO) - } - } - if (noteEvent is TextNoteEvent) { - if (noteEvent.isTaggedUser(currentUser)) { - val netDate = formatDate(noteEvent.createdAt) - replies[netDate] = (replies[netDate] ?: 0) + 1 + if (noteEvent != null && !takenIntoAccount.contains(noteEvent.id())) { + if (noteEvent is ReactionEvent) { + if (noteEvent.isTaggedUser(currentUser) && noteEvent.pubKey != currentUser) { + val netDate = formatDate(noteEvent.createdAt) + reactions[netDate] = (reactions[netDate] ?: 0) + 1 + takenIntoAccount.add(noteEvent.id()) + } + } else if (noteEvent is RepostEvent) { + if (noteEvent.isTaggedUser(currentUser) && noteEvent.pubKey != currentUser) { + val netDate = formatDate(noteEvent.createdAt) + boosts[netDate] = (boosts[netDate] ?: 0) + 1 + takenIntoAccount.add(noteEvent.id()) + } + } else if (noteEvent is LnZapEvent) { + if (noteEvent.isTaggedUser(currentUser) && noteEvent.pubKey != currentUser) { + val netDate = formatDate(noteEvent.createdAt) + zaps[netDate] = (zaps[netDate] ?: BigDecimal.ZERO) + (noteEvent.amount ?: BigDecimal.ZERO) + takenIntoAccount.add(noteEvent.id()) + } + } else if (noteEvent is TextNoteEvent) { + if (noteEvent.isTaggedUser(currentUser) && noteEvent.pubKey != currentUser) { + val netDate = formatDate(noteEvent.createdAt) + replies[netDate] = (replies[netDate] ?: 0) + 1 + takenIntoAccount.add(noteEvent.id()) + } } } } + this.takenIntoAccount = takenIntoAccount this.reactions = reactions this.replies = replies this.zaps = zaps this.boosts = boosts + + refreshChartModel() + } + + fun addToStatsSuspend(newNotes: Set) { + val currentUser = user?.pubkeyHex ?: return + + val reactions = this.reactions.toMutableMap() + val boosts = this.boosts.toMutableMap() + val zaps = this.zaps.toMutableMap() + val replies = this.replies.toMutableMap() + val takenIntoAccount = this.takenIntoAccount.toMutableSet() + var hasNewElements = false + + newNotes.forEach { + val noteEvent = it.event + if (noteEvent != null && !takenIntoAccount.contains(noteEvent.id())) { + if (noteEvent is ReactionEvent) { + if (noteEvent.isTaggedUser(currentUser) && noteEvent.pubKey != currentUser) { + val netDate = formatDate(noteEvent.createdAt) + reactions[netDate] = (reactions[netDate] ?: 0) + 1 + takenIntoAccount.add(noteEvent.id()) + hasNewElements = true + } + } else if (noteEvent is RepostEvent) { + if (noteEvent.isTaggedUser(currentUser) && noteEvent.pubKey != currentUser) { + val netDate = formatDate(noteEvent.createdAt) + boosts[netDate] = (boosts[netDate] ?: 0) + 1 + takenIntoAccount.add(noteEvent.id()) + hasNewElements = true + } + } else if (noteEvent is LnZapEvent) { + if (noteEvent.isTaggedUser(currentUser) && noteEvent.pubKey != currentUser) { + val netDate = formatDate(noteEvent.createdAt) + zaps[netDate] = (zaps[netDate] ?: BigDecimal.ZERO) + (noteEvent.amount ?: BigDecimal.ZERO) + takenIntoAccount.add(noteEvent.id()) + hasNewElements = true + } + } else if (noteEvent is TextNoteEvent) { + if (noteEvent.isTaggedUser(currentUser) && noteEvent.pubKey != currentUser) { + val netDate = formatDate(noteEvent.createdAt) + replies[netDate] = (replies[netDate] ?: 0) + 1 + takenIntoAccount.add(noteEvent.id()) + hasNewElements = true + } + } + } + } + + if (hasNewElements) { + this.takenIntoAccount = takenIntoAccount + this.reactions = reactions + this.replies = replies + this.zaps = zaps + this.boosts = boosts + + refreshChartModel() + } + } + + private fun refreshChartModel() { + val day = 24 * 60 * 60L + val now = LocalDateTime.now() + val displayAxisFormatter = DateTimeFormatter.ofPattern("EEE") + + val dataAxisLabels = listOf(6, 5, 4, 3, 2, 1, 0).map { sdf.format(now.minusSeconds(day * it)) } + + val listOfCountCurves = listOf( + dataAxisLabels.mapIndexed { index, dateStr -> entryOf(index, replies[dateStr]?.toFloat() ?: 0f) }, + dataAxisLabels.mapIndexed { index, dateStr -> entryOf(index, boosts[dateStr]?.toFloat() ?: 0f) }, + dataAxisLabels.mapIndexed { index, dateStr -> entryOf(index, reactions[dateStr]?.toFloat() ?: 0f) } + ) + + val listOfValueCurves = listOf( + dataAxisLabels.mapIndexed { index, dateStr -> entryOf(index, zaps[dateStr]?.toFloat() ?: 0f) } + ) + + val chartEntryModelProducer1 = ChartEntryModelProducer(listOfCountCurves).getModel() + val chartEntryModelProducer2 = ChartEntryModelProducer(listOfValueCurves).getModel() + + this.axisLabels = listOf(6, 5, 4, 3, 2, 1, 0).map { displayAxisFormatter.format(now.minusSeconds(day * it)) } + this.chartModel = chartEntryModelProducer1.plus(chartEntryModelProducer2) } var collectorJob: Job? = null @@ -153,7 +245,7 @@ class UserReactionsViewModel : ViewModel() { init { collectorJob = viewModelScope.launch(Dispatchers.IO) { LocalCache.live.newEventBundles.collect { newNotes -> - refresh() + addToStatsSuspend(newNotes) } } } @@ -191,7 +283,7 @@ fun UserBoostReaction( Icon( painter = painterResource(R.drawable.ic_retweeted), null, - modifier = Modifier.size(20.dp), + modifier = Modifier.size(24.dp), tint = Color.Unspecified ) @@ -231,7 +323,7 @@ fun UserZapReaction( Icon( imageVector = Icons.Default.Bolt, contentDescription = stringResource(R.string.zaps), - modifier = Modifier.size(20.dp), + modifier = Modifier.size(24.dp), tint = BitcoinOrange ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt index aab31e69eb..2989551366 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt @@ -13,7 +13,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Brush @@ -35,34 +34,32 @@ import com.patrykandpatrick.vico.compose.style.ProvideChartStyle import com.patrykandpatrick.vico.core.DefaultAlpha import com.patrykandpatrick.vico.core.axis.AxisPosition import com.patrykandpatrick.vico.core.axis.formatter.AxisValueFormatter -import com.patrykandpatrick.vico.core.chart.composed.ComposedChartEntryModel import com.patrykandpatrick.vico.core.chart.composed.plus import com.patrykandpatrick.vico.core.chart.line.LineChart import com.patrykandpatrick.vico.core.chart.values.ChartValues import com.patrykandpatrick.vico.core.component.shape.shader.DynamicShaders -import com.patrykandpatrick.vico.core.entry.ChartEntryModel -import com.patrykandpatrick.vico.core.entry.ChartEntryModelProducer import com.patrykandpatrick.vico.core.entry.composed.plus -import com.patrykandpatrick.vico.core.entry.entryOf import com.vitorpamplona.amethyst.service.NostrAccountDataSource import com.vitorpamplona.amethyst.ui.dal.NotificationFeedFilter import com.vitorpamplona.amethyst.ui.navigation.Route +import com.vitorpamplona.amethyst.ui.note.OneGiga +import com.vitorpamplona.amethyst.ui.note.OneKilo +import com.vitorpamplona.amethyst.ui.note.OneMega import com.vitorpamplona.amethyst.ui.note.UserReactionsRow import com.vitorpamplona.amethyst.ui.note.UserReactionsViewModel -import com.vitorpamplona.amethyst.ui.note.showAmount import com.vitorpamplona.amethyst.ui.note.showCount import com.vitorpamplona.amethyst.ui.screen.CardFeedView import com.vitorpamplona.amethyst.ui.screen.NotificationViewModel import com.vitorpamplona.amethyst.ui.screen.ScrollStateKeys import com.vitorpamplona.amethyst.ui.theme.BitcoinOrange -import kotlinx.coroutines.launch -import java.time.LocalDateTime -import java.time.format.DateTimeFormatter +import java.math.BigDecimal +import java.math.RoundingMode import kotlin.math.roundToInt @Composable fun NotificationScreen( notifFeedViewModel: NotificationViewModel, + userReactionsStatsModel: UserReactionsViewModel, accountViewModel: AccountViewModel, navController: NavController, scrollToTop: Boolean = false @@ -100,7 +97,7 @@ fun NotificationScreen( Column( modifier = Modifier.padding(vertical = 0.dp) ) { - SummaryBar(accountViewModel, navController) + SummaryBar(userReactionsStatsModel, accountViewModel, navController) CardFeedView( viewModel = notifFeedViewModel, accountViewModel = accountViewModel, @@ -114,49 +111,11 @@ fun NotificationScreen( } @Composable -fun SummaryBar(accountViewModel: AccountViewModel, navController: NavController) { - val accountState by accountViewModel.accountLiveData.observeAsState() - val accountUser = remember(accountState) { accountState?.account?.userProfile() } ?: return - - val model: UserReactionsViewModel = viewModel() - - var chartModel by remember(accountState) { mutableStateOf?>(null) } - var axisLabels by remember(accountState) { mutableStateOf>(emptyList()) } - - val scope = rememberCoroutineScope() - +fun SummaryBar(model: UserReactionsViewModel, accountViewModel: AccountViewModel, navController: NavController) { var showChart by remember { mutableStateOf(false) } - LaunchedEffect(accountUser.pubkeyHex) { - scope.launch { - model.load(accountUser) - model.refreshSuspended() - val day = 24 * 60 * 60L - val now = LocalDateTime.now() - val displayAxisFormatter = DateTimeFormatter.ofPattern("EEE") - - val dataAxisLabels = listOf(6, 5, 4, 3, 2, 1, 0).map { model.sdf.format(now.minusSeconds(day * it)) } - axisLabels = listOf(6, 5, 4, 3, 2, 1, 0).map { displayAxisFormatter.format(now.minusSeconds(day * it)) } - - val listOfCountCurves = listOf( - dataAxisLabels.mapIndexed { index, dateStr -> entryOf(index, model.replies[dateStr]?.toFloat() ?: 0f) }, - dataAxisLabels.mapIndexed { index, dateStr -> entryOf(index, model.boosts[dateStr]?.toFloat() ?: 0f) }, - dataAxisLabels.mapIndexed { index, dateStr -> entryOf(index, model.reactions[dateStr]?.toFloat() ?: 0f) } - ) - - val listOfValueCurves = listOf( - dataAxisLabels.mapIndexed { index, dateStr -> entryOf(index, model.zaps[dateStr]?.toFloat() ?: 0f) } - ) - - val chartEntryModelProducer1 = ChartEntryModelProducer(listOfCountCurves).getModel() - val chartEntryModelProducer2 = ChartEntryModelProducer(listOfValueCurves).getModel() - - chartModel = chartEntryModelProducer1.plus(chartEntryModelProducer2) - } - } - UserReactionsRow(model, accountViewModel, navController) { showChart = !showChart } @@ -197,9 +156,13 @@ fun SummaryBar(accountViewModel: AccountViewModel, navController: NavController) targetVerticalAxisPosition = AxisPosition.Vertical.End ) - chartModel?.let { + model.chartModel?.let { if (showChart) { - Row(modifier = Modifier.padding(vertical = 10.dp, horizontal = 20.dp).clickable(onClick = { showChart = !showChart })) { + Row( + modifier = Modifier + .padding(vertical = 10.dp, horizontal = 20.dp) + .clickable(onClick = { showChart = !showChart }) + ) { ProvideChartStyle() { Chart( chart = remember(lineChartCount, lineChartZaps) { @@ -213,7 +176,7 @@ fun SummaryBar(accountViewModel: AccountViewModel, navController: NavController) valueFormatter = AmountAxisValueFormatter() ), bottomAxis = bottomAxis( - valueFormatter = LabelValueFormatter(axisLabels) + valueFormatter = LabelValueFormatter(model.axisLabels) ) ) } @@ -249,6 +212,18 @@ class AmountAxisValueFormatter() : AxisValueFormatter value: Float, chartValues: ChartValues ): String { - return showAmount(value.toBigDecimal()) + return showAmountAxis(value.toBigDecimal()) + } +} + +fun showAmountAxis(amount: BigDecimal?): String { + if (amount == null) return "" + if (amount.abs() < BigDecimal(0.01)) return "" + + return when { + amount >= OneGiga -> "%.0fG".format(amount.div(OneGiga).setScale(0, RoundingMode.HALF_UP)) + amount >= OneMega -> "%.0fM".format(amount.div(OneMega).setScale(0, RoundingMode.HALF_UP)) + amount >= OneKilo -> "%.0fk".format(amount.div(OneKilo).setScale(0, RoundingMode.HALF_UP)) + else -> "%.0f".format(amount) } } From 95a21cc08c161b138915c652d324402f404526af Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 17 May 2023 09:49:31 -0400 Subject: [PATCH 123/171] Adds Navigation markers to the top panel and reaction watch --- .../amethyst/ui/navigation/AppTopBar.kt | 13 ++++++++- .../amethyst/ui/note/UserReactionsRow.kt | 28 ++++++++++++++----- app/src/main/res/values/strings.xml | 2 ++ 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt index 1ebe2c4329..cecad69ec1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -23,6 +24,7 @@ import androidx.compose.material.Text import androidx.compose.material.TopAppBar import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material.icons.filled.ExpandMore import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue @@ -337,7 +339,16 @@ fun SimpleTextSpinner( modifier = modifier, contentAlignment = Alignment.Center ) { - Text(placeholder) + Row(verticalAlignment = Alignment.CenterVertically) { + Spacer(modifier = Modifier.size(20.dp)) + Text(placeholder) + Icon( + imageVector = Icons.Default.ExpandMore, + null, + modifier = Modifier.size(20.dp), + tint = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) + } Box( modifier = Modifier .matchParentSize() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserReactionsRow.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserReactionsRow.kt index 8eb5f573f7..484fbdde22 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserReactionsRow.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserReactionsRow.kt @@ -7,9 +7,11 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Bolt +import androidx.compose.material.icons.filled.ExpandMore import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -52,13 +54,25 @@ import java.time.format.DateTimeFormatter @Composable fun UserReactionsRow(model: UserReactionsViewModel, accountViewModel: AccountViewModel, navController: NavController, onClick: () -> Unit) { - Row(verticalAlignment = CenterVertically, modifier = Modifier.clickable(onClick = onClick).padding(10.dp)) { - Text( - text = "Today", - fontWeight = FontWeight.Bold, - fontSize = 18.sp, - modifier = Modifier.width(65.dp) - ) + Row( + verticalAlignment = CenterVertically, + modifier = Modifier + .clickable(onClick = onClick) + .padding(10.dp) + ) { + Row(verticalAlignment = CenterVertically, modifier = Modifier.width(68.dp)) { + Text( + text = stringResource(id = R.string.today), + fontWeight = FontWeight.Bold + ) + + Icon( + imageVector = Icons.Default.ExpandMore, + null, + modifier = Modifier.size(20.dp), + tint = MaterialTheme.colors.onSurface.copy(alpha = 0.32f) + ) + } Row(verticalAlignment = CenterVertically, modifier = Modifier.weight(1f)) { UserReplyReaction(model.replies[model.today]) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9de6c008b6..b10e096310 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -402,4 +402,6 @@ npub, nevent or hex Create Join + + Today From a8e650a38dcc9fe8ea2d7f6b8807e37af373a719 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 17 May 2023 09:50:43 -0400 Subject: [PATCH 124/171] v0.50.1 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0d44082828..ed1e20fde3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 168 - versionName "0.50.0" + versionCode 169 + versionName "0.50.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From 117446688b0f9d4045a216fad1feaa51c8142b7a Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 17 May 2023 11:20:03 -0400 Subject: [PATCH 125/171] Fixes jumping chat screens on hidden posts. --- .../ui/note/ChatroomMessageCompose.kt | 20 +++++++++---------- .../amethyst/ui/note/NoteCompose.kt | 20 +++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt index bba8478648..57ed43b3a7 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt @@ -110,6 +110,8 @@ fun ChatroomMessageCompose( note?.let { NoteQuickActionMenu(it, popupExpanded, { popupExpanded = false }, accountViewModel) } + } else if (account.isHidden(noteForReports.author!!)) { + // Does nothing } else { var showHiddenNote by remember { mutableStateOf(false) } var isAcceptableAndCanPreview by remember { mutableStateOf(Pair(true, true)) } @@ -131,16 +133,14 @@ fun ChatroomMessageCompose( } if (!isAcceptableAndCanPreview.first && !showHiddenNote) { - if (!account.isHidden(noteForReports.author!!)) { - HiddenNote( - account.getRelevantReports(noteForReports), - account.userProfile(), - Modifier, - innerQuote, - navController, - onClick = { showHiddenNote = true } - ) - } + HiddenNote( + account.getRelevantReports(noteForReports), + account.userProfile(), + Modifier, + innerQuote, + navController, + onClick = { showHiddenNote = true } + ) } else { val backgroundBubbleColor: Color val alignment: Arrangement.Horizontal diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index bfdcfb7dc1..bff36a2988 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -220,6 +220,8 @@ fun NoteComposeInner( note?.let { NoteQuickActionMenu(it, popupExpanded, { popupExpanded = false }, accountViewModel) } + } else if (account.isHidden(noteForReports.author!!)) { + // Does nothing } else { var showHiddenNote by remember { mutableStateOf(false) } var isAcceptableAndCanPreview by remember { mutableStateOf(Pair(true, true)) } @@ -241,16 +243,14 @@ fun NoteComposeInner( } if (!isAcceptableAndCanPreview.first && !showHiddenNote) { - if (!account.isHidden(noteForReports.author!!)) { - HiddenNote( - account.getRelevantReports(noteForReports), - account.userProfile(), - modifier, - isBoostedNote, - navController, - onClick = { showHiddenNote = true } - ) - } + HiddenNote( + account.getRelevantReports(noteForReports), + account.userProfile(), + modifier, + isBoostedNote, + navController, + onClick = { showHiddenNote = true } + ) } else if ((noteEvent is ChannelCreateEvent || noteEvent is ChannelMetadataEvent) && baseChannel != null) { ChannelHeader(baseChannel = baseChannel, account = account, navController = navController) } else if (noteEvent is BadgeDefinitionEvent) { From d2390208955658345c5b642f24e62a988eca5abe Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 17 May 2023 11:20:14 -0400 Subject: [PATCH 126/171] v0.50.2 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ed1e20fde3..7341d633cf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 169 - versionName "0.50.1" + versionCode 170 + versionName "0.50.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From c5176b8c4973be9b2527aadcbbe674c68b6f62b5 Mon Sep 17 00:00:00 2001 From: Zoltan <34719275+ZsZolee@users.noreply.github.com> Date: Wed, 17 May 2023 17:27:43 +0200 Subject: [PATCH 127/171] Replacing some missing Hungarian translation --- app/src/main/res/values-hu/strings.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 2d5f6b0371..86d2c42c4b 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -284,6 +284,8 @@ "%1$s esemény keresése" Nyilvános üzenet hozzáadása + Adj hozzá egy privát üzenetet + A számlához adj hozzá egy üzenetet Köszönöm a kemény munkát! Létrehoz és Hozzáad @@ -334,6 +336,13 @@ Saját csomópontjaid (NIP-95) A fájlokat a csomópontokra töltik fel és ott tárolják. Rögzített URL-től mentesek (harmadik féltől való függőség). Győződj meg róla, hogy legalább egy NIP-95 csomópont a csomópontlistában szerepel + Tor/Orbot beállítása + Csatlakozás a saját Orbot beállításod alapján + + Lecsatlakozás a saját Orbot/Tor hálózatról? + Az adataid azonnal a hagyományos hálózaton lesz továbbítva + Igen + Nem Követek Lista @@ -374,4 +383,6 @@ npub, nevent vagy hex Létrehoz Csatlakozás + + Ma From d6c8651f0d46ed205e48788bd4e26daeaa2837dc Mon Sep 17 00:00:00 2001 From: KotlinGeek Date: Wed, 17 May 2023 17:26:31 +0100 Subject: [PATCH 128/171] Add lowercase variant of hashtag when creating event. --- .../com/vitorpamplona/amethyst/service/model/TextNoteEvent.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/TextNoteEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/TextNoteEvent.kt index b9bc6ab558..aa80ac016d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/TextNoteEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/TextNoteEvent.kt @@ -43,6 +43,7 @@ class TextNoteEvent( } findHashtags(msg).forEach { tags.add(listOf("t", it)) + tags.add(listOf("t", it.lowercase())) } extraTags?.forEach { tags.add(listOf("t", it)) From 5040350be5ff659d0682f859741061c6e5a224b8 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 17 May 2023 13:54:20 -0400 Subject: [PATCH 129/171] Fixes Auth for NIP-42 sporadic connections. --- .../java/com/vitorpamplona/amethyst/service/relays/Client.kt | 4 ++-- .../com/vitorpamplona/amethyst/service/relays/RelayPool.kt | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt index 3fb91722fc..33a02c40ee 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt @@ -70,7 +70,7 @@ object Client : RelayPool.Listener { if (relay == null) { RelayPool.send(signedEvent) } else { - val useConnectedRelayIfPresent = relays.filter { it.url == relay } + val useConnectedRelayIfPresent = RelayPool.getRelays(relay) if (useConnectedRelayIfPresent.isNotEmpty()) { useConnectedRelayIfPresent.forEach { @@ -103,7 +103,7 @@ object Client : RelayPool.Listener { onConnected(relay) GlobalScope.launch(Dispatchers.IO) { - delay(10000) // waits for a reply + delay(60000) // waits for a reply relay.disconnect() RelayPool.removeRelay(relay) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/RelayPool.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/RelayPool.kt index 702bdc1b2e..23f2c4a254 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/RelayPool.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/RelayPool.kt @@ -30,6 +30,10 @@ object RelayPool : Relay.Listener { return relays.firstOrNull() { it.url == url } } + fun getRelays(url: String): List { + return relays.filter { it.url == url } + } + fun loadRelays(relayList: List) { if (!relayList.isNullOrEmpty()) { relayList.forEach { addRelay(it) } From cbe9462f2809a843a887b296ff7ab05e9ed4d550 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 17 May 2023 13:55:30 -0400 Subject: [PATCH 130/171] v0.50.3 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7341d633cf..d44fd5d93c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 170 - versionName "0.50.2" + versionCode 171 + versionName "0.50.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From 323e71c7cbbe27a1716f3c0a20d830866b3f1f02 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 17 May 2023 15:47:20 -0400 Subject: [PATCH 131/171] Bugfix for saving Replaceable notes in Bookmarks. --- .../vitorpamplona/amethyst/model/Account.kt | 140 +++++++++++++----- .../amethyst/ui/note/NoteCompose.kt | 4 +- 2 files changed, 103 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index bf66a5f436..38d71ebda9 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -593,18 +593,33 @@ class Account( val bookmarks = userProfile().latestBookmarkList - val event = BookmarkListEvent.create( - "bookmark", - bookmarks?.taggedEvents() ?: emptyList(), - bookmarks?.taggedUsers() ?: emptyList(), - bookmarks?.taggedAddresses() ?: emptyList(), + val event = if (note is AddressableNote) { + BookmarkListEvent.create( + "bookmark", + bookmarks?.taggedEvents() ?: emptyList(), + bookmarks?.taggedUsers() ?: emptyList(), + bookmarks?.taggedAddresses() ?: emptyList(), - bookmarks?.privateTaggedEvents(privKey = loggedIn.privKey!!)?.plus(note.idHex) ?: listOf(note.idHex), - bookmarks?.privateTaggedUsers(privKey = loggedIn.privKey!!) ?: emptyList(), - bookmarks?.privateTaggedAddresses(privKey = loggedIn.privKey!!) ?: emptyList(), + bookmarks?.privateTaggedEvents(privKey = loggedIn.privKey!!) ?: emptyList(), + bookmarks?.privateTaggedUsers(privKey = loggedIn.privKey!!) ?: emptyList(), + bookmarks?.privateTaggedAddresses(privKey = loggedIn.privKey!!)?.plus(note.address) ?: listOf(note.address), - loggedIn.privKey!! - ) + loggedIn.privKey!! + ) + } else { + BookmarkListEvent.create( + "bookmark", + bookmarks?.taggedEvents() ?: emptyList(), + bookmarks?.taggedUsers() ?: emptyList(), + bookmarks?.taggedAddresses() ?: emptyList(), + + bookmarks?.privateTaggedEvents(privKey = loggedIn.privKey!!)?.plus(note.idHex) ?: listOf(note.idHex), + bookmarks?.privateTaggedUsers(privKey = loggedIn.privKey!!) ?: emptyList(), + bookmarks?.privateTaggedAddresses(privKey = loggedIn.privKey!!) ?: emptyList(), + + loggedIn.privKey!! + ) + } Client.send(event) LocalCache.consume(event) @@ -615,18 +630,33 @@ class Account( val bookmarks = userProfile().latestBookmarkList - val event = BookmarkListEvent.create( - "bookmark", - bookmarks?.taggedEvents()?.plus(note.idHex) ?: listOf(note.idHex), - bookmarks?.taggedUsers() ?: emptyList(), - bookmarks?.taggedAddresses() ?: emptyList(), + val event = if (note is AddressableNote) { + BookmarkListEvent.create( + "bookmark", + bookmarks?.taggedEvents() ?: emptyList(), + bookmarks?.taggedUsers() ?: emptyList(), + bookmarks?.taggedAddresses()?.plus(note.address) ?: listOf(note.address), - bookmarks?.privateTaggedEvents(privKey = loggedIn.privKey!!) ?: emptyList(), - bookmarks?.privateTaggedUsers(privKey = loggedIn.privKey!!) ?: emptyList(), - bookmarks?.privateTaggedAddresses(privKey = loggedIn.privKey!!) ?: emptyList(), + bookmarks?.privateTaggedEvents(privKey = loggedIn.privKey!!) ?: emptyList(), + bookmarks?.privateTaggedUsers(privKey = loggedIn.privKey!!) ?: emptyList(), + bookmarks?.privateTaggedAddresses(privKey = loggedIn.privKey!!) ?: emptyList(), - loggedIn.privKey!! - ) + loggedIn.privKey!! + ) + } else { + BookmarkListEvent.create( + "bookmark", + bookmarks?.taggedEvents()?.plus(note.idHex) ?: listOf(note.idHex), + bookmarks?.taggedUsers() ?: emptyList(), + bookmarks?.taggedAddresses() ?: emptyList(), + + bookmarks?.privateTaggedEvents(privKey = loggedIn.privKey!!) ?: emptyList(), + bookmarks?.privateTaggedUsers(privKey = loggedIn.privKey!!) ?: emptyList(), + bookmarks?.privateTaggedAddresses(privKey = loggedIn.privKey!!) ?: emptyList(), + + loggedIn.privKey!! + ) + } Client.send(event) LocalCache.consume(event) @@ -637,18 +667,33 @@ class Account( val bookmarks = userProfile().latestBookmarkList - val event = BookmarkListEvent.create( - "bookmark", - bookmarks?.taggedEvents() ?: emptyList(), - bookmarks?.taggedUsers() ?: emptyList(), - bookmarks?.taggedAddresses() ?: emptyList(), + val event = if (note is AddressableNote) { + BookmarkListEvent.create( + "bookmark", + bookmarks?.taggedEvents() ?: emptyList(), + bookmarks?.taggedUsers() ?: emptyList(), + bookmarks?.taggedAddresses() ?: emptyList(), - bookmarks?.privateTaggedEvents(privKey = loggedIn.privKey!!)?.minus(note.idHex) ?: listOf(), - bookmarks?.privateTaggedUsers(privKey = loggedIn.privKey!!) ?: emptyList(), - bookmarks?.privateTaggedAddresses(privKey = loggedIn.privKey!!) ?: emptyList(), + bookmarks?.privateTaggedEvents(privKey = loggedIn.privKey!!) ?: emptyList(), + bookmarks?.privateTaggedUsers(privKey = loggedIn.privKey!!) ?: emptyList(), + bookmarks?.privateTaggedAddresses(privKey = loggedIn.privKey!!)?.minus(note.address) ?: listOf(), - loggedIn.privKey!! - ) + loggedIn.privKey!! + ) + } else { + BookmarkListEvent.create( + "bookmark", + bookmarks?.taggedEvents() ?: emptyList(), + bookmarks?.taggedUsers() ?: emptyList(), + bookmarks?.taggedAddresses() ?: emptyList(), + + bookmarks?.privateTaggedEvents(privKey = loggedIn.privKey!!)?.minus(note.idHex) ?: listOf(), + bookmarks?.privateTaggedUsers(privKey = loggedIn.privKey!!) ?: emptyList(), + bookmarks?.privateTaggedAddresses(privKey = loggedIn.privKey!!) ?: emptyList(), + + loggedIn.privKey!! + ) + } Client.send(event) LocalCache.consume(event) @@ -665,18 +710,33 @@ class Account( val bookmarks = userProfile().latestBookmarkList - val event = BookmarkListEvent.create( - "bookmark", - bookmarks?.taggedEvents()?.minus(note.idHex), - bookmarks?.taggedUsers() ?: emptyList(), - bookmarks?.taggedAddresses() ?: emptyList(), + val event = if (note is AddressableNote) { + BookmarkListEvent.create( + "bookmark", + bookmarks?.taggedEvents() ?: emptyList(), + bookmarks?.taggedUsers() ?: emptyList(), + bookmarks?.taggedAddresses()?.minus(note.address), - bookmarks?.privateTaggedEvents(privKey = loggedIn.privKey!!) ?: emptyList(), - bookmarks?.privateTaggedUsers(privKey = loggedIn.privKey!!) ?: emptyList(), - bookmarks?.privateTaggedAddresses(privKey = loggedIn.privKey!!) ?: emptyList(), + bookmarks?.privateTaggedEvents(privKey = loggedIn.privKey!!) ?: emptyList(), + bookmarks?.privateTaggedUsers(privKey = loggedIn.privKey!!) ?: emptyList(), + bookmarks?.privateTaggedAddresses(privKey = loggedIn.privKey!!) ?: emptyList(), - loggedIn.privKey!! - ) + loggedIn.privKey!! + ) + } else { + BookmarkListEvent.create( + "bookmark", + bookmarks?.taggedEvents()?.minus(note.idHex), + bookmarks?.taggedUsers() ?: emptyList(), + bookmarks?.taggedAddresses() ?: emptyList(), + + bookmarks?.privateTaggedEvents(privKey = loggedIn.privKey!!) ?: emptyList(), + bookmarks?.privateTaggedUsers(privKey = loggedIn.privKey!!) ?: emptyList(), + bookmarks?.privateTaggedAddresses(privKey = loggedIn.privKey!!) ?: emptyList(), + + loggedIn.privKey!! + ) + } Client.send(event) LocalCache.consume(event) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index bff36a2988..2715282ddd 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -2183,13 +2183,15 @@ fun NoteDropDownMenu(note: Note, popupExpanded: Boolean, onDismiss: () -> Unit, val actContext = LocalContext.current var reportDialogShowing by remember { mutableStateOf(false) } + val bookmarkState by accountViewModel.userProfile().live().bookmarks.observeAsState() + var state by remember { mutableStateOf( DropDownParams(false, false, false, false) ) } - LaunchedEffect(key1 = note) { + LaunchedEffect(key1 = note, key2 = bookmarkState) { withContext(Dispatchers.IO) { state = DropDownParams( accountViewModel.isFollowing(note.author), From e41df98920764888199507378e35518eb1269d7e Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 17 May 2023 17:01:07 -0400 Subject: [PATCH 132/171] Bugfix for channel metadata messages show up before channel creation packages --- .../amethyst/model/LocalCache.kt | 29 +++++++++++-------- .../amethyst/ui/note/BlankNote.kt | 4 +-- .../ui/note/ChatroomMessageCompose.kt | 16 ++++++---- .../amethyst/ui/note/NoteCompose.kt | 8 ++--- .../amethyst/ui/note/NoteQuickActionMenu.kt | 7 +++-- .../ui/screen/loggedIn/ChannelScreen.kt | 7 ++++- 6 files changed, 44 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index 16257be07c..eea2d78515 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -553,17 +553,20 @@ object LocalCache { // Log.d("MT", "New Event ${event.content} ${event.id.toHex()}") val oldChannel = getOrCreateChannel(event.id) val author = getOrCreateUser(event.pubKey) + + val note = getOrCreateNote(event.id) + if (note.event == null) { + oldChannel.addNote(note) + note.loadEvent(event, author, emptyList()) + + refreshObservers(note) + } + if (event.createdAt <= oldChannel.updatedMetadataAt) { return // older data, does nothing } if (oldChannel.creator == null || oldChannel.creator == author) { oldChannel.updateChannelInfo(author, event.channelInfo(), event.createdAt) - - val note = getOrCreateNote(event.id) - oldChannel.addNote(note) - note.loadEvent(event, author, emptyList()) - - refreshObservers(note) } } @@ -578,16 +581,18 @@ object LocalCache { if (event.createdAt > oldChannel.updatedMetadataAt) { if (oldChannel.creator == null || oldChannel.creator == author) { oldChannel.updateChannelInfo(author, event.channelInfo(), event.createdAt) - - val note = getOrCreateNote(event.id) - oldChannel.addNote(note) - note.loadEvent(event, author, emptyList()) - - refreshObservers(note) } } else { // Log.d("MT","Relay sent a previous Metadata Event ${oldUser.toBestDisplayName()} ${formattedDateTime(event.createdAt)} > ${formattedDateTime(oldUser.updatedAt)}") } + + val note = getOrCreateNote(event.id) + if (note.event == null) { + oldChannel.addNote(note) + note.loadEvent(event, author, emptyList()) + + refreshObservers(note) + } } fun consume(event: ChannelMessageEvent, relay: Relay?) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BlankNote.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BlankNote.kt index 98aa24cdb0..a333a2b6c3 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BlankNote.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BlankNote.kt @@ -24,7 +24,7 @@ import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.User @Composable -fun BlankNote(modifier: Modifier = Modifier, isQuote: Boolean = false) { +fun BlankNote(modifier: Modifier = Modifier, isQuote: Boolean = false, idHex: String? = null) { Column(modifier = modifier) { Row(modifier = Modifier.padding(horizontal = if (!isQuote) 12.dp else 6.dp)) { Column(modifier = Modifier.padding(start = if (!isQuote) 10.dp else 5.dp)) { @@ -39,7 +39,7 @@ fun BlankNote(modifier: Modifier = Modifier, isQuote: Boolean = false) { horizontalArrangement = Arrangement.Center ) { Text( - text = stringResource(R.string.post_not_found), + text = stringResource(R.string.post_not_found) + if (idHex != null) ": $idHex" else "", modifier = Modifier.padding(30.dp), color = Color.Gray ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt index 57ed43b3a7..55fe086692 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt @@ -90,12 +90,12 @@ fun ChatroomMessageCompose( val loggedIn = remember(accountState) { accountState?.account?.userProfile() } ?: return val noteState by baseNote.live().metadata.observeAsState() - val note = remember(noteState) { noteState?.note } + val note = remember(noteState) { noteState?.note } ?: return val noteReportsState by baseNote.live().reports.observeAsState() val noteForReports = remember(noteReportsState) { noteReportsState?.note } ?: return - val noteEvent = note?.event + val noteEvent = remember(noteState) { note.event } var popupExpanded by remember { mutableStateOf(false) } @@ -107,7 +107,7 @@ fun ChatroomMessageCompose( ) ) - note?.let { + note.let { NoteQuickActionMenu(it, popupExpanded, { popupExpanded = false }, accountViewModel) } } else if (account.isHidden(noteForReports.author!!)) { @@ -209,7 +209,11 @@ fun ChatroomMessageCompose( shape = shape, modifier = Modifier .combinedClickable( - onClick = { }, + onClick = { + if (noteEvent is ChannelCreateEvent) { + navController.navigate("Channel/${note.idHex}") + } + }, onLongClick = { popupExpanded = true } ) ) { @@ -228,12 +232,14 @@ fun ChatroomMessageCompose( alignment, navController ) + } else { + Spacer(modifier = Modifier.height(5.dp)) } val replyTo = note.replyTo if (!innerQuote && !replyTo.isNullOrEmpty()) { Row(verticalAlignment = Alignment.CenterVertically) { - replyTo.toSet().mapIndexed { _, note -> + replyTo.lastOrNull()?.let { note -> ChatroomMessageCompose( note, null, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index 2715282ddd..b6c279f1f5 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -196,13 +196,13 @@ fun NoteComposeInner( val loggedIn = remember(accountState) { accountState?.account?.userProfile() } ?: return val noteState by baseNote.live().metadata.observeAsState() - val note = remember(noteState) { noteState?.note } + val note = remember(noteState) { noteState?.note } ?: return val noteReportsState by baseNote.live().reports.observeAsState() val noteForReports = remember(noteReportsState) { noteReportsState?.note } ?: return - val noteEvent = note?.event - val baseChannel = note?.channel() + val noteEvent = remember(noteState) { note.event } + val baseChannel = remember(noteState) { note.channel() } var popupExpanded by remember { mutableStateOf(false) } @@ -217,7 +217,7 @@ fun NoteComposeInner( isBoostedNote ) - note?.let { + note.let { NoteQuickActionMenu(it, popupExpanded, { popupExpanded = false }, accountViewModel) } } else if (account.isHidden(noteForReports.author!!)) { 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 02369406b0..73c75812c2 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 @@ -217,10 +217,11 @@ fun NoteQuickActionMenu(note: Note, popupExpanded: Boolean, onDismiss: () -> Uni VerticalDivider(primaryLight) NoteQuickActionItem( - icon = ImageVector.vectorResource(id = R.drawable.text_select_move_forward_character), - label = stringResource(R.string.quick_action_select) + icon = ImageVector.vectorResource(id = R.drawable.relays), + label = stringResource(R.string.broadcast) ) { - showSelectTextDialog = true + accountViewModel.broadcast(note) + // showSelectTextDialog = true onDismiss() } VerticalDivider(primaryLight) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt index d2cdff2615..c6bcc52ab7 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt @@ -2,6 +2,7 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn import android.widget.Toast import androidx.compose.animation.animateContentSize +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -253,7 +254,11 @@ fun ChannelHeader(baseChannel: Channel, account: Account, navController: NavCont val context = LocalContext.current.applicationContext - Column() { + Column( + Modifier.clickable { + navController.navigate("Channel/${baseChannel.idHex}") + } + ) { Column(modifier = Modifier.padding(12.dp)) { Row(verticalAlignment = Alignment.CenterVertically) { RobohashAsyncImageProxy( From 639569cd866fb0e78206c805167de261b6440bd2 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 17 May 2023 17:05:06 -0400 Subject: [PATCH 133/171] v0.50.4 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d44fd5d93c..bf17bcf25c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 171 - versionName "0.50.3" + versionCode 172 + versionName "0.50.4" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From 2eb0096630b967147af51bf03231d15718192a50 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sat, 20 May 2023 20:35:13 -0400 Subject: [PATCH 134/171] Adds a space in a bookmark author's name --- .../main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index b6c279f1f5..8412819c61 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -1366,7 +1366,7 @@ fun DisplayHighlight( if (userDisplayName != null) { CreateClickableTextWithEmoji( clickablePart = userDisplayName, - suffix = "", + suffix = " ", tags = userTags, route = route, navController = navController From 7da87af0fb70b96acfb3c6ece7f9c24f43a49bdc Mon Sep 17 00:00:00 2001 From: KotlinGeek Date: Mon, 22 May 2023 01:29:38 +0100 Subject: [PATCH 135/171] Verify presence of note in backstack before navigating to it. --- .../amethyst/ui/note/NoteCompose.kt | 103 +++--------------- 1 file changed, 14 insertions(+), 89 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index bff36a2988..aaadf32f65 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -3,64 +3,25 @@ package com.vitorpamplona.amethyst.ui.note import android.content.Intent import android.graphics.Bitmap import android.util.Log -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.Image -import androidx.compose.foundation.background -import androidx.compose.foundation.border -import androidx.compose.foundation.clickable -import androidx.compose.foundation.combinedClickable -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues -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.layout.size -import androidx.compose.foundation.layout.width +import androidx.compose.foundation.* +import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CutCornerShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.ClickableText -import androidx.compose.material.Button -import androidx.compose.material.ButtonDefaults -import androidx.compose.material.Divider -import androidx.compose.material.DropdownMenu -import androidx.compose.material.DropdownMenuItem -import androidx.compose.material.Icon -import androidx.compose.material.IconButton -import androidx.compose.material.LocalTextStyle -import androidx.compose.material.MaterialTheme -import androidx.compose.material.Text -import androidx.compose.material.darkColors +import androidx.compose.material.* import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Bolt import androidx.compose.material.icons.filled.ExpandMore import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material.icons.filled.PushPin -import androidx.compose.material.lightColors -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.Stable -import androidx.compose.runtime.getValue +import androidx.compose.runtime.* import androidx.compose.runtime.livedata.observeAsState -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Brush -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.graphics.ColorMatrix -import androidx.compose.ui.graphics.compositeOver -import androidx.compose.ui.graphics.luminance +import androidx.compose.ui.graphics.* import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalClipboardManager import androidx.compose.ui.platform.LocalContext @@ -83,49 +44,9 @@ import coil.compose.AsyncImagePainter import com.google.accompanist.flowlayout.FlowRow import com.vitorpamplona.amethyst.NotificationCache import com.vitorpamplona.amethyst.R -import com.vitorpamplona.amethyst.model.Account -import com.vitorpamplona.amethyst.model.Channel -import com.vitorpamplona.amethyst.model.LocalCache -import com.vitorpamplona.amethyst.model.Note -import com.vitorpamplona.amethyst.model.NoteState -import com.vitorpamplona.amethyst.model.User -import com.vitorpamplona.amethyst.service.model.AudioTrackEvent -import com.vitorpamplona.amethyst.service.model.BadgeAwardEvent -import com.vitorpamplona.amethyst.service.model.BadgeDefinitionEvent -import com.vitorpamplona.amethyst.service.model.ChannelCreateEvent -import com.vitorpamplona.amethyst.service.model.ChannelMessageEvent -import com.vitorpamplona.amethyst.service.model.ChannelMetadataEvent -import com.vitorpamplona.amethyst.service.model.EventInterface -import com.vitorpamplona.amethyst.service.model.FileHeaderEvent -import com.vitorpamplona.amethyst.service.model.FileStorageHeaderEvent -import com.vitorpamplona.amethyst.service.model.HighlightEvent -import com.vitorpamplona.amethyst.service.model.LongTextNoteEvent -import com.vitorpamplona.amethyst.service.model.Participant -import com.vitorpamplona.amethyst.service.model.PeopleListEvent -import com.vitorpamplona.amethyst.service.model.PinListEvent -import com.vitorpamplona.amethyst.service.model.PollNoteEvent -import com.vitorpamplona.amethyst.service.model.PrivateDmEvent -import com.vitorpamplona.amethyst.service.model.ReactionEvent -import com.vitorpamplona.amethyst.service.model.ReportEvent -import com.vitorpamplona.amethyst.service.model.ReportedKey -import com.vitorpamplona.amethyst.service.model.RepostEvent -import com.vitorpamplona.amethyst.service.model.TextNoteEvent -import com.vitorpamplona.amethyst.ui.components.ClickableUrl -import com.vitorpamplona.amethyst.ui.components.CreateClickableTextWithEmoji -import com.vitorpamplona.amethyst.ui.components.ObserveDisplayNip05Status -import com.vitorpamplona.amethyst.ui.components.ResizeImage -import com.vitorpamplona.amethyst.ui.components.RobohashAsyncImage -import com.vitorpamplona.amethyst.ui.components.RobohashAsyncImageProxy -import com.vitorpamplona.amethyst.ui.components.RobohashFallbackAsyncImage -import com.vitorpamplona.amethyst.ui.components.TranslatableRichTextViewer -import com.vitorpamplona.amethyst.ui.components.VideoView -import com.vitorpamplona.amethyst.ui.components.ZoomableContent -import com.vitorpamplona.amethyst.ui.components.ZoomableContentView -import com.vitorpamplona.amethyst.ui.components.ZoomableLocalImage -import com.vitorpamplona.amethyst.ui.components.ZoomableLocalVideo -import com.vitorpamplona.amethyst.ui.components.ZoomableUrlImage -import com.vitorpamplona.amethyst.ui.components.ZoomableUrlVideo -import com.vitorpamplona.amethyst.ui.components.imageExtensions +import com.vitorpamplona.amethyst.model.* +import com.vitorpamplona.amethyst.service.model.* +import com.vitorpamplona.amethyst.ui.components.* import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.ChannelHeader import com.vitorpamplona.amethyst.ui.screen.loggedIn.ReportNoteDialog @@ -138,7 +59,7 @@ import nostr.postr.toNpub import java.io.File import java.math.BigDecimal import java.net.URL -import java.util.Locale +import java.util.* import kotlin.time.ExperimentalTime import kotlin.time.measureTimedValue @@ -299,7 +220,11 @@ fun NoteComposeInner( onClick = { scope.launch { routeFor(note, loggedIn)?.let { - navController.navigate(it) + if (note.idHex != navController.currentBackStackEntry?.arguments?.getString("id")) { + navController.navigate(it) + } else { + Log.d("Amethyst-Navigation", "Destination already exists in the backstack!") + } } } }, From 330f3503a6961ef1e5c0fcdf55e751f8a41ba810 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 21 May 2023 20:53:20 -0400 Subject: [PATCH 136/171] Adds nostr: prefix to channel id share. --- .../vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt index c6bcc52ab7..1af7f02c39 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt @@ -349,7 +349,7 @@ private fun NoteCopyButton( expanded = popupExpanded, onDismissRequest = { popupExpanded = false } ) { - DropdownMenuItem(onClick = { clipboardManager.setText(AnnotatedString(note.idNote())); popupExpanded = false }) { + DropdownMenuItem(onClick = { clipboardManager.setText(AnnotatedString("nostr:" + note.idNote())); popupExpanded = false }) { Text(stringResource(R.string.copy_channel_id_note_to_the_clipboard)) } } From a0797f710480c0d092d0e42f7c99db05ff2ee0d5 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 21 May 2023 20:53:57 -0400 Subject: [PATCH 137/171] Fixes NWC with Auth --- .../vitorpamplona/amethyst/model/Account.kt | 7 ++++++- .../NostrLnZapPaymentResponseDataSource.kt | 20 ++++++++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index 38d71ebda9..209a979069 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -217,7 +217,12 @@ class Account( zapPaymentRequest?.let { nip47 -> val event = LnZapPaymentRequestEvent.create(bolt11, nip47.pubKeyHex, nip47.secret?.hexToByteArray() ?: loggedIn.privKey!!) - val wcListener = NostrLnZapPaymentResponseDataSource(nip47.pubKeyHex, event.pubKey, event.id) + val wcListener = NostrLnZapPaymentResponseDataSource( + fromServiceHex = nip47.pubKeyHex, + toUserHex = event.pubKey, + replyingToHex = event.id, + authSigningKey = nip47.secret?.hexToByteArray() ?: loggedIn.privKey!! + ) wcListener.start() LocalCache.consume(event, zappedNote) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrLnZapPaymentResponseDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrLnZapPaymentResponseDataSource.kt index 57de8be6ed..7993306f54 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrLnZapPaymentResponseDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrLnZapPaymentResponseDataSource.kt @@ -1,14 +1,18 @@ package com.vitorpamplona.amethyst.service import com.vitorpamplona.amethyst.service.model.LnZapPaymentResponseEvent +import com.vitorpamplona.amethyst.service.model.RelayAuthEvent +import com.vitorpamplona.amethyst.service.relays.Client import com.vitorpamplona.amethyst.service.relays.FeedType import com.vitorpamplona.amethyst.service.relays.JsonFilter +import com.vitorpamplona.amethyst.service.relays.Relay import com.vitorpamplona.amethyst.service.relays.TypedFilter class NostrLnZapPaymentResponseDataSource( - private var fromServiceHex: String, - private var toUserHex: String, - private var replyingToHex: String + private val fromServiceHex: String, + private val toUserHex: String, + private val replyingToHex: String, + private val authSigningKey: ByteArray ) : NostrDataSource("LnZapPaymentResponseFeed") { val feedTypes = setOf(FeedType.WALLET_CONNECT) @@ -36,4 +40,14 @@ class NostrLnZapPaymentResponseDataSource( channel.typedFilters = listOfNotNull(wc).ifEmpty { null } } + + override fun auth(relay: Relay, challenge: String) { + super.auth(relay, challenge) + + val event = RelayAuthEvent.create(relay.url, challenge, authSigningKey) + Client.send( + event, + relay.url + ) + } } From b219b3631c82142f3eaf80d5272a1978f0dd6c34 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 21 May 2023 20:54:42 -0400 Subject: [PATCH 138/171] - Adds hashtags and #[n] rendering to markdown - Shortcuts the link to Amethyst's router. --- .../vitorpamplona/amethyst/ui/MainActivity.kt | 66 ++++---- .../amethyst/ui/components/RichTextViewer.kt | 141 ++++++++++++++---- 2 files changed, 152 insertions(+), 55 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt index f09b0735c2..9a20166c65 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt @@ -46,35 +46,7 @@ class MainActivity : FragmentActivity() { val uri = intent?.data?.toString() - val startingPage = if (uri.equals("nostr:Notifications", true)) { - Route.Notification.route.replace("{scrollToTop}", "true") - } else { - val nip19 = Nip19.uriToRoute(uri) - when (nip19?.type) { - Nip19.Type.USER -> "User/${nip19.hex}" - Nip19.Type.NOTE -> "Note/${nip19.hex}" - Nip19.Type.EVENT -> { - if (nip19.kind == PrivateDmEvent.kind) { - "Room/${nip19.author}" - } else if (nip19.kind == ChannelMessageEvent.kind || nip19.kind == ChannelCreateEvent.kind || nip19.kind == ChannelMetadataEvent.kind) { - "Channel/${nip19.hex}" - } else { - "Event/${nip19.hex}" - } - } - - Nip19.Type.ADDRESS -> "Note/${nip19.hex}" - else -> null - } - } ?: try { - uri?.let { - Nip47.parse(it) - val encodedUri = URLEncoder.encode(it, StandardCharsets.UTF_8.toString()) - Route.Home.base + "?nip47=" + encodedUri - } - } catch (e: Exception) { - null - } + val startingPage = uriToRoute(uri) // Initializes video cache. VideoCache.init(this.applicationContext) @@ -150,3 +122,39 @@ class GetMediaActivityResultContract : ActivityResultContracts.GetContent() { } } } + +fun uriToRoute(uri: String?): String? { + return if (uri.equals("nostr:Notifications", true)) { + Route.Notification.route.replace("{scrollToTop}", "true") + } else { + if (uri?.startsWith("nostr:Hashtag?id=") == true) { + Route.Hashtag.route.replace("{id}", uri.removePrefix("nostr:Hashtag?id=")) + } else { + val nip19 = Nip19.uriToRoute(uri) + when (nip19?.type) { + Nip19.Type.USER -> "User/${nip19.hex}" + Nip19.Type.NOTE -> "Note/${nip19.hex}" + Nip19.Type.EVENT -> { + if (nip19.kind == PrivateDmEvent.kind) { + "Room/${nip19.author}" + } else if (nip19.kind == ChannelMessageEvent.kind || nip19.kind == ChannelCreateEvent.kind || nip19.kind == ChannelMetadataEvent.kind) { + "Channel/${nip19.hex}" + } else { + "Event/${nip19.hex}" + } + } + + Nip19.Type.ADDRESS -> "Note/${nip19.hex}" + else -> null + } + } ?: try { + uri?.let { + Nip47.parse(it) + val encodedUri = URLEncoder.encode(it, StandardCharsets.UTF_8.toString()) + Route.Home.base + "?nip47=" + encodedUri + } + } catch (e: Exception) { + null + } + } +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt index b2f1b86746..d745aeecff 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt @@ -19,10 +19,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.compositeOver +import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.* import androidx.compose.ui.text.font.FontFamily -import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.text.style.TextDirection import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -43,6 +43,7 @@ import com.vitorpamplona.amethyst.service.lnurl.LnWithdrawalUtil import com.vitorpamplona.amethyst.service.nip19.Nip19 import com.vitorpamplona.amethyst.ui.note.NoteCompose import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel +import com.vitorpamplona.amethyst.ui.uriToRoute import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -99,7 +100,7 @@ fun RichTextViewer( Column(modifier = modifier) { if (isMarkdown) { - RenderContentAsMarkdown(content, backgroundColor) + RenderContentAsMarkdown(content, backgroundColor, tags, navController) } else { RenderRegular(content, tags, canPreview, backgroundColor, accountViewModel, navController) } @@ -310,7 +311,7 @@ fun RenderCustomEmoji(word: String, customEmoji: Map) { } @Composable -private fun RenderContentAsMarkdown(content: String, backgroundColor: Color) { +private fun RenderContentAsMarkdown(content: String, backgroundColor: Color, tags: List>?, navController: NavController) { val myMarkDownStyle = richTextDefaults.copy( codeBlockStyle = richTextDefaults.codeBlockStyle?.copy( textStyle = TextStyle( @@ -334,7 +335,6 @@ private fun RenderContentAsMarkdown(content: String, backgroundColor: Color) { ), stringStyle = richTextDefaults.stringStyle?.copy( linkStyle = SpanStyle( - textDecoration = TextDecoration.Underline, color = MaterialTheme.colors.primary ), codeStyle = SpanStyle( @@ -352,14 +352,14 @@ private fun RenderContentAsMarkdown(content: String, backgroundColor: Color) { LaunchedEffect(key1 = content) { withContext(Dispatchers.IO) { - nip19References = returnNIP19References(content) - markdownWithSpecialContent = returnMarkdownWithSpecialContent(content) + nip19References = returnNIP19References(content, tags) + markdownWithSpecialContent = returnMarkdownWithSpecialContent(content, tags) } } LaunchedEffect(key1 = refresh) { withContext(Dispatchers.IO) { - val newMarkdownWithSpecialContent = returnMarkdownWithSpecialContent(content) + val newMarkdownWithSpecialContent = returnMarkdownWithSpecialContent(content, tags) if (markdownWithSpecialContent != newMarkdownWithSpecialContent) { markdownWithSpecialContent = newMarkdownWithSpecialContent } @@ -389,17 +389,23 @@ private fun RenderContentAsMarkdown(content: String, backgroundColor: Color) { baseNote?.let { val noteState by it.live().metadata.observeAsState() if (noteState?.note?.event != null) { - refresh++ + LaunchedEffect(key1 = noteState) { + refresh++ + } } } baseUser?.let { val userState by it.live().metadata.observeAsState() if (userState?.user?.info != null) { - refresh++ + LaunchedEffect(key1 = userState) { + refresh++ + } } } } + val uri = LocalUriHandler.current + markdownWithSpecialContent?.let { MaterialRichText( style = myMarkDownStyle @@ -407,26 +413,70 @@ private fun RenderContentAsMarkdown(content: String, backgroundColor: Color) { Markdown( content = it, markdownParseOptions = MarkdownParseOptions.Default - ) + ) { link -> + val route = uriToRoute(link) + if (route != null) { + navController.navigate(route) + } else { + runCatching { uri.openUri(link) } + } + } } } } -private fun getDisplayNameFromNip19(nip19: Nip19.Return): String? { - if (nip19.type == Nip19.Type.USER) { - return LocalCache.users[nip19.hex]?.toBestDisplayName() - } else if (nip19.type == Nip19.Type.NOTE) { - return LocalCache.notes[nip19.hex]?.idDisplayNote() - } else if (nip19.type == Nip19.Type.ADDRESS) { - return LocalCache.addressables[nip19.hex]?.idDisplayNote() - } else if (nip19.type == Nip19.Type.EVENT) { - return LocalCache.notes[nip19.hex]?.idDisplayNote() ?: LocalCache.addressables[nip19.hex]?.idDisplayNote() - } else { - return null +private fun getDisplayNameAndNIP19FromTag(tag: String, tags: List>): Pair? { + val matcher = tagIndex.matcher(tag) + val (index, suffix) = try { + matcher.find() + Pair(matcher.group(1)?.toInt(), matcher.group(2) ?: "") + } catch (e: Exception) { + Log.w("Tag Parser", "Couldn't link tag $tag", e) + Pair(null, null) } + + if (index != null && index >= 0 && index < tags.size) { + val tag = tags[index] + + if (tag.size > 1) { + if (tag[0] == "p") { + LocalCache.checkGetOrCreateUser(tag[1])?.let { + return Pair(it.toBestDisplayName(), it.pubkeyNpub()) + } + } else if (tag[0] == "e" || tag[0] == "a") { + LocalCache.checkGetOrCreateNote(tag[1])?.let { + return Pair(it.idDisplayNote(), it.toNEvent()) + } + } + } + } + + return null } -private fun returnNIP19References(content: String): List { +private fun getDisplayNameFromNip19(nip19: Nip19.Return): Pair? { + if (nip19.type == Nip19.Type.USER) { + LocalCache.users[nip19.hex]?.let { + return Pair(it.toBestDisplayName(), it.pubkeyNpub()) + } + } else if (nip19.type == Nip19.Type.NOTE) { + LocalCache.notes[nip19.hex]?.let { + return Pair(it.idDisplayNote(), it.toNEvent()) + } + } else if (nip19.type == Nip19.Type.ADDRESS) { + LocalCache.addressables[nip19.hex]?.let { + return Pair(it.idDisplayNote(), it.toNEvent()) + } + } else if (nip19.type == Nip19.Type.EVENT) { + LocalCache.notes[nip19.hex]?.let { + return Pair(it.idDisplayNote(), it.toNEvent()) + } + } + + return null +} + +private fun returnNIP19References(content: String, tags: List>?): List { val listOfReferences = mutableListOf() content.split('\n').forEach { paragraph -> paragraph.split(' ').forEach { word: String -> @@ -438,10 +488,21 @@ private fun returnNIP19References(content: String): List { } } } + + tags?.forEach { + if (it[0] == "p" && it.size > 1) { + listOfReferences.add(Nip19.Return(Nip19.Type.USER, it[1], null, null, null, "")) + } else if (it[0] == "e" && it.size > 1) { + listOfReferences.add(Nip19.Return(Nip19.Type.NOTE, it[1], null, null, null, "")) + } else if (it[0] == "a" && it.size > 1) { + listOfReferences.add(Nip19.Return(Nip19.Type.ADDRESS, it[1], null, null, null, "")) + } + } + return listOfReferences } -private fun returnMarkdownWithSpecialContent(content: String): String { +private fun returnMarkdownWithSpecialContent(content: String, tags: List>?): String { var returnContent = "" content.split('\n').forEach { paragraph -> paragraph.split(' ').forEach { word: String -> @@ -454,15 +515,43 @@ private fun returnMarkdownWithSpecialContent(content: String): String { } else if (isBechLink(word)) { val parsedNip19 = Nip19.uriToRoute(word) returnContent += if (parsedNip19 !== null) { - val displayName = getDisplayNameFromNip19(parsedNip19) - if (displayName != null) { - "[@$displayName](nostr://$word) " + val pair = getDisplayNameFromNip19(parsedNip19) + if (pair != null) { + val (displayName, nip19) = pair + "[$displayName](nostr:$nip19) " } else { "$word " } } else { "$word " } + } else if (word.startsWith("#")) { + if (tagIndex.matcher(word).matches() && tags != null) { + val pair = getDisplayNameAndNIP19FromTag(word, tags) + if (pair != null) { + returnContent += "[${pair.first}](nostr:${pair.second}) " + } else { + returnContent += "$word " + } + } else if (hashTagsPattern.matcher(word).matches()) { + val hashtagMatcher = hashTagsPattern.matcher(word) + + val (myTag, mySuffix) = try { + hashtagMatcher.find() + Pair(hashtagMatcher.group(1), hashtagMatcher.group(2)) + } catch (e: Exception) { + Log.e("Hashtag Parser", "Couldn't link hashtag $word", e) + Pair(null, null) + } + + if (myTag != null) { + returnContent += "[#$myTag](nostr:Hashtag?id=$myTag)$mySuffix " + } else { + returnContent += "$word " + } + } else { + returnContent += "$word " + } } else { returnContent += "$word " } From 77668865872214cbad80687e388563c6437cd534 Mon Sep 17 00:00:00 2001 From: KotlinGeek Date: Mon, 22 May 2023 12:56:17 +0100 Subject: [PATCH 139/171] Apply fix to profile navigation as well. --- .../amethyst/ui/note/NoteCompose.kt | 111 ++++++++++++++++-- 1 file changed, 99 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index aaadf32f65..c1dd522817 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -3,25 +3,64 @@ package com.vitorpamplona.amethyst.ui.note import android.content.Intent import android.graphics.Bitmap import android.util.Log -import androidx.compose.foundation.* -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +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.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CutCornerShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.ClickableText -import androidx.compose.material.* +import androidx.compose.material.Button +import androidx.compose.material.ButtonDefaults +import androidx.compose.material.Divider +import androidx.compose.material.DropdownMenu +import androidx.compose.material.DropdownMenuItem +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.LocalTextStyle +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.material.darkColors import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Bolt import androidx.compose.material.icons.filled.ExpandMore import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material.icons.filled.PushPin -import androidx.compose.runtime.* +import androidx.compose.material.lightColors +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.Stable +import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.* +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.graphics.ColorMatrix +import androidx.compose.ui.graphics.compositeOver +import androidx.compose.ui.graphics.luminance import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalClipboardManager import androidx.compose.ui.platform.LocalContext @@ -44,9 +83,49 @@ import coil.compose.AsyncImagePainter import com.google.accompanist.flowlayout.FlowRow import com.vitorpamplona.amethyst.NotificationCache import com.vitorpamplona.amethyst.R -import com.vitorpamplona.amethyst.model.* -import com.vitorpamplona.amethyst.service.model.* -import com.vitorpamplona.amethyst.ui.components.* +import com.vitorpamplona.amethyst.model.Account +import com.vitorpamplona.amethyst.model.Channel +import com.vitorpamplona.amethyst.model.LocalCache +import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.model.NoteState +import com.vitorpamplona.amethyst.model.User +import com.vitorpamplona.amethyst.service.model.AudioTrackEvent +import com.vitorpamplona.amethyst.service.model.BadgeAwardEvent +import com.vitorpamplona.amethyst.service.model.BadgeDefinitionEvent +import com.vitorpamplona.amethyst.service.model.ChannelCreateEvent +import com.vitorpamplona.amethyst.service.model.ChannelMessageEvent +import com.vitorpamplona.amethyst.service.model.ChannelMetadataEvent +import com.vitorpamplona.amethyst.service.model.EventInterface +import com.vitorpamplona.amethyst.service.model.FileHeaderEvent +import com.vitorpamplona.amethyst.service.model.FileStorageHeaderEvent +import com.vitorpamplona.amethyst.service.model.HighlightEvent +import com.vitorpamplona.amethyst.service.model.LongTextNoteEvent +import com.vitorpamplona.amethyst.service.model.Participant +import com.vitorpamplona.amethyst.service.model.PeopleListEvent +import com.vitorpamplona.amethyst.service.model.PinListEvent +import com.vitorpamplona.amethyst.service.model.PollNoteEvent +import com.vitorpamplona.amethyst.service.model.PrivateDmEvent +import com.vitorpamplona.amethyst.service.model.ReactionEvent +import com.vitorpamplona.amethyst.service.model.ReportEvent +import com.vitorpamplona.amethyst.service.model.ReportedKey +import com.vitorpamplona.amethyst.service.model.RepostEvent +import com.vitorpamplona.amethyst.service.model.TextNoteEvent +import com.vitorpamplona.amethyst.ui.components.ClickableUrl +import com.vitorpamplona.amethyst.ui.components.CreateClickableTextWithEmoji +import com.vitorpamplona.amethyst.ui.components.ObserveDisplayNip05Status +import com.vitorpamplona.amethyst.ui.components.ResizeImage +import com.vitorpamplona.amethyst.ui.components.RobohashAsyncImage +import com.vitorpamplona.amethyst.ui.components.RobohashAsyncImageProxy +import com.vitorpamplona.amethyst.ui.components.RobohashFallbackAsyncImage +import com.vitorpamplona.amethyst.ui.components.TranslatableRichTextViewer +import com.vitorpamplona.amethyst.ui.components.VideoView +import com.vitorpamplona.amethyst.ui.components.ZoomableContent +import com.vitorpamplona.amethyst.ui.components.ZoomableContentView +import com.vitorpamplona.amethyst.ui.components.ZoomableLocalImage +import com.vitorpamplona.amethyst.ui.components.ZoomableLocalVideo +import com.vitorpamplona.amethyst.ui.components.ZoomableUrlImage +import com.vitorpamplona.amethyst.ui.components.ZoomableUrlVideo +import com.vitorpamplona.amethyst.ui.components.imageExtensions import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.ChannelHeader import com.vitorpamplona.amethyst.ui.screen.loggedIn.ReportNoteDialog @@ -59,7 +138,7 @@ import nostr.postr.toNpub import java.io.File import java.math.BigDecimal import java.net.URL -import java.util.* +import java.util.Locale import kotlin.time.ExperimentalTime import kotlin.time.measureTimedValue @@ -223,7 +302,7 @@ fun NoteComposeInner( if (note.idHex != navController.currentBackStackEntry?.arguments?.getString("id")) { navController.navigate(it) } else { - Log.d("Amethyst-Navigation", "Destination already exists in the backstack!") + Log.d("Amethyst-Navigation", "Note already exists in the backstack!") } } } @@ -1919,7 +1998,11 @@ fun NoteAuthorPicture( pictureModifier: Modifier = Modifier ) { NoteAuthorPicture(baseNote, userAccount, size, pictureModifier) { - navController.navigate("User/${it.pubkeyHex}") + if (it.pubkeyHex != navController.currentBackStackEntry?.arguments?.getString("id")) { + navController.navigate("User/${it.pubkeyHex}") + } else { + Log.d("Amethyst-Navigation", "Profile destination already exists in the backstack!") + } } } @@ -1972,7 +2055,11 @@ fun UserPicture( pictureModifier: Modifier = Modifier ) { UserPicture(user, userAccount, size, pictureModifier) { - navController.navigate("User/${it.pubkeyHex}") + if (it.pubkeyHex != navController.currentBackStackEntry?.arguments?.getString("id")) { + navController.navigate("User/${it.pubkeyHex}") + } else { + Log.d("Amethyst-Navigation", "Profile destination already exists in the backstack!") + } } } From 26634ccb044d5c495747259c385f9e7ed89422f0 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 09:18:13 -0400 Subject: [PATCH 140/171] Migrates notification summary to a new day without having to restart the app. --- .../amethyst/ui/note/UserReactionsRow.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserReactionsRow.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserReactionsRow.kt index 484fbdde22..93ca64ab4b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserReactionsRow.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserReactionsRow.kt @@ -75,19 +75,19 @@ fun UserReactionsRow(model: UserReactionsViewModel, accountViewModel: AccountVie } Row(verticalAlignment = CenterVertically, modifier = Modifier.weight(1f)) { - UserReplyReaction(model.replies[model.today]) + UserReplyReaction(model.replies[model.today()]) } Row(verticalAlignment = CenterVertically, modifier = Modifier.weight(1f)) { - UserBoostReaction(model.boosts[model.today]) + UserBoostReaction(model.boosts[model.today()]) } Row(verticalAlignment = CenterVertically, modifier = Modifier.weight(1f)) { - UserLikeReaction(model.reactions[model.today]) + UserLikeReaction(model.reactions[model.today()]) } Row(verticalAlignment = CenterVertically, modifier = Modifier.weight(1f)) { - UserZapReaction(model.zaps[model.today]) + UserZapReaction(model.zaps[model.today()]) } } } @@ -103,7 +103,6 @@ class UserReactionsViewModel : ViewModel() { var takenIntoAccount = setOf() val sdf = DateTimeFormatter.ofPattern("yyyy-MM-dd") // SimpleDateFormat() - val today = sdf.format(LocalDateTime.now()) var chartModel by mutableStateOf?>(null) var axisLabels by mutableStateOf>(emptyList()) @@ -125,6 +124,8 @@ class UserReactionsViewModel : ViewModel() { ) } + fun today() = sdf.format(LocalDateTime.now()) + fun initializeSuspend() { val currentUser = user?.pubkeyHex ?: return From ec2fc2f7e34f4a5d8bc3d799fd484bf17df5f508 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 09:49:34 -0400 Subject: [PATCH 141/171] Updates relay UI on messages sent by the logged in user in chat --- .../vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt index 55fe086692..e59508bfff 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt @@ -505,7 +505,7 @@ private fun RelayBadges(baseNote: Note) { var expanded by remember { mutableStateOf(false) } - val relaysToDisplay by remember { + val relaysToDisplay by remember(noteRelaysState) { derivedStateOf { if (expanded) state.noteRelays else state.noteRelaysSimple } From 99d302802a76d3dd029801bf8527fa793078d935 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 09:50:06 -0400 Subject: [PATCH 142/171] Deprecating IMGUR --- .../java/com/vitorpamplona/amethyst/LocalPreferences.kt | 4 ++-- .../java/com/vitorpamplona/amethyst/model/Account.kt | 2 +- .../vitorpamplona/amethyst/ui/actions/ImageUploader.kt | 8 ++++---- .../vitorpamplona/amethyst/ui/actions/NewMediaModel.kt | 7 ++++--- .../vitorpamplona/amethyst/ui/actions/NewMediaView.kt | 4 ++-- .../com/vitorpamplona/amethyst/ui/actions/NewPostView.kt | 9 +++++---- 6 files changed, 18 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt index 55421207f9..6984ff9a27 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt @@ -251,9 +251,9 @@ object LocalPreferences { ) ?: LnZapEvent.ZapType.PUBLIC val defaultFileServer = gson.fromJson( - getString(PrefKeys.DEFAULT_FILE_SERVER, "IMGUR"), + getString(PrefKeys.DEFAULT_FILE_SERVER, "NOSTR_BUILD"), object : TypeToken() {}.type - ) ?: ServersAvailable.IMGUR + ) ?: ServersAvailable.NOSTR_BUILD val zapPaymentRequestServer = try { getString(PrefKeys.ZAP_PAYMENT_REQUEST_SERVER, null)?.let { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index 209a979069..89c2e96a82 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -53,7 +53,7 @@ class Account( var translateTo: String = Locale.getDefault().language, var zapAmountChoices: List = listOf(500L, 1000L, 5000L), var defaultZapType: LnZapEvent.ZapType = LnZapEvent.ZapType.PRIVATE, - var defaultFileServer: ServersAvailable = ServersAvailable.IMGUR, + var defaultFileServer: ServersAvailable = ServersAvailable.NOSTR_BUILD, var defaultHomeFollowList: String = KIND3_FOLLOWS, var defaultStoriesFollowList: String = GLOBAL_FOLLOWS, var defaultNotificationFollowList: String = GLOBAL_FOLLOWS, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageUploader.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageUploader.kt index 4f0d840af5..3a0806ff21 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageUploader.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageUploader.kt @@ -40,9 +40,9 @@ object ImageUploader { "Can't open the image input stream" } val myServer = when (server) { - ServersAvailable.IMGUR, ServersAvailable.IMGUR_NIP_94 -> { - ImgurServer() - } + // ServersAvailable.IMGUR, ServersAvailable.IMGUR_NIP_94 -> { + // ImgurServer() + // } ServersAvailable.NOSTRIMG, ServersAvailable.NOSTRIMG_NIP_94 -> { NostrImgServer() } @@ -53,7 +53,7 @@ object ImageUploader { NostrFilesDevServer() } else -> { - ImgurServer() + NostrBuildServer() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt index e8a6398ec5..4aae8742a1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt @@ -38,9 +38,10 @@ open class NewMediaModel : ViewModel() { this.mediaType = contentType this.selectedServer = defaultServer() - if (selectedServer == ServersAvailable.IMGUR) { - selectedServer = ServersAvailable.IMGUR_NIP_94 - } else if (selectedServer == ServersAvailable.NOSTRIMG) { + // if (selectedServer == ServersAvailable.IMGUR) { + // selectedServer = ServersAvailable.IMGUR_NIP_94 + // } else + if (selectedServer == ServersAvailable.NOSTRIMG) { selectedServer = ServersAvailable.NOSTRIMG_NIP_94 } else if (selectedServer == ServersAvailable.NOSTR_BUILD) { selectedServer = ServersAvailable.NOSTR_BUILD_NIP_94 diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaView.kt index 955e0a4fcc..cd24d89d52 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaView.kt @@ -111,7 +111,7 @@ fun NewMediaView(uri: Uri, onClose: () -> Unit, postViewModel: NewMediaModel, ac fun isNIP94Server(selectedServer: ServersAvailable?): Boolean { return selectedServer == ServersAvailable.NOSTRIMG_NIP_94 || - selectedServer == ServersAvailable.IMGUR_NIP_94 || + // selectedServer == ServersAvailable.IMGUR_NIP_94 || selectedServer == ServersAvailable.NOSTR_BUILD_NIP_94 || selectedServer == ServersAvailable.NOSTRFILES_DEV_NIP_94 } @@ -121,7 +121,7 @@ fun ImageVideoPost(postViewModel: NewMediaModel, acc: Account) { val scope = rememberCoroutineScope() val fileServers = listOf( - Triple(ServersAvailable.IMGUR_NIP_94, stringResource(id = R.string.upload_server_imgur_nip94), stringResource(id = R.string.upload_server_imgur_nip94_explainer)), + // Triple(ServersAvailable.IMGUR_NIP_94, stringResource(id = R.string.upload_server_imgur_nip94), stringResource(id = R.string.upload_server_imgur_nip94_explainer)), Triple(ServersAvailable.NOSTRIMG_NIP_94, stringResource(id = R.string.upload_server_nostrimg_nip94), stringResource(id = R.string.upload_server_nostrimg_nip94_explainer)), Triple(ServersAvailable.NOSTR_BUILD_NIP_94, stringResource(id = R.string.upload_server_nostrbuild_nip94), stringResource(id = R.string.upload_server_nostrbuild_nip94_explainer)), Triple(ServersAvailable.NOSTRFILES_DEV_NIP_94, stringResource(id = R.string.upload_server_nostrfilesdev_nip94), stringResource(id = R.string.upload_server_nostrfilesdev_nip94_explainer)), diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt index dc8a01489e..b96e0c61c2 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt @@ -641,11 +641,12 @@ fun SearchButton(onPost: () -> Unit = {}, isActive: Boolean, modifier: Modifier } enum class ServersAvailable { - IMGUR, + // IMGUR, NOSTR_BUILD, NOSTRIMG, NOSTRFILES_DEV, - IMGUR_NIP_94, + + // IMGUR_NIP_94, NOSTRIMG_NIP_94, NOSTR_BUILD_NIP_94, NOSTRFILES_DEV_NIP_94, @@ -668,11 +669,11 @@ fun ImageVideoDescription( val isVideo = mediaType.startsWith("video") val fileServers = listOf( - Triple(ServersAvailable.IMGUR, stringResource(id = R.string.upload_server_imgur), stringResource(id = R.string.upload_server_imgur_explainer)), + // Triple(ServersAvailable.IMGUR, stringResource(id = R.string.upload_server_imgur), stringResource(id = R.string.upload_server_imgur_explainer)), Triple(ServersAvailable.NOSTRIMG, stringResource(id = R.string.upload_server_nostrimg), stringResource(id = R.string.upload_server_nostrimg_explainer)), Triple(ServersAvailable.NOSTR_BUILD, stringResource(id = R.string.upload_server_nostrbuild), stringResource(id = R.string.upload_server_nostrbuild_explainer)), Triple(ServersAvailable.NOSTRFILES_DEV, stringResource(id = R.string.upload_server_nostrfilesdev), stringResource(id = R.string.upload_server_nostrfilesdev_explainer)), - Triple(ServersAvailable.IMGUR_NIP_94, stringResource(id = R.string.upload_server_imgur_nip94), stringResource(id = R.string.upload_server_imgur_nip94_explainer)), + // Triple(ServersAvailable.IMGUR_NIP_94, stringResource(id = R.string.upload_server_imgur_nip94), stringResource(id = R.string.upload_server_imgur_nip94_explainer)), Triple(ServersAvailable.NOSTRIMG_NIP_94, stringResource(id = R.string.upload_server_nostrimg_nip94), stringResource(id = R.string.upload_server_nostrimg_nip94_explainer)), Triple(ServersAvailable.NOSTR_BUILD_NIP_94, stringResource(id = R.string.upload_server_nostrbuild_nip94), stringResource(id = R.string.upload_server_nostrbuild_nip94_explainer)), Triple(ServersAvailable.NOSTRFILES_DEV_NIP_94, stringResource(id = R.string.upload_server_nostrfilesdev_nip94), stringResource(id = R.string.upload_server_nostrfilesdev_nip94_explainer)), From e5b937ed7ece7bacbb19088e21e15f3707638634 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 14:54:25 -0400 Subject: [PATCH 143/171] Only updates the refreshing state if it was refreshing. --- .../java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt | 4 +++- .../vitorpamplona/amethyst/ui/screen/ChatroomListFeedView.kt | 3 ++- .../java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt | 3 ++- .../com/vitorpamplona/amethyst/ui/screen/LnZapFeedView.kt | 4 +++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt index b7d1344bb2..89e21bac8f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt @@ -67,7 +67,9 @@ fun CardFeedView( } } is CardFeedState.Loaded -> { - refreshing = false + if (refreshing) + refreshing = false + FeedLoaded( state = state, accountViewModel = accountViewModel, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ChatroomListFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ChatroomListFeedView.kt index 8238ad33ee..fb00a11dc2 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ChatroomListFeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ChatroomListFeedView.kt @@ -65,7 +65,8 @@ fun ChatroomListFeedView( } is FeedState.Loaded -> { - refreshing = false + if (refreshing) + refreshing = false FeedLoaded(state, accountViewModel, navController, markAsRead) } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt index 3db7f38030..7ea4e8232a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt @@ -77,7 +77,8 @@ fun FeedView( } is FeedState.Loaded -> { - refreshing = false + if (refreshing) + refreshing = false FeedLoaded( state, routeForLastRead, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedView.kt index ab8e591a22..02b8bf10c4 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedView.kt @@ -60,7 +60,9 @@ fun LnZapFeedView( } } is LnZapFeedState.Loaded -> { - refreshing = false + if (refreshing) + refreshing = false + LnZapFeedLoaded(state, accountViewModel, navController) } is LnZapFeedState.Loading -> { From df5b5b90af19362ff0301986be79e5a10ee6b5f3 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 14:54:42 -0400 Subject: [PATCH 144/171] Formatting --- .../com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt | 3 ++- .../vitorpamplona/amethyst/ui/screen/ChatroomListFeedView.kt | 3 ++- .../java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt | 3 ++- .../com/vitorpamplona/amethyst/ui/screen/LnZapFeedView.kt | 5 +++-- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt index 89e21bac8f..6b1d28edc3 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt @@ -67,8 +67,9 @@ fun CardFeedView( } } is CardFeedState.Loaded -> { - if (refreshing) + if (refreshing) { refreshing = false + } FeedLoaded( state = state, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ChatroomListFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ChatroomListFeedView.kt index fb00a11dc2..60905dbc39 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ChatroomListFeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ChatroomListFeedView.kt @@ -65,8 +65,9 @@ fun ChatroomListFeedView( } is FeedState.Loaded -> { - if (refreshing) + if (refreshing) { refreshing = false + } FeedLoaded(state, accountViewModel, navController, markAsRead) } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt index 7ea4e8232a..02f6708012 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt @@ -77,8 +77,9 @@ fun FeedView( } is FeedState.Loaded -> { - if (refreshing) + if (refreshing) { refreshing = false + } FeedLoaded( state, routeForLastRead, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedView.kt index 02b8bf10c4..f6811611bf 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/LnZapFeedView.kt @@ -60,9 +60,10 @@ fun LnZapFeedView( } } is LnZapFeedState.Loaded -> { - if (refreshing) + if (refreshing) { refreshing = false - + } + LnZapFeedLoaded(state, accountViewModel, navController) } is LnZapFeedState.Loading -> { From 5da49c920bf852b5bbadfc0120527f8039edd11b Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 14:55:06 -0400 Subject: [PATCH 145/171] Removes the time log for Composing a note --- .../amethyst/ui/note/NoteCompose.kt | 40 +------------------ 1 file changed, 2 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index 8412819c61..60ec386afc 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -139,10 +139,8 @@ import java.io.File import java.math.BigDecimal import java.net.URL import java.util.Locale -import kotlin.time.ExperimentalTime -import kotlin.time.measureTimedValue -@OptIn(ExperimentalTime::class) +@OptIn(ExperimentalFoundationApi::class) @Composable fun NoteCompose( baseNote: Note, @@ -156,40 +154,6 @@ fun NoteCompose( parentBackgroundColor: Color? = null, accountViewModel: AccountViewModel, navController: NavController -) { - val (value, elapsed) = measureTimedValue { - NoteComposeInner( - baseNote, - routeForLastRead, - modifier, - isBoostedNote, - isQuotedNote, - unPackReply, - makeItShort, - addMarginTop, - parentBackgroundColor, - accountViewModel, - navController - ) - } - - Log.d("Time", "Note Compose in $elapsed for ${baseNote.idHex} ${baseNote.event?.kind()} ${baseNote.event?.content()?.split("\n")?.get(0)?.take(100)}") -} - -@OptIn(ExperimentalFoundationApi::class, ExperimentalTime::class) -@Composable -fun NoteComposeInner( - baseNote: Note, - routeForLastRead: String? = null, - modifier: Modifier = Modifier, - isBoostedNote: Boolean = false, - isQuotedNote: Boolean = false, - unPackReply: Boolean = true, - makeItShort: Boolean = false, - addMarginTop: Boolean = true, - parentBackgroundColor: Color? = null, - accountViewModel: AccountViewModel, - navController: NavController ) { val accountState by accountViewModel.accountLiveData.observeAsState() val account = remember(accountState) { accountState?.account } ?: return @@ -1870,7 +1834,7 @@ private fun LongFormHeader(noteEvent: LongTextNoteEvent, note: Note, loggedIn: U @Composable private fun RelayBadges(baseNote: Note) { val noteRelaysState by baseNote.live().relays.observeAsState() - val noteRelays = noteRelaysState?.note ?: return + val noteRelays = remember(noteRelaysState) { noteRelaysState?.note } ?: return var expanded by remember { mutableStateOf(false) } var showShowMore by remember { mutableStateOf(false) } From 460187c4a4b20c12e89170b3b2d84103f5aa74ba Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 15:07:13 -0400 Subject: [PATCH 146/171] Optimizes Drawer for Recomposition --- .../amethyst/ui/navigation/DrawerContent.kt | 92 ++++++++++--------- 1 file changed, 48 insertions(+), 44 deletions(-) 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 31166e172f..dfa223532f 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 @@ -96,7 +96,7 @@ fun DrawerContent( modifier = Modifier.padding(top = 20.dp) ) ListContent( - account.userProfile(), + account.userProfile().pubkeyHex, navController, scaffoldState, sheetState, @@ -121,16 +121,25 @@ fun ProfileContent( val coroutineScope = rememberCoroutineScope() val accountUserState by baseAccountUser.live().metadata.observeAsState() - val accountUser = accountUserState?.user ?: return + val accountUser = remember (accountUserState) { accountUserState?.user } ?: return + + val profilePubHex = remember (accountUserState) { accountUserState?.user?.pubkeyHex } ?: return + + val profileBanner = remember (accountUserState) { accountUserState?.user?.info?.banner?.ifBlank { null } } + val profilePicture = remember (accountUserState) { accountUserState?.user?.profilePicture()?.ifBlank { null }?.let { ResizeImage(it, 100.dp) } } + val bestUserName = remember(accountUserState) { accountUserState?.user?.bestUsername() } + val bestDisplayName = remember(accountUserState) { accountUserState?.user?.bestDisplayName() } + val tags = remember(accountUserState) { accountUserState?.user?.info?.latestMetadata?.tags } + val route = remember(accountUserState) { "User/${accountUserState?.user?.pubkeyHex}" } val accountUserFollowsState by baseAccountUser.live().follows.observeAsState() - val accountUserFollows = accountUserFollowsState?.user ?: return + val followingCount = remember(accountUserFollowsState) { accountUserFollowsState?.user?.cachedFollowCount()?.toString() ?: "--" } + val followerCount = remember(accountUserFollowsState) { accountUserFollowsState?.user?.cachedFollowerCount()?.toString() ?: "--"} Box { - val banner = accountUser.info?.banner - if (!banner.isNullOrBlank()) { + if (profileBanner != null) { AsyncImage( - model = banner, + model = profileBanner, contentDescription = stringResource(id = R.string.profile_image), contentScale = ContentScale.FillWidth, modifier = Modifier @@ -149,35 +158,34 @@ fun ProfileContent( } Column(modifier = modifier) { - RobohashAsyncImageProxy( - robot = accountUser.pubkeyHex, - model = ResizeImage(accountUser.profilePicture(), 100.dp), - contentDescription = stringResource(id = R.string.profile_image), - modifier = Modifier - .width(100.dp) - .height(100.dp) - .clip(shape = CircleShape) - .border(3.dp, MaterialTheme.colors.background, CircleShape) - .background(MaterialTheme.colors.background) - .clickable(onClick = { - accountUser.let { - navController.navigate("User/${it.pubkeyHex}") - } - coroutineScope.launch { - scaffoldState.drawerState.close() - } - }) - ) - if (accountUser.bestDisplayName() != null) { + profilePicture?.let { + RobohashAsyncImageProxy( + robot = profilePubHex, + model = profilePicture, + contentDescription = stringResource(id = R.string.profile_image), + modifier = Modifier + .width(100.dp) + .height(100.dp) + .clip(shape = CircleShape) + .border(3.dp, MaterialTheme.colors.background, CircleShape) + .background(MaterialTheme.colors.background) + .clickable(onClick = { + navController.navigate(route) + coroutineScope.launch { + scaffoldState.drawerState.close() + } + }) + ) + } + + if (bestDisplayName != null) { CreateTextWithEmoji( - text = accountUser.bestDisplayName() ?: "", - tags = accountUser.info?.latestMetadata?.tags, + text = bestDisplayName, + tags = tags, modifier = Modifier .padding(top = 7.dp) .clickable(onClick = { - accountUser.let { - navController.navigate("User/${it.pubkeyHex}") - } + navController.navigate(route) coroutineScope.launch { scaffoldState.drawerState.close() } @@ -186,18 +194,16 @@ fun ProfileContent( fontSize = 18.sp ) } - if (accountUser.bestUsername() != null) { + if (bestUserName != null) { CreateTextWithEmoji( - text = " @${accountUser.bestUsername()}", + text = " @${bestUserName}", tags = accountUser.info?.latestMetadata?.tags, color = Color.LightGray, modifier = Modifier .padding(top = 15.dp) .clickable( onClick = { - accountUser.let { - navController.navigate("User/${it.pubkeyHex}") - } + navController.navigate(route) coroutineScope.launch { scaffoldState.drawerState.close() } @@ -209,9 +215,7 @@ fun ProfileContent( modifier = Modifier .padding(top = 15.dp) .clickable(onClick = { - accountUser.let { - navController.navigate("User/${it.pubkeyHex}") - } + navController.navigate(route) coroutineScope.launch { scaffoldState.drawerState.close() } @@ -219,14 +223,14 @@ fun ProfileContent( ) { Row() { Text( - "${accountUserFollows.cachedFollowCount() ?: "--"}", + text = followingCount, fontWeight = FontWeight.Bold ) Text(stringResource(R.string.following)) } Row(modifier = Modifier.padding(start = 10.dp)) { Text( - "${accountUserFollows.cachedFollowerCount() ?: "--"}", + text = followerCount, fontWeight = FontWeight.Bold ) Text(stringResource(R.string.followers)) @@ -239,7 +243,7 @@ fun ProfileContent( @OptIn(ExperimentalMaterialApi::class) @Composable fun ListContent( - accountUser: User?, + accountUserPubKey: String?, navController: NavHostController, scaffoldState: ScaffoldState, sheetState: ModalBottomSheetState, @@ -254,14 +258,14 @@ fun ListContent( var proxyPort = remember { mutableStateOf(account.proxyPort.toString()) } Column(modifier = modifier.fillMaxHeight().verticalScroll(rememberScrollState())) { - if (accountUser != null) { + if (accountUserPubKey != null) { NavigationRow( title = stringResource(R.string.profile), icon = Route.Profile.icon, tint = MaterialTheme.colors.primary, navController = navController, scaffoldState = scaffoldState, - route = "User/${accountUser.pubkeyHex}" + route = "User/$accountUserPubKey" ) NavigationRow( From 8223476cb372c52bc5900d85214e2436c709cdd2 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 15:07:21 -0400 Subject: [PATCH 147/171] Formatting --- .../amethyst/ui/navigation/DrawerContent.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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 dfa223532f..40b37b3e33 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 @@ -121,12 +121,12 @@ fun ProfileContent( val coroutineScope = rememberCoroutineScope() val accountUserState by baseAccountUser.live().metadata.observeAsState() - val accountUser = remember (accountUserState) { accountUserState?.user } ?: return + val accountUser = remember(accountUserState) { accountUserState?.user } ?: return - val profilePubHex = remember (accountUserState) { accountUserState?.user?.pubkeyHex } ?: return + val profilePubHex = remember(accountUserState) { accountUserState?.user?.pubkeyHex } ?: return - val profileBanner = remember (accountUserState) { accountUserState?.user?.info?.banner?.ifBlank { null } } - val profilePicture = remember (accountUserState) { accountUserState?.user?.profilePicture()?.ifBlank { null }?.let { ResizeImage(it, 100.dp) } } + val profileBanner = remember(accountUserState) { accountUserState?.user?.info?.banner?.ifBlank { null } } + val profilePicture = remember(accountUserState) { accountUserState?.user?.profilePicture()?.ifBlank { null }?.let { ResizeImage(it, 100.dp) } } val bestUserName = remember(accountUserState) { accountUserState?.user?.bestUsername() } val bestDisplayName = remember(accountUserState) { accountUserState?.user?.bestDisplayName() } val tags = remember(accountUserState) { accountUserState?.user?.info?.latestMetadata?.tags } @@ -134,7 +134,7 @@ fun ProfileContent( val accountUserFollowsState by baseAccountUser.live().follows.observeAsState() val followingCount = remember(accountUserFollowsState) { accountUserFollowsState?.user?.cachedFollowCount()?.toString() ?: "--" } - val followerCount = remember(accountUserFollowsState) { accountUserFollowsState?.user?.cachedFollowerCount()?.toString() ?: "--"} + val followerCount = remember(accountUserFollowsState) { accountUserFollowsState?.user?.cachedFollowerCount()?.toString() ?: "--" } Box { if (profileBanner != null) { @@ -196,7 +196,7 @@ fun ProfileContent( } if (bestUserName != null) { CreateTextWithEmoji( - text = " @${bestUserName}", + text = " @$bestUserName", tags = accountUser.info?.latestMetadata?.tags, color = Color.LightGray, modifier = Modifier From 93282b71aee4030a5b6532cc5583260c08b2253e Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 15:07:47 -0400 Subject: [PATCH 148/171] Optimizes NIP-05 procedures --- .../ui/note/NIP05VerificationDisplay.kt | 51 ++++++++++++------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt index 31dc03ec1d..defb4810df 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt @@ -39,33 +39,48 @@ import java.util.Date @Composable fun nip05VerificationAsAState(user: UserMetadata, pubkeyHex: String): State { - var nip05Verified = remember { mutableStateOf(null) } + val nip05Verified = remember(user) { + // starts with null if must verify or already filled in if verified in the last hour + val default = if ((user.nip05LastVerificationTime ?: 0) > (Date().time / 1000 - 60 * 60)) { // 1hour + user.nip05Verified + } else { + null + } + + mutableStateOf(default) + } LaunchedEffect(key1 = user) { - withContext(Dispatchers.IO) { - user.nip05?.ifBlank { null }?.let { nip05 -> - val now = Date().time / 1000 - if ((user.nip05LastVerificationTime ?: 0) > (now - 60 * 60)) { // 1hour - nip05Verified.value = user.nip05Verified - } else { + if (nip05Verified.value == null) { + withContext(Dispatchers.IO) { + user.nip05?.ifBlank { null }?.let { nip05 -> Nip05Verifier().verifyNip05( nip05, onSuccess = { // Marks user as verified if (it == pubkeyHex) { user.nip05Verified = true - user.nip05LastVerificationTime = now - nip05Verified.value = true + user.nip05LastVerificationTime = Date().time / 1000 + + if (nip05Verified.value != true) { + nip05Verified.value = true + } } else { user.nip05Verified = false user.nip05LastVerificationTime = 0 - nip05Verified.value = false + + if (nip05Verified.value != false) { + nip05Verified.value = false + } } }, onError = { user.nip05LastVerificationTime = 0 user.nip05Verified = false - nip05Verified.value = false + + if (nip05Verified.value != false) { + nip05Verified.value = false + } } ) } @@ -90,16 +105,14 @@ fun ObserveDisplayNip05Status(baseNote: Note, columnModifier: Modifier = Modifie @Composable fun ObserveDisplayNip05Status(baseUser: User, columnModifier: Modifier = Modifier) { val userState by baseUser.live().metadata.observeAsState() - val user = userState?.user ?: return + val user = remember(userState) { userState?.user } ?: return + val parts = remember(userState) { userState?.user?.nip05()?.split("@") } ?: return - user.nip05()?.let { nip05 -> - val parts = nip05.split("@") - if (parts.size == 2) { - val nip05Verified by nip05VerificationAsAState(user.info!!, user.pubkeyHex) + if (parts.size == 2) { + val nip05Verified by nip05VerificationAsAState(user.info!!, user.pubkeyHex) - Column(modifier = columnModifier) { - DisplayNIP05(parts[0], parts[1], nip05Verified) - } + Column(modifier = columnModifier) { + DisplayNIP05(parts[0], parts[1], nip05Verified) } } } From e96a50b4545e452b6c4d72c17e29e260f0e57c58 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 15:08:14 -0400 Subject: [PATCH 149/171] Optimizes recomposition of bottom items. --- .../amethyst/ui/navigation/AppBottomBar.kt | 84 +++++++++++-------- 1 file changed, 49 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt index 0d715b80e1..bae0bb5af6 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt @@ -5,6 +5,7 @@ import android.view.ViewTreeObserver import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width @@ -36,6 +37,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavHostController +import androidx.navigation.compose.currentBackStackEntryAsState import com.vitorpamplona.amethyst.NotificationCache import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel @@ -82,11 +84,7 @@ fun keyboardAsState(): State { @Composable fun AppBottomBar(navController: NavHostController, accountViewModel: AccountViewModel) { - val currentRoute = currentRoute(navController) - val currentRouteBase = currentRoute?.substringBefore("?") - val coroutineScope = rememberCoroutineScope() val isKeyboardOpen by keyboardAsState() - if (isKeyboardOpen == Keyboard.Closed) { Column() { Divider( @@ -98,43 +96,59 @@ fun AppBottomBar(navController: NavHostController, accountViewModel: AccountView backgroundColor = MaterialTheme.colors.background ) { bottomNavigationItems.forEach { item -> - val selected = currentRouteBase == item.base - - BottomNavigationItem( - icon = { NotifiableIcon(item, selected, accountViewModel) }, - selected = selected, - onClick = { - coroutineScope.launch { - if (currentRouteBase != item.base) { - navController.navigate(item.base) { - navController.graph.startDestinationRoute?.let { start -> - popUpTo(start) - restoreState = true - } - launchSingleTop = true - restoreState = true - } - } else { - val route = currentRoute.replace("{scrollToTop}", "true") - navController.navigate(route) { - navController.graph.startDestinationRoute?.let { start -> - popUpTo(start) { inclusive = item.route == Route.Home.route } - restoreState = true - } - - launchSingleTop = true - restoreState = true - } - } - } - } - ) + BottomIcon(item, accountViewModel, navController) } } } } } +@Composable +private fun RowScope.BottomIcon( + item: Route, + accountViewModel: AccountViewModel, + navController: NavHostController +) { + val navBackStackEntry by navController.currentBackStackEntryAsState() + + navBackStackEntry?.let { navBackStackEntry -> + val currentRoute = remember(navBackStackEntry) { navBackStackEntry.destination.route } + val currentRouteBase = remember(navBackStackEntry) { navBackStackEntry.destination.route?.substringBefore("?") } + val selected = remember(navBackStackEntry) { currentRouteBase == item.base } + val coroutineScope = rememberCoroutineScope() + + BottomNavigationItem( + icon = { NotifiableIcon(item, selected, accountViewModel) }, + selected = selected, + onClick = { + coroutineScope.launch { + if (!selected) { + navController.navigate(item.base) { + navController.graph.startDestinationRoute?.let { start -> + popUpTo(start) + restoreState = true + } + launchSingleTop = true + restoreState = true + } + } else if (currentRoute != null) { + val route = currentRoute.replace("{scrollToTop}", "true") + navController.navigate(route) { + navController.graph.startDestinationRoute?.let { start -> + popUpTo(start) { inclusive = item.route == Route.Home.route } + restoreState = true + } + + launchSingleTop = true + restoreState = true + } + } + } + } + ) + } +} + @Composable private fun NotifiableIcon(route: Route, selected: Boolean, accountViewModel: AccountViewModel) { val scope = rememberCoroutineScope() From 3b816559e4c0fa32237b14fea9ba4bd529db0a14 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 15:10:54 -0400 Subject: [PATCH 150/171] Optimizes MultiSetCompose --- .../amethyst/ui/note/MultiSetCompose.kt | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt index 86dd8e0557..c63ad607b2 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt @@ -53,17 +53,19 @@ import kotlinx.coroutines.launch @OptIn(ExperimentalFoundationApi::class) @Composable fun MultiSetCompose(multiSetCard: MultiSetCard, routeForLastRead: String, accountViewModel: AccountViewModel, navController: NavController) { - val noteState by multiSetCard.note.live().metadata.observeAsState() - val note = remember(noteState) { noteState?.note } + val baseNote = remember { multiSetCard.note } + + val noteState by baseNote.live().metadata.observeAsState() + val note = remember(noteState) { noteState?.note } ?: return val accountState by accountViewModel.accountLiveData.observeAsState() - val account = remember(accountState) { accountState?.account } + val account = remember(accountState) { accountState?.account } ?: return var popupExpanded by remember { mutableStateOf(false) } val scope = rememberCoroutineScope() - if (note == null || account == null) { + if (note.event == null) { BlankNote(Modifier, false) } else { var isNew by remember { mutableStateOf(false) } @@ -98,7 +100,7 @@ fun MultiSetCompose(multiSetCard: MultiSetCard, routeForLastRead: String, accoun onClick = { scope.launch { routeFor( - note, + baseNote, account.userProfile() )?.let { navController.navigate(it) } } @@ -129,7 +131,7 @@ fun MultiSetCompose(multiSetCard: MultiSetCard, routeForLastRead: String, accoun Spacer(modifier = Modifier.width(65.dp)) NoteCompose( - baseNote = multiSetCard.note, + baseNote = baseNote, routeForLastRead = null, modifier = Modifier.padding(top = 5.dp), isBoostedNote = true, From d99711d3e64fc92921b8e7dc238259648d13361a Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 17:51:12 -0400 Subject: [PATCH 151/171] Remembering Background color and Text elements for posts. --- .../amethyst/ui/note/NoteCompose.kt | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index dd67d57e64..ffc3d80b33 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -246,15 +246,19 @@ fun NoteCompose( } } - val backgroundColor = if (isNew) { - val newColor = MaterialTheme.colors.primary.copy(0.12f) - if (parentBackgroundColor != null) { - newColor.compositeOver(parentBackgroundColor) + val primaryColor = MaterialTheme.colors.primary.copy(0.12f) + val defaultBackgroundColor = MaterialTheme.colors.background + + val backgroundColor = remember(isNew, parentBackgroundColor) { + if (isNew) { + if (parentBackgroundColor != null) { + primaryColor.compositeOver(parentBackgroundColor) + } else { + primaryColor.compositeOver(defaultBackgroundColor) + } } else { - newColor.compositeOver(MaterialTheme.colors.background) + parentBackgroundColor ?: defaultBackgroundColor } - } else { - parentBackgroundColor ?: MaterialTheme.colors.background } val columnModifier = remember(backgroundColor) { @@ -436,11 +440,11 @@ private fun RenderTextEvent( accountViewModel: AccountViewModel, navController: NavController ) { - val tags = remember { note.event?.tags() } - val hashtags = remember { note.event?.hashtags() ?: emptyList() } - val eventContent = remember { accountViewModel.decrypt(note) } - val modifier = remember { Modifier.fillMaxWidth() } - val isAuthorTheLoggedUser = remember { accountViewModel.isLoggedUser(note.author) } + val tags = remember(note.event?.id()) { note.event?.tags() } + val hashtags = remember(note.event?.id()) { note.event?.hashtags() ?: emptyList() } + val eventContent = remember(note.event?.id()) { accountViewModel.decrypt(note) } + val modifier = remember(note.event?.id()) { Modifier.fillMaxWidth() } + val isAuthorTheLoggedUser = remember(note.event?.id()) { accountViewModel.isLoggedUser(note.author) } if (eventContent != null) { if (makeItShort && isAuthorTheLoggedUser) { From 278091e6efce09f03262779bfcb5ce052665acad Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 17:51:37 -0400 Subject: [PATCH 152/171] Moves default state of url previews to the remember function --- .../amethyst/ui/components/UrlPreview.kt | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreview.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreview.kt index 14fb7bd9f0..b4d914a403 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreview.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreview.kt @@ -19,16 +19,19 @@ import kotlinx.coroutines.launch @Composable fun UrlPreview(url: String, urlText: String) { - val default = UrlCachedPreviewer.cache[url]?.let { - if (it.allFetchComplete() && it.url == url) { - UrlPreviewState.Loaded(it) - } else { - UrlPreviewState.Empty - } - } ?: UrlPreviewState.Loading val context = LocalContext.current - var urlPreviewState by remember { mutableStateOf(default) } + var urlPreviewState by remember { + val default = UrlCachedPreviewer.cache[url]?.let { + if (it.allFetchComplete() && it.url == url) { + UrlPreviewState.Loaded(it) + } else { + UrlPreviewState.Empty + } + } ?: UrlPreviewState.Loading + + mutableStateOf(default) + } val scope = rememberCoroutineScope() // Doesn't use a viewModel because of viewModel reusing issues (too many UrlPreview are created). From 22dbaaf95a6f51247acc434c05aeb67235fc5d07 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 17:51:59 -0400 Subject: [PATCH 153/171] Adjusts bottombar to not recalculate hasNewItems in every recomposition. --- .../amethyst/ui/navigation/AppBottomBar.kt | 161 +++++++++++------- 1 file changed, 98 insertions(+), 63 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt index bae0bb5af6..d392d85a21 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt @@ -34,8 +34,10 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.navigation.NavController import androidx.navigation.NavHostController import androidx.navigation.compose.currentBackStackEntryAsState import com.vitorpamplona.amethyst.NotificationCache @@ -96,7 +98,77 @@ fun AppBottomBar(navController: NavHostController, accountViewModel: AccountView backgroundColor = MaterialTheme.colors.background ) { bottomNavigationItems.forEach { item -> - BottomIcon(item, accountViewModel, navController) + HasNewItemsIcon(item, accountViewModel, navController) + } + } + } + } +} + +@Composable +private fun RowScope.HasNewItemsIcon( + route: Route, + accountViewModel: AccountViewModel, + navController: NavHostController +) { + val scope = rememberCoroutineScope() + + val accountState by accountViewModel.accountLiveData.observeAsState() + val account = remember(accountState) { accountState?.account } ?: return + + val notifState = NotificationCache.live.observeAsState() + val notif = remember(notifState) { notifState.value } ?: return + + var hasNewItems by remember { mutableStateOf(false) } + + LaunchedEffect(key1 = notif) { + scope.launch(Dispatchers.IO) { + val newHasNewItems = route.hasNewItems(account, notif.cache, emptySet()) + if (newHasNewItems != hasNewItems) { + hasNewItems = newHasNewItems + } + } + } + + LaunchedEffect(Unit) { + scope.launch(Dispatchers.IO) { + LocalCache.live.newEventBundles.collect { + val newHasNewItems = route.hasNewItems(account, notif.cache, it) + if (newHasNewItems != hasNewItems) { + hasNewItems = newHasNewItems + } + } + } + } + + BottomIcon( + icon = route.icon, + size = if ("Home" == route.base) 25.dp else 23.dp, + iconSize = if ("Home" == route.base) 24.dp else 20.dp, + base = route.base, + hasNewItems = hasNewItems, + navController + ) { selected -> + scope.launch { + if (!selected) { + navController.navigate(route.base) { + navController.graph.startDestinationRoute?.let { start -> + popUpTo(start) + restoreState = true + } + launchSingleTop = true + restoreState = true + } + } else { + val newRoute = route.route.replace("{scrollToTop}", "true") + navController.navigate(newRoute) { + navController.graph.startDestinationRoute?.let { start -> + popUpTo(start) { inclusive = newRoute == Route.Home.route } + restoreState = true + } + + launchSingleTop = true + restoreState = true } } } @@ -105,84 +177,47 @@ fun AppBottomBar(navController: NavHostController, accountViewModel: AccountView @Composable private fun RowScope.BottomIcon( - item: Route, - accountViewModel: AccountViewModel, - navController: NavHostController + icon: Int, + size: Dp, + iconSize: Dp, + base: String, + hasNewItems: Boolean, + navController: NavController, + onClick: (Boolean) -> Unit ) { val navBackStackEntry by navController.currentBackStackEntryAsState() - navBackStackEntry?.let { navBackStackEntry -> - val currentRoute = remember(navBackStackEntry) { navBackStackEntry.destination.route } - val currentRouteBase = remember(navBackStackEntry) { navBackStackEntry.destination.route?.substringBefore("?") } - val selected = remember(navBackStackEntry) { currentRouteBase == item.base } - val coroutineScope = rememberCoroutineScope() + navBackStackEntry?.let { + val selected = remember(it) { + it.destination.route?.substringBefore("?") == base + } BottomNavigationItem( - icon = { NotifiableIcon(item, selected, accountViewModel) }, + icon = { + NotifiableIcon( + icon, + size, + iconSize, + selected, + hasNewItems + ) + }, selected = selected, - onClick = { - coroutineScope.launch { - if (!selected) { - navController.navigate(item.base) { - navController.graph.startDestinationRoute?.let { start -> - popUpTo(start) - restoreState = true - } - launchSingleTop = true - restoreState = true - } - } else if (currentRoute != null) { - val route = currentRoute.replace("{scrollToTop}", "true") - navController.navigate(route) { - navController.graph.startDestinationRoute?.let { start -> - popUpTo(start) { inclusive = item.route == Route.Home.route } - restoreState = true - } - - launchSingleTop = true - restoreState = true - } - } - } - } + onClick = { onClick(selected) } ) } } @Composable -private fun NotifiableIcon(route: Route, selected: Boolean, accountViewModel: AccountViewModel) { - val scope = rememberCoroutineScope() - - Box(Modifier.size(if ("Home" == route.base) 25.dp else 23.dp)) { +private fun NotifiableIcon(icon: Int, size: Dp, iconSize: Dp, selected: Boolean, hasNewItems: Boolean) { + Box(Modifier.size(size)) { Icon( - painter = painterResource(id = route.icon), + painter = painterResource(id = icon), contentDescription = null, - modifier = Modifier.size(if ("Home" == route.base) 24.dp else 20.dp), + modifier = Modifier.size(iconSize), tint = if (selected) MaterialTheme.colors.primary else Color.Unspecified ) - val accountState by accountViewModel.accountLiveData.observeAsState() - val account = accountState?.account ?: return - - val notifState = NotificationCache.live.observeAsState() - val notif = notifState.value ?: return - - var hasNewItems by remember { mutableStateOf(false) } - - LaunchedEffect(key1 = notif) { - scope.launch(Dispatchers.IO) { - hasNewItems = route.hasNewItems(account, notif.cache, emptySet()) - } - } - - LaunchedEffect(Unit) { - scope.launch(Dispatchers.IO) { - LocalCache.live.newEventBundles.collect { - hasNewItems = route.hasNewItems(account, notif.cache, it) - } - } - } - if (hasNewItems) { Box( Modifier From 0a8c79dacd1431219b69005a9a124f20625987e5 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 17:52:18 -0400 Subject: [PATCH 154/171] Stops recomposing the drawer at every new route. --- .../vitorpamplona/amethyst/ui/navigation/DrawerContent.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) 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 40b37b3e33..d5f483769e 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 @@ -407,11 +407,8 @@ fun NavigationRow( route: String ) { val coroutineScope = rememberCoroutineScope() - val currentRoute = currentRoute(navController) IconRow(title, icon, tint, onClick = { - if (currentRoute != route) { - navController.navigate(route) - } + navController.navigate(route) coroutineScope.launch { scaffoldState.drawerState.close() } From 6437a2106a8e0ac80322bc86f1d481de78e726e7 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 17:52:46 -0400 Subject: [PATCH 155/171] Moves zapProgress to inside the IO update to make sure it only updates when needed. --- .../com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt index 36891d3b5b..1f8b86ab7d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt @@ -331,15 +331,15 @@ fun ZapReaction( animationSize: Dp = 14.dp ) { val accountState by accountViewModel.accountLiveData.observeAsState() - val account = accountState?.account ?: return + val account = remember(accountState) { accountState?.account } ?: return val zapsState by baseNote.live().zaps.observeAsState() - val zappedNote = zapsState?.note ?: return - val zapMessage = "" + val zappedNote = remember(zapsState) { zapsState?.note } ?: return var wantsToZap by remember { mutableStateOf(false) } var wantsToChangeZapAmount by remember { mutableStateOf(false) } var wantsToSetCustomZap by remember { mutableStateOf(false) } + val context = LocalContext.current val scope = rememberCoroutineScope() @@ -352,6 +352,7 @@ fun ZapReaction( scope.launch(Dispatchers.IO) { if (!wasZappedByLoggedInUser) { wasZappedByLoggedInUser = accountViewModel.calculateIfNoteWasZappedByAccount(zappedNote) + zappingProgress = 1f } zapAmountTxt = showAmount(account.calculateZappedAmount(zappedNote)) @@ -393,7 +394,7 @@ fun ZapReaction( baseNote, account.zapAmountChoices.first() * 1000, null, - zapMessage, + "", context, onError = { scope.launch { @@ -457,7 +458,6 @@ fun ZapReaction( } if (wasZappedByLoggedInUser) { - zappingProgress = 1f Icon( imageVector = Icons.Default.Bolt, contentDescription = stringResource(R.string.zaps), From a3fc22a04a67777b80c08ac327de6942a562c291 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 18:24:50 -0400 Subject: [PATCH 156/171] v0.50.5 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index bf17bcf25c..5c8b925af8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 172 - versionName "0.50.4" + versionCode 173 + versionName "0.50.5" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From 0bf94f316f6b21d4eb132e89e661036cccd715c2 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 20:04:23 -0400 Subject: [PATCH 157/171] Moving more variables to remember clauses --- .../amethyst/ui/components/ClickableRoute.kt | 8 ++++---- .../amethyst/ui/note/MultiSetCompose.kt | 13 +++++++++---- .../amethyst/ui/note/NIP05VerificationDisplay.kt | 7 +++++-- .../vitorpamplona/amethyst/ui/note/NoteCompose.kt | 6 ++++-- .../vitorpamplona/amethyst/ui/note/ReactionsRow.kt | 5 ++++- 5 files changed, 26 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ClickableRoute.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ClickableRoute.kt index 9bd2753fb9..acbc4b65f8 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ClickableRoute.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ClickableRoute.kt @@ -84,8 +84,8 @@ private fun DisplayEvent( noteBase?.let { val noteState by it.live().metadata.observeAsState() - val note = noteState?.note ?: return - val channel = note.channel() + val note = remember(noteState) { noteState?.note } ?: return + val channel = remember(noteState) { note.channel() } if (note.event is ChannelCreateEvent) { CreateClickableText( @@ -105,7 +105,7 @@ private fun DisplayEvent( CreateClickableText( clickablePart = channel.toBestDisplayName(), suffix = "${nip19.additionalChars} ", - route = "Channel/${note.channel()?.idHex}", + route = "Channel/${channel.idHex}", navController = navController ) } else { @@ -196,7 +196,7 @@ private fun DisplayAddress( noteBase?.let { val noteState by it.live().metadata.observeAsState() - val note = noteState?.note ?: return + val note = remember(noteState) { noteState?.note } ?: return CreateClickableText( clickablePart = "@${note.idDisplayNote()}", diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt index c63ad607b2..d45180015b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt @@ -82,10 +82,15 @@ fun MultiSetCompose(multiSetCard: MultiSetCard, routeForLastRead: String, accoun } } - val backgroundColor = if (isNew) { - MaterialTheme.colors.primary.copy(0.12f).compositeOver(MaterialTheme.colors.background) - } else { - MaterialTheme.colors.background + val primaryColor = MaterialTheme.colors.primary.copy(0.12f) + val defaultBackgroundColor = MaterialTheme.colors.background + + val backgroundColor = remember(isNew) { + if (isNew) { + primaryColor.compositeOver(defaultBackgroundColor) + } else { + defaultBackgroundColor + } } val columnModifier = remember(isNew) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt index defb4810df..4940819b7c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt @@ -19,6 +19,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -34,7 +35,7 @@ import com.vitorpamplona.amethyst.model.UserMetadata import com.vitorpamplona.amethyst.service.Nip05Verifier import com.vitorpamplona.amethyst.ui.theme.Nip05 import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext +import kotlinx.coroutines.launch import java.util.Date @Composable @@ -50,9 +51,11 @@ fun nip05VerificationAsAState(user: UserMetadata, pubkeyHex: String): State Nip05Verifier().verifyNip05( nip05, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index ffc3d80b33..82d9bdf275 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -1169,12 +1169,14 @@ private fun FirstUserInfoRow( @Composable fun TimeAgo(time: Long) { val context = LocalContext.current - var timeStr by remember { mutableStateOf("") } LaunchedEffect(key1 = time) { withContext(Dispatchers.IO) { - timeStr = timeAgo(time, context = context) + val newTimeStr = timeAgo(time, context = context) + if (newTimeStr != timeStr) { + timeStr = newTimeStr + } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt index 1f8b86ab7d..f4fbf8f413 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt @@ -352,10 +352,13 @@ fun ZapReaction( scope.launch(Dispatchers.IO) { if (!wasZappedByLoggedInUser) { wasZappedByLoggedInUser = accountViewModel.calculateIfNoteWasZappedByAccount(zappedNote) - zappingProgress = 1f } zapAmountTxt = showAmount(account.calculateZappedAmount(zappedNote)) + + if (wasZappedByLoggedInUser) { + zappingProgress = 1f + } } } From a1da4affeb5ef65cee66b7b94d4bfc7fd24699e6 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 20:04:33 -0400 Subject: [PATCH 158/171] Updating dependencies --- app/build.gradle | 6 +++--- build.gradle | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5c8b925af8..4e859781f9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -128,7 +128,7 @@ dependencies { implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.11' // Json Serialization TODO: We might need to converge between gson and Jackson (we are usin both) - implementation 'com.fasterxml.jackson.module:jackson-module-kotlin:2.15.0' + implementation 'com.fasterxml.jackson.module:jackson-module-kotlin:2.15.1' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // link preview @@ -138,7 +138,7 @@ dependencies { implementation 'androidx.security:security-crypto-ktx:1.1.0-alpha06' // view videos - implementation 'com.google.android.exoplayer:exoplayer:2.18.6' + implementation 'com.google.android.exoplayer:exoplayer:2.18.7' // Load images from the web. implementation "io.coil-kt:coil-compose:$coil_version" @@ -184,7 +184,7 @@ dependencies { implementation "com.patrykandpatrick.vico:compose-m2:${vico_version}" // Automatic memory leak detection - debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.10' + debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.11' testImplementation 'junit:junit:4.13.2' testImplementation 'io.mockk:mockk:1.13.5' diff --git a/build.gradle b/build.gradle index 4d3a662e08..0a999c817c 100644 --- a/build.gradle +++ b/build.gradle @@ -6,8 +6,8 @@ buildscript { nav_version = "2.5.3" room_version = "2.4.3" accompanist_version = '0.30.0' - coil_version = '2.3.0' - vico_version = '1.6.5' + coil_version = '2.4.0' + vico_version = '1.6.6' } dependencies { classpath 'com.google.gms:google-services:4.3.15' From 93f8847544a5c4d5904da509b7c4e12fb56a0d6d Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 20:41:42 -0400 Subject: [PATCH 159/171] moving plugin to the latest --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 0a999c817c..07c24fd4e0 100644 --- a/build.gradle +++ b/build.gradle @@ -16,8 +16,8 @@ buildscript { plugins { id 'com.android.application' version '8.0.1' apply false id 'com.android.library' version '8.0.1' apply false - id 'org.jetbrains.kotlin.android' version '1.8.10' apply false - id 'org.jetbrains.kotlin.jvm' version '1.8.10' apply false + id 'org.jetbrains.kotlin.android' version '1.8.21' apply false + id 'org.jetbrains.kotlin.jvm' version '1.8.21' apply false } task installGitHook(type: Copy) { From 538e61b38eb568c463ca6d1685dd0bd84a6a2e3b Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 20:47:13 -0400 Subject: [PATCH 160/171] rollback vm version --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 07c24fd4e0..0a999c817c 100644 --- a/build.gradle +++ b/build.gradle @@ -16,8 +16,8 @@ buildscript { plugins { id 'com.android.application' version '8.0.1' apply false id 'com.android.library' version '8.0.1' apply false - id 'org.jetbrains.kotlin.android' version '1.8.21' apply false - id 'org.jetbrains.kotlin.jvm' version '1.8.21' apply false + id 'org.jetbrains.kotlin.android' version '1.8.10' apply false + id 'org.jetbrains.kotlin.jvm' version '1.8.10' apply false } task installGitHook(type: Copy) { From 4b49cc1aab15322df67bf774f6073b056928fbe6 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 20:47:34 -0400 Subject: [PATCH 161/171] better translations to unfollow in portuguese --- app/src/main/res/values-pt-rBR/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 2db0e85dcc..d662b8a8a4 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -149,7 +149,7 @@ descrição para e foto para Sair - Remover seguidor + Desseguir Canal criado Informação do canal mudou para Chat público From 2082c6cb28bab865edbde715faeb29c1f8e1ecbe Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 22 May 2023 21:01:25 -0400 Subject: [PATCH 162/171] Fixes size for following symbol --- .../vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt | 3 +-- .../java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt index e59508bfff..e799500d14 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt @@ -9,7 +9,6 @@ import androidx.compose.foundation.layout.Box 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 @@ -557,7 +556,7 @@ private fun RenderRelay(dirtyUrl: String) { val iconModifier = remember { Modifier - .fillMaxSize(1f) + .size(15.dp) .clip(shape = CircleShape) } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index 82d9bdf275..7c23d16233 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -2132,7 +2132,7 @@ fun UserPicture( } val myIconModifier = remember { - Modifier.fillMaxSize() + Modifier.width(size.div(3.5f)).height(size.div(3.5f)) } Box(myIconBoxModifier, contentAlignment = Alignment.Center) { From d355f22938b765acefca8cfb8452f711e38071b1 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 23 May 2023 10:35:56 -0400 Subject: [PATCH 163/171] Fixes click on the Home to update the feed --- .../com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt index d392d85a21..f6c9c88237 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt @@ -163,7 +163,7 @@ private fun RowScope.HasNewItemsIcon( val newRoute = route.route.replace("{scrollToTop}", "true") navController.navigate(newRoute) { navController.graph.startDestinationRoute?.let { start -> - popUpTo(start) { inclusive = newRoute == Route.Home.route } + popUpTo(start) { inclusive = route.route == Route.Home.route } restoreState = true } From a29d9ad433afccbd04f8b9c0c51234336135845e Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 23 May 2023 10:37:18 -0400 Subject: [PATCH 164/171] Adds a cache layer for citations in Notes --- .../amethyst/service/model/BaseTextNoteEvent.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BaseTextNoteEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BaseTextNoteEvent.kt index 93f576f058..4f9e98fce4 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BaseTextNoteEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BaseTextNoteEvent.kt @@ -19,6 +19,7 @@ open class BaseTextNoteEvent( open fun replyTos() = tags.filter { it.firstOrNull() == "e" }.mapNotNull { it.getOrNull(1) } private var citedUsersCache: Set? = null + private var citedNotesCache: Set? = null fun citedUsers(): Set { citedUsersCache?.let { return it } @@ -61,8 +62,10 @@ open class BaseTextNoteEvent( return returningList } - fun findCitations(): Set { - var citations = mutableSetOf() + fun findCitations(): Set { + citedNotesCache?.let { return it } + + val citations = mutableSetOf() // Removes citations from replies: val matcher = tagSearch.matcher(content) while (matcher.find()) { @@ -102,6 +105,7 @@ open class BaseTextNoteEvent( } } + citedNotesCache = citations return citations } From 15621f16a2e6f945c5aab7aa7b896190b89c6c0b Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 23 May 2023 10:37:34 -0400 Subject: [PATCH 165/171] Improves the speed of updating Notification notes --- .../amethyst/ui/screen/CardFeedViewModel.kt | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt index 075419debf..cdcac191ef 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt @@ -37,7 +37,7 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { val feedContent = _feedContent.asStateFlow() private var lastAccount: Account? = null - private var lastNotes: List? = null + private var lastNotes: Set? = null fun refresh() { val scope = CoroutineScope(Job() + Dispatchers.Default) @@ -57,13 +57,13 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { if (lastNotesCopy != null && oldNotesState is CardFeedState.Loaded) { val newCards = convertToCard(notes.minus(lastNotesCopy)) if (newCards.isNotEmpty()) { - lastNotes = notes + lastNotes = notes.toSet() lastAccount = (localFilter as? NotificationFeedFilter)?.account updateFeed((oldNotesState.feed.value + newCards).distinctBy { it.id() }.sortedWith(compareBy({ it.createdAt() }, { it.id() })).reversed()) } } else { val cards = convertToCard(notes) - lastNotes = notes + lastNotes = notes.toSet() lastAccount = (localFilter as? NotificationFeedFilter)?.account updateFeed(cards) } @@ -184,13 +184,26 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { if (lastNotesCopy != null && localFilter is AdditiveFeedFilter && oldNotesState is CardFeedState.Loaded) { val filteredNewList = localFilter.applyFilter(newItems) + + if (filteredNewList.isEmpty()) return + val actuallyNew = filteredNewList.minus(lastNotesCopy) + if (actuallyNew.isEmpty()) return + val newCards = convertToCard(actuallyNew) + if (newCards.isNotEmpty()) { - lastNotes = lastNotesCopy + newItems + lastNotes = lastNotesCopy + actuallyNew lastAccount = (localFilter as? NotificationFeedFilter)?.account - updateFeed((oldNotesState.feed.value + newCards).distinctBy { it.id() }.sortedWith(compareBy({ it.createdAt() }, { it.id() })).reversed()) + + val updatedCards = (oldNotesState.feed.value + newCards) + .distinctBy { it.id() } + .sortedWith(compareBy({ it.createdAt() }, { it.id() })) + .reversed() + .take(1000) + + updateFeed(updatedCards) } } else { // Refresh Everything @@ -216,10 +229,13 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { @OptIn(ExperimentalTime::class) fun invalidateInsertData(newItems: Set) { bundlerInsert.invalidateList(newItems) { + val newObjects = it.flatten().toSet() val (value, elapsed) = measureTimedValue { - refreshFromOldState(it.flatten().toSet()) + if (newObjects.isNotEmpty()) { + refreshFromOldState(newObjects) + } } - Log.d("Time", "${this.javaClass.simpleName} Card additive update $elapsed") + Log.d("Time", "${this.javaClass.simpleName} Card additive update $elapsed. ${newObjects.size}") } } From 8898e5d10bf7797a92e08a6ca98ad4a5e173ca44 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 23 May 2023 12:02:34 -0400 Subject: [PATCH 166/171] Adds Immutable and Stable annotations to avoid recomposing --- .../main/java/com/vitorpamplona/amethyst/model/Note.kt | 3 +++ .../main/java/com/vitorpamplona/amethyst/model/User.kt | 3 +++ .../com/vitorpamplona/amethyst/service/model/ATag.kt | 2 ++ .../amethyst/service/model/AudioTrackEvent.kt | 2 ++ .../amethyst/service/model/BadgeAwardEvent.kt | 2 ++ .../amethyst/service/model/BadgeDefinitionEvent.kt | 2 ++ .../amethyst/service/model/BadgeProfilesEvent.kt | 2 ++ .../amethyst/service/model/BaseTextNoteEvent.kt | 2 ++ .../amethyst/service/model/BookmarkListEvent.kt | 2 ++ .../amethyst/service/model/ChannelCreateEvent.kt | 2 ++ .../amethyst/service/model/ChannelHideMessageEvent.kt | 2 ++ .../amethyst/service/model/ChannelMessageEvent.kt | 2 ++ .../amethyst/service/model/ChannelMetadataEvent.kt | 2 ++ .../amethyst/service/model/ChannelMuteUserEvent.kt | 2 ++ .../amethyst/service/model/ContactListEvent.kt | 2 ++ .../amethyst/service/model/DeletionEvent.kt | 2 ++ .../com/vitorpamplona/amethyst/service/model/Event.kt | 3 +++ .../amethyst/service/model/EventInterface.kt | 2 ++ .../amethyst/service/model/FileHeaderEvent.kt | 2 ++ .../amethyst/service/model/FileStorageEvent.kt | 2 ++ .../amethyst/service/model/FileStorageHeaderEvent.kt | 2 ++ .../amethyst/service/model/GeneralListEvent.kt | 2 ++ .../amethyst/service/model/HighlightEvent.kt | 2 ++ .../vitorpamplona/amethyst/service/model/LnZapEvent.kt | 2 ++ .../amethyst/service/model/LnZapEventInterface.kt | 2 ++ .../amethyst/service/model/LnZapPaymentRequestEvent.kt | 2 ++ .../amethyst/service/model/LnZapPaymentResponseEvent.kt | 2 ++ .../amethyst/service/model/LnZapRequestEvent.kt | 2 ++ .../amethyst/service/model/LongTextNoteEvent.kt | 2 ++ .../amethyst/service/model/MetadataEvent.kt | 2 ++ .../amethyst/service/model/MuteListEvent.kt | 2 ++ .../amethyst/service/model/PeopleListEvent.kt | 2 ++ .../vitorpamplona/amethyst/service/model/PinListEvent.kt | 2 ++ .../amethyst/service/model/PollNoteEvent.kt | 2 ++ .../amethyst/service/model/PrivateDmEvent.kt | 2 ++ .../amethyst/service/model/ReactionEvent.kt | 2 ++ .../amethyst/service/model/RecommendRelayEvent.kt | 2 ++ .../amethyst/service/model/RelayAuthEvent.kt | 2 ++ .../vitorpamplona/amethyst/service/model/ReportEvent.kt | 3 +++ .../vitorpamplona/amethyst/service/model/RepostEvent.kt | 2 ++ .../amethyst/service/model/TextNoteEvent.kt | 2 ++ .../vitorpamplona/amethyst/ui/screen/CardFeedState.kt | 9 +++++++++ .../com/vitorpamplona/amethyst/ui/screen/FeedView.kt | 7 ++++++- 43 files changed, 101 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt index e8920e69f1..b012aabc2b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt @@ -1,5 +1,6 @@ package com.vitorpamplona.amethyst.model +import androidx.compose.runtime.Stable import androidx.lifecycle.LiveData import com.vitorpamplona.amethyst.service.NostrSingleEventDataSource import com.vitorpamplona.amethyst.service.lnurl.LnInvoiceUtil @@ -20,6 +21,7 @@ import java.util.regex.Pattern val tagSearch = Pattern.compile("(?:\\s|\\A)\\#\\[([0-9]+)\\]") +@Stable class AddressableNote(val address: ATag) : Note(address.toTag()) { override fun idNote() = address.toNAddr() override fun toNEvent() = address.toNAddr() @@ -28,6 +30,7 @@ class AddressableNote(val address: ATag) : Note(address.toTag()) { override fun createdAt() = (event as? LongTextNoteEvent)?.publishedAt() ?: event?.createdAt() } +@Stable open class Note(val idHex: String) { // These fields are only available after the Text Note event is received. // They are immutable after that. diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt index 7d5877952e..afc4460040 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt @@ -1,5 +1,6 @@ package com.vitorpamplona.amethyst.model +import androidx.compose.runtime.Stable import androidx.lifecycle.LiveData import com.vitorpamplona.amethyst.service.NostrSingleUserDataSource import com.vitorpamplona.amethyst.service.model.BookmarkListEvent @@ -20,6 +21,7 @@ import java.util.regex.Pattern val lnurlpPattern = Pattern.compile("(?i:http|https):\\/\\/((.+)\\/)*\\.well-known\\/lnurlp\\/(.*)") +@Stable class User(val pubkeyHex: String) { var info: UserMetadata? = null @@ -358,6 +360,7 @@ data class RelayInfo( data class Chatroom(var roomMessages: Set) +@Stable class UserMetadata { var name: String? = null var username: String? = null diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ATag.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ATag.kt index 24d7058358..3b23481f6f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ATag.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ATag.kt @@ -1,6 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.hexToByteArray import com.vitorpamplona.amethyst.model.toHexKey import com.vitorpamplona.amethyst.service.nip19.Tlv @@ -9,6 +10,7 @@ import nostr.postr.Bech32 import nostr.postr.bechToBytes import nostr.postr.toByteArray +@Immutable data class ATag(val kind: Int, val pubKeyHex: String, val dTag: String, val relay: String?) { fun toTag() = "$kind:$pubKeyHex:$dTag" diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/AudioTrackEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/AudioTrackEvent.kt index 82dc30aa0f..980dbe00dc 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/AudioTrackEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/AudioTrackEvent.kt @@ -1,10 +1,12 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +@Immutable class AudioTrackEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeAwardEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeAwardEvent.kt index c16abc20e1..71f374a39d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeAwardEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeAwardEvent.kt @@ -1,7 +1,9 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey +@Immutable class BadgeAwardEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeDefinitionEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeDefinitionEvent.kt index 5e8be53504..f31cd3a42b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeDefinitionEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeDefinitionEvent.kt @@ -1,7 +1,9 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey +@Immutable class BadgeDefinitionEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeProfilesEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeProfilesEvent.kt index f616bb7a44..a81723fe95 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeProfilesEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeProfilesEvent.kt @@ -1,7 +1,9 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey +@Immutable class BadgeProfilesEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BaseTextNoteEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BaseTextNoteEvent.kt index 4f9e98fce4..84d1732777 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BaseTextNoteEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BaseTextNoteEvent.kt @@ -1,11 +1,13 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.tagSearch import com.vitorpamplona.amethyst.service.nip19.Nip19 import com.vitorpamplona.amethyst.service.nip19.Nip19.nip19regex +@Immutable open class BaseTextNoteEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BookmarkListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BookmarkListEvent.kt index 71f1ad7e6d..5209d4d9e0 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BookmarkListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BookmarkListEvent.kt @@ -1,10 +1,12 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +@Immutable class BookmarkListEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelCreateEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelCreateEvent.kt index f9205b61a1..aecf4d697d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelCreateEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelCreateEvent.kt @@ -1,11 +1,13 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +@Immutable class ChannelCreateEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelHideMessageEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelHideMessageEvent.kt index 5de80f0b6e..896f8d462c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelHideMessageEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelHideMessageEvent.kt @@ -1,10 +1,12 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +@Immutable class ChannelHideMessageEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMessageEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMessageEvent.kt index 5fb98d1e39..32635e1ea6 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMessageEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMessageEvent.kt @@ -1,10 +1,12 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +@Immutable class ChannelMessageEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMetadataEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMetadataEvent.kt index 6382e588cd..b15365f917 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMetadataEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMetadataEvent.kt @@ -1,11 +1,13 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +@Immutable class ChannelMetadataEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMuteUserEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMuteUserEvent.kt index 79988b4de8..c0b86ee3ba 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMuteUserEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMuteUserEvent.kt @@ -1,10 +1,12 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +@Immutable class ChannelMuteUserEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ContactListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ContactListEvent.kt index d141c3fd83..56cb3212e3 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ContactListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ContactListEvent.kt @@ -1,6 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log +import com.google.errorprone.annotations.Immutable import com.google.gson.reflect.TypeToken import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.decodePublicKey @@ -8,6 +9,7 @@ import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +@Immutable data class Contact(val pubKeyHex: String, val relayUri: String?) class ContactListEvent( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/DeletionEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/DeletionEvent.kt index 4d7170f61b..9b959e884c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/DeletionEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/DeletionEvent.kt @@ -1,10 +1,12 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +@Immutable class DeletionEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt index 91b825e8df..2d633ee500 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt @@ -1,6 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log +import com.google.errorprone.annotations.Immutable import com.google.gson.* import com.google.gson.annotations.SerializedName import com.vitorpamplona.amethyst.model.HexKey @@ -14,6 +15,7 @@ import java.math.BigDecimal import java.security.MessageDigest import java.util.* +@Immutable open class Event( val id: HexKey, @SerializedName("pubkey") val pubKey: HexKey, @@ -285,6 +287,7 @@ open class Event( } } +@Immutable interface AddressableEvent { fun dTag(): String fun address(): ATag diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/EventInterface.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/EventInterface.kt index 5a4e1db57e..3528cfedd4 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/EventInterface.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/EventInterface.kt @@ -1,8 +1,10 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import java.math.BigDecimal +@Immutable interface EventInterface { fun id(): HexKey diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileHeaderEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileHeaderEvent.kt index a33344af66..f9832f24d1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileHeaderEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileHeaderEvent.kt @@ -1,10 +1,12 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +@Immutable class FileHeaderEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageEvent.kt index af25b41524..13087fb353 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageEvent.kt @@ -1,12 +1,14 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Base64 import java.util.Date +@Immutable class FileStorageEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageHeaderEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageHeaderEvent.kt index f2ba729bb1..b27d3bee58 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageHeaderEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageHeaderEvent.kt @@ -1,10 +1,12 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +@Immutable class FileStorageHeaderEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/GeneralListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/GeneralListEvent.kt index 57cadcd66c..859e1381b5 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/GeneralListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/GeneralListEvent.kt @@ -1,11 +1,13 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log +import com.google.errorprone.annotations.Immutable import com.google.gson.reflect.TypeToken import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.hexToByteArray import nostr.postr.Utils +@Immutable abstract class GeneralListEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/HighlightEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/HighlightEvent.kt index 1d3d1acf67..427cf7ddbd 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/HighlightEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/HighlightEvent.kt @@ -1,10 +1,12 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +@Immutable class HighlightEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapEvent.kt index a326f5795d..7826700c5f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapEvent.kt @@ -1,10 +1,12 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.service.lnurl.LnInvoiceUtil import com.vitorpamplona.amethyst.service.relays.Client +@Immutable class LnZapEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapEventInterface.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapEventInterface.kt index 934dba55b2..853fcbab5d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapEventInterface.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapEventInterface.kt @@ -1,7 +1,9 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import java.math.BigDecimal +@Immutable interface LnZapEventInterface : EventInterface { fun zappedPost(): List diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentRequestEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentRequestEvent.kt index 4946fb4c99..24ec918822 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentRequestEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentRequestEvent.kt @@ -1,6 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log +import com.google.errorprone.annotations.Immutable import com.google.gson.JsonDeserializationContext import com.google.gson.JsonDeserializer import com.google.gson.JsonElement @@ -12,6 +13,7 @@ import nostr.postr.Utils import java.lang.reflect.Type import java.util.Date +@Immutable class LnZapPaymentRequestEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentResponseEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentResponseEvent.kt index 5d8ec2e95d..ccebb3cce0 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentResponseEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentResponseEvent.kt @@ -1,6 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log +import com.google.errorprone.annotations.Immutable import com.google.gson.JsonDeserializationContext import com.google.gson.JsonDeserializer import com.google.gson.JsonElement @@ -10,6 +11,7 @@ import com.vitorpamplona.amethyst.model.HexKey import nostr.postr.Utils import java.lang.reflect.Type +@Immutable class LnZapPaymentResponseEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapRequestEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapRequestEvent.kt index eeb2bb81a5..87f00b1f1a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapRequestEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapRequestEvent.kt @@ -1,5 +1,6 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.* import nostr.postr.Bech32 import nostr.postr.Utils @@ -11,6 +12,7 @@ import javax.crypto.Cipher import javax.crypto.spec.IvParameterSpec import javax.crypto.spec.SecretKeySpec +@Immutable class LnZapRequestEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LongTextNoteEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LongTextNoteEvent.kt index 529c96fd3b..43d1a7ab9f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LongTextNoteEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LongTextNoteEvent.kt @@ -1,10 +1,12 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +@Immutable class LongTextNoteEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/MetadataEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/MetadataEvent.kt index 7cec19bcaf..e21e257d08 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/MetadataEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/MetadataEvent.kt @@ -1,6 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log +import com.google.errorprone.annotations.Immutable import com.google.gson.Gson import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.HexKey @@ -8,6 +9,7 @@ import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +@Immutable data class ContactMetaData( val name: String, val picture: String, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/MuteListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/MuteListEvent.kt index 9774888362..aed9a91fee 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/MuteListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/MuteListEvent.kt @@ -1,6 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log +import com.google.errorprone.annotations.Immutable import com.google.gson.reflect.TypeToken import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.hexToByteArray @@ -8,6 +9,7 @@ import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +@Immutable class MuteListEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PeopleListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PeopleListEvent.kt index 583f534b5f..26b490be03 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PeopleListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PeopleListEvent.kt @@ -1,10 +1,12 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +@Immutable class PeopleListEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PinListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PinListEvent.kt index 100aaf9818..1007c0bea0 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PinListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PinListEvent.kt @@ -1,10 +1,12 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +@Immutable class PinListEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PollNoteEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PollNoteEvent.kt index 0cb71f8054..3a425ecd79 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PollNoteEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PollNoteEvent.kt @@ -1,5 +1,6 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils @@ -11,6 +12,7 @@ const val VALUE_MINIMUM = "value_minimum" const val CONSENSUS_THRESHOLD = "consensus_threshold" const val CLOSED_AT = "closed_at" +@Immutable class PollNoteEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PrivateDmEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PrivateDmEvent.kt index 20e4bc6967..9bb2385ecf 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PrivateDmEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PrivateDmEvent.kt @@ -1,6 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import fr.acinq.secp256k1.Hex @@ -8,6 +9,7 @@ import nostr.postr.Utils import nostr.postr.toHex import java.util.Date +@Immutable class PrivateDmEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt index 91b34d4e72..3e44207e8b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt @@ -1,10 +1,12 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +@Immutable class ReactionEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RecommendRelayEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RecommendRelayEvent.kt index 117931b999..93639bb10b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RecommendRelayEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RecommendRelayEvent.kt @@ -1,11 +1,13 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.net.URI import java.util.Date +@Immutable class RecommendRelayEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RelayAuthEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RelayAuthEvent.kt index 6a7e042287..55522a04fc 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RelayAuthEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RelayAuthEvent.kt @@ -1,10 +1,12 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +@Immutable class RelayAuthEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReportEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReportEvent.kt index b05e55870c..c41a9f5786 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReportEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReportEvent.kt @@ -1,13 +1,16 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils import java.util.Date +@Immutable data class ReportedKey(val key: String, val reportType: ReportEvent.ReportType) // NIP 56 event. +@Immutable class ReportEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt index c00c67617e..930e49cb74 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt @@ -1,11 +1,13 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import com.vitorpamplona.amethyst.service.relays.Client import nostr.postr.Utils import java.util.Date +@Immutable class RepostEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/TextNoteEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/TextNoteEvent.kt index aa80ac016d..169b121a3b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/TextNoteEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/TextNoteEvent.kt @@ -1,5 +1,6 @@ package com.vitorpamplona.amethyst.service.model +import com.google.errorprone.annotations.Immutable import com.linkedin.urls.detection.UrlDetector import com.linkedin.urls.detection.UrlDetectorOptions import com.vitorpamplona.amethyst.model.HexKey @@ -8,6 +9,7 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.findHashtags import nostr.postr.Utils import java.util.Date +@Immutable class TextNoteEvent( id: HexKey, pubKey: HexKey, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedState.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedState.kt index 3f374730c2..df080b9f62 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedState.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedState.kt @@ -1,5 +1,6 @@ package com.vitorpamplona.amethyst.ui.screen +import androidx.compose.runtime.Immutable import androidx.compose.runtime.MutableState import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.User @@ -9,6 +10,7 @@ abstract class Card() { abstract fun id(): String } +@Immutable class BadgeCard(val note: Note) : Card() { override fun createdAt(): Long { return note.createdAt() ?: 0 @@ -17,6 +19,7 @@ class BadgeCard(val note: Note) : Card() { override fun id() = note.idHex } +@Immutable class NoteCard(val note: Note) : Card() { override fun createdAt(): Long { return note.createdAt() ?: 0 @@ -25,6 +28,7 @@ class NoteCard(val note: Note) : Card() { override fun id() = note.idHex } +@Immutable class LikeSetCard(val note: Note, val likeEvents: List) : Card() { val createdAt = likeEvents.maxOf { it.createdAt() ?: 0 } override fun createdAt(): Long { @@ -33,6 +37,7 @@ class LikeSetCard(val note: Note, val likeEvents: List) : Card() { override fun id() = note.idHex + "L" + createdAt } +@Immutable class ZapSetCard(val note: Note, val zapEvents: Map) : Card() { val createdAt = zapEvents.maxOf { it.value.createdAt() ?: 0 } override fun createdAt(): Long { @@ -41,6 +46,7 @@ class ZapSetCard(val note: Note, val zapEvents: Map) : Card() { override fun id() = note.idHex + "Z" + createdAt } +@Immutable class ZapUserSetCard(val user: User, val zapEvents: Map) : Card() { val createdAt = zapEvents.maxOf { it.value.createdAt() ?: 0 } override fun createdAt(): Long { @@ -49,6 +55,7 @@ class ZapUserSetCard(val user: User, val zapEvents: Map) : Card() { override fun id() = user.pubkeyHex + "U" + createdAt } +@Immutable class MultiSetCard(val note: Note, val boostEvents: List, val likeEvents: List, val zapEvents: Map) : Card() { val createdAt = maxOf( zapEvents.maxOfOrNull { it.value.createdAt() ?: 0 } ?: 0, @@ -62,6 +69,7 @@ class MultiSetCard(val note: Note, val boostEvents: List, val likeEvents: override fun id() = note.idHex + "X" + createdAt } +@Immutable class BoostSetCard(val note: Note, val boostEvents: List) : Card() { val createdAt = boostEvents.maxOf { it.createdAt() ?: 0 } @@ -72,6 +80,7 @@ class BoostSetCard(val note: Note, val boostEvents: List) : Card() { override fun id() = note.idHex + "B" + createdAt } +@Immutable class MessageSetCard(val note: Note) : Card() { override fun createdAt(): Long { return note.createdAt() ?: 0 diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt index 02f6708012..e5faa3fdc5 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt @@ -124,6 +124,10 @@ private fun FeedLoaded( } } + val baseModifier = remember { + Modifier + } + LazyColumn( contentPadding = PaddingValues( top = 10.dp, @@ -134,8 +138,9 @@ private fun FeedLoaded( itemsIndexed(state.feed.value, key = { _, item -> item.idHex }) { _, item -> NoteCompose( item, - isBoostedNote = false, routeForLastRead = routeForLastRead, + modifier = baseModifier, + isBoostedNote = false, accountViewModel = accountViewModel, navController = navController ) From 0015100dea7b97573a216e450b489c10c10e1aa0 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 23 May 2023 12:12:43 -0400 Subject: [PATCH 167/171] Fixing Immutable imports --- .../main/java/com/vitorpamplona/amethyst/service/model/ATag.kt | 2 +- .../com/vitorpamplona/amethyst/service/model/AudioTrackEvent.kt | 2 +- .../com/vitorpamplona/amethyst/service/model/BadgeAwardEvent.kt | 2 +- .../amethyst/service/model/BadgeDefinitionEvent.kt | 2 +- .../vitorpamplona/amethyst/service/model/BadgeProfilesEvent.kt | 2 +- .../vitorpamplona/amethyst/service/model/BaseTextNoteEvent.kt | 2 +- .../vitorpamplona/amethyst/service/model/BookmarkListEvent.kt | 2 +- .../vitorpamplona/amethyst/service/model/ChannelCreateEvent.kt | 2 +- .../amethyst/service/model/ChannelHideMessageEvent.kt | 2 +- .../vitorpamplona/amethyst/service/model/ChannelMessageEvent.kt | 2 +- .../amethyst/service/model/ChannelMetadataEvent.kt | 2 +- .../amethyst/service/model/ChannelMuteUserEvent.kt | 2 +- .../vitorpamplona/amethyst/service/model/ContactListEvent.kt | 2 +- .../com/vitorpamplona/amethyst/service/model/DeletionEvent.kt | 2 +- .../main/java/com/vitorpamplona/amethyst/service/model/Event.kt | 2 +- .../com/vitorpamplona/amethyst/service/model/EventInterface.kt | 2 +- .../com/vitorpamplona/amethyst/service/model/FileHeaderEvent.kt | 2 +- .../vitorpamplona/amethyst/service/model/FileStorageEvent.kt | 2 +- .../amethyst/service/model/FileStorageHeaderEvent.kt | 2 +- .../vitorpamplona/amethyst/service/model/GeneralListEvent.kt | 2 +- .../com/vitorpamplona/amethyst/service/model/HighlightEvent.kt | 2 +- .../java/com/vitorpamplona/amethyst/service/model/LnZapEvent.kt | 2 +- .../vitorpamplona/amethyst/service/model/LnZapEventInterface.kt | 2 +- .../amethyst/service/model/LnZapPaymentRequestEvent.kt | 2 +- .../amethyst/service/model/LnZapPaymentResponseEvent.kt | 2 +- .../vitorpamplona/amethyst/service/model/LnZapRequestEvent.kt | 2 +- .../vitorpamplona/amethyst/service/model/LongTextNoteEvent.kt | 2 +- .../com/vitorpamplona/amethyst/service/model/MetadataEvent.kt | 2 +- .../com/vitorpamplona/amethyst/service/model/MuteListEvent.kt | 2 +- .../com/vitorpamplona/amethyst/service/model/PeopleListEvent.kt | 2 +- .../com/vitorpamplona/amethyst/service/model/PinListEvent.kt | 2 +- .../com/vitorpamplona/amethyst/service/model/PollNoteEvent.kt | 2 +- .../com/vitorpamplona/amethyst/service/model/PrivateDmEvent.kt | 2 +- .../com/vitorpamplona/amethyst/service/model/ReactionEvent.kt | 2 +- .../vitorpamplona/amethyst/service/model/RecommendRelayEvent.kt | 2 +- .../com/vitorpamplona/amethyst/service/model/RelayAuthEvent.kt | 2 +- .../com/vitorpamplona/amethyst/service/model/ReportEvent.kt | 2 +- .../com/vitorpamplona/amethyst/service/model/RepostEvent.kt | 2 +- .../com/vitorpamplona/amethyst/service/model/TextNoteEvent.kt | 2 +- 39 files changed, 39 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ATag.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ATag.kt index 3b23481f6f..10749bc4c0 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ATag.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ATag.kt @@ -1,7 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.hexToByteArray import com.vitorpamplona.amethyst.model.toHexKey import com.vitorpamplona.amethyst.service.nip19.Tlv diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/AudioTrackEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/AudioTrackEvent.kt index 980dbe00dc..e7c543dd27 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/AudioTrackEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/AudioTrackEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeAwardEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeAwardEvent.kt index 71f374a39d..082322b110 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeAwardEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeAwardEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey @Immutable diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeDefinitionEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeDefinitionEvent.kt index f31cd3a42b..5a4d25c16e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeDefinitionEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeDefinitionEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey @Immutable diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeProfilesEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeProfilesEvent.kt index a81723fe95..3acb994f77 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeProfilesEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeProfilesEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey @Immutable diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BaseTextNoteEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BaseTextNoteEvent.kt index 84d1732777..201622544d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BaseTextNoteEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BaseTextNoteEvent.kt @@ -1,7 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.tagSearch import com.vitorpamplona.amethyst.service.nip19.Nip19 diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BookmarkListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BookmarkListEvent.kt index 5209d4d9e0..d11b079a13 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BookmarkListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BookmarkListEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelCreateEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelCreateEvent.kt index aecf4d697d..8123144b72 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelCreateEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelCreateEvent.kt @@ -1,7 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelHideMessageEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelHideMessageEvent.kt index 896f8d462c..b2ed4c4b42 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelHideMessageEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelHideMessageEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMessageEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMessageEvent.kt index 32635e1ea6..471419f222 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMessageEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMessageEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMetadataEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMetadataEvent.kt index b15365f917..b3db7553e0 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMetadataEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMetadataEvent.kt @@ -1,7 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMuteUserEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMuteUserEvent.kt index c0b86ee3ba..626dbf5295 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMuteUserEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ChannelMuteUserEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ContactListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ContactListEvent.kt index 56cb3212e3..b100990737 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ContactListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ContactListEvent.kt @@ -1,7 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.google.gson.reflect.TypeToken import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.decodePublicKey diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/DeletionEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/DeletionEvent.kt index 9b959e884c..9c3613569c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/DeletionEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/DeletionEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt index 2d633ee500..dcc0ad35d9 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt @@ -1,7 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.google.gson.* import com.google.gson.annotations.SerializedName import com.vitorpamplona.amethyst.model.HexKey diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/EventInterface.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/EventInterface.kt index 3528cfedd4..de9275d7bf 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/EventInterface.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/EventInterface.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import java.math.BigDecimal diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileHeaderEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileHeaderEvent.kt index f9832f24d1..ca72864f97 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileHeaderEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileHeaderEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageEvent.kt index 13087fb353..13fc5d03d0 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageEvent.kt @@ -1,7 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageHeaderEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageHeaderEvent.kt index b27d3bee58..c84de54ada 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageHeaderEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/FileStorageHeaderEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/GeneralListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/GeneralListEvent.kt index 859e1381b5..2594c74f56 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/GeneralListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/GeneralListEvent.kt @@ -1,7 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.google.gson.reflect.TypeToken import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.hexToByteArray diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/HighlightEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/HighlightEvent.kt index 427cf7ddbd..6bb49cb085 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/HighlightEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/HighlightEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapEvent.kt index 7826700c5f..59e61c309a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapEvent.kt @@ -1,7 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.service.lnurl.LnInvoiceUtil import com.vitorpamplona.amethyst.service.relays.Client diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapEventInterface.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapEventInterface.kt index 853fcbab5d..13921deee6 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapEventInterface.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapEventInterface.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import java.math.BigDecimal @Immutable diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentRequestEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentRequestEvent.kt index 24ec918822..9975ae8142 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentRequestEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentRequestEvent.kt @@ -1,7 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.google.gson.JsonDeserializationContext import com.google.gson.JsonDeserializer import com.google.gson.JsonElement diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentResponseEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentResponseEvent.kt index ccebb3cce0..4e4c41a90e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentResponseEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentResponseEvent.kt @@ -1,7 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.google.gson.JsonDeserializationContext import com.google.gson.JsonDeserializer import com.google.gson.JsonElement diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapRequestEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapRequestEvent.kt index 87f00b1f1a..aa60dcb6f4 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapRequestEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapRequestEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.* import nostr.postr.Bech32 import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LongTextNoteEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LongTextNoteEvent.kt index 43d1a7ab9f..f2fe3de388 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LongTextNoteEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LongTextNoteEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/MetadataEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/MetadataEvent.kt index e21e257d08..766d1e79d1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/MetadataEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/MetadataEvent.kt @@ -1,7 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.google.gson.Gson import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.HexKey diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/MuteListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/MuteListEvent.kt index aed9a91fee..afd65cfb77 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/MuteListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/MuteListEvent.kt @@ -1,7 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.google.gson.reflect.TypeToken import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.hexToByteArray diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PeopleListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PeopleListEvent.kt index 26b490be03..51d9fa305b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PeopleListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PeopleListEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PinListEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PinListEvent.kt index 1007c0bea0..e5f6e69a21 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PinListEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PinListEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PollNoteEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PollNoteEvent.kt index 3a425ecd79..10f1541938 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PollNoteEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PollNoteEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PrivateDmEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PrivateDmEvent.kt index 9bb2385ecf..435e3b3023 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/PrivateDmEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/PrivateDmEvent.kt @@ -1,7 +1,7 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import fr.acinq.secp256k1.Hex diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt index 3e44207e8b..e2a23ecb7f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RecommendRelayEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RecommendRelayEvent.kt index 93639bb10b..8cdc833dcf 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RecommendRelayEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RecommendRelayEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RelayAuthEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RelayAuthEvent.kt index 55522a04fc..388daefdcb 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RelayAuthEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RelayAuthEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReportEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReportEvent.kt index c41a9f5786..cdb075f3ab 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReportEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReportEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Utils diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt index 930e49cb74..6b2053afd7 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.toHexKey import com.vitorpamplona.amethyst.service.relays.Client diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/TextNoteEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/TextNoteEvent.kt index 169b121a3b..8f7b5bb56d 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/TextNoteEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/TextNoteEvent.kt @@ -1,6 +1,6 @@ package com.vitorpamplona.amethyst.service.model -import com.google.errorprone.annotations.Immutable +import androidx.compose.runtime.Immutable import com.linkedin.urls.detection.UrlDetector import com.linkedin.urls.detection.UrlDetectorOptions import com.vitorpamplona.amethyst.model.HexKey From dcbd4148e2a4cd4f5c27bd11600942c763b0a9aa Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 23 May 2023 12:14:47 -0400 Subject: [PATCH 168/171] v0.50.6 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4e859781f9..8ba1e99073 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vitorpamplona.amethyst" minSdk 26 targetSdk 33 - versionCode 173 - versionName "0.50.5" + versionCode 174 + versionName "0.50.6" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { From 5a375b94d6be096da9459bcb6bb2b55bd0551e34 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 23 May 2023 15:14:00 -0400 Subject: [PATCH 169/171] Adds Zap amounts to Notification bubbles. --- .../amethyst/ui/note/MultiSetCompose.kt | 65 ++++++++++++++----- .../amethyst/ui/note/UserReactionsRow.kt | 3 +- 2 files changed, 49 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt index d45180015b..49bd4cffcf 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt @@ -31,8 +31,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.compositeOver import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import androidx.navigation.NavController import com.google.accompanist.flowlayout.FlowRow import com.vitorpamplona.amethyst.NotificationCache @@ -42,13 +44,16 @@ import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.model.UserState +import com.vitorpamplona.amethyst.service.model.LnZapEvent import com.vitorpamplona.amethyst.service.model.LnZapRequestEvent import com.vitorpamplona.amethyst.ui.components.TranslatableRichTextViewer import com.vitorpamplona.amethyst.ui.screen.MultiSetCard import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel +import com.vitorpamplona.amethyst.ui.screen.loggedIn.showAmountAxis import com.vitorpamplona.amethyst.ui.theme.BitcoinOrange import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import java.math.BigDecimal @OptIn(ExperimentalFoundationApi::class) @Composable @@ -253,14 +258,10 @@ fun AuthorGalleryZaps( ) { val accountState = account.userProfile().live().follows.observeAsState() - val listToRender = remember { - authorNotes.keys.take(50) - } - Column(modifier = Modifier.padding(start = 10.dp)) { FlowRow() { - listToRender.forEach { - AuthorPictureAndComment(it, navController, accountState, accountViewModel) + authorNotes.forEach { + AuthorPictureAndComment(it.key, it.value, navController, accountState, accountViewModel) } } } @@ -269,38 +270,48 @@ fun AuthorGalleryZaps( @Composable private fun AuthorPictureAndComment( zapRequest: Note, + zapEvent: Note?, navController: NavController, accountUser: State, accountViewModel: AccountViewModel ) { val author = zapRequest.author ?: return - var content by remember { mutableStateOf>(Pair(author, null)) } + var content by remember { mutableStateOf>(Triple(author, null, null)) } val scope = rememberCoroutineScope() - LaunchedEffect(key1 = zapRequest.idHex) { + LaunchedEffect(key1 = zapRequest.idHex, key2 = zapEvent?.idHex) { scope.launch(Dispatchers.IO) { (zapRequest.event as? LnZapRequestEvent)?.let { val decryptedContent = accountViewModel.decryptZap(zapRequest) + val amount = (zapEvent?.event as? LnZapEvent)?.amount if (decryptedContent != null) { val newAuthor = LocalCache.getOrCreateUser(decryptedContent.pubKey) - content = Pair(newAuthor, decryptedContent.content) + content = Triple(newAuthor, decryptedContent.content, amount) } else { - if (!zapRequest.event?.content().isNullOrBlank()) { - content = Pair(author, zapRequest.event?.content()) + if (!zapRequest.event?.content().isNullOrBlank() || amount != null) { + content = Triple(author, zapRequest.event?.content(), amount) } } } } } - AuthorPictureAndComment(content.first, content.second, navController, accountUser, accountViewModel) + AuthorPictureAndComment( + author = content.first, + comment = content.second, + amount = showAmountAxis(content.third), + navController = navController, + accountUser = accountUser, + accountViewModel = accountViewModel + ) } @Composable private fun AuthorPictureAndComment( author: User, comment: String?, + amount: String?, navController: NavController, accountUser: State, accountViewModel: AccountViewModel @@ -323,11 +334,29 @@ private fun AuthorPictureAndComment( modifier = modifier, verticalAlignment = Alignment.CenterVertically ) { - FastNoteAuthorPicture( - author = author, - userAccount = accountUser, - size = 35.dp - ) + Box(modifier = remember { Modifier.size(35.dp) }, contentAlignment = Alignment.BottomCenter) { + FastNoteAuthorPicture( + author = author, + userAccount = accountUser, + size = 35.dp + ) + + amount?.let { + Box( + modifier = Modifier + .fillMaxWidth() + .background(MaterialTheme.colors.background.copy(0.52f)), + contentAlignment = Alignment.BottomCenter + ) { + Text( + text = it, + fontWeight = FontWeight.Bold, + color = BitcoinOrange, + fontSize = 12.sp + ) + } + } + } if (!comment.isNullOrBlank()) { Spacer(modifier = Modifier.width(5.dp)) @@ -362,7 +391,7 @@ fun AuthorGallery( Column(modifier = Modifier.padding(start = 10.dp)) { FlowRow() { listToRender.first.forEach { author -> - AuthorPictureAndComment(author, null, navController, accountState, accountViewModel) + AuthorPictureAndComment(author, null, null, navController, accountState, accountViewModel) } if (listToRender.second > 50) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserReactionsRow.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserReactionsRow.kt index 93ca64ab4b..b6d243aa58 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserReactionsRow.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserReactionsRow.kt @@ -42,6 +42,7 @@ import com.vitorpamplona.amethyst.service.model.ReactionEvent import com.vitorpamplona.amethyst.service.model.RepostEvent import com.vitorpamplona.amethyst.service.model.TextNoteEvent import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel +import com.vitorpamplona.amethyst.ui.screen.loggedIn.showAmountAxis import com.vitorpamplona.amethyst.ui.theme.BitcoinOrange import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -345,7 +346,7 @@ fun UserZapReaction( Spacer(modifier = Modifier.width(8.dp)) Text( - showAmount(amount), + showAmountAxis(amount), fontWeight = FontWeight.Bold, fontSize = 18.sp ) From f0ba68e4677890617dd22ec72ec841f7c5babfaa Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 23 May 2023 16:04:29 -0400 Subject: [PATCH 170/171] Fixing missing some notifications. --- .../amethyst/ui/screen/CardFeedViewModel.kt | 9 +++++++-- .../amethyst/ui/screen/loggedIn/NotificationScreen.kt | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt index cdcac191ef..40ed18d80e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt @@ -48,7 +48,7 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { @Synchronized private fun refreshSuspended() { - val notes = localFilter.loadTop() + val notes = localFilter.feed() val thisAccount = (localFilter as? NotificationFeedFilter)?.account val lastNotesCopy = if (thisAccount == lastAccount) lastNotes else null @@ -59,7 +59,12 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { if (newCards.isNotEmpty()) { lastNotes = notes.toSet() lastAccount = (localFilter as? NotificationFeedFilter)?.account - updateFeed((oldNotesState.feed.value + newCards).distinctBy { it.id() }.sortedWith(compareBy({ it.createdAt() }, { it.id() })).reversed()) + val singleList = (oldNotesState.feed.value + newCards) + .distinctBy { it.id() } + .sortedWith(compareBy({ it.createdAt() }, { it.id() })) + .reversed() + .take(1000) + updateFeed(singleList) } } else { val cards = convertToCard(notes) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt index 2989551366..79843b1215 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt @@ -75,7 +75,7 @@ fun NotificationScreen( NostrAccountDataSource.resetFilters() NotificationFeedFilter.account = account notifFeedViewModel.clear() - notifFeedViewModel.refresh() + notifFeedViewModel.invalidateData() } val lifeCycleOwner = LocalLifecycleOwner.current From 4841d4004e83f9485295589725a5a29dfa800ec5 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 24 May 2023 10:38:25 -0400 Subject: [PATCH 171/171] Fixes https://github.com/vitorpamplona/amethyst/issues/425 --- app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt index 9a20166c65..f758617e89 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt @@ -20,6 +20,7 @@ import coil.decode.SvgDecoder import com.vitorpamplona.amethyst.LocalPreferences import com.vitorpamplona.amethyst.ServiceManager import com.vitorpamplona.amethyst.VideoCache +import com.vitorpamplona.amethyst.service.HttpClient import com.vitorpamplona.amethyst.service.model.ChannelCreateEvent import com.vitorpamplona.amethyst.service.model.ChannelMessageEvent import com.vitorpamplona.amethyst.service.model.ChannelMetadataEvent @@ -60,6 +61,7 @@ class MainActivity : FragmentActivity() { } add(SvgDecoder.Factory()) } // .logger(DebugLogger()) + .okHttpClient { HttpClient.getHttpClient() } .respectCacheHeaders(false) .build() }

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ȹBx%p7RmV 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