From 7a90523139bfc499c84b9ff0e22b965ed8978728 Mon Sep 17 00:00:00 2001
From: Maarten Vercruysse <67873169+MV-GH@users.noreply.github.com>
Date: Thu, 31 Aug 2023 22:38:24 +0200
Subject: [PATCH] Add connect on matrix (#1206)
* Add connect on matrix
* Use faster perf icon
* Fix contentDescription
---
.../main/java/com/jerboa/feat/UserActions.kt | 8 ++++++
.../ui/components/common/DropdownMenu.kt | 23 +++++++++++++++
.../ui/components/person/PersonProfile.kt | 28 +++++++++++++++++++
.../person/PersonProfileActivity.kt | 6 ++--
app/src/main/res/drawable/matrix_favicon.xml | 6 ++++
app/src/main/res/values/strings.xml | 1 +
6 files changed, 70 insertions(+), 2 deletions(-)
create mode 100644 app/src/main/res/drawable/matrix_favicon.xml
diff --git a/app/src/main/java/com/jerboa/feat/UserActions.kt b/app/src/main/java/com/jerboa/feat/UserActions.kt
index 2bc8f1df2..17fbff10f 100644
--- a/app/src/main/java/com/jerboa/feat/UserActions.kt
+++ b/app/src/main/java/com/jerboa/feat/UserActions.kt
@@ -127,3 +127,11 @@ fun shareLink(url: String, ctx: Context) {
val shareIntent = Intent.createChooser(intent, ctx.getString(R.string.share))
ctx.startActivitySafe(shareIntent)
}
+
+/**
+ * Opens matrix for that user
+ */
+fun openMatrix(matrixId: String, ctx: Context) {
+ val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://matrix.to/#/$matrixId"))
+ ctx.startActivitySafe(intent)
+}
diff --git a/app/src/main/java/com/jerboa/ui/components/common/DropdownMenu.kt b/app/src/main/java/com/jerboa/ui/components/common/DropdownMenu.kt
index d440fe237..2babf9789 100644
--- a/app/src/main/java/com/jerboa/ui/components/common/DropdownMenu.kt
+++ b/app/src/main/java/com/jerboa/ui/components/common/DropdownMenu.kt
@@ -40,6 +40,29 @@ fun MenuItem(
)
}
+@Composable
+fun MenuItem(
+ text: String,
+ onClick: () -> Unit,
+ modifier: Modifier = Modifier,
+ textModifier: Modifier = Modifier,
+ icon: @Composable (() -> Unit),
+ textStyle: TextStyle = MaterialTheme.typography.bodyMedium,
+) {
+ DropdownMenuItem(
+ text = {
+ Text(
+ text = text,
+ style = textStyle,
+ modifier = textModifier,
+ )
+ },
+ leadingIcon = icon,
+ onClick = onClick,
+ modifier = modifier,
+ )
+}
+
@Composable
fun MenuItem(
text: String,
diff --git a/app/src/main/java/com/jerboa/ui/components/person/PersonProfile.kt b/app/src/main/java/com/jerboa/ui/components/person/PersonProfile.kt
index 33ccfacea..6bee16e34 100644
--- a/app/src/main/java/com/jerboa/ui/components/person/PersonProfile.kt
+++ b/app/src/main/java/com/jerboa/ui/components/person/PersonProfile.kt
@@ -8,8 +8,10 @@ import androidx.compose.foundation.layout.Row
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.material.icons.Icons
import androidx.compose.material.icons.outlined.*
+import androidx.compose.material3.Divider
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
@@ -27,12 +29,14 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import com.jerboa.R
import com.jerboa.datatypes.samplePersonView
import com.jerboa.datatypes.types.PersonView
import com.jerboa.datatypes.types.SortType
+import com.jerboa.feat.openMatrix
import com.jerboa.personNameShown
import com.jerboa.ui.components.common.DotSpacer
import com.jerboa.ui.components.common.LargerCircularIcon
@@ -42,6 +46,7 @@ import com.jerboa.ui.components.common.PictrsBannerImage
import com.jerboa.ui.components.common.SortOptionsDialog
import com.jerboa.ui.components.common.SortTopOptionsDialog
import com.jerboa.ui.components.common.TimeAgo
+import com.jerboa.ui.theme.MARKDOWN_BAR_ICON_SIZE
import com.jerboa.ui.theme.MEDIUM_PADDING
import com.jerboa.ui.theme.PROFILE_BANNER_SIZE
import com.jerboa.ui.theme.muted
@@ -155,7 +160,10 @@ fun PersonProfileHeader(
onBack: (() -> Unit)? = null,
isLoggedIn: () -> Boolean,
siteVersion: String,
+ matrixId: String?,
) {
+ val ctx = LocalContext.current
+
var showSortOptions by remember { mutableStateOf(false) }
var showTopOptions by remember { mutableStateOf(false) }
var showMoreOptions by remember { mutableStateOf(false) }
@@ -247,6 +255,9 @@ fun PersonProfileHeader(
showMoreOptions = false
onMessagePersonClick()
},
+ openMatrix = matrixId?.let {
+ { openMatrix(matrixId, ctx) }
+ },
)
}
}
@@ -278,6 +289,7 @@ fun PersonProfileMoreDropdown(
onBlockPersonClick: () -> Unit,
onReportPersonClick: () -> Unit,
onMessagePersonClick: () -> Unit,
+ openMatrix: (() -> Unit)?,
) {
DropdownMenu(
expanded = expanded,
@@ -288,6 +300,22 @@ fun PersonProfileMoreDropdown(
onClick = onMessagePersonClick,
icon = Icons.Outlined.Message,
)
+
+ if (openMatrix != null) {
+ MenuItem(
+ text = stringResource(R.string.matrix_send_msg),
+ icon = {
+ Icon(
+ painter = painterResource(R.drawable.matrix_favicon),
+ contentDescription = null,
+ modifier = Modifier.size(MARKDOWN_BAR_ICON_SIZE),
+ )
+ },
+ onClick = openMatrix,
+ )
+ }
+
+ Divider()
MenuItem(
text = stringResource(R.string.person_profile_block_person),
onClick = onBlockPersonClick,
diff --git a/app/src/main/java/com/jerboa/ui/components/person/PersonProfileActivity.kt b/app/src/main/java/com/jerboa/ui/components/person/PersonProfileActivity.kt
index b4f883ab1..695622036 100644
--- a/app/src/main/java/com/jerboa/ui/components/person/PersonProfileActivity.kt
+++ b/app/src/main/java/com/jerboa/ui/components/person/PersonProfileActivity.kt
@@ -190,18 +190,19 @@ fun PersonProfileActivity(
ApiState.Loading, ApiState.Refreshing -> {
// Prevents tabs from jumping around during loading/refreshing
PersonProfileHeader(
- scrollBehavior = scrollBehavior,
personName = ctx.getString(R.string.loading),
myProfile = false,
- selectedSortType = personProfileViewModel.sortType,
onClickSortType = {},
onBlockPersonClick = {},
onReportPersonClick = {},
onMessagePersonClick = {},
+ selectedSortType = personProfileViewModel.sortType,
openDrawer = ::openDrawer,
+ scrollBehavior = scrollBehavior,
onBack = onBack,
isLoggedIn = { false },
siteVersion = siteViewModel.siteVersion(),
+ matrixId = null,
)
}
is ApiState.Holder -> {
@@ -267,6 +268,7 @@ fun PersonProfileActivity(
onBack = onBack,
isLoggedIn = { !account.isAnon() },
siteVersion = siteViewModel.siteVersion(),
+ matrixId = person.matrix_user_id,
)
}
else -> {}
diff --git a/app/src/main/res/drawable/matrix_favicon.xml b/app/src/main/res/drawable/matrix_favicon.xml
new file mode 100644
index 000000000..3edab4cbc
--- /dev/null
+++ b/app/src/main/res/drawable/matrix_favicon.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 25b51a078..ce81cd4d4 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -412,4 +412,5 @@
Open link in external
No activity (app) found that can open this link
Insert spoiler
+ Connect on Matrix