diff --git a/android/proguard-rules.pro b/android/proguard-rules.pro index a0cd8454..5cfb82e5 100644 --- a/android/proguard-rules.pro +++ b/android/proguard-rules.pro @@ -1,2 +1,7 @@ -dontobfuscate -keepattributes SourceFile, LineNumberTable + +# Keep Glance ActionCallback classes for reflection +-keep class * implements androidx.glance.action.ActionCallback { + public (); +} diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/glance/OpenUrlCallback.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/glance/OpenUrlCallback.kt new file mode 100644 index 00000000..54982fc2 --- /dev/null +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/glance/OpenUrlCallback.kt @@ -0,0 +1,31 @@ +/* + * Copyright © Harsh Shandilya. + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/MIT. + */ +package dev.msfjarvis.claw.android.glance + +import android.content.Context +import android.content.Intent +import androidx.core.net.toUri +import androidx.glance.GlanceId +import androidx.glance.action.ActionParameters +import androidx.glance.appwidget.action.ActionCallback + +class OpenUrlCallback : ActionCallback { + override suspend fun onAction( + context: Context, + glanceId: GlanceId, + parameters: ActionParameters, + ) { + val url = parameters[urlKey] ?: return + val intent = + Intent(Intent.ACTION_VIEW, url.toUri()).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } + context.startActivity(intent) + } + + companion object { + val urlKey = ActionParameters.Key("url") + } +} diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/glance/WidgetListEntry.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/glance/WidgetListEntry.kt index 50a26420..30f1ace6 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/glance/WidgetListEntry.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/glance/WidgetListEntry.kt @@ -6,11 +6,9 @@ */ package dev.msfjarvis.claw.android.glance -import android.content.Intent import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.unit.dp -import androidx.core.net.toUri import androidx.glance.GlanceComposable import androidx.glance.GlanceModifier import androidx.glance.GlanceTheme @@ -20,7 +18,7 @@ import androidx.glance.action.ActionParameters.Key import androidx.glance.action.actionParametersOf import androidx.glance.action.actionStartActivity import androidx.glance.action.clickable -import androidx.glance.appwidget.action.actionStartActivity +import androidx.glance.appwidget.action.actionRunCallback import androidx.glance.appwidget.cornerRadius import androidx.glance.background import androidx.glance.layout.Alignment @@ -43,10 +41,9 @@ fun WidgetListEntry(post: UIPost, modifier: GlanceModifier = GlanceModifier) { val titleStyle = MaterialTheme.typography.titleMedium val commentsAction = actionStartActivity(actionParametersOf(destinationKey to post.shortId)) - // If the URL starts with a /, it's a relative URL and we should open the comments page directly. val postAction = if (post.url.startsWith('/')) commentsAction - else actionStartActivity(Intent(Intent.ACTION_VIEW, post.url.toUri())) + else actionRunCallback(actionParametersOf(OpenUrlCallback.urlKey to post.url)) Box(modifier.padding(8.dp)) { Row( verticalAlignment = Alignment.CenterVertically,