You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

530 lines
16 KiB

package com.gyf.csams.main.ui
import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.Image
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import com.gyf.csams.Api
import com.gyf.csams.MainApi
import com.gyf.csams.R
import com.gyf.csams.activity.ui.ActivityDetailActivity
import com.gyf.csams.association.ui.AssociationActivity
import com.gyf.csams.association.ui.RegAssociationActivity
import com.gyf.csams.main.model.*
import com.gyf.csams.message.ui.MessageActivity
import com.gyf.csams.uikit.*
import com.gyf.csams.uikit.theme.CSAMSTheme
import com.gyf.csams.util.randomChinese
/**
* 主界面
*
*/
class MainActivity : ComponentActivity() {
lateinit var imageModel: ImageModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
imageModel = ImageModel(application = application, Api.buildUrl(MainApi.HotActivity))
setContent {
CSAMSTheme {
Body { nav, scaffoldState ->
NavHost(navController = nav, startDestination = MainMenu.Main.name) {
composable(MainMenu.Main.name) {
Main(navController = nav)
ShowSnackbar(scaffoldState = scaffoldState)
}
composable(MainMenu.List.name) {
AssociationList(navController = nav)
ShowSnackbar(scaffoldState = scaffoldState)
}
composable(MainMenu.Center.name) {
Center(navController = nav)
ShowSnackbar(scaffoldState = scaffoldState)
}
}
}
}
}
}
override fun onStart() {
super.onStart()
imageModel.start()
}
override fun onResume() {
super.onResume()
imageModel.start()
}
override fun onPause() {
super.onPause()
imageModel.cancel()
}
/**
* 个人中心
*
*/
@Composable
private fun Center(
model: CenterViewModel = viewModel(),
navController: NavHostController
) {
MainFrame(
background = { Background(image = BackgroundImage.Center, alpha = 0.5F) },
mainMenu = MainMenu.Center,
nav = navController
) {
val context = LocalContext.current
val info by model.info.observeAsState()
Column(
modifier = Modifier
.weight(0.3F)
.padding(10.dp),
) {
info?.let {
Row(
modifier = Modifier
.fillMaxWidth()
.weight(0.7F)
.border(width = 1.dp, color = MaterialTheme.colors.background),
horizontalArrangement = Arrangement.SpaceBetween
) {
Image(
painter = painterResource(
id = R.drawable.ic_launcher_foreground
),
contentDescription = null,
modifier = Modifier
.weight(0.4F)
.fillMaxHeight()
)
Column(
modifier = Modifier
.weight(0.4F)
.fillMaxHeight()
.border(width = 1.dp, color = MaterialTheme.colors.background),
verticalArrangement = Arrangement.SpaceEvenly,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(text = it.name)
Text(text = it.duty)
}
}
Spacer(modifier = Modifier.weight(0.05F))
Card(
backgroundColor = MaterialTheme.colors.background,
modifier = Modifier.weight(0.15F)
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.Center
) {
Text(text = it.desc)
}
}
}
}
Column(
modifier = Modifier.weight(0.7F),
verticalArrangement = Arrangement.SpaceEvenly
) {
CenterMenuItem(text = model.myAssociationDesc) {
context.startActivity(Intent(context, AssociationActivity::class.java))
}
CenterMenuItem(text = model.myJoinActivity)
CenterMenuItem(text = model.myLikeActivity)
CenterMenuItem(text = model.myCollectActivity)
}
}
}
@Composable
private fun CenterMenuItem(text: String, onClick: () -> Unit = {}) {
Card(backgroundColor = MaterialTheme.colors.background) {
Row(
modifier = Modifier
.fillMaxWidth()
.clickable(onClick = onClick),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Spacer(modifier = Modifier)
Row {
Text(text = text)
}
Row {
Icon(
painter = painterResource(id = R.drawable.ic_arrow_right),
contentDescription = null,
modifier = Modifier.size(50.dp)
)
}
}
}
}
/**
* 主界面
*/
@Composable
private fun Main(navController: NavHostController) {
MainFrame(
background = { Background(image = BackgroundImage.Main) },
mainMenu = MainMenu.Main,
nav = navController
) {
Column(modifier = Modifier.weight(0.33F)) {
Notification()
Column(
modifier = Modifier
.fillMaxSize()
.padding(horizontal = 15.dp),
verticalArrangement = Arrangement.SpaceEvenly
) {
MessageBoard()
ClubActivitiesTitle()
}
}
Column(modifier = Modifier.weight(0.66F)) {
PosterWithDesc()
}
}
}
/**
* 社团列表
*
* @param navController
*/
@Composable
private fun AssociationList(navController: NavHostController) {
MainFrame(
background = { Background(image = BackgroundImage.AssociationList) },
mainMenu = MainMenu.List,
nav = navController
) {
RegisterAssociation()
AssociationSearch()
AssociationListBody()
}
}
/**
* 注册社团按钮
*
*/
@Composable
private fun RegisterAssociation() {
val context = LocalContext.current
Row(
horizontalArrangement = Arrangement.End,
modifier = Modifier
.fillMaxWidth()
.padding(10.dp)
) {
IconButton(onClick = {
context.startActivity(Intent(context, RegAssociationActivity::class.java))
}) {
Icon(
painter = painterResource(id = R.drawable.ic_add_fill),
contentDescription = null,
modifier = Modifier.size(50.dp),
)
}
}
}
/**
* 社团列表
*
*/
@Composable
private fun AssociationListBody(
model: ListViewModel = viewModel(),
scaffoldModel: ScaffoldModel = viewModel()
) {
val associationList: MutableList<AssociationDto>? by model.associationDto.observeAsState()
val listState = rememberLazyListState()
LazyColumn(state = listState) {
associationList?.chunked(2)?.forEach {
item {
Row {
Spacer(modifier = Modifier.weight(0.1F))
Box(modifier = Modifier.weight(0.35F)) {
Association(associationDto = it[0])
}
Spacer(modifier = Modifier.weight(0.05F))
if (it.size == 2) {
Box(modifier = Modifier.weight(0.35F)) {
Association(associationDto = it[1])
}
} else {
Box(
modifier = Modifier
.weight(0.35F)
.border(width = 1.dp, color = MaterialTheme.colors.onBackground)
)
}
Spacer(modifier = Modifier.weight(0.1F))
}
Spacer(
modifier = Modifier
.fillMaxWidth()
.height(10.dp)
)
}
}
}
if (listState.layoutInfo.totalItemsCount - listState.firstVisibleItemIndex == model.associationListSize / 2 - 1) {
model.loadMore { scaffoldModel.update(message = it) }
}
}
@Composable
private fun Association(associationDto: AssociationDto) {
val context = LocalContext.current
Card(modifier = Modifier.clickable(onClick = {
context.startActivity(
Intent(
context,
AssociationActivity::class.java
)
)
})) {
Image(
painter = painterResource(id = R.drawable.association_list_border),
contentDescription = null
)
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.Center
) {
Text(text = associationDto.name)
}
}
}
/**
* 社团检索
*
*/
@Composable
private fun AssociationSearch(
model: ListViewModel = viewModel(),
scaffoldModel: ScaffoldModel = viewModel()
) {
Card(modifier = Modifier.padding(horizontal = 50.dp, vertical = 10.dp)) {
Column {
BaseTextField(
form = model.name,
singeLine = true,
modifier = Modifier.padding(horizontal = 10.dp)
)
BaseTextField(
form = model.desc,
singeLine = true,
modifier = Modifier.padding(horizontal = 10.dp)
)
Spacer(
modifier = Modifier.height(10.dp)
)
Row(
horizontalArrangement = Arrangement.Center,
modifier = Modifier.fillMaxWidth()
) {
OutlinedButton(
onClick = { model.search { scaffoldModel.update(message = it) } },
modifier = Modifier.width(100.dp)
) {
Text(text = model.searchDesc)
}
}
Spacer(
modifier = Modifier.height(10.dp)
)
}
}
}
/**
* 通知
*
*/
@Composable
private fun Notification() {
val context = LocalContext.current
Row(
horizontalArrangement = Arrangement.End,
modifier = Modifier
.fillMaxWidth()
.padding(10.dp)
) {
IconButton(onClick = {
context.startActivity(Intent(context, MessageActivity::class.java))
}) {
Icon(
painter = painterResource(id = R.drawable.ic_notification),
contentDescription = null
)
}
}
}
/**
* 留言板
*
*/
@Composable
private fun MessageBoard(
modifier: Modifier = Modifier,
model: MarqueeViewModel = viewModel(),
mainViewModel: MainViewModel = viewModel()
) {
Card(modifier = modifier, backgroundColor = MaterialTheme.colors.background) {
Row(
verticalAlignment = Alignment.CenterVertically
) {
IconButton(onClick = { mainViewModel.openDialog() }) {
Icon(
painter = painterResource(id = R.drawable.ic_comments),
contentDescription = null,
)
}
SendComment(model = mainViewModel)
Row(
horizontalArrangement = Arrangement.Center,
modifier = Modifier
.fillMaxWidth()
) {
Marquee(model = model) { model, value ->
MarqueeText(
model = model,
offset = value
)
}
}
}
}
}
/**
* 活动标题
*
*/
@Composable
private fun ClubActivitiesTitle(modifier: Modifier = Modifier) {
Card(modifier = modifier, backgroundColor = MaterialTheme.colors.background) {
Row(
modifier = Modifier
.fillMaxWidth(),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically
) {
Text(
text = "超级课程表X滴滴出行-了不起的社团",
style = MaterialTheme.typography.h6,
overflow = TextOverflow.Ellipsis,
maxLines = 1
)
}
}
}
/**
* 带介绍活动海报
*
*/
@Composable
private fun PosterWithDesc() {
val context = LocalContext.current as MainActivity
Carousel(imageBitmap = context.imageModel.image) {
Column(modifier = Modifier.clickable(onClick = {
context.startActivity(Intent(context, ActivityDetailActivity::class.java))
})) {
Poster(
modifier = Modifier
.weight(0.6F)
.fillMaxWidth()
)
DescCard(
modifier = Modifier
.weight(0.4F)
.fillMaxWidth(),
content = randomChinese(500)
)
}
}
}
@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
CSAMSTheme {
Text(text = "666")
}
}
}