Skip to content

Commit 201d381

Browse files
committed
Merge branch 'android15' into develop
2 parents 816dc69 + 4455fb2 commit 201d381

File tree

77 files changed

+495
-305
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

77 files changed

+495
-305
lines changed

app-backup/src/main/java/xyz/aprildown/timer/app/backup/AppPreferencesProviderImpl.kt

Lines changed: 23 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -328,8 +328,6 @@ private class ThemePreferenceItem : PreferenceItem {
328328
map[PreferenceData.AppTheme.PREF_TYPE] = appTheme.type.toString()
329329
map[PreferenceData.AppTheme.PREF_PRIMARY] = appTheme.colorPrimary.toString()
330330
map[PreferenceData.AppTheme.PREF_SECONDARY] = appTheme.colorSecondary.toString()
331-
map[PreferenceData.AppTheme.PREF_SAME_STATUS_BAR] = appTheme.sameStatusBar.toString()
332-
map[PreferenceData.AppTheme.PREF_ENABLE_NAV] = appTheme.enableNav.toString()
333331

334332
map[PreferenceData.KEY_STEP_NORMAL] = StepType.NORMAL.getTypeColor(context).toString()
335333
map[PreferenceData.KEY_STEP_NOTIFIER] = StepType.NOTIFIER.getTypeColor(context).toString()
@@ -344,35 +342,29 @@ private class ThemePreferenceItem : PreferenceItem {
344342
) {
345343
prefs.ifHasKey(PreferenceData.AppTheme.PREF_PRIMARY) { primary ->
346344
prefs.ifHasKey(PreferenceData.AppTheme.PREF_SECONDARY) { secondary ->
347-
prefs.ifHasKey(PreferenceData.AppTheme.PREF_SAME_STATUS_BAR) { sameStatus ->
348-
prefs.ifHasKey(PreferenceData.AppTheme.PREF_ENABLE_NAV) { enableNav ->
349-
PreferenceData.AppTheme(
350-
type = prefs.getOrDefault(
351-
PreferenceData.AppTheme.PREF_TYPE,
352-
PreferenceData.AppTheme.AppThemeType.TYPE_COLOR.toString()
353-
).toInt(),
354-
colorPrimary = primary.toInt(),
355-
colorSecondary = secondary.toInt(),
356-
sameStatusBar = sameStatus.toBoolean(),
357-
enableNav = enableNav.toBoolean(),
358-
).also {
359-
context.appTheme = it
360-
AppThemeUtils.configAppTheme(context, it)
361-
}
362-
363-
prefs.ifHasKey(PreferenceData.KEY_STEP_NORMAL) {
364-
StepType.NORMAL.saveTypeColor(context, it.toInt())
365-
}
366-
prefs.ifHasKey(PreferenceData.KEY_STEP_NOTIFIER) {
367-
StepType.NOTIFIER.saveTypeColor(context, it.toInt())
368-
}
369-
prefs.ifHasKey(PreferenceData.KEY_STEP_START) {
370-
StepType.START.saveTypeColor(context, it.toInt())
371-
}
372-
prefs.ifHasKey(PreferenceData.KEY_STEP_END) {
373-
StepType.END.saveTypeColor(context, it.toInt())
374-
}
375-
}
345+
PreferenceData.AppTheme(
346+
type = prefs.getOrDefault(
347+
PreferenceData.AppTheme.PREF_TYPE,
348+
PreferenceData.AppTheme.AppThemeType.TYPE_COLOR.toString()
349+
).toInt(),
350+
colorPrimary = primary.toInt(),
351+
colorSecondary = secondary.toInt(),
352+
).also {
353+
context.appTheme = it
354+
AppThemeUtils.configAppTheme(context, it)
355+
}
356+
357+
prefs.ifHasKey(PreferenceData.KEY_STEP_NORMAL) {
358+
StepType.NORMAL.saveTypeColor(context, it.toInt())
359+
}
360+
prefs.ifHasKey(PreferenceData.KEY_STEP_NOTIFIER) {
361+
StepType.NOTIFIER.saveTypeColor(context, it.toInt())
362+
}
363+
prefs.ifHasKey(PreferenceData.KEY_STEP_START) {
364+
StepType.START.saveTypeColor(context, it.toInt())
365+
}
366+
prefs.ifHasKey(PreferenceData.KEY_STEP_END) {
367+
StepType.END.saveTypeColor(context, it.toInt())
376368
}
377369
}
378370
}

app-backup/src/main/java/xyz/aprildown/timer/app/backup/BackupComposables.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.annotation.StringRes
55
import androidx.compose.foundation.clickable
66
import androidx.compose.foundation.layout.Arrangement
77
import androidx.compose.foundation.layout.Column
8+
import androidx.compose.foundation.layout.navigationBarsPadding
89
import androidx.compose.foundation.layout.padding
910
import androidx.compose.foundation.rememberScrollState
1011
import androidx.compose.foundation.selection.toggleable
@@ -47,7 +48,8 @@ internal fun Backup(
4748
Column(
4849
modifier = modifier
4950
.verticalScroll(rememberScrollState())
50-
.padding(16.dp),
51+
.padding(16.dp)
52+
.navigationBarsPadding(),
5153
verticalArrangement = Arrangement.spacedBy(16.dp),
5254
) {
5355
Header(text = contentLocationTitle)

app-backup/src/main/java/xyz/aprildown/timer/app/backup/BackupFragment.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ package xyz.aprildown.timer.app.backup
33
import android.os.Bundle
44
import androidx.navigation.fragment.NavHostFragment
55
import androidx.preference.Preference
6-
import androidx.preference.PreferenceFragmentCompat
76
import dagger.hilt.android.AndroidEntryPoint
7+
import xyz.aprildown.timer.app.base.ui.BasePreferenceFragmentCompat
88
import xyz.aprildown.timer.app.base.ui.FlavorUiInjector
99
import xyz.aprildown.timer.app.base.ui.FlavorUiInjectorQualifier
1010
import xyz.aprildown.timer.app.base.utils.NavigationUtils.subLevelNavigate
@@ -13,7 +13,7 @@ import javax.inject.Inject
1313
import xyz.aprildown.timer.app.base.R as RBase
1414

1515
@AndroidEntryPoint
16-
class BackupFragment : PreferenceFragmentCompat() {
16+
class BackupFragment : BasePreferenceFragmentCompat() {
1717

1818
@Inject
1919
@FlavorUiInjectorQualifier

app-base/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ dependencies {
2121
testImplementation libs.junit
2222

2323
api libs.androidx.recyclerView
24+
implementation libs.androidx.preference
2425
api libs.androidx.constraintLayout
2526
implementation libs.androidx.customTabs
2627
implementation libs.androidx.media

app-base/src/main/java/xyz/aprildown/timer/app/base/data/PreferenceData.kt

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -294,8 +294,6 @@ object PreferenceData {
294294
val colorPrimary: Int,
295295
@ColorInt
296296
val colorSecondary: Int,
297-
val sameStatusBar: Boolean = false,
298-
val enableNav: Boolean = false,
299297
) {
300298

301299
@IntDef(TYPE_COLOR, TYPE_DYNAMIC_DARK, TYPE_DYNAMIC_LIGHT)
@@ -313,8 +311,6 @@ object PreferenceData {
313311
const val PREF_TYPE = "${PREF_PREFIX}type"
314312
const val PREF_PRIMARY = "${PREF_PREFIX}primary"
315313
const val PREF_SECONDARY = "${PREF_PREFIX}accent"
316-
const val PREF_SAME_STATUS_BAR = "${PREF_PREFIX}same_status_bar"
317-
const val PREF_ENABLE_NAV = "${PREF_PREFIX}enable_nav"
318314

319315
// androidx.compose.material3.dynamicLightColorScheme
320316
@RequiresApi(Build.VERSION_CODES.S)
@@ -335,26 +331,20 @@ object PreferenceData {
335331
get() {
336332
val sp = safeSharedPreference
337333
val type = sp.getInt(AppTheme.PREF_TYPE, TYPE_COLOR)
338-
val sameStatusBar = sp.getBoolean(AppTheme.PREF_SAME_STATUS_BAR, true)
339-
val enableNav = sp.getBoolean(AppTheme.PREF_ENABLE_NAV, false)
340334

341335
return when {
342336
Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && type == TYPE_DYNAMIC_DARK -> {
343337
AppTheme(
344338
type = type,
345339
colorPrimary = color(AppTheme.dynamicDarkPrimaryColorRes),
346340
colorSecondary = color(AppTheme.dynamicDarkSecondaryColorRes),
347-
sameStatusBar = sameStatusBar,
348-
enableNav = enableNav,
349341
)
350342
}
351343
Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && type == TYPE_DYNAMIC_LIGHT -> {
352344
AppTheme(
353345
type = type,
354346
colorPrimary = color(AppTheme.dynamicLightPrimaryColorRes),
355347
colorSecondary = color(AppTheme.dynamicLightSecondaryColorRes),
356-
sameStatusBar = sameStatusBar,
357-
enableNav = enableNav,
358348
)
359349
}
360350
else -> {
@@ -368,8 +358,6 @@ object PreferenceData {
368358
AppTheme.PREF_SECONDARY,
369359
color(R.color.colorSecondary)
370360
),
371-
sameStatusBar = sameStatusBar,
372-
enableNav = enableNav,
373361
)
374362
}
375363
}
@@ -379,8 +367,6 @@ object PreferenceData {
379367
putInt(AppTheme.PREF_TYPE, value.type)
380368
putInt(AppTheme.PREF_PRIMARY, value.colorPrimary)
381369
putInt(AppTheme.PREF_SECONDARY, value.colorSecondary)
382-
putBoolean(AppTheme.PREF_SAME_STATUS_BAR, value.sameStatusBar)
383-
putBoolean(AppTheme.PREF_ENABLE_NAV, value.enableNav)
384370
}
385371
}
386372

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,31 @@
11
package xyz.aprildown.timer.app.base.ui
22

3-
import android.view.View
3+
import android.os.Bundle
4+
import androidx.activity.enableEdgeToEdge
45
import androidx.appcompat.app.AppCompatActivity
5-
import androidx.appcompat.app.AppCompatDelegate
6+
import androidx.core.view.WindowCompat
67
import com.github.deweyreed.tools.helper.isDarkTheme
7-
import xyz.aprildown.timer.app.base.utils.AppThemeUtils
8+
import com.github.deweyreed.tools.helper.themeColor
9+
import com.github.deweyreed.tools.utils.ThemeColorUtils
10+
import com.google.android.material.R as RMaterial
811

912
abstract class BaseActivity : AppCompatActivity() {
1013

11-
override fun setContentView(view: View?) {
12-
super.setContentView(view)
13-
newDynamicTheme.tintSystemUi(this)
14+
override fun onCreate(savedInstanceState: Bundle?) {
15+
enableEdgeToEdge()
16+
super.onCreate(savedInstanceState)
17+
tintSystemUi()
1418
}
1519

16-
override fun setContentView(layoutResID: Int) {
17-
super.setContentView(layoutResID)
18-
newDynamicTheme.tintSystemUi(this)
19-
}
20-
21-
override fun onNightModeChanged(mode: Int) {
22-
AppThemeUtils.configThemeForDark(
23-
this,
24-
isDark = when (mode) {
25-
AppCompatDelegate.MODE_NIGHT_YES -> true
26-
AppCompatDelegate.MODE_NIGHT_NO -> false
27-
else -> resources.isDarkTheme
20+
private fun tintSystemUi() {
21+
val controller = WindowCompat.getInsetsController(window, window.decorView)
22+
val isLight = ThemeColorUtils.isLightColor(
23+
if (resources.isDarkTheme) {
24+
themeColor(RMaterial.attr.colorSurface)
25+
} else {
26+
newDynamicTheme.colorPrimary
2827
}
2928
)
29+
controller.isAppearanceLightStatusBars = isLight
3030
}
3131
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package xyz.aprildown.timer.app.base.ui
2+
3+
import android.os.Bundle
4+
import android.view.LayoutInflater
5+
import android.view.ViewGroup
6+
import androidx.core.view.ViewCompat
7+
import androidx.core.view.WindowInsetsCompat
8+
import androidx.core.view.updatePadding
9+
import androidx.preference.PreferenceFragmentCompat
10+
import androidx.recyclerview.widget.RecyclerView
11+
12+
abstract class BasePreferenceFragmentCompat : PreferenceFragmentCompat() {
13+
override fun onCreateRecyclerView(
14+
inflater: LayoutInflater,
15+
parent: ViewGroup,
16+
savedInstanceState: Bundle?
17+
): RecyclerView {
18+
return super.onCreateRecyclerView(inflater, parent, savedInstanceState)
19+
.also { recyclerView ->
20+
ViewCompat.setOnApplyWindowInsetsListener(recyclerView) { view, insets ->
21+
val target = insets.getInsets(WindowInsetsCompat.Type.navigationBars())
22+
view.updatePadding(bottom = target.bottom)
23+
WindowInsetsCompat.CONSUMED
24+
}
25+
}
26+
}
27+
}

app-base/src/main/java/xyz/aprildown/timer/app/base/ui/DynamicTheme.kt

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package xyz.aprildown.timer.app.base.ui
22

3-
import android.app.Activity
43
import xyz.aprildown.theme.Theme
54

65
interface DynamicTheme {
@@ -11,11 +10,6 @@ interface DynamicTheme {
1110
val colorSecondaryVariant: Int
1211
val colorOnSecondary: Int
1312

14-
val colorStatusBar: Int
15-
val colorNavigationBar: Int
16-
17-
fun tintSystemUi(activity: Activity)
18-
1913
var enabled: Boolean
2014

2115
fun withoutDynamicTheme(r: DynamicThemeResume.() -> Unit)
@@ -37,12 +31,6 @@ private class DynamicThemeImpl : DynamicTheme {
3731
override val colorSecondary: Int get() = theme.colorSecondary
3832
override val colorSecondaryVariant: Int get() = theme.colorSecondaryVariant
3933
override val colorOnSecondary: Int get() = theme.colorOnSecondary
40-
override val colorStatusBar: Int get() = theme.colorStatusBar
41-
override val colorNavigationBar: Int get() = theme.colorNavigationBar
42-
43-
override fun tintSystemUi(activity: Activity) {
44-
Theme.tintSystemUi(activity)
45-
}
4634

4735
override var enabled: Boolean
4836
get() = Theme.get().enabled
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package xyz.aprildown.timer.app.base.ui
2+
3+
import android.app.Activity
4+
import android.content.Context
5+
import android.content.ContextWrapper
6+
import android.graphics.drawable.ColorDrawable
7+
import android.util.AttributeSet
8+
import android.view.View
9+
import androidx.core.view.ViewCompat
10+
import androidx.core.view.WindowCompat
11+
import androidx.core.view.WindowInsetsCompat
12+
import androidx.core.view.isVisible
13+
import androidx.core.view.updateLayoutParams
14+
import com.github.deweyreed.tools.anko.dp
15+
import com.github.deweyreed.tools.utils.ThemeColorUtils
16+
17+
class StatusBarView(
18+
context: Context,
19+
attrs: AttributeSet? = null
20+
) : View(context, attrs) {
21+
init {
22+
importantForAccessibility = IMPORTANT_FOR_ACCESSIBILITY_NO
23+
isVisible = false
24+
ViewCompat.setOnApplyWindowInsetsListener(this) { _, insets ->
25+
val systemBarInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars())
26+
val top = systemBarInsets.top
27+
if (top > 0) {
28+
isVisible = true
29+
updateLayoutParams { height = top }
30+
} else {
31+
isVisible = false
32+
}
33+
insets
34+
}
35+
}
36+
37+
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
38+
if (isInEditMode) {
39+
super.onMeasure(
40+
widthMeasureSpec,
41+
MeasureSpec.makeMeasureSpec(context.dp(24).toInt(), MeasureSpec.EXACTLY)
42+
)
43+
} else {
44+
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
45+
}
46+
}
47+
}
48+
49+
class NavigationBarView(
50+
context: Context,
51+
attrs: AttributeSet? = null
52+
) : View(context, attrs) {
53+
private val controller = context.getActivity()?.run {
54+
WindowCompat.getInsetsController(window, window.decorView)
55+
}
56+
private val initialLightNavBar = controller?.isAppearanceLightNavigationBars
57+
58+
init {
59+
importantForAccessibility = IMPORTANT_FOR_ACCESSIBILITY_NO
60+
isVisible = false
61+
ViewCompat.setOnApplyWindowInsetsListener(this) { _, insets ->
62+
val systemBarInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars())
63+
val bottom = systemBarInsets.bottom
64+
if (bottom > 0) {
65+
isVisible = true
66+
updateLayoutParams { height = bottom }
67+
val backgroundColor = (background as? ColorDrawable)?.color
68+
if (backgroundColor != null) {
69+
controller?.isAppearanceLightNavigationBars =
70+
ThemeColorUtils.isLightColor(backgroundColor)
71+
}
72+
} else {
73+
isVisible = false
74+
}
75+
insets
76+
}
77+
}
78+
79+
override fun onDetachedFromWindow() {
80+
super.onDetachedFromWindow()
81+
if (initialLightNavBar != null) {
82+
controller?.isAppearanceLightNavigationBars = initialLightNavBar
83+
}
84+
}
85+
86+
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
87+
if (isInEditMode) {
88+
super.onMeasure(
89+
widthMeasureSpec,
90+
MeasureSpec.makeMeasureSpec(context.dp(24).toInt(), MeasureSpec.EXACTLY)
91+
)
92+
} else {
93+
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
94+
}
95+
}
96+
}
97+
98+
private fun Context.getActivity(): Activity? {
99+
if (this is Activity) return this
100+
if (this is ContextWrapper) return baseContext.getActivity()
101+
return null
102+
}

0 commit comments

Comments
 (0)