Skip to content

Commit 1d0e7b4

Browse files
committed
update
1 parent f3a1bb3 commit 1d0e7b4

File tree

11 files changed

+214
-34
lines changed

11 files changed

+214
-34
lines changed

app/src/main/java/com/wzq/jd/compose/app/MainActivity.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import androidx.navigation.compose.composable
1919
import androidx.navigation.compose.rememberNavController
2020
import androidx.navigation.navArgument
2121
import com.wzq.jd.compose.app.page.WebPage
22+
import com.wzq.jd.compose.app.page.main.CategoriesDetailPage
2223
import com.wzq.jd.compose.app.page.main.MainPage
2324
import com.wzq.jd.compose.app.page.search.SearchPage
2425
import com.wzq.jd.compose.app.ui.theme.JetpackDemoTheme
@@ -60,6 +61,12 @@ fun Greeting(name: String) {
6061
) {
6162
WebPage(navController, it.arguments?.getString("url"))
6263
}
64+
composable("categories") {
65+
CategoriesDetailPage(
66+
navController = navController,
67+
categories = navController.previousBackStackEntry?.savedStateHandle?.get("categories")
68+
)
69+
}
6370
}
6471
}
6572

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import io.ktor.client.HttpClient
99
import io.ktor.client.call.body
1010
import io.ktor.client.request.forms.submitForm
1111
import io.ktor.client.request.get
12+
import io.ktor.client.request.parameter
1213
import io.ktor.http.parametersOf
1314

1415
/**
@@ -21,8 +22,14 @@ class RemoteDataRepo(private val httpClient: HttpClient, private val baseUrl: St
2122
exception.printStackTrace()
2223
}
2324

24-
suspend fun getHomeArticleList(pageNum: Int = 0) = httpClient.runCatching {
25-
get("${baseUrl}article/list/${pageNum}/json").body<NetResult<PagingResult<ArticleItem>>>()
25+
suspend fun getArticleList(pageNum: Int = 0, cid: String? = null) = httpClient.runCatching {
26+
get("${baseUrl}article/list/${pageNum}/json"){
27+
url {
28+
if (!cid.isNullOrEmpty()) {
29+
parameter("cid", cid)
30+
}
31+
}
32+
}.body<NetResult<PagingResult<ArticleItem>>>()
2633
}.onFailure(defaultErrorHandler)
2734

2835
suspend fun getProjectList(pageNum: Int = 0) = httpClient.runCatching {
@@ -34,6 +41,7 @@ class RemoteDataRepo(private val httpClient: HttpClient, private val baseUrl: St
3441
.body<NetResult<List<KnowledgeCategories>>>()
3542
}.onFailure(defaultErrorHandler)
3643

44+
3745
suspend fun getHotWords() = runCatching {
3846
httpClient.get("${baseUrl}hotkey/json").body<NetResult<List<SearchHotWords>>>()
3947
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.wzq.jd.compose.app.page.main
2+
3+
import androidx.compose.foundation.layout.Column
4+
import androidx.compose.foundation.layout.fillMaxSize
5+
import androidx.compose.foundation.layout.padding
6+
import androidx.compose.material3.ScrollableTabRow
7+
import androidx.compose.material3.Tab
8+
import androidx.compose.material3.Text
9+
import androidx.compose.runtime.Composable
10+
import androidx.compose.runtime.getValue
11+
import androidx.compose.runtime.mutableIntStateOf
12+
import androidx.compose.runtime.remember
13+
import androidx.compose.runtime.setValue
14+
import androidx.compose.ui.Modifier
15+
import androidx.compose.ui.unit.dp
16+
import androidx.navigation.NavController
17+
import com.wzq.jd.compose.app.data.model.KnowledgeCategories
18+
19+
/**
20+
* create by wzq on 2023/12/11
21+
*
22+
*/
23+
@Composable
24+
fun CategoriesDetailPage(navController: NavController, categories: List<KnowledgeCategories>?) {
25+
if (categories.isNullOrEmpty()) {
26+
return
27+
}
28+
var currentSelectedIndex by remember {
29+
mutableIntStateOf(0)
30+
}
31+
Column(modifier = Modifier.fillMaxSize()) {
32+
ScrollableTabRow(
33+
selectedTabIndex = currentSelectedIndex,
34+
edgePadding = 0.dp,
35+
divider = {}) {
36+
categories.forEachIndexed { index, knowledgeCategories ->
37+
Tab(
38+
selected = currentSelectedIndex == index,
39+
onClick = { currentSelectedIndex = index }) {
40+
Text(text = knowledgeCategories.name, modifier = Modifier.padding(8.dp))
41+
}
42+
}
43+
44+
}
45+
}
46+
}
Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,78 @@
11
package com.wzq.jd.compose.app.page.main
22

3+
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.layout.Arrangement
5+
import androidx.compose.foundation.layout.Column
6+
import androidx.compose.foundation.layout.ExperimentalLayoutApi
7+
import androidx.compose.foundation.layout.FlowRow
8+
import androidx.compose.foundation.layout.fillMaxSize
9+
import androidx.compose.foundation.layout.fillMaxWidth
10+
import androidx.compose.foundation.layout.padding
11+
import androidx.compose.foundation.lazy.LazyColumn
12+
import androidx.compose.foundation.lazy.items
13+
import androidx.compose.material3.AssistChip
14+
import androidx.compose.material3.Divider
15+
import androidx.compose.material3.DividerDefaults
16+
import androidx.compose.material3.MaterialTheme
17+
import androidx.compose.material3.ScrollableTabRow
18+
import androidx.compose.material3.Tab
19+
import androidx.compose.material3.Text
320
import androidx.compose.runtime.Composable
21+
import androidx.compose.runtime.getValue
22+
import androidx.compose.runtime.mutableIntStateOf
23+
import androidx.compose.runtime.remember
24+
import androidx.compose.runtime.setValue
25+
import androidx.compose.ui.Modifier
26+
import androidx.compose.ui.unit.dp
27+
import androidx.navigation.NavHostController
28+
import androidx.navigation.navArgument
29+
import com.wzq.jd.compose.app.data.model.KnowledgeCategories
430

531
/**
632
* create by wzq on 2023/12/1
733
*
834
*/
935
@Composable
10-
fun CategoriesPage() {
36+
fun CategoriesPage(
37+
navController: NavHostController,
38+
categories: List<KnowledgeCategories>
39+
) {
40+
if (categories.isEmpty()) {
41+
// TODO: not data
42+
return
43+
}
44+
LazyColumn(content = {
45+
items(categories, key = { it.id }) {
46+
CategoryItem(it) {
47+
navController.currentBackStackEntry?.savedStateHandle?.set("data", it)
48+
navController.navigate("categories")
49+
}
50+
}
51+
})
52+
}
53+
54+
@OptIn(ExperimentalLayoutApi::class)
55+
@Composable
56+
fun CategoryItem(category: KnowledgeCategories, onItemClick: () -> Unit) {
57+
Column(
58+
) {
59+
Text(
60+
text = category.name,
61+
style = MaterialTheme.typography.titleLarge,
62+
modifier = Modifier
63+
.fillMaxWidth()
64+
.background(DividerDefaults.color)
65+
)
66+
FlowRow(
67+
modifier = Modifier
68+
.fillMaxWidth()
69+
.padding(8.dp),
70+
horizontalArrangement = Arrangement.spacedBy(8.dp)
71+
) {
72+
category.children.forEach { item ->
73+
AssistChip(onClick = onItemClick, label = { Text(text = item.name) })
74+
}
75+
}
76+
}
77+
1178
}

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ import androidx.compose.material3.MaterialTheme
1111
import androidx.compose.material3.Text
1212
import androidx.compose.runtime.Composable
1313
import androidx.compose.ui.Modifier
14+
import androidx.compose.ui.graphics.toArgb
1415
import androidx.compose.ui.unit.dp
1516
import androidx.navigation.NavHostController
1617
import com.wzq.jd.compose.app.data.model.ArticleItem
18+
import com.wzq.jd.compose.app.ui.widget.HtmlText
1719

1820
/**
1921
* create by wzq on 2023/11/27
@@ -41,10 +43,18 @@ fun ArticleItemPage(itemData: ArticleItem, onItemClick: (ArticleItem) -> Unit) {
4143
.padding(8.dp)
4244
.fillMaxWidth()
4345
) {
44-
Text(
45-
text = itemData.title,
46-
modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 16.dp, bottom = 8.dp),
47-
style = MaterialTheme.typography.titleMedium
46+
// Text(
47+
// text = itemData.title,
48+
// modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 16.dp, bottom = 8.dp),
49+
// style = MaterialTheme.typography.titleMedium
50+
// )
51+
HtmlText(
52+
modifier = Modifier.padding(
53+
start = 16.dp, end = 16.dp, top = 16.dp, bottom = 8.dp
54+
),
55+
color = MaterialTheme.colorScheme.onSurface.toArgb(),
56+
size = 16f,
57+
text = itemData.title
4858
)
4959
Row(modifier = Modifier.padding(top = 8.dp, start = 16.dp, end = 16.dp, bottom = 16.dp)) {
5060
Text(

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ fun MainPage(navController: NavHostController, viewModel: MainViewModel = viewMo
5555
when (page) {
5656
0 -> HomePage(navController, viewModel.homeList)
5757
1 -> ProjectPage(navController, viewModel.projectList)
58-
2 -> CategoriesPage()
58+
2 -> CategoriesPage(navController, viewModel.categories)
5959
else -> {
6060
throw Exception("Shouldn't Happen!")
6161
}

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.lifecycle.ViewModel
55
import androidx.lifecycle.viewModelScope
66
import com.wzq.jd.compose.app.data.model.ArticleItem
77
import com.wzq.jd.compose.app.data.NetworkUtil
8+
import com.wzq.jd.compose.app.data.model.KnowledgeCategories
89
import kotlinx.coroutines.launch
910

1011
/**
@@ -15,16 +16,18 @@ class MainViewModel : ViewModel() {
1516

1617
val homeList = mutableStateListOf<ArticleItem>()
1718
val projectList = mutableStateListOf<ArticleItem>()
19+
val categories = mutableStateListOf<KnowledgeCategories>()
1820

1921
init {
2022
println("MainViewModel create")
2123
getHomeArticleList()
2224
getProjectList()
25+
getCategories()
2326
}
2427

2528
private fun getHomeArticleList() {
2629
viewModelScope.launch {
27-
NetworkUtil.remoteRepo.getHomeArticleList().onSuccess {
30+
NetworkUtil.remoteRepo.getArticleList().onSuccess {
2831
homeList.clear()
2932
homeList.addAll(it.data.listData)
3033
}
@@ -39,4 +42,13 @@ class MainViewModel : ViewModel() {
3942
}
4043
}
4144
}
45+
46+
private fun getCategories(){
47+
viewModelScope.launch {
48+
NetworkUtil.remoteRepo.getKnowledgeCategories().onSuccess {
49+
categories.clear()
50+
categories.addAll(it.data)
51+
}
52+
}
53+
}
4254
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.wzq.jd.compose.app.ui.widget
2+
3+
import android.util.TypedValue
4+
import android.widget.TextView
5+
import androidx.compose.runtime.Composable
6+
import androidx.compose.ui.Modifier
7+
import androidx.compose.ui.viewinterop.AndroidView
8+
import androidx.core.text.HtmlCompat
9+
10+
/**
11+
* create by wzq on 2023/12/8
12+
*
13+
*/
14+
@Composable
15+
fun HtmlText(modifier: Modifier, color: Int, size: Float, text: String) {
16+
AndroidView(
17+
factory = {
18+
TextView(it).apply {
19+
setTextSize(TypedValue.COMPLEX_UNIT_SP, size)
20+
setTextColor(color)
21+
22+
}
23+
},
24+
modifier = modifier
25+
) {
26+
it.text = HtmlCompat.fromHtml(text, HtmlCompat.FROM_HTML_MODE_COMPACT)
27+
}
28+
29+
}

app/src/test/java/com/wzq/jd/compose/app/ExampleUnitTest.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package com.wzq.jd.compose.app
22

3+
import kotlinx.coroutines.Dispatchers
34
import kotlinx.coroutines.SupervisorJob
5+
import kotlinx.coroutines.delay
46
import kotlinx.coroutines.launch
57
import kotlinx.coroutines.runBlocking
8+
import kotlinx.coroutines.withContext
69
import org.junit.Test
710

811
import org.junit.Assert.*
@@ -63,4 +66,13 @@ class ExampleUnitTest {
6366

6467
Unit
6568
}
69+
70+
@Test
71+
fun testAsync() = runBlocking {
72+
println(1)
73+
withContext(Dispatchers.IO) {
74+
delay(5000)
75+
}
76+
println(3)
77+
}
6678
}

gradle.properties

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,23 @@
1-
# Project-wide Gradle settings.
2-
3-
# IDE (e.g. Android Studio) users:
4-
# Gradle settings configured through the IDE *will override*
5-
# any settings specified in this file.
6-
7-
# For more details on how to configure your build environment visit
1+
## For more details on how to configure your build environment visit
82
# http://www.gradle.org/docs/current/userguide/build_environment.html
9-
3+
#
104
# Specifies the JVM arguments used for the daemon process.
115
# The setting is particularly useful for tweaking memory settings.
12-
org.gradle.jvmargs=-Xmx1536m
13-
org.gradle.daemon=true
14-
6+
# Default value: -Xmx1024m -XX:MaxPermSize=256m
7+
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
8+
#
159
# When configured, Gradle will run in incubating parallel mode.
1610
# This option should only be used with decoupled projects. More details, visit
1711
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
1812
# org.gradle.parallel=true
19-
20-
# AndroidX package structure to make it clearer which packages are bundled with the
21-
# Android operating system, and which are packaged with your app's APK
22-
# https://developer.android.com/topic/libraries/support-library/androidx-rn
23-
android.useAndroidX=true
24-
# Automatically convert third-party libraries to use AndroidX
25-
android.enableJetifier=false
26-
27-
# Kotlin code style for this project: "official" or "obsolete":
28-
kotlin.code.style=official
29-
kapt.incremental.apt = true
30-
#android.databinding.incremental=true
31-
13+
#Thu Dec 07 16:49:57 CST 2023
3214
-Xopt-in=kotlin.RequiresOptIn
3315
android.defaults.buildfeatures.buildconfig=true
16+
android.enableJetifier=false
17+
android.nonFinalResIds=true
3418
android.nonTransitiveRClass=true
35-
android.nonFinalResIds=true
19+
android.useAndroidX=true
20+
kapt.incremental.apt=true
21+
kotlin.code.style=official
22+
org.gradle.daemon=true
23+
org.gradle.jvmargs=-Xmx2048M -Dkotlin.daemon.jvm.options\="-Xmx2048M"

0 commit comments

Comments
 (0)