Skip to content

Commit d4b9078

Browse files
committed
[feature|optimize|build] Support configure whether the group is expanded or not (#13); optimize SettingsItem.kt; update dependencies
1 parent 78d4fe1 commit d4b9078

File tree

13 files changed

+186
-23
lines changed

13 files changed

+186
-23
lines changed

app/build.gradle.kts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ android {
2121
minSdk = 24
2222
targetSdk = 34
2323
versionCode = 14
24-
versionName = "1.1-beta14"
24+
versionName = "1.1-beta15"
2525

2626
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
2727

@@ -105,7 +105,7 @@ android {
105105
buildConfig = true
106106
}
107107
composeOptions {
108-
kotlinCompilerExtensionVersion = "1.5.11"
108+
kotlinCompilerExtensionVersion = "1.5.12"
109109
}
110110
packaging {
111111
resources.excludes += mutableSetOf(
@@ -139,25 +139,25 @@ tasks.withType(KotlinCompile::class.java).configureEach {
139139

140140
dependencies {
141141

142-
implementation("androidx.core:core-ktx:1.12.0")
142+
implementation("androidx.core:core-ktx:1.13.0")
143143
implementation("androidx.appcompat:appcompat:1.6.1")
144144
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
145145
implementation("androidx.navigation:navigation-fragment-ktx:2.7.7")
146146
implementation("androidx.navigation:navigation-ui-ktx:2.7.7")
147147
implementation("androidx.navigation:navigation-compose:2.7.7")
148148
implementation("androidx.lifecycle:lifecycle-runtime-compose:2.7.0")
149-
implementation("androidx.compose.ui:ui:1.6.5")
150-
implementation("androidx.compose.material:material:1.6.5")
149+
implementation("androidx.compose.ui:ui:1.6.6")
150+
implementation("androidx.compose.material:material:1.6.6")
151151
implementation("androidx.compose.material3:material3:1.3.0-alpha05")
152152
implementation("androidx.compose.material3:material3-window-size-class:1.2.1")
153-
implementation("androidx.compose.material:material-icons-extended:1.6.5")
153+
implementation("androidx.compose.material:material-icons-extended:1.6.6")
154154
implementation("com.materialkolor:material-kolor:1.4.4")
155155
implementation("androidx.room:room-runtime:2.6.1")
156156
implementation("androidx.room:room-ktx:2.6.1")
157157
implementation("androidx.room:room-paging:2.6.1")
158158
ksp("androidx.room:room-compiler:2.6.1")
159159
implementation("androidx.work:work-runtime-ktx:2.9.0")
160-
implementation("androidx.datastore:datastore-preferences:1.0.0")
160+
implementation("androidx.datastore:datastore-preferences:1.1.0")
161161
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
162162
implementation("androidx.core:core-splashscreen:1.0.1")
163163
implementation("androidx.media3:media3-exoplayer:1.3.1")

app/src/main/java/com/skyd/anivu/ext/PreferenceExt.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,17 @@ import com.skyd.anivu.model.preference.IgnoreUpdateVersionPreference
55
import com.skyd.anivu.model.preference.Settings
66
import com.skyd.anivu.model.preference.appearance.DarkModePreference
77
import com.skyd.anivu.model.preference.appearance.ThemePreference
8+
import com.skyd.anivu.model.preference.appearance.feed.FeedGroupExpandPreference
89
import com.skyd.anivu.model.preference.behavior.article.ArticleSwipeLeftActionPreference
910
import com.skyd.anivu.model.preference.behavior.article.ArticleTapActionPreference
1011
import com.skyd.anivu.model.preference.behavior.article.DeduplicateTitleInDescPreference
1112

1213
fun Preferences.toSettings(): Settings {
1314
return Settings(
14-
// Theme
15+
// Appearance
1516
theme = ThemePreference.fromPreferences(this),
1617
darkMode = DarkModePreference.fromPreferences(this),
18+
feedGroupExpand = FeedGroupExpandPreference.fromPreferences(this),
1719

1820
// Update
1921
ignoreUpdateVersion = IgnoreUpdateVersionPreference.fromPreferences(this),

app/src/main/java/com/skyd/anivu/model/bean/GroupBean.kt

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,26 @@ data class GroupBean(
2222
@ColumnInfo(name = NAME_COLUMN)
2323
val name: String,
2424
) : BaseBean, Parcelable {
25+
override fun equals(other: Any?): Boolean {
26+
if (this === other) return true
27+
if (other !is GroupBean) return false
28+
return groupId == other.groupId
29+
}
30+
31+
override fun hashCode(): Int {
32+
return groupId.hashCode()
33+
}
34+
2535
companion object {
2636
const val DEFAULT_GROUP_ID = "default"
2737

2838
const val NAME_COLUMN = "name"
2939
const val GROUP_ID_COLUMN = "groupId"
3040

31-
val defaultGroup = GroupBean(
32-
groupId = DEFAULT_GROUP_ID,
33-
name = appContext.getString(R.string.default_feed_group)
34-
)
41+
val defaultGroup
42+
get() = GroupBean(
43+
groupId = DEFAULT_GROUP_ID,
44+
name = appContext.getString(R.string.default_feed_group)
45+
)
3546
}
3647
}

app/src/main/java/com/skyd/anivu/model/preference/Settings.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,25 @@ import com.skyd.anivu.ext.dataStore
1010
import com.skyd.anivu.ext.toSettings
1111
import com.skyd.anivu.model.preference.appearance.DarkModePreference
1212
import com.skyd.anivu.model.preference.appearance.ThemePreference
13+
import com.skyd.anivu.model.preference.appearance.feed.FeedGroupExpandPreference
1314
import com.skyd.anivu.model.preference.behavior.article.ArticleSwipeLeftActionPreference
1415
import com.skyd.anivu.model.preference.behavior.article.ArticleTapActionPreference
1516
import com.skyd.anivu.model.preference.behavior.article.DeduplicateTitleInDescPreference
1617
import com.skyd.anivu.ui.local.LocalArticleSwipeLeftAction
1718
import com.skyd.anivu.ui.local.LocalArticleTapAction
1819
import com.skyd.anivu.ui.local.LocalDarkMode
1920
import com.skyd.anivu.ui.local.LocalDeduplicateTitleInDesc
21+
import com.skyd.anivu.ui.local.LocalFeedGroupExpand
2022
import com.skyd.anivu.ui.local.LocalIgnoreUpdateVersion
2123
import com.skyd.anivu.ui.local.LocalTheme
2224
import kotlinx.coroutines.Dispatchers
2325
import kotlinx.coroutines.flow.map
2426

2527
data class Settings(
26-
// Theme
28+
// Appearance
2729
val theme: String = ThemePreference.default,
2830
val darkMode: Int = DarkModePreference.default,
31+
val feedGroupExpand: Boolean = FeedGroupExpandPreference.default,
2932
// Update
3033
val ignoreUpdateVersion: Long = IgnoreUpdateVersionPreference.default,
3134
// Behavior
@@ -43,9 +46,10 @@ fun SettingsProvider(
4346
.collectAsState(initial = Settings(), context = Dispatchers.Default)
4447

4548
CompositionLocalProvider(
46-
// Theme
49+
// Appearance
4750
LocalTheme provides settings.theme,
4851
LocalDarkMode provides settings.darkMode,
52+
LocalFeedGroupExpand provides settings.feedGroupExpand,
4953
// Update
5054
LocalIgnoreUpdateVersion provides settings.ignoreUpdateVersion,
5155
// Behavior
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.skyd.anivu.model.preference.appearance.feed
2+
3+
import android.content.Context
4+
import androidx.datastore.preferences.core.Preferences
5+
import androidx.datastore.preferences.core.booleanPreferencesKey
6+
import com.skyd.anivu.base.BasePreference
7+
import com.skyd.anivu.ext.dataStore
8+
import com.skyd.anivu.ext.put
9+
import kotlinx.coroutines.CoroutineScope
10+
import kotlinx.coroutines.Dispatchers
11+
import kotlinx.coroutines.launch
12+
13+
object FeedGroupExpandPreference : BasePreference<Boolean> {
14+
private const val FEED_GROUP_EXPAND = "feedGroupExpand"
15+
override val default = true
16+
17+
val key = booleanPreferencesKey(FEED_GROUP_EXPAND)
18+
19+
fun put(context: Context, scope: CoroutineScope, value: Boolean) {
20+
scope.launch(Dispatchers.IO) {
21+
context.dataStore.put(key, value)
22+
}
23+
}
24+
25+
override fun fromPreferences(preferences: Preferences): Boolean = preferences[key] ?: default
26+
}

app/src/main/java/com/skyd/anivu/ui/component/SettingsItem.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ fun BannerItem(content: @Composable () -> Unit) {
5454
Spacer(modifier = Modifier.height(16.dp))
5555
CompositionLocalProvider(
5656
LocalContentColor provides (LocalContentColor.current alwaysLight true),
57-
LocalVerticalPadding provides 12.dp
57+
LocalVerticalPadding provides 21.dp
5858
) {
5959
Box(
6060
modifier = Modifier
@@ -354,7 +354,7 @@ fun BaseSettingsItem(
354354
combinedClickable(onLongClick = onLongClick) { onClick() }
355355
} else this
356356
}
357-
.padding(LocalVerticalPadding.current),
357+
.padding(horizontal = 16.dp),
358358
verticalAlignment = Alignment.CenterVertically
359359
) {
360360
if (icon != null) {
@@ -379,7 +379,7 @@ fun BaseSettingsItem(
379379
Column(
380380
modifier = Modifier
381381
.weight(1f)
382-
.padding(horizontal = 10.dp)
382+
.padding(horizontal = 10.dp, vertical = LocalVerticalPadding.current)
383383
) {
384384
Text(
385385
text = text,
@@ -389,7 +389,7 @@ fun BaseSettingsItem(
389389
)
390390
dropdownMenu?.invoke()
391391
if (description != null) {
392-
Box(modifier = Modifier.padding(top = 5.dp)) {
392+
Box(modifier = Modifier.padding(top = 4.dp)) {
393393
description.invoke()
394394
}
395395
}

app/src/main/java/com/skyd/anivu/ui/fragment/feed/FeedScreen.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ import androidx.compose.ui.Alignment
4949
import androidx.compose.ui.Modifier
5050
import androidx.compose.ui.focus.FocusDirection
5151
import androidx.compose.ui.focus.FocusRequester
52-
import androidx.compose.ui.focus.focusProperties
5352
import androidx.compose.ui.focus.focusRequester
5453
import androidx.compose.ui.graphics.Color
5554
import androidx.compose.ui.input.nestedscroll.nestedScroll
@@ -81,6 +80,7 @@ import com.skyd.anivu.ui.component.lazyverticalgrid.adapter.LazyGridAdapter
8180
import com.skyd.anivu.ui.component.lazyverticalgrid.adapter.proxy.Feed1Proxy
8281
import com.skyd.anivu.ui.component.lazyverticalgrid.adapter.proxy.Group1Proxy
8382
import com.skyd.anivu.ui.fragment.search.SearchFragment
83+
import com.skyd.anivu.ui.local.LocalFeedGroupExpand
8484
import com.skyd.anivu.ui.local.LocalNavController
8585
import com.skyd.anivu.ui.local.LocalWindowSizeClass
8686
import kotlinx.coroutines.android.awaitFrame
@@ -170,7 +170,7 @@ fun FeedScreen(viewModel: FeedViewModel = hiltViewModel()) {
170170
is GroupListState.Success -> {
171171
FeedList(
172172
result = groupListState.dataList,
173-
contentPadding = innerPadding + PaddingValues(bottom = fabHeight),
173+
contentPadding = innerPadding + PaddingValues(bottom = fabHeight + 16.dp),
174174
onRemoveFeed = { feed -> dispatch(FeedIntent.RemoveFeed(feed.url)) },
175175
onEditFeed = { feed ->
176176
openEditDialog = feed
@@ -405,6 +405,7 @@ private fun EditFeedDialog(
405405
AniVuIconButton(
406406
onClick = openCreateGroupDialog,
407407
imageVector = Icons.Default.Add,
408+
contentDescription = stringResource(id = R.string.feed_screen_add_group),
408409
)
409410
}
410411

@@ -474,12 +475,13 @@ private fun FeedList(
474475
onMoveToGroup: (from: GroupBean, to: GroupBean) -> Unit,
475476
openCreateGroupDialog: () -> Unit,
476477
) {
478+
val feedGroupExpand = LocalFeedGroupExpand.current
477479
val groups = rememberSaveable(result) { result.filterIsInstance<GroupBean>() }
478480
val feedVisible = rememberSaveable(saver = snapshotStateMapSaver()) {
479481
mutableStateMapOf(
480-
GroupBean.DEFAULT_GROUP_ID to false,
482+
GroupBean.DEFAULT_GROUP_ID to feedGroupExpand,
481483
*(groups
482-
.map { it.groupId to false }
484+
.map { it.groupId to feedGroupExpand }
483485
.toTypedArray())
484486
)
485487
}

app/src/main/java/com/skyd/anivu/ui/fragment/settings/appearance/AppearanceFragment.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ import android.content.Context
44
import android.os.Bundle
55
import android.util.TypedValue
66
import androidx.lifecycle.lifecycleScope
7+
import androidx.preference.Preference
78
import androidx.preference.PreferenceCategory
89
import androidx.preference.PreferenceScreen
910
import androidx.preference.SwitchPreferenceCompat
1011
import com.google.android.material.color.DynamicColors
1112
import com.skyd.anivu.R
1213
import com.skyd.anivu.base.BasePreferenceFragmentCompat
1314
import com.skyd.anivu.ext.dataStore
15+
import com.skyd.anivu.ext.findMainNavController
1416
import com.skyd.anivu.ext.getOrDefault
1517
import com.skyd.anivu.ext.inDarkMode
1618
import com.skyd.anivu.model.preference.appearance.DarkModePreference
@@ -90,6 +92,22 @@ class AppearanceFragment : BasePreferenceFragmentCompat() {
9092
themeCategory.addPreference(this)
9193
}
9294
}
95+
96+
val styleCategory = PreferenceCategory(this).apply {
97+
key = "styleCategory"
98+
title = getString(R.string.appearance_fragment_style_category)
99+
screen.addPreference(this)
100+
}
101+
102+
Preference(this).apply {
103+
key = "feedScreenStyle"
104+
title = getString(R.string.feed_style_screen_name)
105+
setOnPreferenceClickListener {
106+
findMainNavController().navigate(R.id.action_to_feed_style_fragment)
107+
true
108+
}
109+
styleCategory.addPreference(this)
110+
}
93111
}
94112

95113
private fun getColorPalettes(): List<ColorPalettesPreference.ColorPalette> {
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package com.skyd.anivu.ui.fragment.settings.appearance.feed
2+
3+
import android.os.Bundle
4+
import android.view.LayoutInflater
5+
import android.view.View
6+
import android.view.ViewGroup
7+
import androidx.compose.foundation.layout.fillMaxSize
8+
import androidx.compose.foundation.lazy.LazyColumn
9+
import androidx.compose.material.icons.Icons
10+
import androidx.compose.material.icons.filled.Expand
11+
import androidx.compose.material3.Scaffold
12+
import androidx.compose.material3.Text
13+
import androidx.compose.material3.TopAppBarDefaults
14+
import androidx.compose.runtime.Composable
15+
import androidx.compose.runtime.rememberCoroutineScope
16+
import androidx.compose.ui.Modifier
17+
import androidx.compose.ui.input.nestedscroll.nestedScroll
18+
import androidx.compose.ui.platform.LocalContext
19+
import androidx.compose.ui.res.stringResource
20+
import com.skyd.anivu.R
21+
import com.skyd.anivu.base.BaseComposeFragment
22+
import com.skyd.anivu.model.preference.appearance.feed.FeedGroupExpandPreference
23+
import com.skyd.anivu.ui.component.AniVuTopBar
24+
import com.skyd.anivu.ui.component.AniVuTopBarStyle
25+
import com.skyd.anivu.ui.component.CategorySettingsItem
26+
import com.skyd.anivu.ui.component.SwitchSettingsItem
27+
import com.skyd.anivu.ui.local.LocalFeedGroupExpand
28+
import dagger.hilt.android.AndroidEntryPoint
29+
30+
31+
@AndroidEntryPoint
32+
class FeedAppearanceFragment : BaseComposeFragment() {
33+
override fun onCreateView(
34+
inflater: LayoutInflater,
35+
container: ViewGroup?,
36+
savedInstanceState: Bundle?
37+
): View = setContentBase { FeedStyleScreen() }
38+
}
39+
40+
@Composable
41+
fun FeedStyleScreen() {
42+
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
43+
val context = LocalContext.current
44+
val scope = rememberCoroutineScope()
45+
46+
Scaffold(
47+
topBar = {
48+
AniVuTopBar(
49+
style = AniVuTopBarStyle.Large,
50+
scrollBehavior = scrollBehavior,
51+
title = { Text(text = stringResource(R.string.feed_style_screen_name)) },
52+
)
53+
}
54+
) { paddingValues ->
55+
LazyColumn(
56+
modifier = Modifier
57+
.fillMaxSize()
58+
.nestedScroll(scrollBehavior.nestedScrollConnection),
59+
contentPadding = paddingValues,
60+
) {
61+
item {
62+
CategorySettingsItem(text = stringResource(id = R.string.feed_style_screen_group_list_category))
63+
}
64+
item {
65+
val feedGroupExpand = LocalFeedGroupExpand.current
66+
SwitchSettingsItem(
67+
imageVector = Icons.Default.Expand,
68+
text = stringResource(id = R.string.feed_style_screen_feed_group_expand),
69+
checked = feedGroupExpand,
70+
onCheckedChange = {
71+
FeedGroupExpandPreference.put(
72+
context = context,
73+
scope = scope,
74+
value = it,
75+
)
76+
}
77+
)
78+
}
79+
}
80+
}
81+
}

app/src/main/java/com/skyd/anivu/ui/local/LocalValue.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.navigation.NavHostController
66
import com.skyd.anivu.model.preference.IgnoreUpdateVersionPreference
77
import com.skyd.anivu.model.preference.appearance.DarkModePreference
88
import com.skyd.anivu.model.preference.appearance.ThemePreference
9+
import com.skyd.anivu.model.preference.appearance.feed.FeedGroupExpandPreference
910
import com.skyd.anivu.model.preference.behavior.article.ArticleSwipeLeftActionPreference
1011
import com.skyd.anivu.model.preference.behavior.article.ArticleTapActionPreference
1112
import com.skyd.anivu.model.preference.behavior.article.DeduplicateTitleInDescPreference
@@ -18,9 +19,10 @@ val LocalWindowSizeClass = compositionLocalOf<WindowSizeClass> {
1819
error("LocalWindowSizeClass not initialized!")
1920
}
2021

21-
// Theme
22+
// Appearance
2223
val LocalTheme = compositionLocalOf { ThemePreference.default }
2324
val LocalDarkMode = compositionLocalOf { DarkModePreference.default }
25+
val LocalFeedGroupExpand = compositionLocalOf { FeedGroupExpandPreference.default }
2426

2527
// Update
2628
val LocalIgnoreUpdateVersion = compositionLocalOf { IgnoreUpdateVersionPreference.default }

0 commit comments

Comments
 (0)