Skip to content

Commit 5a3db3b

Browse files
authored
App Theming (#141)
* Theming * Accent coloring * Implement DayNightSwitch * Update strings * Update Settings
1 parent 6c9a63b commit 5a3db3b

File tree

35 files changed

+876
-125
lines changed

35 files changed

+876
-125
lines changed

app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ android {
2929
buildConfigField "String", "UPDATE_API_URL", "\"https://sdai.moroz.cc\""
3030
buildConfigField "String", "DEMO_MODE_API_URL", "\"https://sdai.moroz.cc\""
3131
buildConfigField "String", "POLICY_URL", "\"https://sdai.moroz.cc/policy.html\""
32+
buildConfigField "String", "DONATE_URL", "\"https://www.buymeacoffee.com/shifthackz\""
3233
buildConfigField "String", "GITHUB_SOURCE_URL", "\"https://github.com/ShiftHackZ/Stable-Diffusion-Android\""
3334
buildConfigField "String", "SETUP_INSTRUCTIONS_URL", "\"https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki\""
3435
}

app/src/main/java/com/shifthackz/aisdv1/app/di/ProvidersModule.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ import com.shifthackz.aisdv1.domain.preference.PreferenceManager
1414
import com.shifthackz.aisdv1.feature.diffusion.entity.LocalDiffusionFlag
1515
import com.shifthackz.aisdv1.feature.diffusion.environment.DeviceNNAPIFlagProvider
1616
import com.shifthackz.aisdv1.feature.diffusion.environment.LocalModelIdProvider
17+
import com.shifthackz.aisdv1.network.qualifiers.ApiKeyProvider
1718
import com.shifthackz.aisdv1.network.qualifiers.ApiUrlProvider
1819
import com.shifthackz.aisdv1.network.qualifiers.CredentialsProvider
19-
import com.shifthackz.aisdv1.network.qualifiers.ApiKeyProvider
2020
import com.shifthackz.aisdv1.network.qualifiers.NetworkHeaders
2121
import com.shifthackz.aisdv1.network.qualifiers.NetworkPrefixes
2222
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
@@ -95,6 +95,7 @@ val providersModule = module {
9595
override val huggingFaceUrl: String = BuildConfig.HUGGING_FACE_INFO_URL
9696
override val openAiInfoUrl: String = BuildConfig.OPEN_AI_INFO_URL
9797
override val privacyPolicyUrl: String = BuildConfig.POLICY_URL
98+
override val donateUrl: String = BuildConfig.DONATE_URL
9899
override val gitHubSourceUrl: String = BuildConfig.GITHUB_SOURCE_URL
99100
override val setupInstructionsUrl: String = BuildConfig.SETUP_INSTRUCTIONS_URL
100101
override val demoModeUrl: String = BuildConfig.DEMO_MODE_API_URL

core/common/src/main/java/com/shifthackz/aisdv1/core/common/links/LinksProvider.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ interface LinksProvider {
66
val huggingFaceUrl: String
77
val openAiInfoUrl: String
88
val privacyPolicyUrl: String
9+
val donateUrl: String
910
val gitHubSourceUrl: String
1011
val setupInstructionsUrl: String
1112
val demoModeUrl: String

core/ui/src/main/java/com/shifthackz/aisdv1/core/ui/MviComponent.kt

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@ package com.shifthackz.aisdv1.core.ui
22

33
import androidx.compose.material3.MaterialTheme
44
import androidx.compose.runtime.Composable
5-
import androidx.compose.runtime.SideEffect
5+
import androidx.compose.runtime.LaunchedEffect
6+
import androidx.compose.runtime.getValue
67
import androidx.compose.ui.graphics.Color
8+
import androidx.compose.ui.platform.LocalLifecycleOwner
9+
import androidx.lifecycle.Lifecycle
10+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
711
import com.google.accompanist.systemuicontroller.rememberSystemUiController
812
import com.shifthackz.android.core.mvi.MviComponent
913
import com.shifthackz.android.core.mvi.MviEffect
@@ -21,8 +25,18 @@ fun <S : MviState, I: MviIntent, E : MviEffect> MviComponent(
2125
) {
2226
if (applySystemUiColors) {
2327
val systemUiController = rememberSystemUiController()
24-
SideEffect {
25-
systemUiController.setNavigationBarColor(navigationBarColor)
28+
val lifecycleOwner = LocalLifecycleOwner.current
29+
val lifecycleState by lifecycleOwner.lifecycle.currentStateFlow.collectAsStateWithLifecycle()
30+
31+
LaunchedEffect(lifecycleState) {
32+
when (lifecycleState) {
33+
Lifecycle.State.INITIALIZED,
34+
Lifecycle.State.RESUMED,
35+
Lifecycle.State.CREATED -> {
36+
systemUiController.setNavigationBarColor(navigationBarColor)
37+
}
38+
else -> Unit
39+
}
2640
}
2741
}
2842
MviComponent(

data/src/main/java/com/shifthackz/aisdv1/data/preference/PreferenceManagerImpl.kt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.shifthackz.aisdv1.data.preference
33
import android.content.SharedPreferences
44
import com.shifthackz.aisdv1.core.common.extensions.fixUrlSlashes
55
import com.shifthackz.aisdv1.core.common.extensions.shouldUseNewMediaStore
6+
import com.shifthackz.aisdv1.domain.entity.ColorToken
67
import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel
78
import com.shifthackz.aisdv1.domain.entity.ServerSource
89
import com.shifthackz.aisdv1.domain.entity.Settings
@@ -129,6 +130,33 @@ class PreferenceManagerImpl(
129130
.apply()
130131
.also { onPreferencesChanged() }
131132

133+
override var designUseSystemColorPalette: Boolean
134+
get() = preferences.getBoolean(KEY_DESIGN_DYNAMIC_COLORS, false)
135+
set(value) = preferences.edit()
136+
.putBoolean(KEY_DESIGN_DYNAMIC_COLORS, value)
137+
.apply()
138+
.also { onPreferencesChanged() }
139+
140+
override var designUseSystemDarkTheme: Boolean
141+
get() = preferences.getBoolean(KEY_DESIGN_SYSTEM_DARK_THEME, true)
142+
set(value) = preferences.edit()
143+
.putBoolean(KEY_DESIGN_SYSTEM_DARK_THEME, value)
144+
.apply()
145+
.also { onPreferencesChanged() }
146+
147+
override var designDarkTheme: Boolean
148+
get() = preferences.getBoolean(KEY_DESIGN_DARK_THEME, true)
149+
set(value) = preferences.edit()
150+
.putBoolean(KEY_DESIGN_DARK_THEME, value)
151+
.apply()
152+
.also { onPreferencesChanged() }
153+
override var designColorToken: String
154+
get() = preferences.getString(KEY_DESIGN_COLOR_TOKEN, "${ColorToken.MAUVE}") ?: "${ColorToken.MAUVE}"
155+
set(value) = preferences.edit()
156+
.putString(KEY_DESIGN_COLOR_TOKEN, value)
157+
.apply()
158+
.also { onPreferencesChanged() }
159+
132160
override fun observe(): Flowable<Settings> = preferencesChangedSubject
133161
.toFlowable(BackpressureStrategy.LATEST)
134162
.map {
@@ -143,6 +171,10 @@ class PreferenceManagerImpl(
143171
source = source,
144172
hordeApiKey = hordeApiKey,
145173
localUseNNAPI = localUseNNAPI,
174+
designUseSystemColorPalette = designUseSystemColorPalette,
175+
designUseSystemDarkTheme = designUseSystemDarkTheme,
176+
designDarkTheme = designDarkTheme,
177+
designColorToken = designColorToken,
146178
)
147179
}
148180

@@ -163,6 +195,10 @@ class PreferenceManagerImpl(
163195
private const val KEY_HUGGING_FACE_MODEL_KEY = "key_hugging_face_model_key"
164196
private const val KEY_LOCAL_NN_API = "key_local_nn_api"
165197
private const val KEY_LOCAL_MODEL_ID = "key_local_model_id"
198+
private const val KEY_DESIGN_DYNAMIC_COLORS = "key_design_dynamic_colors"
199+
private const val KEY_DESIGN_SYSTEM_DARK_THEME = "key_design_system_dark_theme"
200+
private const val KEY_DESIGN_DARK_THEME = "key_design_dark_theme"
201+
private const val KEY_DESIGN_COLOR_TOKEN = "key_design_color_token_theme"
166202
private const val KEY_FORCE_SETUP_AFTER_UPDATE = "force_upd_setup_v0.x.x-v0.5.8"
167203
}
168204
}

dependencies.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ ext {
1919
pagingComposeVersion = '1.0.0-alpha18'
2020
imagePickerVersion = 'v2.0.3'
2121
mviVersion = '1.0.1'
22+
dayNightSwitchVersion = '1.0.0'
2223
timberVersion = '5.0.1'
2324
apacheLangVersion = '3.14.0'
2425
gsonVersion = '2.10.1'
@@ -87,6 +88,7 @@ ext {
8788
ui = [
8889
imagePicker : "com.github.ShiftHackZ:ImagePicker:$imagePickerVersion",
8990
mvi : "com.github.ShiftHackZ:AndroidCoreMVI:$mviVersion",
91+
dayNightSwitch : "com.github.ShiftHackZ:DayNightSwitch:$dayNightSwitchVersion",
9092
catppuccinLegacy : "com.github.ShiftHackZ.Catppuccin-Android-Library:palette-legacy:$catppuccinVersion",
9193
catppuccinCompose : "com.github.ShiftHackZ.Catppuccin-Android-Library:compose:$catppuccinVersion",
9294
catppuccinSplashscreen: "com.github.ShiftHackZ.Catppuccin-Android-Library:splashscreen:$catppuccinVersion",
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.shifthackz.aisdv1.domain.entity
2+
3+
enum class ColorToken {
4+
ROSEWATER,
5+
FLAMINGO,
6+
PINK,
7+
MAUVE,
8+
RED,
9+
MAROON,
10+
PEACH,
11+
YELLOW,
12+
GREEN,
13+
TEAL,
14+
SKY,
15+
SAPPHIRE,
16+
BLUE,
17+
LAVENDER;
18+
19+
companion object {
20+
fun parse(value: String) = entries.find { "$it" == value } ?: MAUVE
21+
}
22+
}

domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Settings.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,8 @@ data class Settings(
1111
val source: ServerSource,
1212
val hordeApiKey: String,
1313
val localUseNNAPI: Boolean,
14+
val designUseSystemColorPalette: Boolean,
15+
val designUseSystemDarkTheme: Boolean,
16+
val designDarkTheme: Boolean,
17+
val designColorToken: String,
1418
)

domain/src/main/java/com/shifthackz/aisdv1/domain/preference/PreferenceManager.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ interface PreferenceManager {
2020
var forceSetupAfterUpdate: Boolean
2121
var localModelId: String
2222
var localUseNNAPI: Boolean
23+
var designUseSystemColorPalette: Boolean
24+
var designUseSystemDarkTheme: Boolean
25+
var designDarkTheme: Boolean
26+
var designColorToken: String
2327

2428
fun observe(): Flowable<Settings>
2529
}

presentation/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,6 @@ dependencies {
4141

4242
implementation ui.imagePicker
4343
implementation ui.catppuccinCompose
44+
implementation ui.dayNightSwitch
4445
implementation "androidx.exifinterface:exifinterface:1.3.6"
4546
}

0 commit comments

Comments
 (0)