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? 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") } } }