A cheap attempt at a native Bluesky client for Android

SkeetView: Allow navigating to quoted skeet's thread

Previously, tapping on a quoted skeet within another skeet would navigate to the thread of the top-level skeet. This change correctly passes the `onShowThread` handler down through nested and embedded skeets.

Now, tapping on a quoted skeet will navigate to the thread for that specific skeet, as intended. This also fixes an issue where tapping a "see more" link on a quoted skeet would incorrectly show the parent's thread.

+35 -20
+7 -7
app/src/main/java/industries/geesawra/monarch/ShowSkeets.kt
··· 68 68 skeet = it, 69 69 onReplyTap = onReplyTap, 70 70 inThread = true, 71 - onShowThread = { 71 + onShowThread = { skeet -> 72 72 if (onSeeMoreTap != null) { 73 - viewModel.setThread(root) 74 - onSeeMoreTap(root) 73 + viewModel.setThread(skeet) 74 + onSeeMoreTap(skeet) 75 75 } 76 76 } 77 77 ) ··· 103 103 skeet = it, 104 104 onReplyTap = onReplyTap, 105 105 inThread = true, 106 - onShowThread = { 106 + onShowThread = { skeet -> 107 107 if (onSeeMoreTap != null) { 108 - viewModel.setThread(parent) 109 - onSeeMoreTap(parent) 108 + viewModel.setThread(skeet) 109 + onSeeMoreTap(skeet) 110 110 } 111 111 } 112 112 ) ··· 119 119 skeet = skeet, 120 120 onReplyTap = onReplyTap, 121 121 showInReplyTo = parent == null, 122 - onShowThread = { 122 + onShowThread = { skeet -> 123 123 if (onSeeMoreTap != null) { 124 124 viewModel.setThread(skeet) 125 125 onSeeMoreTap(skeet)
+28 -13
app/src/main/java/industries/geesawra/monarch/SkeetView.kt
··· 4 4 5 5 import android.content.Context 6 6 import android.net.Uri 7 + import android.util.Log 7 8 import androidx.browser.customtabs.CustomTabsIntent 8 9 import androidx.compose.foundation.background 9 10 import androidx.compose.foundation.clickable ··· 91 92 .padding(top = 8.dp, start = 16.dp, end = 16.dp) 92 93 .background(Color.Transparent) 93 94 .clickable { 95 + Log.d("SkeetView", skeet.content) 94 96 onShowThread(skeet) 95 97 } 96 98 ) { ··· 127 129 SkeetHeader(modifier = Modifier.padding(start = 16.dp), skeet = skeet) 128 130 } 129 131 130 - SkeetContent(skeet, nested, disableEmbeds) 132 + SkeetContent(skeet, nested, disableEmbeds, onShowThread) 131 133 132 134 if (!nested && !disableEmbeds) { 133 135 TimelinePostActionsView( ··· 151 153 skeet: SkeetData, 152 154 nested: Boolean = false, 153 155 disableEmbeds: Boolean = false, 156 + onShowThread: (SkeetData) -> Unit 154 157 ) { 155 158 val context = LocalContext.current 156 159 ··· 166 169 return 167 170 } 168 171 169 - Embeds(context, nested, skeet.embed) 172 + Embeds(context, nested, skeet.embed, onShowThread) 170 173 } 171 174 172 175 @Composable 173 - fun Embeds(context: Context, nested: Boolean, embed: PostViewEmbedUnion?) { 176 + fun Embeds( 177 + context: Context, 178 + nested: Boolean, 179 + embed: PostViewEmbedUnion?, 180 + onShowThread: (SkeetData) -> Unit 181 + ) { 174 182 when (embed) { 175 183 is PostViewEmbedUnion.ImagesView -> { 176 184 ImageView(embed.value.images) ··· 194 202 ) { 195 203 RecordView( 196 204 modifier = Modifier.padding(top = 8.dp, bottom = 8.dp), 197 - embed.value 205 + embed.value, 206 + onShowThread = onShowThread, 198 207 ) 199 208 } 200 209 } ··· 211 220 is RecordWithMediaViewMediaUnion.VideoView -> PostViewEmbedUnion.VideoView(media.value) 212 221 } 213 222 214 - Embeds(context, false, mediaValue) 223 + Embeds(context, false, mediaValue, onShowThread) 215 224 216 225 OutlinedCard( 217 226 modifier = Modifier.padding(top = 8.dp) 218 227 ) { 219 228 RecordWithMediaView( 220 229 modifier = Modifier.padding(top = 8.dp, bottom = 8.dp), 221 - embed.value 230 + embed.value, 231 + onShowThread = onShowThread, 222 232 ) 223 233 } 224 234 } ··· 356 366 @Composable 357 367 private fun RecordView( 358 368 modifier: Modifier = Modifier, 359 - rv: RecordView 369 + rv: RecordView, 370 + onShowThread: (SkeetData) -> Unit 360 371 ) { 361 372 val rv = rv.record 362 373 when (rv) { 374 + is RecordViewRecordUnion.ViewBlocked -> SkeetData(blocked = true) 375 + is RecordViewRecordUnion.ViewNotFound -> SkeetData(notFound = true) 363 376 is RecordViewRecordUnion.ViewRecord -> { 377 + val s = SkeetData.fromRecordView(rv.value) 364 378 SkeetView( 365 - modifier = modifier, 366 379 viewModel = null, 367 - skeet = SkeetData.fromRecordView(rv.value), 368 - nested = true 380 + skeet = s, 381 + nested = true, 382 + onShowThread = onShowThread 369 383 ) 370 384 } 371 385 ··· 376 390 @Composable 377 391 private fun RecordWithMediaView( 378 392 modifier: Modifier = Modifier, 379 - rv: RecordWithMediaView 393 + rv: RecordWithMediaView, 394 + onShowThread: (SkeetData) -> Unit 380 395 ) { 381 396 val rv = rv.record.record 382 397 val record = when (rv) { ··· 393 408 394 409 record?.let { 395 410 SkeetView( 396 - modifier = modifier, 397 411 viewModel = null, 398 412 skeet = record, 399 - nested = true 413 + nested = true, 414 + onShowThread = onShowThread 400 415 ) 401 416 } 402 417 }