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

Configure Feed

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

*: Show appview name in feeds drawer header

Display "via Bluesky" or "via Blacksky" (or the domain for unknown
appviews) under the "Feeds" title in the navigation rail drawer so
users know which appview they're connected through.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

geesawra f4f94e13 1b07739d

+23 -6
+12 -6
app/src/main/java/industries/geesawra/monarch/MainView.kt
··· 274 274 Row(modifier = Modifier.fillMaxSize()) { 275 275 ModalWideNavigationRail( 276 276 header = { 277 - Text( 278 - text = "Feeds", 279 - modifier = Modifier.padding(start = 16.dp), 280 - fontWeight = FontWeight.Bold, 281 - style = MaterialTheme.typography.titleLarge 282 - ) 277 + Column(modifier = Modifier.padding(start = 16.dp)) { 278 + Text( 279 + text = "Feeds", 280 + fontWeight = FontWeight.Bold, 281 + style = MaterialTheme.typography.titleLarge 282 + ) 283 + Text( 284 + text = "via ${timelineViewModel.appviewName()}", 285 + style = MaterialTheme.typography.labelSmall, 286 + color = MaterialTheme.colorScheme.onSurfaceVariant, 287 + ) 288 + } 283 289 }, 284 290 hideOnCollapse = true, 285 291 state = drawerState,
+10
app/src/main/java/industries/geesawra/monarch/datalayer/Bluesky.kt
··· 249 249 var session: SessionData? = null 250 250 var createMutex: Mutex = Mutex() 251 251 var pdsURL: String? = null 252 + var appviewProxy: String? = null 253 + 254 + fun appviewName(): String { 255 + return when (appviewProxy) { 256 + "did:web:api.bsky.app#bsky_appview" -> "Bluesky" 257 + "did:web:api.blacksky.community#bsky_appview" -> "Blacksky" 258 + else -> appviewProxy?.substringAfter("did:web:")?.substringBefore("#") ?: "Unknown" 259 + } 260 + } 252 261 253 262 // Label cache: maps "labelerDid:labelVal" -> display name/description, and labelerDid -> avatar URL 254 263 private var labelDisplayNames: Map<String, String> = emptyMap() ··· 577 586 return Result.failure(it) 578 587 } 579 588 this.pdsURL = pdsURL 589 + this.appviewProxy = appviewProxy 580 590 581 591 this.pdsClient = mkPdsClient(pdsURL, sessionData) 582 592 this.client = mkClient(
+1
app/src/main/java/industries/geesawra/monarch/datalayer/TimelineViewModel.kt
··· 111 111 private var timelineFetchJob: Job? = null 112 112 private var notificationsFetchJob: Job? = null 113 113 114 + fun appviewName(): String = bskyConn.appviewName() 114 115 fun labelDisplayName(label: Label): String = bskyConn.labelDisplayName(label) 115 116 fun labelDescription(label: Label): String? = bskyConn.labelDescription(label) 116 117 fun labelerAvatar(label: Label): String? = bskyConn.labelerAvatar(label)