Skip to content

Commit 0d42266

Browse files
committed
update
1 parent 3c39cbb commit 0d42266

File tree

7 files changed

+174
-16
lines changed

7 files changed

+174
-16
lines changed

app/src/main/java/com/wzq/jd/compose/app/data/local/ArticleDao.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,7 @@ interface ArticleDao {
2121

2222
@Query("select * from articles")
2323
suspend fun getArticlesAll(): List<ArticleItem>
24+
25+
@Query("select count(id) from articles")
26+
suspend fun getArticlesSize(): Int
2427
}

app/src/main/java/com/wzq/jd/compose/app/data/local/CategoriesDao.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,7 @@ interface CategoriesDao {
1818

1919
@Query("Select * from categories")
2020
suspend fun getCategoriesAll(): List<Categories>
21+
22+
@Query("select count(id) from categories")
23+
suspend fun getCategoriesSize(): Int
2124
}

app/src/main/java/com/wzq/jd/compose/app/page/MainNavGraph.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import com.wzq.jd.compose.app.data.model.Categories
1414
import com.wzq.jd.compose.app.page.categories.CategoryScreen
1515
import com.wzq.jd.compose.app.page.home.HomeScreen
1616
import com.wzq.jd.compose.app.page.search.SearchScreen
17+
import com.wzq.jd.compose.app.page.setting.SettingScreen
1718
import com.wzq.jd.compose.app.page.web.WebScreen
1819

1920
/**
@@ -36,6 +37,7 @@ fun MainNavGraph(hostName: String = "main", navController: NavHostController) {
3637
webPage(navActions)
3738
searchPage(navActions)
3839
categoryPage(navActions)
40+
settingPage(navActions)
3941
}
4042
}
4143

@@ -58,3 +60,7 @@ private fun NavGraphBuilder.categoryPage(navActions: NavActions) =
5860
// val position = backStackEntry.arguments?.getInt("position", 0)
5961
CategoryScreen(navActions = navActions, viewModel())
6062
}
63+
64+
private fun NavGraphBuilder.settingPage(navActions: NavActions) = composable(ScreenPath.Setting.route) {
65+
SettingScreen(navActions)
66+
}

app/src/main/java/com/wzq/jd/compose/app/page/ScreenRouter.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ sealed class ScreenPath(
3535

3636
fun createPath(position: Int) = "category?position=${position}"
3737
}
38+
39+
data object Setting: ScreenPath("setting")
3840
}
3941

4042
interface CommonActions {
@@ -61,6 +63,10 @@ class NavActions(private val navController: NavController) : CommonActions {
6163

6264
}
6365

66+
fun toSetting() {
67+
navController.navigate(ScreenPath.Setting.route)
68+
}
69+
6470
override fun goBack() = navController.navigateUp()
6571
}
6672

app/src/main/java/com/wzq/jd/compose/app/page/home/HomeProjectPage.kt

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@ import androidx.compose.foundation.layout.Box
66
import androidx.compose.foundation.layout.PaddingValues
77
import androidx.compose.foundation.layout.fillMaxSize
88
import androidx.compose.foundation.layout.fillMaxWidth
9+
import androidx.compose.foundation.layout.height
910
import androidx.compose.foundation.layout.padding
1011
import androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid
1112
import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells
1213
import androidx.compose.material3.Card
14+
import androidx.compose.material3.CircularProgressIndicator
1315
import androidx.compose.material3.ExperimentalMaterial3Api
1416
import androidx.compose.material3.MaterialTheme
1517
import androidx.compose.material3.Text
@@ -18,11 +20,13 @@ import androidx.compose.ui.Alignment
1820
import androidx.compose.ui.Modifier
1921
import androidx.compose.ui.graphics.Color
2022
import androidx.compose.ui.layout.ContentScale
23+
import androidx.compose.ui.platform.LocalContext
2124
import androidx.compose.ui.unit.dp
2225
import androidx.paging.PagingData
2326
import androidx.paging.compose.collectAsLazyPagingItems
2427
import androidx.paging.compose.itemKey
25-
import coil.compose.AsyncImage
28+
import coil.compose.SubcomposeAsyncImage
29+
import coil.request.ImageRequest
2630
import com.wzq.jd.compose.app.data.model.ArticleItem
2731
import io.ktor.http.encodeURLPath
2832
import kotlinx.coroutines.flow.Flow
@@ -55,15 +59,23 @@ fun HomeProjectPage(
5559
@Composable
5660
fun ProjectItem(item: ArticleItem, onItemClick: () -> Unit) {
5761
Card(modifier = Modifier.fillMaxWidth(), onClick = onItemClick) {
58-
Box(modifier = Modifier.fillMaxSize()) {
59-
AsyncImage(
60-
model = item.envelopePic,
62+
Box(
63+
modifier = Modifier.fillMaxSize()
64+
) {
65+
SubcomposeAsyncImage(model = ImageRequest.Builder(LocalContext.current)
66+
.data(item.envelopePic).crossfade(true).build(),
6167
contentDescription = null,
6268
modifier = Modifier.fillMaxWidth(),
6369
contentScale = ContentScale.FillWidth,
64-
onLoading = {
65-
}
66-
)
70+
loading = {
71+
Box(
72+
modifier = Modifier
73+
.fillMaxWidth()
74+
.height(80.dp)
75+
) {
76+
CircularProgressIndicator(modifier = Modifier.align(Alignment.Center))
77+
}
78+
})
6779
Box(
6880
modifier = Modifier
6981
.fillMaxWidth()
@@ -78,8 +90,6 @@ fun ProjectItem(item: ArticleItem, onItemClick: () -> Unit) {
7890
modifier = Modifier.padding(8.dp)
7991
)
8092
}
81-
8293
}
83-
8494
}
8595
}

app/src/main/java/com/wzq/jd/compose/app/page/home/HomeScreen.kt

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ import androidx.compose.foundation.pager.rememberPagerState
88
import androidx.compose.material.icons.Icons
99
import androidx.compose.material.icons.filled.AccountCircle
1010
import androidx.compose.material.icons.filled.Home
11+
import androidx.compose.material.icons.filled.List
1112
import androidx.compose.material.icons.filled.Search
13+
import androidx.compose.material.icons.filled.Settings
1214
import androidx.compose.material.icons.filled.ShoppingCart
1315
import androidx.compose.material3.CenterAlignedTopAppBar
1416
import androidx.compose.material3.ExperimentalMaterial3Api
@@ -36,16 +38,18 @@ import kotlinx.coroutines.launch
3638
@OptIn(ExperimentalFoundationApi::class)
3739
@Composable
3840
fun HomeScreen(viewModel: HomeViewModel, navActions: NavActions) {
39-
val pagerState = rememberPagerState(0) { 3 }
41+
val pagerState = rememberPagerState(0) { 4 }
4042
val localScope = rememberCoroutineScope()
4143

4244
val snackbarHostState = remember {
4345
SnackbarHostState()
4446
}
4547

4648
Scaffold(topBar = {
47-
HomeTopBar {
49+
HomeTopBar(pagerState.currentPage, {
4850
navActions.toSearch()
51+
}) {
52+
navActions.toSetting()
4953
}
5054
}, bottomBar = {
5155
HomeBottomBar(pagerState.currentPage) {
@@ -77,7 +81,9 @@ fun HomeScreen(viewModel: HomeViewModel, navActions: NavActions) {
7781
categories = viewModel.categories,
7882
onItemClick = { categories, i -> navActions.toCategory(i, categories) })
7983

80-
else -> throw Exception("todo")
84+
3 -> Text(text = "TODO Profile")
85+
86+
else -> throw Exception()
8187
}
8288
}
8389
}
@@ -87,7 +93,10 @@ fun HomeScreen(viewModel: HomeViewModel, navActions: NavActions) {
8793
fun HomeBottomBar(selectedIndex: Int, onItemClick: (Int) -> Unit) {
8894
NavigationBar {
8995
arrayOf(
90-
Icons.Default.Home, Icons.Default.ShoppingCart, Icons.Default.AccountCircle
96+
Icons.Default.Home,
97+
Icons.Default.ShoppingCart,
98+
Icons.Default.List,
99+
Icons.Default.AccountCircle
91100
).forEachIndexed { index, icon ->
92101
NavigationBarItem(
93102
selected = selectedIndex == index,
@@ -102,14 +111,24 @@ fun HomeBottomBar(selectedIndex: Int, onItemClick: (Int) -> Unit) {
102111

103112
@OptIn(ExperimentalMaterial3Api::class)
104113
@Composable
105-
fun HomeTopBar(navigationToSearch: () -> Unit) {
114+
fun HomeTopBar(
115+
currentPager: Int,
116+
navigationToSearch: () -> Unit,
117+
navigationToSetting: () -> Unit
118+
) {
106119
CenterAlignedTopAppBar(
107120
title = {
108121
Text(text = "App")
109122
},
110123
actions = {
111-
IconButton(onClick = navigationToSearch) {
112-
Icon(Icons.Default.Search, null)
124+
if (currentPager == 3) {
125+
IconButton(onClick = navigationToSetting) {
126+
Icon(imageVector = Icons.Default.Settings, contentDescription = null)
127+
}
128+
} else {
129+
IconButton(onClick = navigationToSearch) {
130+
Icon(Icons.Default.Search, null)
131+
}
113132
}
114133
},
115134
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(containerColor = MaterialTheme.colorScheme.primaryContainer)
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package com.wzq.jd.compose.app.page.setting
2+
3+
import androidx.compose.foundation.layout.Box
4+
import androidx.compose.foundation.layout.Column
5+
import androidx.compose.foundation.layout.padding
6+
import androidx.compose.material.icons.Icons
7+
import androidx.compose.material.icons.filled.ArrowBack
8+
import androidx.compose.material3.CenterAlignedTopAppBar
9+
import androidx.compose.material3.Divider
10+
import androidx.compose.material3.ExperimentalMaterial3Api
11+
import androidx.compose.material3.Icon
12+
import androidx.compose.material3.IconButton
13+
import androidx.compose.material3.MaterialTheme
14+
import androidx.compose.material3.Scaffold
15+
import androidx.compose.material3.SnackbarHost
16+
import androidx.compose.material3.SnackbarHostState
17+
import androidx.compose.material3.Text
18+
import androidx.compose.material3.TextButton
19+
import androidx.compose.material3.TopAppBarDefaults
20+
import androidx.compose.runtime.Composable
21+
import androidx.compose.runtime.LaunchedEffect
22+
import androidx.compose.runtime.mutableFloatStateOf
23+
import androidx.compose.runtime.mutableIntStateOf
24+
import androidx.compose.runtime.remember
25+
import androidx.compose.runtime.rememberCoroutineScope
26+
import androidx.compose.ui.Modifier
27+
import androidx.compose.ui.platform.LocalContext
28+
import androidx.compose.ui.unit.dp
29+
import coil.Coil
30+
import coil.annotation.ExperimentalCoilApi
31+
import com.wzq.jd.compose.app.AppContainer
32+
import com.wzq.jd.compose.app.page.NavActions
33+
import kotlinx.coroutines.launch
34+
35+
/**
36+
* create by wzq on 2023/12/28
37+
*
38+
*/
39+
@OptIn(ExperimentalCoilApi::class, ExperimentalMaterial3Api::class)
40+
@Composable
41+
fun SettingScreen(navActions: NavActions) {
42+
val imageLoader = Coil.imageLoader(LocalContext.current)
43+
44+
fun currentMemory() = (imageLoader.memoryCache?.size ?: 0) / 1024f / 1024f
45+
46+
val memoryCacheSize = remember {
47+
mutableFloatStateOf(currentMemory())
48+
}
49+
val diskCacheSize: Float = (imageLoader.diskCache?.size ?: 0) / 1024f / 1024f
50+
51+
val snackbarHostState = remember {
52+
SnackbarHostState()
53+
}
54+
55+
val scope = rememberCoroutineScope()
56+
57+
val articleSize = remember {
58+
mutableIntStateOf(0)
59+
}
60+
val categoriesSize = remember {
61+
mutableIntStateOf(0)
62+
}
63+
val articleDao = AppContainer.database.articleDao()
64+
val categoriesDao = AppContainer.database.categoriesDao()
65+
LaunchedEffect(articleDao, categoriesDao, block = {
66+
articleSize.intValue = articleDao.getArticlesSize()
67+
categoriesSize.intValue = categoriesDao.getCategoriesSize()
68+
})
69+
70+
Scaffold(
71+
topBar = {
72+
CenterAlignedTopAppBar(
73+
title = {
74+
Text(text = "设置", maxLines = 1)
75+
},
76+
navigationIcon = {
77+
IconButton(onClick = { navActions.goBack() }) {
78+
Icon(Icons.Default.ArrowBack, null)
79+
}
80+
},
81+
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(containerColor = MaterialTheme.colorScheme.primaryContainer)
82+
)
83+
},
84+
snackbarHost = {
85+
SnackbarHost(hostState = snackbarHostState)
86+
}
87+
) { paddingValues ->
88+
Box(modifier = Modifier.padding(paddingValues)) {
89+
Column(Modifier.padding(16.dp)) {
90+
TextButton(onClick = {
91+
imageLoader.memoryCache?.clear()
92+
memoryCacheSize.floatValue = currentMemory()
93+
scope.launch {
94+
snackbarHostState.showSnackbar(
95+
"已清理缓存",
96+
)
97+
}
98+
}) {
99+
Text(text = "内存缓存: ${memoryCacheSize.floatValue} M")
100+
}
101+
Divider(modifier = Modifier.padding(top = 16.dp, bottom = 16.dp))
102+
Text(text = "磁盘缓存: $diskCacheSize M")
103+
104+
Divider(modifier = Modifier.padding(top = 16.dp, bottom = 16.dp))
105+
106+
Text(text = "数据库条目数量: \narticle=${articleSize.intValue} | category=${categoriesSize.intValue}")
107+
}
108+
}
109+
}
110+
111+
}

0 commit comments

Comments
 (0)