Skip to content
CAI
Software that uses CAICheck a score

android/nowinandroid

48.8

Weak · 5 August 2026

18.1k

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 is an Android news aggregation application that allows users to browse, search, and save content from various topics. It features a modern, offline-first architecture using Kotlin, Jetpack Compose, and Hilt, with a focus on performance optimization through baseline profiles and macro benchmarks. The system includes a comprehensive test suite covering UI, unit, and screenshot testing to ensure stability and visual consistency.

How it got here

2021–2023 — Architecture and build system modernization

63 changes.

The project underwent a comprehensive architectural overhaul, migrating the codebase to Kotlin and adopting a modern Android development stack featuring Jetpack Compose, Hilt, and Navigation3. The build system was refactored using Gradle convention plugins and a centralized version catalog to improve consistency and maintainability. Additionally, the data layer was restructured to support offline-first synchronization and improved performance through baseline profile benchmarking.

27 changes.

This period focused on migrating the app's navigation layer to the new Navigation3 API, introducing typed navigation keys, and refactoring feature modules like Bookmarks, Search, and Interests to use the new state management and Hilt dependency injection. Concurrently, new features such as the Topic screen and Settings dialog were implemented, supported by extensive unit and UI test coverage for the updated architecture.

Features

Add Apache 2.0 license header templates for KTS, XML, and Kotlin files

The project now includes standardized copyright header templates for Kotlin script (.kts), XML, and Kotlin (.kt) files. These templates, based on the Apache 2.0 license, will be used by the Spotless code formatter to automatically apply the correct license headers to new or modified files, ensuring consistent legal notices across the codebase.

spotless · high confidence

Add NiaIcons object for centralized icon management

A new \NiaIcons\ object has been added to centralize the application's icon definitions. This change introduces a single source of truth for all icon \ImageVector\s, including standard Material icons like \ArrowBack\, \ShortText\, and \Search\, as well as custom icons. This allows the app to reference icons consistently across the design system.

core/designsystem/src/main/kotlin/com/google/samples/apps/nowinandroid/core/designsystem/icon · high confidence

Add Now in Android component catalog for UI previews

A new catalog activity and UI components have been added to the app, providing a dedicated screen to preview and test various UI elements such as buttons, chips, and navigation bars. This allows developers to easily view and interact with the design system components in isolation.

app-nia-catalog/src/main/kotlin/com/google/samples/apps/niacatalog · high confidence

Added BookmarksScreen and BookmarksViewModel to implement the bookmarks feature

The bookmarks feature is now implemented with a new BookmarksScreen composable and its corresponding BookmarksViewModel. Users can view their saved articles in a staggered grid, remove bookmarks with an undo option, and track screen views. The implementation includes handling loading and empty states, managing the undo state for bookmark removals, and integrating with the core UI components for news feeds.

feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl · high confidence

Added Kokoro CI configuration for Android builds and tests

The project now includes a complete Kokoro continuous integration setup, featuring a build script that installs Java 17 and Android build tools, and executes Gradle tasks to assemble the app and instrumented test APKs. The configuration supports running Firebase Test Lab (FTL) tests on a variety of physical devices and OS versions, with retry logic for flaky tests. Separate configurations are provided for continuous, nightly, and presubmit pipelines, enabling automated testing and build verification on Google's internal CI infrastructure.

kokoro · high confidence

Added Topic screen and ViewModel for displaying topic details and associated news

Users can now view a dedicated screen for a specific topic, which displays the topic's title, description, and a list of associated news resources. The new TopicScreen composable and TopicViewModel handle the UI state and data fetching, allowing users to follow topics, bookmark news, and track their reading status.

feature/topic/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl · high confidence

Added baseline profile benchmarks for app startup and key screens

New benchmark tests have been added to automatically generate baseline profiles for the app's startup, For You, Bookmarks, and Interests screens. These profiles enable Android's Dex Layout Optimizations, which can improve cold-start performance and runtime efficiency for these critical user journeys.

benchmarks/src/main/kotlin/com/google/samples/apps/nowinandroid/baselineprofile · high confidence

Added demo data source for offline development

A new demo data source has been introduced in the core network module to provide static JSON data for development. This includes a \DemoAssetManager\ interface and a \DemoNiaNetworkDataSource\ implementation that reads from local assets (news.json, topics.json). The implementation includes a specific workaround for Android API levels 23 and below to handle JSON deserialization, ensuring the demo mode functions correctly across different device versions.

core/network/src/main/kotlin/com/google/samples/apps/nowinandroid/core/network/demo · high confidence

Added demo-specific Hilt module for sync dependencies

A new Hilt module, SyncModule, has been added to the demo source set. It binds the SyncManager and SyncSubscriber interfaces to their concrete implementations (WorkManagerSyncManager and StubSyncSubscriber respectively), providing a simplified or stubbed version of the sync functionality for the demo build variant.

sync/work/src/demo/kotlin/com/google/samples/apps/nowinandroid · high confidence

Added internal build trigger and packaging metadata for Android samples

A new file, .google/BUILDME, was added to allow internal builds to be triggered by modifying its contents. Additionally, .google/packaging.yaml was introduced to provide Google with metadata about the Android samples, including their status, technologies (such as Jetpack Compose and Coroutines), categories, and associated solutions.

.google · high confidence

Added network model classes for changes, news resources, and topics

New Kotlin data classes—NetworkChangeList, NetworkNewsResource, and NetworkTopic—were added to the core network model package. These classes define the structure for fetching change lists, news resources, and topics from the network, with NetworkTopic including a conversion function to map to the external Topic model.

core/network/src/main/kotlin/com/google/samples/apps/nowinandroid/core/network/model · high confidence

Added new Now in Android design system components

The core/designsystem component package now includes a comprehensive set of reusable UI components, including backgrounds (NiaBackground, NiaGradientBackground), buttons (NiaButton, NiaOutlinedButton, NiaTextButton), chips (NiaFilterChip), image loading (DynamicAsyncImage), icon buttons (NiaIconToggleButton), loading indicators (NiaLoadingWheel, NiaOverlayLoadingWheel), navigation elements (NiaNavigationBar, NiaNavigationRail, NiaNavigationSuiteScaffold), tabs (NiaTab, NiaTabRow), tags (NiaTopicTag), top app bars (NiaTopAppBar), and view toggles (NiaViewToggleButton). These components provide a consistent, themed interface for the app's visual design.

core/designsystem/src/main/kotlin/com/google/samples/apps/nowinandroid/core/designsystem/component · high confidence

Added new scrollbar components and utilities for lazy lists and grids

The design system now includes a new set of scrollbar components (AppScrollbars.kt, Scrollbar.kt, ScrollbarExt.kt, ThumbExt.kt, LazyScrollbarUtilities.kt) that provide interactive scrollbars for LazyList, LazyGrid, and LazyStaggeredGrid layouts. These components allow users to quickly navigate through content by dragging the scrollbar thumb, with the thumb automatically fading out when the scroll container becomes dormant. The implementation includes helper functions to calculate thumb size and position based on visible items, supporting both vertical and horizontal orientations.

core/designsystem/src/main/kotlin/com/google/samples/apps/nowinandroid/core/designsystem/component/scrollbar · high confidence

Added startup performance benchmarking for cold app launches

A new Kotlin-based macrobenchmark has been added to measure cold-startup performance across different compilation modes (none, partial with disabled baseline profile, partial with required baseline profile, and full precompilation). This enables automated measurement of app startup metrics, supporting the generation of baseline profiles to improve cold-startup performance.

benchmarks/src/main/kotlin/com/google/samples/apps/nowinandroid/startup · high confidence

Added synchronization utilities for data syncing

The core/data module now includes SyncUtilities.kt, which introduces the Synchronizer and Syncable interfaces along with a changeListSync utility function. This provides a standardized way to synchronize local data with remote sources, handling change lists, deletions, and updates while ensuring structured concurrency safety.

core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data · high confidence

Added utilities for dark mode detection and profile verification

The app now includes new utility classes to improve runtime behavior and diagnostics. A new \ProfileVerifierLogger\ component logs the status of the app's baseline profile compilation, helping developers verify if the profile is compiled or enqueued. Additionally, \UiExtensions\ provides a convenient way to observe the system's dark theme state, allowing the app to react to dark mode changes in real-time.

app/src/main/kotlin/com/google/samples/apps/nowinandroid/util · medium confidence

App icon theming and splash screen integration

The app now supports distinct launcher icon colors for different build variants (debug, benchmark, main) and light/dark modes, allowing users to visually distinguish between them. A new splash screen is integrated using the AndroidX SplashScreen API, and the app manifest removes unused advertising-related permissions (AD\_ID, ADSERVICES) to comply with store policies. Additionally, the app enables predictive back navigation support.

app/src · high confidence

App module scaffolding and configuration files added

The app module now includes essential configuration and documentation files to support the build and release process. A \.gitignore\ file is added to exclude build artifacts. A \README.md\ provides a visual dependency graph of the app module and its sub-modules. A \google-services.json\ file is introduced to configure Firebase services for various build variants. Additionally, \prodRelease-badging.txt\ is added to capture the manifest details for the production release, and \proguard-rules.pro\ is introduced to configure code shrinking and obfuscation, specifically repackaging classes to reduce descriptor size.

app · high confidence

Initial project scaffolding and configuration

The project was initialized with essential configuration and documentation files, including \.editorconfig\ for code style, a \.gitignore\ for build artifacts, and standard open-source legal and community files (\LICENSE\, \CODE\_OF\_CONDUCT.md\, \CONTRIBUTING.md\, \codeowners\). Additionally, \AGENTS.md\ was added to document the project's architecture and build commands, while \compose\_compiler\_config.conf\ was introduced to configure the Compose compiler stability rules.

(repo-wide) · high confidence

Introduce new navigation state and navigator for the app

The core/navigation module now includes a new NavigationState class and a Navigator class to manage application navigation. The NavigationState holds the current top-level and sub-stack navigation keys, while the Navigator handles forward and back navigation events, including clearing sub-stacks when navigating to top-level destinations. This refactors the previous navigation implementation to use a more explicit state management approach with separate top-level and sub-stacks for each top-level destination.

core/navigation/src/main/kotlin/com/google/samples/apps/nowinandroid · high confidence

Introduces new data models for user-specific content and search results

The core model layer now includes new data classes to represent user-specific states and enriched content. This includes \UserData\ to track user preferences like bookmarked and viewed news resources, followed topics, and theme settings. New types such as \UserNewsResource\ and \UserSearchResult\ provide user-specific metadata (e.g., whether a user has bookmarked or viewed a news resource, or is following a topic) by wrapping the base \NewsResource\ and \SearchResult\ models. Additionally, enums for \DarkThemeConfig\ and \ThemeBrand\ are introduced to manage theme preferences.

core/model/src/main/kotlin/com/google/samples/apps/nowinandroid · high confidence

Introduction of a notification system with deep-linking support

The app now features a new notification system that displays news updates in the system tray. Users will see grouped notifications for news resources, with each notification containing the title and content of the update. Tapping a notification opens the corresponding news resource via a deep link. The system also includes a no-op notifier for testing purposes.

core/notifications/src/main/kotlin/com/google/samples/apps/nowinandroid · high confidence

New build-logic convention plugins for Android, Compose, and testing

The build-logic convention plugins have been refactored into dedicated Kotlin files (AndroidCompose, AndroidInstrumentedTests, Badging, GradleManagedDevices, Graph, Jacoco, KotlinAndroid, NiaBuildType, NiaFlavor, PrintTestApks, ProjectExtensions, Spotless). This introduces automated badging checks, Compose compiler metrics and reports, combined JaCoCo coverage reports, and Mermaid dependency graphs, while standardizing code formatting with Spotless and configuring Gradle managed devices for CI.

build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid · high confidence

New coroutine dispatcher and result handling abstractions

The app introduces new core utilities for managing background work and state. A \NiaDispatchers\ enum and \@Dispatcher\ qualifier are added to the \core/common/network\ package, with Hilt modules (\DispatchersModule\, \CoroutineScopesModule\) providing \CoroutineDispatcher\ and \CoroutineScope\ bindings for \Default\ and \IO\ threads. Additionally, a generic \Result\<T\>\ sealed interface (with \Success\, \Error\, and \Loading\ states) and an \asResult()\ extension on \Flow\ are added to \core/common/result\, enabling consistent error and loading state handling across the app.

core/common/src/main/kotlin/com/google/samples/apps/nowinandroid · high confidence

New data layer for search, analytics, and user data

The app introduces a new data layer in the core repository package, adding interfaces and implementations for managing recent search queries, full-text search contents, and user-specific news resources. It also adds analytics logging for user actions like bookmarking, topic following, theme changes, and onboarding state changes. The \OfflineFirstNewsRepository\ and \OfflineFirstTopicsRepository\ implement offline-first synchronization with the network, while \CompositeUserNewsResourceRepository\ combines news and user data. This change reorganizes the data access layer to better separate concerns and support offline capabilities.

core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/repository · high confidence

New data model classes for news resources, search queries, and topics

The app introduces new Kotlin data models for handling news resources, recent search queries, and topics. These models include conversion functions to map between network responses, database entities, and external data classes, supporting the app's data layer with structured representations for content, search history, and topic metadata.

core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/model · high confidence

New domain use cases and performance tracking module

The app now includes new domain-layer use cases for retrieving followable topics, recent search queries, and search contents, enabling the UI to display topic lists with their follow status, access recent search history, and perform content searches. Additionally, a new Hilt module for JankStats has been added to track and log janky frames for performance monitoring.

app/src/main/kotlin/com/google/samples/apps/nowinandroid/di, core/domain/src/main/kotlin/com/google/samples/apps/nowinandroid · high confidence

New sync initialization and worker infrastructure

The app now uses a new \Sync\ initializer to configure background sync via Android's WorkManager. This includes a \SyncWorker\ that coordinates data synchronization across repositories, a \DelegatingWorker\ to handle Hilt injection for workers, and helper classes for notifications and analytics logging. A \SyncSubscriber\ interface and its \StubSyncSubscriber\ implementation are also introduced to manage backend sync requests.

sync/work/src/main/kotlin/com/google/samples/apps/nowinandroid · high confidence

New user preference schema for theme and onboarding settings

The app introduces new protocol buffer definitions to store user preferences, specifically adding support for dark theme configuration (following system, light, or dark mode) and theme brand selection (default, Android, or other brands). The UserPreferences message also includes fields for tracking migration states, topic/author/bookmark IDs, and onboarding status, enabling the app to remember and apply user-specific UI and content settings.

core/datastore-proto/src/main/proto/com/google/samples/apps/nowinandroid · high confidence

Behavioural changes

Add JVM unit test asset manager for demo resources

A new JvmUnitTestDemoAssetManager class has been introduced to handle loading of Android /assets files during JVM unit tests. This implementation ensures that demo asset resources are correctly resolved in the test environment, addressing previous issues where the readText method was not properly exposed or configured for testing.

core/network/src/main/kotlin · high confidence

Add automated code-style enforcement and pre-push checks

The project now enforces a consistent code style and pre-push validation. A new \nowinandroid-codestyle.xml\ file defines the Java, Kotlin, and XML formatting rules, which are applied by default via the Spotless tool. Additionally, a \pre-push\ Git hook is introduced to automatically run \./gradlew check\ before pushing to Gerrit, and a \setup.sh\ script automates the installation of these hooks into the \.git/hooks\ directory.

tools · high confidence

Add production-specific notification sync service

A new \SyncNotificationsService\ has been added to the \prod\ source set, implementing \FirebaseMessagingService\ to handle incoming FCM messages on the \/topics/sync\ topic. When a message is received from this topic, the service triggers a sync request via \SyncManager\. This change isolates the Firebase messaging integration to the \prod\ build variant, reducing build complexity by avoiding unnecessary code in other source sets.

sync/work/src/prod/kotlin/com/google/samples/apps/nowinandroid/sync/services · high confidence

Added FlavoredNetworkModule for network dependency injection

A new Dagger/Hilt module, FlavoredNetworkModule, has been added to the production source set. This module binds the Retrofit-based network implementation to the NiaNetworkDataSource interface, ensuring that the application uses the correct network data source for the production flavor.

core/network/src/prod/kotlin/com/google/samples/apps/nowinandroid · medium confidence

Added baseline profile benchmarking infrastructure

The benchmark module now includes new Kotlin source files (BaselineProfileMetrics, GeneralActions, Utils, and BookmarksActions) that provide custom metrics for measuring baseline profile effectiveness, such as JIT compilation time and class initialization, along with helper functions for UI interaction during macro benchmarks.

benchmarks/src/main/kotlin/com/google/samples/apps/nowinandroid · high confidence

Configure Dagger Hilt modules for network and image loading

The app now explicitly defines Hilt modules to provide network and image-loading dependencies. This includes a JSON configuration provider, a demo asset manager for local assets, an OkHttp call factory with debug logging, and a Coil ImageLoader configured to support SVGs and use the custom OkHttp client. These changes establish the dependency injection bindings required for the network layer and image rendering.

core/network/src/main/kotlin/com/google/samples/apps/nowinandroid/core/network/di · high confidence

Database schema and data access layer refactored

The app's local database has been restructured to support schema version 14, introducing automatic migrations for renaming the topics table's description column to shortDescription, and deleting the episodes and authors tables. The data access layer now uses Kotlin Data Access Objects (DAOs) for news resources, topics, and recent search queries, with dependency injection wired via Hilt modules. This change ensures the database can be upgraded smoothly and provides a cleaner, more maintainable data access layer.

core/database/src/main/kotlin/com/google/samples/apps/nowinandroid · high confidence

Demo flavor network module added

A new Kotlin source set named 'demo' has been introduced, containing a Dagger/Hilt module that binds the demo-specific network data source (DemoNiaNetworkDataSource) to the interface (NiaNetworkDataSource). This allows the application to use a mock or demo implementation of the network layer when building the 'demo' variant of the app.

core/network/src/demo/kotlin/com/google/samples/apps/nowinandroid · high confidence

Improved network and timezone monitoring

The app now uses a new NetworkMonitor interface and ConnectivityManagerNetworkMonitor implementation to track connectivity status, with the network check offloaded to a background thread. Additionally, a TimeZoneMonitor interface and TimeZoneBroadcastMonitor implementation have been added to track the device's current timezone, using kotlinx.datetime.TimeZone instead of java ZoneId, and preventing multiple BroadcastReceivers from being registered.

core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/util · medium confidence

Interests feature migrated to new navigation and UI components

The Interests feature has been refactored to use the new ListDetailScene architecture and navigation3 routing. This introduces a dedicated placeholder screen for the detail view, updates the main screen to use the new \InterestsScreen\ composable with state-driven UI rendering, and integrates with the \InterestsNavKey\ for navigation. The UI now leverages the new \TopicsTabContent\ component for displaying topics, and the \InterestsViewModel\ has been updated to work with the new navigation state management.

feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl · medium confidence

Introduces typed navigation keys for app features

The app's navigation system now uses specific, type-safe keys for each feature area. New \NavKey\ implementations have been added for Bookmarks, For You, Interests, Search, and Topic. This change provides a structured way to handle deep links and navigation state for these distinct sections of the app.

(repo-wide) · high confidence

Migrate analytics and notification modules to Kotlin source sets

The analytics and notification core modules have been migrated from Java to Kotlin source sets. This includes the introduction of new Kotlin files for analytics (AnalyticsEvent, AnalyticsHelper, NoOpAnalyticsHelper, StubAnalyticsHelper, and UiHelpers) and corresponding Dagger Hilt modules for notifications (NotificationsModule) in both demo and prod build variants. Additionally, a new FirebaseSyncSubscriber implementation for FCM topic subscription was added in the sync/work module.

(repo-wide) · high confidence

Migrate analytics implementation to use Firebase KTX APIs

The analytics module now uses the Firebase Kotlin extensions (KTX) APIs for logging events. The \AnalyticsModule\ provides the \FirebaseAnalytics\ instance using the \Firebase.analytics\ property, and the \FirebaseAnalyticsHelper\ uses the \logEvent\ extension function, simplifying the integration with Firebase Analytics.

core/analytics/src/prod/kotlin/com/google/samples/apps/nowinandroid · high confidence

Migrate app navigation to Navigation3 and introduce type-safe route keys

The app's navigation system has been refactored to use the new Navigation3 library, replacing the previous implementation. This change introduces type-safe navigation keys (e.g., \ForYouNavKey\, \BookmarksNavKey\) and a \TopLevelNavItem\ data class to manage top-level navigation items. The \NiaApp\ composable now utilizes \NiaNavigationSuiteScaffold\ for the navigation suite, and \NiaAppState\ is updated to manage navigation state and offline status using the new navigation structure.

app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui · high confidence

Migrate navigation to Navigation3 and introduce new UI state models

The app's navigation layer has been refactored to use the new Navigation3 API, with entry points for the Bookmarks, Search, and Topic screens now defined in dedicated provider files (e.g., BookmarksEntryProvider, SearchEntryProvider, TopicEntryProvider). This change introduces new UI state models for the search feature, including RecentSearchQueriesUiState and SearchResultUiState, which manage the loading, empty, and success states for search queries and results. The SearchScreen component has been updated to consume these new states, providing a more robust handling of search interactions and recent query history.

feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/navigation, feature/search/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/search, feature/topic/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/topic/impl/navigation · medium confidence

Migrate network data source and test utilities to Kotlin

The \NiaNetworkDataSource\ interface, which defines network calls for topics, news resources, and change lists, has been added in Kotlin, replacing the previous Java implementation. Additionally, a new \HiltComponentActivity\ has been introduced in the \ui-test-hilt-manifest\ module to support Hilt in UI tests, addressing a known Dagger issue.

core/network/src/main/kotlin/com/google/samples/apps/nowinandroid/core/network, ui-test-hilt-manifest/src/main/kotlin/com/google/samples/apps/nowinandroid · high confidence

Migrate sync dependency injection to use Firebase KTX APIs

The sync module's dependency injection has been updated to use the Firebase Kotlin extensions (KTX) APIs. Specifically, the module now provides the Firebase Messaging instance using the KTX property accessor (Firebase.messaging) rather than the standard Java API, aligning the codebase with modern Kotlin idioms for Firebase integration.

sync/work/src/prod/kotlin/com/google/samples/apps/nowinandroid/sync/di · medium confidence

Migrate user preferences storage from Int to String IDs and Lists to Maps

The app's local data storage has been updated to support new data structures for user preferences. Existing user data is automatically migrated: topic, author, and bookmark IDs are converted from Integers to Strings, and collections of followed/bookmarked items are converted from Lists to Maps. This ensures that future sync and preference updates use the new string-based IDs and map-based collections.

core/datastore/src/main/kotlin/com/google/samples/apps/nowinandroid · high confidence

Migrated Retrofit network implementation to Kotlin

The Retrofit network implementation for the NIA API has been migrated from Java to Kotlin. This change updates the source file location and language, while preserving the existing API contract and functionality for fetching topics, news resources, and change lists.

core/network/src/main/kotlin/com/google/samples/apps/nowinandroid/core/network/retrofit · medium confidence

New Gradle convention plugins for Android and JVM modules

The build system now uses dedicated convention plugins to standardize configuration across the project. For Android, new plugins handle Compose, Firebase, flavors, Jacoco, Lint, Room, and testing setups. For JVM modules, a dedicated plugin configures Kotlin and Spotless. A root plugin configures graph tasks and Spotless for the top-level project. This refactoring centralizes build logic, making it easier to maintain and apply consistent settings to all modules.

build-logic/convention · high confidence

New lint checks for test naming and design system usage

The Now in Android project introduces two new lint detectors to enforce code standards. The TestMethodNameDetector flags test methods that incorrectly start with 'test' or do not follow the 'given\_when\_then' or 'when\_then' naming format. Additionally, the DesignSystemDetector identifies usages of standard Compose Material components that should be replaced with the app's custom 'Nia' equivalents, such as using 'NiaTheme' instead of 'MaterialTheme'.

lint/src/main/kotlin/com/google/samples/apps/nowinandroid · high confidence

Redesigned news feed with staggered grid layout and drag-and-drop support

The news feed now uses a staggered grid layout to maximize space utilization, replacing the previous list-based approach. This change introduces a new \InterestsItem\ component for displaying topics and adds drag-and-drop functionality to the \NewsResourceCard\, allowing users to interact with news items more dynamically. Additionally, the feed now supports tracking screen views and jank metrics, and provides device-specific previews for phone, foldable, tablet, and desktop layouts.

core/ui/src/main/kotlin/com/google/samples/apps/nowinandroid · high confidence

Refactor interests feature navigation to use NavKeys and Hilt ViewModel injection

The interests feature's navigation entry point has been refactored to use NavKeys for route identification and Hilt for ViewModel injection. This change updates how the InterestsScreen is launched and how its ViewModel is instantiated, aligning the feature with the app's new navigation state management and dependency injection patterns.

feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/navigation · medium confidence

Refactored For You screen to use Hilt dependency injection and new navigation3

The For You screen implementation has been updated to use Hilt for dependency injection, replacing the previous manual or alternative DI approach. The screen now relies on a new \ForYouViewModel\ that manages state for the feed, onboarding, and deep linking. Additionally, the navigation entry point has been migrated to use the new \navigation3\ framework, integrating with the updated \NiaNavigator\ and \NavKeys\ for routing.

feature/foryou/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/foryou · medium confidence

Refactored app startup and theme handling in MainActivity

The app's main activity and application entry points have been refactored to improve theme management and initialization. MainActivity now explicitly manages dark/light mode state via a new ThemeSettings data class and uses enableEdgeToEdge for proper edge-to-edge rendering. A new MainActivityViewModel centralizes UI state logic, while NiaApplication extracts the StrictMode policy configuration into a dedicated function. These changes streamline how the app handles system theme changes and background initialization.

app/src/main/kotlin/com/google/samples/apps/nowinandroid · medium confidence

Register the new lint issue registry

The lint module now registers the \NiaIssueRegistry\ via the Android Lint service provider file, enabling the detection of issues defined by the migrated registry.

lint/src · high confidence

Settings dialog implementation moved to feature/settings/impl

The implementation of the settings dialog and its associated ViewModel have been moved from the API layer to the implementation layer (feature/settings/impl). This change relocates the UI components and view model logic to their proper module, ensuring the settings feature is correctly encapsulated within the application's architecture.

feature/settings/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/settings · medium confidence

Typography styles enforce left-alignment and LTR direction for English text in RTL locales

The typography definitions in the design system have been updated to explicitly set text direction to left-to-right and text alignment to left for all text styles. This ensures that English text remains left-aligned and properly oriented when displayed in right-to-left (RTL) locales, preventing misalignment or incorrect text direction in those regions.

core/designsystem/src/main/kotlin/com/google/samples/apps/nowinandroid/core/designsystem/theme · high confidence

Updated Gradle wrapper to version 9.4.0

The Gradle wrapper has been updated to use Gradle version 9.4.0. This change ensures that the project uses a specific, verified version of the Gradle build tool, which may include new features, performance improvements, or bug fixes compared to previous versions.

gradle · high confidence

Updated database schema to version 14

The \core/database\ module now includes database schema files for versions 1 through 14. This update reflects the current state of the \NiaDatabase\, which includes tables for \news\_resources\, \topics\, and their relationships, as well as an FTS4 virtual table for news resource search. The schema evolution tracks changes such as the addition of the \newsResourcesFts\ table in version 13 and the removal of the \episodes\ and \authors\ tables in later versions.

core · high confidence

Test coverage

Add unit tests for the Navigator component; Added Android tests for database DAOs; Added For You page macrobenchmark; Added Robolectric configuration for Android 15 (API 35); Added ScreenshotHelper for automated accessibility and multi-device screenshot testing; Added UI and unit tests for the Bookmarks, Interests, and Search feature modules; Added UI and unit tests for the Interests feature; Added UI tests for app navigation and top-level destinations; Added UI tests for the Bookmarks screen; Added UI tests for the For You screen; Added UI tests for the Settings dialog; Added benchmarking utilities for UI automation; Added fake repository implementations for testing; Added in-memory DataStore test utilities; Added instrumentation test for SyncWorker; Added macrobenchmark tests for the Interests screen; Added screenshot and unit tests for the ForYou feature; Added screenshot tests for design system components; Added screenshot tests for snackbar and app state; Added test doubles for sync operations; Added test utilities and mock repositories for the core testing module; Added tests for Now in Android lint rules; Added unit and UI tests for domain and UI components; Added unit tests for DataStore migrations and preferences; Added unit tests for Result handling; Added unit tests for SettingsViewModel; Added unit tests for the SearchViewModel; Added unit tests for the data layer; Added unit tests for the demo network data source; Test data module and fake repositories moved to core/data-test.

Dependencies

Migrate build configuration to Gradle convention plugins and version catalogs

The project's build system has been refactored to use Gradle convention plugins and a centralized version catalog. Build logic is now managed through \build-logic/convention\, which registers reusable plugins like \AndroidApplicationComposeConventionPlugin\ and \HiltConventionPlugin\. Individual module \build.gradle.kts\ files have been simplified to apply these convention plugins and reference dependencies via the \libs\ version catalog, improving consistency and reducing duplication across the multi-module Android project.

(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

This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.

Score

  • CAI 49 → 49 (+0.0)
  • Rubric changed (rubric-2026.08.18 → rubric-2026.08.19) — scores are not directly comparable.

Lenses

  • Code Health 96 → 96 (+0.0)
  • Architecture 55 → 55 (+0.0)
  • Maturity 78 → 78 (-0.1)
  • Readiness 81 → 81 (+0.0)
  • Security 33 → 34 (+0.0)
  • Domain Modelling 55 → 55 (+0.0)

Resolved (3)

  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Off-boarding risk: anonymized user #1

New (2)

  • Off-boarding risk: anonymized user #1
  • The build-logic README lists convention plugins but does not explain how to add new ones or where the plugin source files live. (build-logic/README.md)

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

Survey your own repository

android/nowinandroid 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 5 August 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 7d45eae4f8720a0c77f507712ba2437ff974b6ed — the exact code this score is about.
  • Scored under rubric-2026.08.19 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer latest.