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.

*: Fix appview radio button reactivity, dismiss keyboard with compose view

- Track appview proxy as local mutable state so radio buttons update
immediately on selection
- Clear focus (dismiss keyboard) alongside hiding bottom sheet on back

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

geesawra 548c187e 8e4d6735

+7 -1
+3
app/src/main/java/industries/geesawra/monarch/MainView.kt
··· 6 6 import androidx.activity.compose.BackHandler 7 7 import androidx.compose.foundation.ExperimentalFoundationApi 8 8 import androidx.compose.foundation.combinedClickable 9 + import androidx.compose.ui.platform.LocalFocusManager 9 10 import androidx.annotation.StringRes 10 11 import androidx.compose.animation.AnimatedVisibility 11 12 import androidx.compose.animation.core.animate ··· 153 154 onFirstLoad() 154 155 } 155 156 157 + val focusManager = LocalFocusManager.current 156 158 BackHandler(enabled = scaffoldState.bottomSheetState.isVisible) { 159 + focusManager.clearFocus() 157 160 coroutineScope.launch { 158 161 scaffoldState.bottomSheetState.hide() 159 162 }
+4 -1
app/src/main/java/industries/geesawra/monarch/SettingsView.kt
··· 242 242 "Bluesky" to "did:web:api.bsky.app#bsky_appview", 243 243 "Blacksky" to "did:web:api.blacksky.community#bsky_appview", 244 244 ) 245 - val currentProxy = timelineViewModel.appviewProxy() ?: "" 245 + var currentProxy by remember { mutableStateOf(timelineViewModel.appviewProxy() ?: "") } 246 246 var showCustomDialog by remember { mutableStateOf(false) } 247 247 248 248 knownAppviews.forEach { (name, did) -> ··· 254 254 selected = currentProxy == did, 255 255 onClick = { 256 256 if (currentProxy != did) { 257 + currentProxy = did 257 258 timelineViewModel.changeAppview(did) 258 259 } 259 260 } ··· 261 262 }, 262 263 modifier = Modifier.clickable { 263 264 if (currentProxy != did) { 265 + currentProxy = did 264 266 timelineViewModel.changeAppview(did) 265 267 } 266 268 } ··· 308 310 TextButton( 309 311 onClick = { 310 312 if (customDid.isNotBlank()) { 313 + currentProxy = customDid.trim() 311 314 timelineViewModel.changeAppview(customDid.trim()) 312 315 showCustomDialog = false 313 316 }