Skip to content

Commit

Permalink
WIP compose openURL dialog
Browse files Browse the repository at this point in the history
  • Loading branch information
alansley committed Aug 27, 2024
1 parent 5df981b commit 2aa58f4
Show file tree
Hide file tree
Showing 2 changed files with 126 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,12 @@ import android.text.util.Linkify
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import android.widget.Toast
import androidx.annotation.ColorInt
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.graphics.ColorUtils
import androidx.core.text.getSpans
Expand Down Expand Up @@ -40,7 +44,14 @@ import org.thoughtcrime.securesms.database.model.MmsMessageRecord
import org.thoughtcrime.securesms.database.model.SmsMessageRecord
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestManager
import org.thoughtcrime.securesms.copyURLToClipboard
import org.thoughtcrime.securesms.openUrl
import org.thoughtcrime.securesms.showOpenUrlDialog
import org.thoughtcrime.securesms.ui.AlertDialog
import org.thoughtcrime.securesms.ui.DialogButtonModel
import org.thoughtcrime.securesms.ui.GetString
import org.thoughtcrime.securesms.ui.OpenURLAlertDialog
import org.thoughtcrime.securesms.ui.theme.LocalColors
import org.thoughtcrime.securesms.util.GlowViewUtilities
import org.thoughtcrime.securesms.util.SearchUtil
import org.thoughtcrime.securesms.util.getAccentColor
Expand All @@ -60,6 +71,7 @@ class VisibleMessageContentView : ConstraintLayout {
// endregion

// region Updating
@Composable
fun bind(
message: MessageRecord,
isStartOfMessageCluster: Boolean = true,
Expand Down Expand Up @@ -273,6 +285,7 @@ class VisibleMessageContentView : ConstraintLayout {
// region Convenience
companion object {

@Composable
fun getBodySpans(context: Context, message: MessageRecord, searchQuery: String?): Spannable {
var body = message.body.toSpannable()

Expand All @@ -293,8 +306,14 @@ class VisibleMessageContentView : ConstraintLayout {
body.getSpans<URLSpan>(0, body.length).toList().forEach { urlSpan ->
val updatedUrl = urlSpan.url.let { it.toHttpUrlOrNull().toString() }
val replacementSpan = ModalURLSpan(updatedUrl) { url ->
val activity = context as AppCompatActivity
activity.showOpenUrlDialog(url)

// @Thomas - PREVIOUS CODE WAS:
//val activity = context as AppCompatActivity
//activity.showOpenUrlDialog(url)

// Now attempting to use compose for the dialog - but it's not happy =/
OpenURLWarningDialog(url)

}
val start = body.getSpanStart(urlSpan)
val end = body.getSpanEnd(urlSpan)
Expand All @@ -305,6 +324,35 @@ class VisibleMessageContentView : ConstraintLayout {
return body
}

@Composable
private fun OpenURLWarningDialog(url: String) {
val context = LocalContext.current

OpenURLAlertDialog(
title = stringResource(R.string.urlOpen),
text = stringResource(R.string.urlOpenDescription),
showCloseButton = true, // display the 'x' button
buttons = listOf(
DialogButtonModel(
text = GetString(R.string.open),
contentDescription = GetString(R.string.AccessibilityId_urlOpenBrowser),
color = LocalColors.current.danger,
onClick = { context.openUrl(url) }
),
DialogButtonModel(
text = GetString(android.R.string.copyUrl),
contentDescription = GetString(R.string.AccessibilityId_copy),
onClick = {
context.copyURLToClipboard(url)
Toast.makeText(context, R.string.copied, Toast.LENGTH_SHORT).show()
}
)
),
url = url,
onDismissRequest = {}
)
}

@ColorInt
fun getTextColor(context: Context, message: MessageRecord): Int = context.getColorFromAttr(
if (message.isOutgoing) R.attr.message_sent_text_color else R.attr.message_received_text_color
Expand Down
86 changes: 76 additions & 10 deletions app/src/main/java/org/thoughtcrime/securesms/ui/AlertDialog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.material3.BasicAlertDialog
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
Expand All @@ -29,6 +28,7 @@ import androidx.compose.ui.graphics.takeOrElse
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import network.loki.messenger.R
Expand Down Expand Up @@ -57,7 +57,8 @@ fun AlertDialog(
text: String? = null,
buttons: List<DialogButtonModel>? = null,
showCloseButton: Boolean = false,
content: @Composable () -> Unit = {}
content: @Composable () -> Unit = {},
optionalURL: String = ""
) {
BasicAlertDialog(
modifier = modifier,
Expand Down Expand Up @@ -88,19 +89,32 @@ fun AlertDialog(
) {
title?.let {
Text(
it,
text = it,
textAlign = TextAlign.Center,
style = LocalType.current.h7,
modifier = Modifier.padding(bottom = LocalDimensions.current.xxsSpacing)
)
}
text?.let {
Text(
it,
textAlign = TextAlign.Center,
style = LocalType.current.large,
modifier = Modifier.padding(bottom = LocalDimensions.current.xxsSpacing)
)
if (optionalURL.isNotEmpty()) {
// If this is an open URL dialog it should have a maximum height of 5 lines and truncate long URLs with an ellipsis
Text(
text = it,
textAlign = TextAlign.Center,
style = LocalType.current.large,
modifier = Modifier.padding(bottom = LocalDimensions.current.xxsSpacing),
maxLines = 5,
overflow = TextOverflow.Ellipsis
)
} else {
// Otherwise it should be a regular, non-open-URL dialog
Text(
text = it,
textAlign = TextAlign.Center,
style = LocalType.current.large,
modifier = Modifier.padding(bottom = LocalDimensions.current.xxsSpacing)
)
}
}
content()
}
Expand All @@ -127,6 +141,30 @@ fun AlertDialog(
)
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun OpenURLAlertDialog(
onDismissRequest: () -> Unit,
modifier: Modifier = Modifier,
title: String? = null,
text: String? = null,
buttons: List<DialogButtonModel>? = null,
showCloseButton: Boolean = false,
content: @Composable () -> Unit = {},
url: String = ""
) {
AlertDialog(
onDismissRequest = onDismissRequest,
modifier = modifier,
title = title,
text = text,
buttons = buttons,
showCloseButton = showCloseButton,
content = content,
optionalURL = url
)
}

@Composable
fun DialogButton(
text: String,
Expand Down Expand Up @@ -224,7 +262,8 @@ fun PreviewSimpleDialog() {
DialogButtonModel(
GetString(stringResource(R.string.cancel))
)
)
),
optionalURL = "https://slashdot.org"
)
}
}
Expand Down Expand Up @@ -254,6 +293,33 @@ fun PreviewXCloseDialog() {
}
}

@Preview
@Composable
fun PreviewOpenURLDialog() {
PreviewTheme {
OpenURLAlertDialog(
title = stringResource(R.string.urlOpen),
text = stringResource(R.string.urlOpenDescription),
showCloseButton = true, // display the 'x' button
buttons = listOf(
DialogButtonModel(
text = GetString(R.string.open),
contentDescription = GetString(R.string.AccessibilityId_urlOpenBrowser),
color = LocalColors.current.danger,
onClick = {}
),
DialogButtonModel(
text = GetString(android.R.string.copyUrl),
contentDescription = GetString(R.string.AccessibilityId_copy),
onClick = {}
)
),
url = "http://slashdot.org",
onDismissRequest = {}
)
}
}

@Preview
@Composable
fun PreviewLoadingDialog() {
Expand Down

0 comments on commit 2aa58f4

Please sign in to comment.