androidbooster-ui-compose — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited androidbooster-ui-compose (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Use reusable Compose list components from core/ui:
com.huhx0015.androidbooster.model.DataItemcom.huhx0015.androidbooster.ui.compose.components.ComposeDataColumncom.huhx0015.androidbooster.ui.compose.components.ComposeDataRowDataItem is the shared model contract:
sealed interface DataItem {
val id: Long
}Any list item model must implement DataItem so lazy list keys can use id.
Pass these state values to either component:
items: List<T> where T : DataItemisInitialLoading: Boolean for first-load/forced-refresh full replacement spinnerisRefreshing: Boolean for pull-to-refresh active stateisLoadingMore: Boolean for pagination footer spinneronRefresh: () -> Unit for pull-to-refresh actiononLoadMore: () -> Unit for endless-scroll paginationprogressColor: Color for all progress indicatorsisInitialLoading is true, list content is replaced with a centered spinner.onLoadMore.isLoadingMore is true, a loading footer is shown at list end.progressColor.import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import com.huhx0015.androidbooster.ui.compose.components.ComposeDataColumn
import com.huhx0015.androidbooster.model.DataItem
data class UserUiItem(
override val id: Long,
val title: String
) : DataItem
@Composable
fun UsersColumn(
items: List<UserUiItem>,
isInitialLoading: Boolean,
isRefreshing: Boolean,
isLoadingMore: Boolean,
onRefresh: () -> Unit,
onLoadMore: () -> Unit
) {
ComposeDataColumn(
items = items,
isInitialLoading = isInitialLoading,
isRefreshing = isRefreshing,
isLoadingMore = isLoadingMore,
onRefresh = onRefresh,
onLoadMore = onLoadMore,
progressColor = Color.Magenta
) { item ->
// Render each item
}
}Use ComposeDataRow with the same state contract for horizontal lists.
When using ComposeDataColumn in an Activity-driven MVI screen:
BaseActivity + setContent { ... } from androidx.activity.compose.setContent.StateFlow in composition using collectAsState().onRefresh, onLoadMore) to ViewModel intents via sendIntent(...).LaunchedEffect(viewModel) and handle UI side effects there.ShowMessage-style events, use a SnackbarHostState + Scaffold.Reference shape:
setContent {
val state by viewModel.state.collectAsState()
val snackbarHostState = remember { SnackbarHostState() }
LaunchedEffect(viewModel) {
viewModel.events.collect { event ->
when (event) {
is ComposeDataEvent.ShowMessage -> snackbarHostState.showSnackbar(event.message)
}
}
}
Scaffold(
snackbarHost = { SnackbarHost(snackbarHostState) }
) { innerPadding ->
ComposeDataScreen(
state = state,
onIntent = viewModel::sendIntent,
modifier = Modifier.padding(innerPadding)
)
}
}~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.