Skip to content

Commit 894e1e7

Browse files
committed
update
1 parent ab4b84f commit 894e1e7

File tree

9 files changed

+271
-135
lines changed

9 files changed

+271
-135
lines changed

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

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ import android.os.Bundle
44
import androidx.activity.ComponentActivity
55
import androidx.activity.compose.setContent
66
import androidx.activity.enableEdgeToEdge
7+
import androidx.compose.animation.fadeIn
8+
import androidx.compose.animation.fadeOut
9+
import androidx.compose.animation.slideInHorizontally
10+
import androidx.compose.animation.slideOutHorizontally
711
import androidx.compose.foundation.layout.fillMaxSize
812
import androidx.compose.material3.MaterialTheme
913
import androidx.compose.material3.Surface
@@ -13,7 +17,9 @@ import androidx.compose.ui.tooling.preview.Preview
1317
import androidx.navigation.compose.NavHost
1418
import androidx.navigation.compose.composable
1519
import androidx.navigation.compose.rememberNavController
16-
import com.wzq.jd.compose.app.page.MainPage
20+
import androidx.navigation.navArgument
21+
import com.wzq.jd.compose.app.page.WebPage
22+
import com.wzq.jd.compose.app.page.main.MainPage
1723
import com.wzq.jd.compose.app.page.search.SearchPage
1824
import com.wzq.jd.compose.app.ui.theme.JetpackDemoTheme
1925

@@ -25,22 +31,35 @@ class MainActivity : ComponentActivity() {
2531
JetpackDemoTheme {
2632
// A surface container using the 'background' color from the theme
2733
Surface(
28-
modifier = Modifier.fillMaxSize(),
29-
color = MaterialTheme.colorScheme.background
34+
modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background
3035
) {
31-
Greeting("Android")
36+
Greeting("JetpackDemo")
3237
}
3338
}
3439
}
3540
}
3641
}
3742

3843
@Composable
39-
fun Greeting(name: String, modifier: Modifier = Modifier) {
44+
fun Greeting(name: String) {
4045
val navController = rememberNavController()
41-
NavHost(navController = navController, startDestination = "main", route = name) {
46+
NavHost(
47+
navController = navController,
48+
startDestination = "main",
49+
route = name,
50+
enterTransition = {
51+
slideInHorizontally { it }
52+
},
53+
exitTransition = { fadeOut() },
54+
popEnterTransition = { fadeIn() },
55+
popExitTransition = { slideOutHorizontally { it } }) {
4256
composable("main") { MainPage(navController) }
43-
composable("search") { SearchPage(navController = navController)}
57+
composable("search") { SearchPage(navController = navController) }
58+
composable(
59+
"web?url={url}", arguments = listOf(navArgument("url") { defaultValue = "" })
60+
) {
61+
WebPage(navController, it.arguments?.getString("url"))
62+
}
4463
}
4564
}
4665

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

Lines changed: 0 additions & 33 deletions
This file was deleted.
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
package com.wzq.jd.compose.app.page
2+
3+
import android.webkit.WebChromeClient
4+
import android.webkit.WebResourceRequest
5+
import android.webkit.WebResourceResponse
6+
import android.webkit.WebView
7+
import android.webkit.WebViewClient
8+
import androidx.compose.foundation.layout.Box
9+
import androidx.compose.foundation.layout.fillMaxSize
10+
import androidx.compose.foundation.layout.fillMaxWidth
11+
import androidx.compose.foundation.layout.padding
12+
import androidx.compose.material.icons.Icons
13+
import androidx.compose.material.icons.filled.ArrowBack
14+
import androidx.compose.material.icons.filled.Refresh
15+
import androidx.compose.material3.CenterAlignedTopAppBar
16+
import androidx.compose.material3.ExperimentalMaterial3Api
17+
import androidx.compose.material3.Icon
18+
import androidx.compose.material3.IconButton
19+
import androidx.compose.material3.LinearProgressIndicator
20+
import androidx.compose.material3.MaterialTheme
21+
import androidx.compose.material3.Scaffold
22+
import androidx.compose.material3.Text
23+
import androidx.compose.material3.TopAppBarDefaults
24+
import androidx.compose.runtime.Composable
25+
import androidx.compose.runtime.MutableState
26+
import androidx.compose.runtime.mutableStateOf
27+
import androidx.compose.runtime.remember
28+
import androidx.compose.ui.Modifier
29+
import androidx.compose.ui.viewinterop.AndroidView
30+
import androidx.navigation.NavHostController
31+
32+
/**
33+
* create by wzq on 2023/12/4
34+
*
35+
*/
36+
@OptIn(ExperimentalMaterial3Api::class)
37+
@Composable
38+
fun WebPage(navController: NavHostController, url: String?) {
39+
val webTitle = remember { mutableStateOf(url ?: "") }
40+
val isRefreshing = remember { mutableStateOf(false) }
41+
val isProgressing = remember { mutableStateOf(true) }
42+
43+
Scaffold(topBar = {
44+
CenterAlignedTopAppBar(
45+
title = {
46+
Text(text = webTitle.value, maxLines = 1)
47+
},
48+
navigationIcon = {
49+
IconButton(onClick = {
50+
navController.navigateUp()
51+
}) {
52+
Icon(Icons.Default.ArrowBack, null)
53+
54+
}
55+
},
56+
actions = {
57+
IconButton(onClick = {
58+
isRefreshing.value = !isRefreshing.value
59+
}) {
60+
Icon(Icons.Default.Refresh, null)
61+
}
62+
},
63+
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(containerColor = MaterialTheme.colorScheme.primaryContainer)
64+
)
65+
}) { contentPadding ->
66+
Box(
67+
modifier = Modifier
68+
.fillMaxSize()
69+
.padding(contentPadding)
70+
) {
71+
CustomWebView(url, webTitle, isProgressing, isRefreshing)
72+
73+
if (isProgressing.value) {
74+
LinearProgressIndicator(modifier = Modifier.fillMaxWidth())
75+
}
76+
}
77+
}
78+
}
79+
80+
@Composable
81+
private fun CustomWebView(
82+
url: String?,
83+
titleStr: MutableState<String>,
84+
isProgressing: MutableState<Boolean>,
85+
isRefreshing: MutableState<Boolean>
86+
) {
87+
if (url.isNullOrEmpty()) {
88+
// TODO: empty view
89+
return
90+
}
91+
AndroidView(modifier = Modifier
92+
.fillMaxSize(), factory = {
93+
WebView(it).apply {
94+
webViewClient = object : WebViewClient() {
95+
override fun shouldInterceptRequest(
96+
view: WebView?,
97+
request: WebResourceRequest?
98+
): WebResourceResponse? {
99+
println("redirect --> ${request?.url}")
100+
return super.shouldInterceptRequest(view, request)
101+
}
102+
103+
override fun shouldOverrideUrlLoading(
104+
view: WebView?,
105+
request: WebResourceRequest?
106+
): Boolean {
107+
return true
108+
}
109+
}
110+
webChromeClient = object : WebChromeClient() {
111+
override fun onReceivedTitle(view: WebView?, title: String?) {
112+
titleStr.value = title ?: ""
113+
}
114+
115+
override fun onProgressChanged(view: WebView?, newProgress: Int) {
116+
isProgressing.value = newProgress < 100
117+
}
118+
}
119+
120+
loadUrl(url)
121+
}
122+
}) {
123+
if (isRefreshing.value) {
124+
it.reload()
125+
}
126+
}
127+
}

app/src/main/java/com/wzq/jd/compose/app/page/CategoriesPage.kt renamed to app/src/main/java/com/wzq/jd/compose/app/page/main/CategoriesPage.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.wzq.jd.compose.app.page
1+
package com.wzq.jd.compose.app.page.main
22

33
import androidx.compose.runtime.Composable
44

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

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,42 @@
1-
package com.wzq.jd.compose.app.page
1+
package com.wzq.jd.compose.app.page.main
22

33
import androidx.compose.foundation.layout.Row
44
import androidx.compose.foundation.layout.fillMaxWidth
55
import androidx.compose.foundation.layout.padding
6+
import androidx.compose.foundation.lazy.LazyColumn
7+
import androidx.compose.foundation.lazy.items
68
import androidx.compose.material3.Card
79
import androidx.compose.material3.ExperimentalMaterial3Api
810
import androidx.compose.material3.MaterialTheme
911
import androidx.compose.material3.Text
1012
import androidx.compose.runtime.Composable
1113
import androidx.compose.ui.Modifier
12-
import androidx.compose.ui.platform.LocalContext
1314
import androidx.compose.ui.unit.dp
14-
import com.wzq.jd.compose.app.WebActivity
15+
import androidx.navigation.NavHostController
1516
import com.wzq.jd.compose.app.data.ArticleItem
1617

1718
/**
1819
* create by wzq on 2023/11/27
1920
*
2021
*/
22+
@Composable
23+
fun HomePage(navController: NavHostController, articleList: List<ArticleItem>) {
24+
val onItemClick = { item: ArticleItem ->
25+
navController.navigate("web?url=${item.link}")
26+
}
27+
LazyColumn(content = {
28+
items(articleList) {
29+
ArticleItemPage(itemData = it, onItemClick)
30+
}
31+
})
32+
}
33+
2134
@OptIn(ExperimentalMaterial3Api::class)
2235
@Composable
23-
fun ArticleItemPage(itemData: ArticleItem) {
24-
val context = LocalContext.current
36+
fun ArticleItemPage(itemData: ArticleItem, onItemClick: (ArticleItem) -> Unit) {
2537
Card(
2638
onClick = {
27-
WebActivity.open(context, itemData.link)
39+
onItemClick(itemData)
2840
}, modifier = Modifier
2941
.padding(8.dp)
3042
.fillMaxWidth()
@@ -48,4 +60,4 @@ fun ArticleItemPage(itemData: ArticleItem) {
4860
)
4961
}
5062
}
51-
}
63+
}

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

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
package com.wzq.jd.compose.app.page
1+
package com.wzq.jd.compose.app.page.main
22

33
import androidx.compose.foundation.ExperimentalFoundationApi
44
import androidx.compose.foundation.background
55
import androidx.compose.foundation.layout.padding
66
import androidx.compose.foundation.pager.HorizontalPager
7-
import androidx.compose.foundation.pager.PagerState
87
import androidx.compose.foundation.pager.rememberPagerState
98
import androidx.compose.material.icons.Icons
109
import androidx.compose.material.icons.filled.AccountCircle
@@ -23,6 +22,7 @@ import androidx.compose.material3.TopAppBarDefaults
2322
import androidx.compose.runtime.Composable
2423
import androidx.compose.runtime.rememberCoroutineScope
2524
import androidx.compose.ui.Modifier
25+
import androidx.lifecycle.viewmodel.compose.viewModel
2626
import androidx.navigation.NavHostController
2727
import kotlinx.coroutines.launch
2828

@@ -32,12 +32,18 @@ import kotlinx.coroutines.launch
3232
*/
3333
@OptIn(ExperimentalFoundationApi::class)
3434
@Composable
35-
fun MainPage(navController: NavHostController) {
35+
fun MainPage(navController: NavHostController, viewModel: MainViewModel = viewModel()) {
36+
val scope = rememberCoroutineScope()
3637
val pagerState = rememberPagerState { 3 }
38+
3739
Scaffold(topBar = {
3840
MainTopBar(navController)
3941
}, bottomBar = {
40-
MainBottomBar(pagerState)
42+
MainBottomBar { index ->
43+
scope.launch {
44+
pagerState.scrollToPage(index)
45+
}
46+
}
4147
}) { paddingValues ->
4248
HorizontalPager(
4349
state = pagerState,
@@ -46,10 +52,9 @@ fun MainPage(navController: NavHostController) {
4652
.background(color = MaterialTheme.colorScheme.background),
4753
beyondBoundsPageCount = 3
4854
) { page ->
49-
println(page)
5055
when (page) {
51-
0 -> HomePage()
52-
1 -> ProjectPage()
56+
0 -> HomePage(navController, viewModel.homeList)
57+
1 -> ProjectPage(navController, viewModel.projectList)
5358
2 -> CategoriesPage()
5459
else -> {
5560
throw Exception("Shouldn't Happen!")
@@ -59,32 +64,17 @@ fun MainPage(navController: NavHostController) {
5964
}
6065
}
6166

62-
@OptIn(ExperimentalFoundationApi::class)
6367
@Composable
64-
fun MainBottomBar(pagerState: PagerState) {
65-
val coroutineScope = rememberCoroutineScope()
66-
68+
fun MainBottomBar(onItemClick: (Int) -> Unit) {
6769
BottomAppBar(containerColor = MaterialTheme.colorScheme.secondaryContainer) {
68-
IconButton(modifier = Modifier.weight(1f), onClick = {
69-
coroutineScope.launch {
70-
pagerState.scrollToPage(0)
71-
}
72-
}) {
73-
Icon(Icons.Default.Home, null)
74-
}
75-
IconButton(modifier = Modifier.weight(1f), onClick = {
76-
coroutineScope.launch {
77-
pagerState.scrollToPage(1)
78-
}
79-
}) {
80-
Icon(Icons.Default.ShoppingCart, null)
81-
}
82-
IconButton(modifier = Modifier.weight(1f), onClick = {
83-
coroutineScope.launch {
84-
pagerState.scrollToPage(2)
70+
arrayOf(
71+
Icons.Default.Home,
72+
Icons.Default.ShoppingCart,
73+
Icons.Default.AccountCircle
74+
).forEachIndexed { index, icon ->
75+
IconButton(modifier = Modifier.weight(1f), onClick = { onItemClick(index) }) {
76+
Icon(icon, null)
8577
}
86-
}) {
87-
Icon(Icons.Default.AccountCircle, null)
8878
}
8979
}
9080
}

0 commit comments

Comments
 (0)