Skip to content
CAI
Software that uses CAICheck a score

utsmannn/store-apps-mvvm

47.8

Weak · 21 September 2026

6.6k

lines of production code

Kotlin

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is an Android application designed for browsing, downloading, and installing APKs, featuring a modernized architecture built with Hilt and Jetpack components. It provides a user interface for searching and managing applications, with local persistence for downloads, search history, and error logs. The system also includes utility scripts for Android emulator root access and a centralized library for common UI extensions.

Features

Add download management and search features to the listing feature

The listing feature now includes a new 'Downloaded' section to track and manage downloaded applications, complete with a dedicated fragment, view model, and list adapter that supports multiple item types (progress, downloaded, installed) and dividers. A 'Categories' view has been added to the home screen to browse apps by category. Additionally, a new 'Search' activity allows users to search for apps, with recent queries persisted and displayed as chips. The implementation also introduces domain use cases for managing downloaded apps, installed apps, and recent queries, wired together via Hilt dependency injection.

feature/listing · high confidence

Added Android emulator root and shell scripts with SuperSU v2.82

The emu\_tools directory now includes shell scripts (1\_emu\_run\_writable\_system.sh, 2\_emu\_adb\_setup\_root.sh, 3\_emu\_shell\_setup\_root.sh) that automate the process of launching an Android emulator with a writable system partition and establishing root access using SuperSU v2.82. These scripts handle ADB root, remounting the system partition, and installing the SuperSU binaries and daemons. The directory also contains the full SuperSU v2.82 package, including the update-binary installer script, APK, and various configuration files for different Android API levels and architectures.

_emu\tools · high confidence

Added debug APK build metadata

A new file, apk/debug/output-metadata.json, has been added to the repository. This JSON file contains metadata about the debug APK build, including the application ID (com.utsman.storeApps), the variant name (processDebugResources), and the output file name (app-debug.apk). This metadata is typically generated by the Android build system to track build artifacts.

apk · high confidence

Centralized UI and utility extensions in the abstraction library

The \libraries/abstraction\ module has been significantly expanded with a new suite of Kotlin extension functions and Android resource files to support common UI and utility patterns. New extension files (\ext\_binding.kt\, \ext\_detail.kt\, \ext\_di.kt\, \ext\_drawable.kt\, \ext\_intent.kt\, \ext\_keyboard.kt\, \ext\_list.kt\, \ext\_permission.kt\, \ext\_textview.kt\, \ext\_view.kt\) provide helpers for view binding, navigation, dependency injection, drawable tinting, intent handling, keyboard management, and list states. Additionally, new layout resources (\item\_list\_empty.xml\, \item\_list\_loader.xml\, \initial\_loader.xml\) and drawable selectors (\bg\_fill\_active.xml\, \bg\_fill\_inactive.xml\, \selector\_btn.xml\) have been added to standardize loading, error, and empty states across the application. The \PagingStateAdapter\ and related resources have been moved from the \feature/listing\ module to \libraries/abstraction\ to promote reuse.

libraries/abstraction · high confidence

Introduce the Detail feature for app information and downloads

The app now includes a new 'Detail' feature that allows users to view comprehensive information about an application, including its icon, title, version, and developer. Users can browse app graphics in a full-screen dialog, read the full description, and view a list of required permissions. The feature also supports downloading and installing APKs, with the UI dynamically updating the action button to show 'Download', 'Update', 'Open', or 'Install' based on the app's current state. This includes a dedicated ViewModel, use cases for fetching data and managing downloads, and UI components like adapters and layouts for the detail screen.

feature/detail · high confidence

Introduces local storage for downloads, queries, and error logs

The app now persists data locally using Room databases. Three new databases are introduced: CurrentDownloadDatabase for tracking active downloads, RecentQueryDatabase for search history, and ErrorLogInstallerDatabase for installation errors. These are wired into the data layer via Dagger Hilt, providing repositories that allow the app to save, retrieve, and observe the state of downloads, recent queries, and error logs.

data · high confidence

Behavioural changes

Home screen adopts paging for category lists and switches to Hilt for dependency injection

The home screen now loads category lists using AndroidX Paging, providing smoother scrolling and automatic background loading. The view model and use case have been updated to expose a \PagingData\ stream for categories, and the UI layer has been refactored to consume this stream via \PagingDataAdapter\. Additionally, the feature's dependency injection has been migrated from a manual/provider-based approach to Hilt, with \HomeModule\ now using \@InstallIn(ApplicationComponent::class)\ to provide the \HomeUseCase\ and \HomeViewModel\. This change improves the user experience by preventing UI jank during list loading and standardizing the app's architecture.

feature/home · high confidence

Major UI and architecture overhaul: new navigation, settings, and error logging

The app's main interface has been restructured from a ViewPager-based layout to a bottom navigation bar with a NavHostFragment, enabling distinct screens for Home, Categories, Download, and Updated apps. A new Options screen allows users to toggle auto-installer and maturity content filters, and clean unused APK files. Additionally, a new Error Log Installer screen displays installation failure logs, with the ability to clear them. The underlying architecture has also been updated to use Dagger Hilt for dependency injection, replacing the previous manual DI setup.

app/src · high confidence

Refactor network library dependency injection and JSON utilities

The network library's dependency injection has been refactored from a static singleton pattern to a modern approach using Kotlin's MutableStateFlow for dependency storage, and the JsonBeautifier class now accepts Moshi as a constructor argument rather than accessing it via a global module. Additionally, the Network object's builder method now explicitly requires a Moshi instance, and new extension functions have been added to the network module to handle JSON serialization and deserialization directly.

libraries/network · high confidence

Updated Gradle wrapper configuration

The Gradle wrapper properties file was modified to include a copyright header and comment block, indicating an update to the build system's configuration metadata.

gradle · medium confidence

Dependencies

Upgrade to Hilt for dependency injection and add new libraries

The project has migrated from manual dependency injection to Hilt, adding the Hilt Gradle plugin and related dependencies (hilt-android, hilt-lifecycle-viewmodel, hilt-compiler) to enable automatic injection. Additionally, the update introduces several new libraries: Jetpack Navigation (2.3.2) for navigation, WorkManager (2.4.0) for background tasks, Room (2.2.5) for local storage, DataStore (1.0.0-alpha05) for data storage, Moshi (1.11.0) for JSON parsing, and Dexter (6.2.2) for runtime permissions. The minimum SDK level has also been raised from 19 to 21.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 53 → 48 (-5.5)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 97 → 97 (+0.3)
  • Architecture 100 → 72 (-28.0)
  • Maturity 57 → 56 (-0.0)
  • Readiness 24 → 24 (+0.0)
  • Security 97 → 97 (+0.0)
  • Domain Modelling 100 → 74 (-25.6)

Resolved (9)

  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • Duplicated block (10 lines × 2) (data/src/main/java/com/utsman/data/model/dto/list/converter.kt)
  • Duplicated block (11 lines × 2) (app/src/main/java/com/utsman/storeapps/adapter/ErrorLogInstallerAdapter.kt)
  • Duplicated block (16 lines × 2) (feature/listing/src/main/java/com/utsman/listing/ui/activity/ListAppActivity.kt)
  • Duplicated block (7 lines × 2) (feature/home/src/main/java/com/utsman/home/ui/holder/AppsViewHolder.kt)
  • No exposed public API
  • Test reliability not included
  • single-maintainer — knowledge-concentration (bus factor) risk

New (12)

  • Coverage not measured — no coverage collector is wired up
  • Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
  • Documentation: no architecture or design documentation (README.md)
  • Documentation: no installation or build instructions (README.md)
  • Duplicated block (10 lines × 2) (app/src/main/java/com/utsman/storeapps/adapter/ErrorLogInstallerAdapter.kt)
  • Duplicated block (10 lines × 2) (data/src/main/java/com/utsman/data/model/dto/list/converter.kt)
  • Duplicated block (16 lines × 2) (feature/listing/src/main/java/com/utsman/listing/ui/activity/ListAppActivity.kt)
  • Duplicated block (6 lines × 2) (feature/home/src/main/java/com/utsman/home/ui/holder/AppsViewHolder.kt)
  • Duplicated block (9 lines × 4) (app/src/main/java/com/utsman/storeapps/ui/OptionsActivity.kt)
  • Hotspot: feature/detail/src/main/java/com/utsman/detail/ui/DetailActivity.kt (feature/detail/src/main/java/com/utsman/detail/ui/DetailActivity.kt)
  • MethodTooLong: DownloadAppWorker.observingDownload (data/src/main/java/com/utsman/data/worker/DownloadAppWorker.kt)
  • No ADRs found

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

utsmannn/store-apps-mvvm was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 21 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 6886dfcb037615b522556ed2c3baccf06c7cb7ed — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-fa71c66cabd8.