* Apply spotless by default
- Upgrades to spotless 8.2.1
- Moves spotless setup from an init.gradle.kts to build-logic
- Narrows down the scope of `target` in spotless configuration to
be more precise to workaround https://github.com/diffplug/spotless/issues/2717
- Updates all references to init.gradle.kts
Ran gradle-profiler ./gradlew build --dry-run to validate performance
impact.
Before PR:
Mean 10,527.96 ms with 289.01 ms std dev
After PR:
Mean 11,251.78 ms with 530.29 ms std dev
Regression is there, but quite minor.
Test: ./gradlew spotlessCheck
* Address comments from AI overlords
* Fix usage of rootProject
* Enable spotless for build-logic via root project
Fixes#633
On Android 12 and above, the splash screen was ignoring the user’s saved theme preference and instead defaulting to the system theme. This happened because the splash screen is rendered before Application.onCreate() finishes executing. At that point, the system’s UiModeManager hadn't been updated with the user's preferred theme, so it showed the wrong one.
Changes:
- Introduced initializeNightModeFromPreferences() in UiExtensions.kt. This method forces the correct theme mode synchronously during Application.onCreate(), ensuring it’s in place before the splash screen ever appears.
- Added observeNightModePreferences() to actively listen for changes to the theme setting. This keeps UiModeManager updated in real time so future cold starts use the right theme immediately.
- On Android 12+ (API 31+), now using UiModeManager.setApplicationNightMode() to set the theme properly.
- For older versions, the implementation falls back to AppCompatDelegate.setDefaultNightMode() for compatibility.
- Added a toDarkThemeConfig() extension function to translate the DataStore proto into the theme model used by the UI.
- Included the AppCompat dependency in the app module to support these changes.
Why the Observer Matters? Without it, any theme change made by the user wouldn't notify UiModeManager right away. That would mean the next time the app is launched cold, the splash screen would still use whatever theme was cached before—not the one the user just selected. This fix prevents that.
Testing:
- Confirmed that the splash screen reflects the saved theme preference, even on a fresh app start.
- Checked all theme configurations: Light, Dark, and Follow System.
- Verified behavior on both Android 12+ and Android 11 devices to ensure backward compatibility.
The string resource identifiers for settings have been updated in the navigation tests. The `feature_settings` prefix has been changed to `feature_settings_impl` to reflect changes in the settings feature module.
The `feature:settings:api` module has been renamed to `feature:settings:impl` to better reflect its role as an implementation module.
This change includes:
* Updating module paths and namespaces.
* Moving all related files, including source code, resources, and tests, to the new `impl` directory.
* Updating dependencies and project configurations in Gradle scripts and README files to point to the new module path.
* Renaming string resources to include the `_impl` suffix for clarity.
* Updating the AndroidX Lifecycle dependency to version 2.10.0.
The `NiaAppStateTest` is updated to align with the changes in `InterestsNavKey`, which now requires a `topicId` argument. The test now uses `InterestsNavKey(null)` to correctly represent the top-level interests destination.
This commit refactors the navigation implementation by renaming all `...Route` classes to `...NavKey`. This change provides more descriptive and consistent naming for navigation keys across the codebase.
Key changes include:
* Renamed `BookmarksRoute` to `BookmarksNavKey`
* Renamed `ForYouRoute` to `ForYouNavKey`
* Renamed `InterestsRoute` to `InterestsNavKey`
* Renamed `TopicRoute` to `TopicNavKey`
* Renamed `SearchRoute` to `SearchNavKey`
* Updated all associated feature modules, tests, and UI components to use the new `NavKey` names.
* Removed obsolete test utilities and mock providers related to the old navigation setup.
* Deleted outdated dependency graph images and their corresponding `README.md` files from feature modules.
This commit refactors the navigation state management by renaming `NiaNavigatorState` to `NavigationState` to make it more generic.
Specific changes include:
- Renamed `NiaNavigatorState` to `NavigationState`.
- Renamed `NiaNavigatorProvider` to `NavigationStateProvider`.
- Updated all usages of the renamed classes, including `NiaNavigator`, `NiaBackStackViewModel`, and various tests.
- Replaced the `getEntries()` extension function with `toEntries()`.
- Added numerous TODOs to identify areas for future improvement, such as removing dependencies on `SavedStateHandle` for navigation state, simplifying event handling in ViewModels, and documenting the new navigation components.
Made NiaNavigator a stateless class only responsibly for navigating and pop (modifying backStack).
Navigation state now lives in a new class called NiaNavigatorState.
The state of this class is saved and restored by ViewModel.
- Move to using plugins {} block for applying com.google.android.gms.oss-licenses-plugin
as this plugin now publishes plugin markers
- Upgrade oss-licenses-plugin to 0.10.8
- Remove unused secrets plugin
Test: ./gradlew build -m
- Upgrades to a newer version of compose bom that pulls in newer
versions of lint checks that work with AGP 8.12.2
- Bump the minSdk to 23 because compose now requires minSdk 23
- Update Navigation_fontScale2.png due to compose upgrade
- Clean up BuildConfig set up since we already use Gradle 9.0.0
Test: ./gradlew build
Gradle 9.0.0 has the new enforcement that Test task runs that
have sources but no tests run should fail. Without this change we get
Execution failed for task ':core:analytics:testDemoDebugUnitTest'.
> There are test sources present and no filters are applied, but the test task did not discover any tests to execute. This is likely due to a misconfiguration. Please check your test configuration. If this is not a misconfiguration, this error can be disabled by setting the 'failOnNoDiscoveredTests' property to false.
We get this because before this change AndroidCompose was always setting
isIncludeAndroidResources = true which generates a source to the test
task and in the case of :core:analytics it is the only source.
Instead of setting isIncludeAndroidResources in AndroidCompose move to
setting it in relevant build.gradle.kts files (most already had it)