A cheap attempt at a native Bluesky client for Android
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

ShowSkeet: show "see more" placeholder

geesawra 88e49b8b 88f0ce68

+57 -10
+44 -2
app/src/main/java/industries/geesawra/monarch/ShowSkeets.kt
··· 2 2 3 3 import androidx.compose.foundation.layout.Arrangement 4 4 import androidx.compose.foundation.layout.Box 5 + import androidx.compose.foundation.layout.Column 5 6 import androidx.compose.foundation.layout.fillMaxSize 6 7 import androidx.compose.foundation.layout.fillMaxWidth 8 + import androidx.compose.foundation.layout.height 7 9 import androidx.compose.foundation.layout.padding 8 10 import androidx.compose.foundation.layout.width 9 11 import androidx.compose.foundation.lazy.LazyColumn 10 12 import androidx.compose.foundation.lazy.LazyListState 11 13 import androidx.compose.foundation.lazy.rememberLazyListState 14 + import androidx.compose.foundation.shape.RoundedCornerShape 12 15 import androidx.compose.material3.CircularProgressIndicator 16 + import androidx.compose.material3.MaterialTheme 17 + import androidx.compose.material3.OutlinedCard 18 + import androidx.compose.material3.Text 19 + import androidx.compose.material3.VerticalDivider 13 20 import androidx.compose.runtime.Composable 14 21 import androidx.compose.runtime.LaunchedEffect 15 22 import androidx.compose.runtime.derivedStateOf ··· 17 24 import androidx.compose.runtime.remember 18 25 import androidx.compose.ui.Alignment 19 26 import androidx.compose.ui.Modifier 27 + import androidx.compose.ui.draw.clip 20 28 import androidx.compose.ui.unit.dp 21 29 import industries.geesawra.monarch.datalayer.SkeetData 22 30 import industries.geesawra.monarch.datalayer.TimelineViewModel ··· 44 52 ) { 45 53 viewModel.uiState.skeets.forEach { skeet -> 46 54 item(key = skeet.key()) { 47 - skeet.root()?.let { 55 + val root = skeet.root() 56 + val (parent, parentsParent) = skeet.parent() 57 + root?.let { 48 58 SkeetView( 49 59 viewModel = viewModel, 50 60 skeet = it, ··· 52 62 inThread = true 53 63 ) 54 64 } 55 - skeet.parent()?.let { 65 + 66 + parent?.let { 67 + if (parentsParent?.cid != root?.cid) { 68 + OutlinedCard( 69 + modifier = Modifier 70 + .height(50.dp) 71 + .padding(8.dp) 72 + .fillMaxWidth() 73 + ) { 74 + Column( 75 + modifier = Modifier 76 + .fillMaxSize() 77 + .padding(start = 8.dp), 78 + verticalArrangement = Arrangement.Center 79 + ) { 80 + Text( 81 + text = "See more", 82 + color = MaterialTheme.colorScheme.onSurfaceVariant 83 + ) 84 + } 85 + } 86 + 87 + VerticalDivider( 88 + thickness = 4.dp, 89 + modifier = Modifier 90 + .height(50.dp) 91 + .padding(start = (16 + 25).dp) 92 + .clip(RoundedCornerShape(12.dp)) 93 + ) 94 + } 95 + 56 96 SkeetView( 57 97 viewModel = viewModel, 58 98 skeet = it, ··· 60 100 inThread = true 61 101 ) 62 102 } 103 + 104 + 63 105 SkeetView(viewModel = viewModel, skeet = skeet, onReplyTap = onReplyTap) 64 106 } 65 107 }
+2 -1
app/src/main/java/industries/geesawra/monarch/SkeetView.kt
··· 57 57 ) { 58 58 val minSize = 55.dp 59 59 60 - val hasParent = skeet.parent() != null 60 + val (parent, _) = skeet.parent() 61 + val hasParent = parent != null 61 62 62 63 Surface( 63 64 color = MaterialTheme.colorScheme.surface,
+1 -1
app/src/main/java/industries/geesawra/monarch/TimelinePostActionsView.kt
··· 103 103 VerticalDivider( 104 104 thickness = 4.dp, 105 105 modifier = Modifier 106 - .padding(start = 25.dp, top = 8.dp) 106 + .padding(start = 25.dp, top = 4.dp) 107 107 .clip(RoundedCornerShape(12.dp)) 108 108 ) 109 109
+10 -6
app/src/main/java/industries/geesawra/monarch/datalayer/Models.kt
··· 143 143 ) 144 144 } 145 145 146 - fun parent(): SkeetData? { 146 + fun parent(): Pair<SkeetData?, StrongRef?> { 147 147 val rawParent = this.reply?.parent 148 148 return when (rawParent) { 149 149 is ReplyRefParentUnion.BlockedPost -> SkeetData( 150 150 authorName = "Blocked", 151 151 uri = rawParent.value.uri, 152 152 blocked = rawParent.value.blocked 153 - ) 153 + ) to null 154 154 155 155 is ReplyRefParentUnion.NotFoundPost -> SkeetData( 156 156 authorName = "Post not found", 157 157 uri = rawParent.value.uri, 158 158 notFound = rawParent.value.notFound 159 - ) 159 + ) to null 160 160 161 - is ReplyRefParentUnion.PostView -> fromPostView(rawParent.value) 161 + is ReplyRefParentUnion.PostView -> { 162 + val content: Post = (rawParent.value.record.decodeAs()) 162 163 163 - else -> null 164 + fromPostView(rawParent.value) to content.reply?.parent 165 + } 166 + 167 + else -> null to null 164 168 } 165 169 } 166 170 167 171 fun root(): SkeetData? { 168 - val p = this.parent() 172 + val (p, _) = this.parent() 169 173 170 174 val rawRoot = this.reply?.root 171 175 val r = when (rawRoot) {