fix: use actionRunCallback to launch browser from widget

Fixes COMPOSE-LOBSTERS-8M
This commit is contained in:
Harsh Shandilya
2025-12-30 14:12:53 +05:30
parent 7c7c217f8b
commit b3373473a7
3 changed files with 38 additions and 5 deletions
+5
View File
@@ -1,2 +1,7 @@
-dontobfuscate
-keepattributes SourceFile, LineNumberTable
# Keep Glance ActionCallback classes for reflection
-keep class * implements androidx.glance.action.ActionCallback {
public <init>();
}
@@ -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<String>("url")
}
}
@@ -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<MainActivity>(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<OpenUrlCallback>(actionParametersOf(OpenUrlCallback.urlKey to post.url))
Box(modifier.padding(8.dp)) {
Row(
verticalAlignment = Alignment.CenterVertically,