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