Skip to content

πŸ”€ :: (#914) μ‹œμŠ€ν…œ ν…Œλ§ˆ μ‚¬μš©μž 선택 제곡#915

Merged
uson1004 merged 5 commits intodevelopfrom
feature/914-μ‹œμŠ€ν…œ-ν…Œλ§ˆ-μ‚¬μš©μž-선택-제곡
Apr 28, 2026

Hidden character warning

The head ref may contain hidden characters: "feature/914-\uc2dc\uc2a4\ud15c-\ud14c\ub9c8-\uc0ac\uc6a9\uc790-\uc120\ud0dd-\uc81c\uacf5"
Merged

πŸ”€ :: (#914) μ‹œμŠ€ν…œ ν…Œλ§ˆ μ‚¬μš©μž 선택 제곡#915
uson1004 merged 5 commits intodevelopfrom
feature/914-μ‹œμŠ€ν…œ-ν…Œλ§ˆ-μ‚¬μš©μž-선택-제곡

Conversation

@uson1004
Copy link
Copy Markdown
Member

@uson1004 uson1004 commented Apr 24, 2026

κ°œμš”

μž‘μ—…μ‚¬ν•­

μΆ”κ°€ 둜 ν•  말

Summary by CodeRabbit

  • New Features
    • Theme selection added to Settings: choose System, Light, or Dark.
    • Selected theme is applied across the app immediately and persists between sessions.

@uson1004 uson1004 requested a review from ashxom April 24, 2026 02:29
@uson1004 uson1004 self-assigned this Apr 24, 2026
@uson1004 uson1004 added the feat μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ ν•  경우 label Apr 24, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 24, 2026

No actionable comments were generated in the recent review. πŸŽ‰

ℹ️ Recent review info
βš™οΈ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 6687af18-ec24-4cf5-8616-a57e5a6c7ca7

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between 5701430 and c900535.

πŸ“’ Files selected for processing (3)
  • app/src/main/kotlin/team/aliens/dms/android/app/MainActivityViewModel.kt
  • core/datastore/src/main/java/team/aliens/dms/android/core/datastore/di/DataStoreModule.kt
  • feature/src/main/kotlin/team/aliens/dms/android/feature/setting/ui/SettingScreen.kt
🚧 Files skipped from review as they are similar to previous changes (1)
  • app/src/main/kotlin/team/aliens/dms/android/app/MainActivityViewModel.kt

πŸ“ Walkthrough

Walkthrough

Adds a new core:theme module with theme persistence, DI bindings, and UI integration; wires PreferencesDataStore for theme, exposes ThemeMode flows, persists selections, and integrates theme state into MainActivity and Settings.

Changes

Cohort / File(s) Summary
Project & Gradle
settings.gradle.kts, buildSrc/src/main/kotlin/ProjectPaths.kt, app/build.gradle.kts, feature/build.gradle.kts
Registers :core:theme, adds ProjectPaths.Core.THEME, and declares module dependencies in app and feature builds.
Core Theme Module Setup
core/theme/build.gradle.kts, core/theme/.gitignore, core/theme/proguard-rules.pro, core/theme/src/main/AndroidManifest.xml
Adds new Android library module scaffolding and build configuration for core:theme.
Theme Types & Contracts
core/theme/src/main/java/.../ThemeMode.kt, .../datastore/ThemeDataStoreDataSource.kt, .../datastore/store/ThemeStore.kt
Defines ThemeMode enum and abstract contracts for theme persistence and exposure via Flow.
Theme Implementation
core/theme/src/main/java/.../datastore/ThemeDataStoreDataSourceImpl.kt, .../datastore/store/ThemeStoreImpl.kt
Implements data store wiring: reads/writes ThemeMode to PreferencesDataStore, maps stored string to enum with SYSTEM fallback.
Theme DI
core/theme/src/main/java/.../di/DataSourceModule.kt, .../di/StoreModule.kt, core/datastore/src/main/java/.../di/DataStoreModule.kt, core/datastore/src/main/java/.../Qualifier.kt
Adds Hilt modules and a @ThemeDataStore qualifier; provides and binds the theme PreferencesDataStore and implementations as singletons.
DataStore Accessor
core/datastore/src/main/java/.../DataStore.kt
Adds Context.themeStore: PreferencesDataStore accessor using name "theme-datastore".
App Integration
app/src/main/kotlin/.../MainActivity.kt, app/src/main/kotlin/.../MainActivityViewModel.kt
MainActivity consumes themeMode StateFlow from MainActivityViewModel, resolves SYSTEM via isSystemInDarkTheme(), and passes resolved boolean to DmsTheme. ViewModel now exposes themeMode.
Settings UI & ViewModel
feature/src/main/kotlin/.../setting/ui/SettingScreen.kt, feature/src/main/kotlin/.../setting/viewmodel/SettingViewModel.kt
Adds theme selection UI/dialog, persists selections via injected ThemeDataStoreDataSource, and observes theme changes to populate UI state.

Sequence Diagram(s)

sequenceDiagram
    actor User as User
    participant Setting as SettingScreen
    participant SVM as SettingViewModel
    participant TSDS as ThemeDataStoreDataSource
    participant Store as ThemeStore
    participant DS as PreferencesDataStore
    participant MAViewModel as MainActivityViewModel
    participant MainActivity as MainActivity
    participant Theme as DmsTheme

    User->>Setting: choose ThemeMode
    Setting->>SVM: setThemeMode(mode)
    SVM->>TSDS: setThemeMode(mode)
    TSDS->>Store: setThemeMode(mode)
    Store->>DS: write THEME_MODE = mode.name

    rect rgba(0,200,100,0.5)
    note over DS,Store: Persistence saved
    end

    DS->>Store: emit preferences update
    Store->>TSDS: Flow emits ThemeMode
    TSDS->>MAViewModel: themeMode StateFlow updates
    MAViewModel->>MainActivity: themeMode collected
    MainActivity->>MainActivity: resolve isDark (SYSTEM -> isSystemInDarkTheme())
    MainActivity->>Theme: DmsTheme(isDarkTheme=isDark)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • ashxom
  • parkuiery

🐰✨
A rabbit hops with colors bright,
SYSTEM, LIGHT, and DARK in sight,
DataStore hums a gentle tune,
Views update beneath the moon,
Hop, click, the theme is just right. πŸ₯•

πŸš₯ Pre-merge checks | βœ… 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
βœ… Passed checks (4 passed)
Check name Status Explanation
Description Check βœ… Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check βœ… Passed The title 'πŸ”€ :: (#914) μ‹œμŠ€ν…œ ν…Œλ§ˆ μ‚¬μš©μž 선택 제곡' clearly describes the main change: providing system theme user selection. It directly relates to the PR's primary objective of adding theme mode selection functionality (SYSTEM, LIGHT, DARK) with UI and data persistence.
Linked Issues check βœ… Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check βœ… Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
πŸ“ Generate docstrings
  • Create stacked PR
  • Commit on current branch
πŸ§ͺ Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/914-μ‹œμŠ€ν…œ-ν…Œλ§ˆ-μ‚¬μš©μž-선택-제곡

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❀️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (7)
core/theme/src/main/java/team/aliens/dms/android/core/theme/datastore/store/ThemeStoreImpl.kt (1)

25-30: Minor: redundant null fallback inside runCatching.

preferences[THEME_MODE] ?: ThemeMode.SYSTEM.name is unnecessary β€” when the key is absent, ThemeMode.valueOf(null) would throw and runCatching { ... }.getOrDefault(ThemeMode.SYSTEM) already handles that, producing the same result. The double fallback slightly obscures intent.

♻️ Optional simplification
-    override fun getThemeModeFlow(): Flow<ThemeMode> =
-        themeDataStore.data.map { preferences ->
-            runCatching {
-                ThemeMode.valueOf(preferences[THEME_MODE] ?: ThemeMode.SYSTEM.name)
-            }.getOrDefault(ThemeMode.SYSTEM)
-        }
+    override fun getThemeModeFlow(): Flow<ThemeMode> =
+        themeDataStore.data.map { preferences ->
+            val stored = preferences[THEME_MODE] ?: return@map ThemeMode.SYSTEM
+            runCatching { ThemeMode.valueOf(stored) }.getOrDefault(ThemeMode.SYSTEM)
+        }
πŸ€– Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@core/theme/src/main/java/team/aliens/dms/android/core/theme/datastore/store/ThemeStoreImpl.kt`
around lines 25 - 30, The null-coalescing fallback inside getThemeModeFlow is
redundant: inside themeDataStore.data.map you're already wrapping
ThemeMode.valueOf(...) with runCatching and calling
.getOrDefault(ThemeMode.SYSTEM), so remove the ?: ThemeMode.SYSTEM.name and pass
the raw preferences[THEME_MODE] into ThemeMode.valueOf; keep the runCatching and
.getOrDefault as-is to handle absent/invalid values. Reference:
getThemeModeFlow, ThemeMode.valueOf, THEME_MODE, themeDataStore.data,
runCatching.
core/theme/src/main/java/team/aliens/dms/android/core/theme/datastore/ThemeDataStoreDataSource.kt (1)

6-9: Prefer interface for this stateless contract.

Same rationale as ThemeStore: no state, no constructor, only used as a contract. An interface is more idiomatic and plays nicely with @Binds.

♻️ Proposed refactor
-abstract class ThemeDataStoreDataSource {
-    abstract suspend fun setThemeMode(mode: ThemeMode)
-    abstract fun getThemeModeFlow(): Flow<ThemeMode>
-}
+interface ThemeDataStoreDataSource {
+    suspend fun setThemeMode(mode: ThemeMode)
+    fun getThemeModeFlow(): Flow<ThemeMode>
+}

See the comment on ThemeStore.kt regarding the overall redundancy between these two sibling abstractions.

πŸ€– Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@core/theme/src/main/java/team/aliens/dms/android/core/theme/datastore/ThemeDataStoreDataSource.kt`
around lines 6 - 9, The file defines an abstract class ThemeDataStoreDataSource
but it’s a stateless contract; replace it with an interface to be idiomatic and
compatible with `@Binds`. Change ThemeDataStoreDataSource from abstract class to
interface and keep the signatures suspend fun setThemeMode(mode: ThemeMode) and
fun getThemeModeFlow(): Flow<ThemeMode> unchanged so implementations can be
bound via `@Binds` and to match the existing ThemeStore pattern.
core/theme/src/main/java/team/aliens/dms/android/core/theme/datastore/store/ThemeStore.kt (2)

6-9: Prefer interface over stateless abstract class.

ThemeStore has no state or constructor logic and is used only as a pure contract (bound via @Binds in StoreModule). An interface is the idiomatic Kotlin choice and avoids forcing subclasses to call a superclass constructor.

♻️ Proposed refactor
-internal abstract class ThemeStore {
-    abstract suspend fun setThemeMode(mode: ThemeMode)
-    abstract fun getThemeModeFlow(): Flow<ThemeMode>
-}
+internal interface ThemeStore {
+    suspend fun setThemeMode(mode: ThemeMode)
+    fun getThemeModeFlow(): Flow<ThemeMode>
+}

If you apply this, also update ThemeStoreImpl to use : ThemeStore (without parentheses).

πŸ€– Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@core/theme/src/main/java/team/aliens/dms/android/core/theme/datastore/store/ThemeStore.kt`
around lines 6 - 9, Replace the stateless abstract class ThemeStore with a
Kotlin interface: declare ThemeStore as an interface exposing suspend fun
setThemeMode(mode: ThemeMode) and fun getThemeModeFlow(): Flow<ThemeMode>, then
update the implementation class ThemeStoreImpl to implement the interface using
": ThemeStore" (remove any superclass constructor call) and ensure the `@Binds`
binding in StoreModule still binds ThemeStore to ThemeStoreImpl.

6-9: Redundant abstraction layer between ThemeStore and ThemeDataStoreDataSource?

ThemeStore and ThemeDataStoreDataSource expose the exact same two members (setThemeMode, getThemeModeFlow), and per the AI summary ThemeDataStoreDataSourceImpl simply forwards every call to ThemeStore. Unless there is a planned divergence (e.g., caching, additional data sources, extra members), one of the two layers can be collapsed β€” either have ThemeDataStoreDataSourceImpl talk to DataStore directly, or expose ThemeStore itself to consumers and drop ThemeDataStoreDataSource. Keeping both only increases DI wiring and boilerplate without behavioral value.

πŸ€– Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@core/theme/src/main/java/team/aliens/dms/android/core/theme/datastore/store/ThemeStore.kt`
around lines 6 - 9, The two-layer abstraction is redundant: either remove
ThemeStore and let ThemeDataStoreDataSourceImpl (class
ThemeDataStoreDataSourceImpl) talk directly to DataStore, or remove
ThemeDataStoreDataSource (interface/class) and expose ThemeStore to consumers;
pick one and collapse the other, update DI bindings to provide the remaining
implementation, and remove the forwarding methods (setThemeMode,
getThemeModeFlow) from the dropped layer so callers use the single remaining
type (ThemeStore or ThemeDataStoreDataSourceImpl) directly.
feature/src/main/kotlin/team/aliens/dms/android/feature/setting/viewmodel/SettingViewModel.kt (1)

23-56: LGTM!

Theme mode observation in init and setThemeMode correctly delegate to the data source. State synchronization via setState is straightforward.

Minor note (optional): Wrapping themeDataStoreDataSource.setThemeMode(mode) with Dispatchers.IO is not strictly required since DataStore internally uses Dispatchers.IO for its write operations. It's harmless but can be omitted for consistency with observeThemeMode() which doesn't specify a dispatcher.

πŸ€– Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@feature/src/main/kotlin/team/aliens/dms/android/feature/setting/viewmodel/SettingViewModel.kt`
around lines 23 - 56, Remove the explicit Dispatchers.IO dispatcher in
setThemeMode and let DataStore manage threading: change internal fun
setThemeMode(mode: ThemeMode) { viewModelScope.launch(Dispatchers.IO) {
themeDataStoreDataSource.setThemeMode(mode) } } to launch without specifying a
dispatcher so it matches observeThemeMode() and relies on DataStore’s internal
IO handling; update the method signature/usage of setThemeMode and references to
themeDataStoreDataSource.setThemeMode(mode) accordingly.
feature/src/main/kotlin/team/aliens/dms/android/feature/setting/ui/SettingScreen.kt (2)

220-251: Consider a radio-selection pattern for the theme dialog.

Rendering each ThemeMode as a full DmsButton (with a "βœ“ " prefix hack to denote selection) works but isn't the most idiomatic Material pattern for single-choice selection. A RadioButton + label row per option would:

  • Convey selection semantics to accessibility services (TalkBack announces "selected"/"not selected") instead of relying on a check glyph in the label text.
  • Be more compact visually and easier to scan.
  • Avoid the string concatenation for the checkmark, which complicates localization.

Not a blocker β€” current implementation is functional.

πŸ€– Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@feature/src/main/kotlin/team/aliens/dms/android/feature/setting/ui/SettingScreen.kt`
around lines 220 - 251, The ThemeSelectDialog currently renders each ThemeMode
as a full DmsButton and uses a prefixed "βœ“ " string to indicate selection;
change this to an idiomatic radio-selection pattern by replacing the DmsButton
list inside ThemeSelectDialog with a Column of selectable rows that contain a
RadioButton (selected = mode == currentThemeMode) and a Text label
(mode.toDisplayName()), wire the row's clickable/onClick to call
onThemeSelected(mode), and remove the checkmark string and buttonColor logic;
ensure you iterate ThemeMode.entries and keep onDismissRequest and dismissButton
behavior the same so accessibility (TalkBack selection state) and localization
are preserved.

253-257: Consider moving toDisplayName() alongside ThemeMode or using string resources.

Hardcoded Korean strings ("μ‹œμŠ€ν…œ κΈ°λ³Έ", "라이트", "닀크") in a .kt file bypass Android's string-resource system, which prevents translation, per-locale formatting, and runtime locale switching. If the app targets only Korean this is acceptable, but consider moving these labels into strings.xml and resolving via stringResource(...) in the composable, keeping the enum free of display concerns.

πŸ€– Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@feature/src/main/kotlin/team/aliens/dms/android/feature/setting/ui/SettingScreen.kt`
around lines 253 - 257, The extension ThemeMode.toDisplayName() currently
returns hardcoded Korean strings which bypass Android string resources; move
these labels into strings.xml and replace usage of toDisplayName() in the
composable (e.g., SettingScreen) with calls to stringResource(R.string.some_key)
mapped from the enum (e.g., when(themeMode) -> R.string.theme_system /
R.string.theme_light / R.string.theme_dark), or alternatively relocate the
toDisplayName() implementation next to the ThemeMode declaration only if it
returns resource IDs instead of raw strings so the enum stays UI-agnostic.
πŸ€– Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@app/src/main/kotlin/team/aliens/dms/android/app/MainActivityViewModel.kt`:
- Around line 34-48: The startup coroutine flips _isStartupResolved before the
persisted theme from themeDataStoreDataSource.getThemeModeFlow() is observed,
causing a flicker; modify init so the startup-resolution coroutine first obtains
the initial theme (e.g., call getThemeModeFlow().first()/collect the first
emission) and set _themeMode.value to that before setting _isStartupResolved =
true (then after that, continue to collect subsequent emissions in a separate
collector or re-launch a continuous collector) so that _themeMode is resolved
synchronously during startup; update references to _themeMode,
themeDataStoreDataSource.getThemeModeFlow(), and _isStartupResolved in
MainActivityViewModel to implement this ordering.

---

Nitpick comments:
In
`@core/theme/src/main/java/team/aliens/dms/android/core/theme/datastore/store/ThemeStore.kt`:
- Around line 6-9: Replace the stateless abstract class ThemeStore with a Kotlin
interface: declare ThemeStore as an interface exposing suspend fun
setThemeMode(mode: ThemeMode) and fun getThemeModeFlow(): Flow<ThemeMode>, then
update the implementation class ThemeStoreImpl to implement the interface using
": ThemeStore" (remove any superclass constructor call) and ensure the `@Binds`
binding in StoreModule still binds ThemeStore to ThemeStoreImpl.
- Around line 6-9: The two-layer abstraction is redundant: either remove
ThemeStore and let ThemeDataStoreDataSourceImpl (class
ThemeDataStoreDataSourceImpl) talk directly to DataStore, or remove
ThemeDataStoreDataSource (interface/class) and expose ThemeStore to consumers;
pick one and collapse the other, update DI bindings to provide the remaining
implementation, and remove the forwarding methods (setThemeMode,
getThemeModeFlow) from the dropped layer so callers use the single remaining
type (ThemeStore or ThemeDataStoreDataSourceImpl) directly.

In
`@core/theme/src/main/java/team/aliens/dms/android/core/theme/datastore/store/ThemeStoreImpl.kt`:
- Around line 25-30: The null-coalescing fallback inside getThemeModeFlow is
redundant: inside themeDataStore.data.map you're already wrapping
ThemeMode.valueOf(...) with runCatching and calling
.getOrDefault(ThemeMode.SYSTEM), so remove the ?: ThemeMode.SYSTEM.name and pass
the raw preferences[THEME_MODE] into ThemeMode.valueOf; keep the runCatching and
.getOrDefault as-is to handle absent/invalid values. Reference:
getThemeModeFlow, ThemeMode.valueOf, THEME_MODE, themeDataStore.data,
runCatching.

In
`@core/theme/src/main/java/team/aliens/dms/android/core/theme/datastore/ThemeDataStoreDataSource.kt`:
- Around line 6-9: The file defines an abstract class ThemeDataStoreDataSource
but it’s a stateless contract; replace it with an interface to be idiomatic and
compatible with `@Binds`. Change ThemeDataStoreDataSource from abstract class to
interface and keep the signatures suspend fun setThemeMode(mode: ThemeMode) and
fun getThemeModeFlow(): Flow<ThemeMode> unchanged so implementations can be
bound via `@Binds` and to match the existing ThemeStore pattern.

In
`@feature/src/main/kotlin/team/aliens/dms/android/feature/setting/ui/SettingScreen.kt`:
- Around line 220-251: The ThemeSelectDialog currently renders each ThemeMode as
a full DmsButton and uses a prefixed "βœ“ " string to indicate selection; change
this to an idiomatic radio-selection pattern by replacing the DmsButton list
inside ThemeSelectDialog with a Column of selectable rows that contain a
RadioButton (selected = mode == currentThemeMode) and a Text label
(mode.toDisplayName()), wire the row's clickable/onClick to call
onThemeSelected(mode), and remove the checkmark string and buttonColor logic;
ensure you iterate ThemeMode.entries and keep onDismissRequest and dismissButton
behavior the same so accessibility (TalkBack selection state) and localization
are preserved.
- Around line 253-257: The extension ThemeMode.toDisplayName() currently returns
hardcoded Korean strings which bypass Android string resources; move these
labels into strings.xml and replace usage of toDisplayName() in the composable
(e.g., SettingScreen) with calls to stringResource(R.string.some_key) mapped
from the enum (e.g., when(themeMode) -> R.string.theme_system /
R.string.theme_light / R.string.theme_dark), or alternatively relocate the
toDisplayName() implementation next to the ThemeMode declaration only if it
returns resource IDs instead of raw strings so the enum stays UI-agnostic.

In
`@feature/src/main/kotlin/team/aliens/dms/android/feature/setting/viewmodel/SettingViewModel.kt`:
- Around line 23-56: Remove the explicit Dispatchers.IO dispatcher in
setThemeMode and let DataStore manage threading: change internal fun
setThemeMode(mode: ThemeMode) { viewModelScope.launch(Dispatchers.IO) {
themeDataStoreDataSource.setThemeMode(mode) } } to launch without specifying a
dispatcher so it matches observeThemeMode() and relies on DataStore’s internal
IO handling; update the method signature/usage of setThemeMode and references to
themeDataStoreDataSource.setThemeMode(mode) accordingly.
πŸͺ„ Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
βš™οΈ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 277d68a3-09dd-48de-93f4-4e5ab808287e

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between f971a2c and 5701430.

πŸ“’ Files selected for processing (23)
  • app/build.gradle.kts
  • app/src/main/kotlin/team/aliens/dms/android/app/MainActivity.kt
  • app/src/main/kotlin/team/aliens/dms/android/app/MainActivityViewModel.kt
  • buildSrc/src/main/kotlin/ProjectPaths.kt
  • core/datastore/src/main/java/team/aliens/dms/android/core/datastore/DataStore.kt
  • core/datastore/src/main/java/team/aliens/dms/android/core/datastore/Qualifier.kt
  • core/datastore/src/main/java/team/aliens/dms/android/core/datastore/di/DataStoreModule.kt
  • core/theme/.gitignore
  • core/theme/build.gradle.kts
  • core/theme/consumer-rules.pro
  • core/theme/proguard-rules.pro
  • core/theme/src/main/AndroidManifest.xml
  • core/theme/src/main/java/team/aliens/dms/android/core/theme/ThemeMode.kt
  • core/theme/src/main/java/team/aliens/dms/android/core/theme/datastore/ThemeDataStoreDataSource.kt
  • core/theme/src/main/java/team/aliens/dms/android/core/theme/datastore/ThemeDataStoreDataSourceImpl.kt
  • core/theme/src/main/java/team/aliens/dms/android/core/theme/datastore/store/ThemeStore.kt
  • core/theme/src/main/java/team/aliens/dms/android/core/theme/datastore/store/ThemeStoreImpl.kt
  • core/theme/src/main/java/team/aliens/dms/android/core/theme/di/DataSourceModule.kt
  • core/theme/src/main/java/team/aliens/dms/android/core/theme/di/StoreModule.kt
  • feature/build.gradle.kts
  • feature/src/main/kotlin/team/aliens/dms/android/feature/setting/ui/SettingScreen.kt
  • feature/src/main/kotlin/team/aliens/dms/android/feature/setting/viewmodel/SettingViewModel.kt
  • settings.gradle.kts

@uson1004 uson1004 merged commit fcde610 into develop Apr 28, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feat μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ ν•  경우

Projects

None yet

Development

Successfully merging this pull request may close these issues.

μ‹œμŠ€ν…œ ν…Œλ§ˆ μ‚¬μš©μž 선택 제곡

2 participants