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