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.

588 lines
20 KiB

package com.gyf.csams.main.ui
import android.content.Intent
import android.os.Bundle
3 years ago
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.compose.setContent
3 years ago
import androidx.activity.result.contract.ActivityResultContracts
3 years ago
import androidx.compose.foundation.Image
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
3 years ago
import androidx.compose.foundation.layout.*
3 years ago
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.rememberLazyListState
3 years ago
import androidx.compose.material.*
import androidx.compose.runtime.Composable
3 years ago
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
3 years ago
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
3 years ago
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavHostController
3 years ago
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import com.google.accompanist.coil.rememberCoilPainter
3 years ago
import com.google.accompanist.imageloading.ImageLoadState
import com.google.accompanist.pager.ExperimentalPagerApi
import com.google.accompanist.pager.HorizontalPager
import com.google.accompanist.pager.PagerState
import com.google.accompanist.pager.rememberPagerState
3 years ago
import com.gyf.csams.R
import com.gyf.csams.account.model.AccountViewModel
import com.gyf.csams.activity.ui.ActivityDetailActivity
import com.gyf.csams.activity.ui.TendencyActivity
import com.gyf.csams.association.ui.AssociationActivity
import com.gyf.csams.association.ui.RegAssociationActivity
import com.gyf.csams.main.model.*
3 years ago
import com.gyf.csams.message.ui.SysMessageActivity
3 years ago
import com.gyf.csams.module.*
import com.gyf.csams.uikit.*
3 years ago
import com.gyf.lib.model.RefreshViewModel
import com.gyf.lib.service.BaseActivity
import com.gyf.lib.uikit.*
import com.gyf.lib.util.*
3 years ago
import com.orhanobut.logger.Logger
3 years ago
/**
* 主界面
*
*/
class MainActivity : BaseActivity() {
override val clientType: ClientType = ClientType.Foreground
3 years ago
private val choosePhoto: ChoosePhoto = ChoosePhoto(activity = this)
3 years ago
@ExperimentalPagerApi
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
NavBody { 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) {
3 years ago
val refresh: RefreshViewModel = viewModel()
refresh.refresh()
val load by refresh.refresh.observeAsState()
load?.let {
Center(navController = nav)
ShowSnackbar(scaffoldState = scaffoldState)
}
}
}
3 years ago
}
}
}
/**
* 个人中心
*
*/
@Composable
private fun Center(
model: CenterViewModel = viewModel(),
scaffoldModel: ScaffoldModel = viewModel(),
accountViewModel: AccountViewModel = viewModel(),
navController: NavHostController
) {
3 years ago
MainColumnFrame(
background = { Background(image = BackgroundImage.Center, alpha = 0.5F) },
mainMenu = MainMenu.Center,
nav = navController
) {
3 years ago
val photoLauncher = choosePhoto.photoLauncher()
val permissionLauncher = choosePhoto.permissionLauncher(photoLauncher = photoLauncher)
val personInfoData by TokenManager.getPersonInfoData().observeAsState()
3 years ago
personInfoData?.let {
Profile(
modifier = Modifier
.weight(0.4F)
.padding(10.dp),
setHeadImg = {
choosePhoto.requestPhoto(
photoLauncher = photoLauncher,
permissionLauncher = permissionLauncher
)
},
personInfoVo = it
)
}
Column(
3 years ago
modifier = Modifier.weight(0.6F),
verticalArrangement = Arrangement.SpaceEvenly
) {
3 years ago
TokenManager.getUserInfo()?.associationVo?.associationId?.let {
3 years ago
CenterMenuItem(text = model.myAssociationDesc) {
startActivity(
Intent(
this@MainActivity,
AssociationActivity::class.java
).apply {
3 years ago
putExtra(AssociationActivity::class.java.name, it)
3 years ago
})
}
CenterMenuItem(text = model.myLikeActivity) {
startActivity(
Intent(
this@MainActivity,
TendencyActivity::class.java
).apply {
putExtra(TendencyType::class.java.name, TendencyType.Like)
})
}
CenterMenuItem(text = model.myCollectActivity) {
startActivity(
Intent(
this@MainActivity,
TendencyActivity::class.java
).apply {
putExtra(TendencyType::class.java.name, TendencyType.Collect)
})
}
}
3 years ago
CenterMenuItem(text = "退出登录") {
accountViewModel.logout(this@MainActivity) {
scaffoldModel.update(message = it)
}
}
}
}
}
@Composable
private fun CenterMenuItem(text: String, onClick: () -> Unit = {}) {
Card(backgroundColor = MaterialTheme.colors.background) {
3 years ago
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)
)
}
3 years ago
}
}
}
/**
* 主界面
*/
3 years ago
@ExperimentalPagerApi
@Composable
private fun Main(navController: NavHostController) {
MainColumnFrame(
background = { Background(image = BackgroundImage.Main) },
mainMenu = MainMenu.Main,
nav = navController
) {
3 years ago
val viewModel: ImageViewModel = viewModel()
val imageList by viewModel.imageList.observeAsState()
imageList?.let {
val pagerState = rememberPagerState(pageCount = it.size)
Column(modifier = Modifier.weight(0.33F)) {
Notification()
Column(
modifier = Modifier
.fillMaxSize()
.padding(horizontal = 15.dp),
verticalArrangement = Arrangement.SpaceEvenly
) {
MessageBoard()
ClubActivitiesTitle(vo = it[pagerState.currentPage])
}
}
Column(modifier = Modifier.weight(0.66F)) {
PosterWithDesc(pagerState = pagerState, imgList = it)
}
}
3 years ago
3 years ago
}
}
/**
* 社团列表
*
* @param navController
*/
@Composable
private fun AssociationList(navController: NavHostController) {
MainColumnFrame(
background = { Background(image = BackgroundImage.AssociationList) },
mainMenu = MainMenu.List,
nav = navController
) {
3 years ago
val associationVo = TokenManager.getUserInfo()?.associationVo
if (associationVo == null) {
3 years ago
RegisterAssociation(navController = navController)
}
AssociationSearch()
AssociationListBody()
}
3 years ago
}
/**
* 注册社团按钮
*
*/
@Composable
3 years ago
private fun RegisterAssociation(
navController: NavHostController
) {
val launch =
rememberLauncherForActivityResult(contract = ActivityResultContracts.StartActivityForResult()) { it ->
when (it.resultCode) {
RESULT_OK -> {
it.data?.getStringExtra(RegAssociationActivity::class.java.name)?.let {
if (it == CheckStatus.Finish.name) {
navController.navigate(MainMenu.List.name)
}
}
}
}
}
Row(
horizontalArrangement = Arrangement.End,
modifier = Modifier
.fillMaxWidth()
.padding(10.dp)
) {
IconButton(onClick = {
3 years ago
launch.launch(Intent(this@MainActivity, RegAssociationActivity::class.java))
}) {
Icon(
painter = painterResource(id = R.drawable.ic_add_fill),
contentDescription = null,
modifier = Modifier.size(50.dp),
)
}
}
3 years ago
}
/**
* 社团列表
*
*/
@Composable
private fun AssociationListBody(
3 years ago
model: AssociationListViewModel = viewModel()
) {
val associationListList: MutableList<AssociationVo>? by model.data.observeAsState()
val listState = rememberLazyListState()
LazyColumn(state = listState) {
associationListList?.chunked(2)?.forEach {
item {
Row {
Spacer(modifier = Modifier.weight(0.1F))
3 years ago
Box(modifier = Modifier.weight(0.35F)) {
Association(associationVo = it[0])
3 years ago
}
Spacer(modifier = Modifier.weight(0.05F))
if (it.size == 2) {
Box(modifier = Modifier.weight(0.35F)) {
Association(associationVo = it[1])
}
} else {
Box(
modifier = Modifier
.weight(0.35F)
.border(width = 1.dp, color = MaterialTheme.colors.onBackground)
)
}
Spacer(modifier = Modifier.weight(0.1F))
3 years ago
}
Spacer(
modifier = Modifier
.fillMaxWidth()
.height(10.dp)
)
3 years ago
}
}
}
3 years ago
if (listState.layoutInfo.totalItemsCount - listState.firstVisibleItemIndex == model.initSize / 2 - 1) {
TODO("加载更多")
}
3 years ago
}
/**
* 社团卡片
*
* @param associationVo
*/
@Composable
private fun Association(associationVo: AssociationVo) {
Card(modifier = Modifier.clickable(onClick = {
val intent = Intent(this, AssociationActivity::class.java)
3 years ago
intent.putExtra(AssociationActivity::class.java.name, associationVo.associationId)
startActivity(intent)
})) {
val backgroundImage = rememberCoilPainter(request = R.drawable.association_list_border)
Image(
painter = backgroundImage,
contentDescription = null
)
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.Center
) {
Text(text = associationVo.name)
}
3 years ago
}
}
/**
* 社团检索
*
*/
@Composable
private fun AssociationSearch(
model: AssociationListViewModel = 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.load {
scaffoldModel.update(message = it)
}
},
modifier = Modifier.width(100.dp)
) {
Text(text = stringResource(id = R.string.search_btn))
}
3 years ago
}
Spacer(
modifier = Modifier.height(10.dp)
)
3 years ago
}
3 years ago
}
}
/**
* 通知
*
*/
@Composable
private fun Notification(notificationViewModel: NotificationViewModel = viewModel()) {
val count by notificationViewModel.count.observeAsState(null)
count?.let {
Row(
horizontalArrangement = Arrangement.End,
modifier = Modifier
.fillMaxWidth()
.padding(10.dp)
) {
IconButton(onClick = {
3 years ago
startActivity(Intent(this@MainActivity, SysMessageActivity::class.java))
}) {
Icon(
painter = painterResource(id = if (it > 0) R.drawable.ic_notice else R.drawable.ic_notification),
contentDescription = null
)
}
3 years ago
}
}
3 years ago
}
/**
* 留言板
*
*/
@Composable
private fun MessageBoard(
modifier: Modifier = Modifier,
model: MarqueeViewModel = viewModel(),
scaffoldModel: ScaffoldModel = viewModel()
) {
model.loadMessage {
scaffoldModel.update(message = it)
}
Card(modifier = modifier, backgroundColor = MaterialTheme.colors.background) {
Row(
verticalAlignment = Alignment.CenterVertically
) {
3 years ago
IconButton(onClick = { model.openDialog() }) {
Icon(
painter = painterResource(id = R.drawable.ic_comments),
contentDescription = null,
)
}
SendComment(model = model)
Row(
horizontalArrangement = Arrangement.Center,
modifier = Modifier
.fillMaxWidth()
) {
Marquee(model = model)
}
}
}
}
/**
* 活动标题
*
*/
3 years ago
@ExperimentalPagerApi
@Composable
3 years ago
private fun ClubActivitiesTitle(modifier: Modifier = Modifier, vo: MainActivityPhotoVo) {
Card(modifier = modifier, backgroundColor = MaterialTheme.colors.background) {
3 years ago
Row(
modifier = Modifier
.fillMaxWidth(),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically
3 years ago
) {
Text(
3 years ago
text = vo.activityVo.activityName,
style = MaterialTheme.typography.h6,
overflow = TextOverflow.Ellipsis,
maxLines = 1
)
3 years ago
}
}
}
/**
* 带介绍活动海报
*
*/
3 years ago
@ExperimentalPagerApi
@Composable
private fun PosterWithDesc(
3 years ago
pagerState: PagerState,
imgList: List<MainActivityPhotoVo>
) {
3 years ago
imgList.let {
HorizontalPager(state = pagerState) { page ->
// Our page content
Logger.i("page=${page}")
Column {
val photo = rememberCoilPainter(request = Api.buildUrl(it[page].url))
Poster(
modifier = Modifier
.weight(0.6F)
.fillMaxWidth()
) {
when (photo.loadState) {
3 years ago
is ImageLoadState.Loading -> CircularProgressIndicator()
is ImageLoadState.Success -> it[page].apply {
Image(
painter = photo,
contentDescription = activityVo.activityName,
modifier = Modifier.clickable(onClick = {
startActivity(
Intent(
this@MainActivity,
ActivityDetailActivity::class.java
).apply {
putExtra(
ActivityDetailActivity::class.java.name,
activityVo.activityId
)
putExtra(
AssociationActivity::class.java.name,
associationVo.associationId
)
})
})
)
3 years ago
}
3 years ago
else -> Text(text = "图片加载失败")
3 years ago
}
}
DescCard(
modifier = Modifier
.weight(0.4F)
.fillMaxWidth(),
content = it[page].activityVo.activityDesc
)
}
}
3 years ago
3 years ago
}
3 years ago
3 years ago
}
}
3 years ago
3 years ago