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.
244 lines
8.4 KiB
244 lines
8.4 KiB
package com.gyf.csams.association.ui
|
|
|
|
import android.Manifest
|
|
import android.app.Activity
|
|
import android.content.Intent
|
|
import android.content.pm.PackageManager
|
|
import android.graphics.BitmapFactory
|
|
import android.net.Uri
|
|
import android.os.Bundle
|
|
import android.provider.MediaStore
|
|
import androidx.activity.ComponentActivity
|
|
import androidx.activity.compose.rememberLauncherForActivityResult
|
|
import androidx.activity.compose.setContent
|
|
import androidx.activity.result.contract.ActivityResultContracts
|
|
import androidx.compose.foundation.Image
|
|
import androidx.compose.foundation.background
|
|
import androidx.compose.foundation.border
|
|
import androidx.compose.foundation.layout.*
|
|
import androidx.compose.material.IconButton
|
|
import androidx.compose.material.MaterialTheme
|
|
import androidx.compose.material.OutlinedButton
|
|
import androidx.compose.material.Text
|
|
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.graphics.Color
|
|
import androidx.compose.ui.graphics.asImageBitmap
|
|
import androidx.compose.ui.platform.LocalContext
|
|
import androidx.compose.ui.res.painterResource
|
|
import androidx.compose.ui.unit.dp
|
|
import androidx.core.content.ContextCompat
|
|
import androidx.lifecycle.viewmodel.compose.viewModel
|
|
import com.gyf.csams.R
|
|
import com.gyf.csams.association.model.RegAssociationViewModel
|
|
import com.gyf.csams.uikit.*
|
|
import com.gyf.csams.uikit.theme.CSAMSTheme
|
|
import com.orhanobut.logger.Logger
|
|
|
|
|
|
/**
|
|
* 注册社团
|
|
*
|
|
*/
|
|
class RegAssociationActivity : ComponentActivity() {
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
super.onCreate(savedInstanceState)
|
|
setContent {
|
|
CSAMSTheme {
|
|
Body { scaffoldState ->
|
|
MainFrame(background = {
|
|
Background(
|
|
BackgroundImage.RegAssociation,
|
|
alpha = 0.5F
|
|
)
|
|
}) {
|
|
Spacer(
|
|
modifier = Modifier
|
|
.weight(0.1F)
|
|
)
|
|
Title()
|
|
Name()
|
|
Desc(
|
|
modifier = Modifier
|
|
.weight(0.1F)
|
|
.fillMaxWidth()
|
|
)
|
|
Spacer(modifier = Modifier.weight(0.05F))
|
|
Logo(
|
|
modifier = Modifier
|
|
.weight(0.2F)
|
|
.fillMaxWidth()
|
|
)
|
|
Spacer(modifier = Modifier.weight(0.05F))
|
|
BottomButton(modifier = Modifier.fillMaxWidth())
|
|
Spacer(modifier = Modifier.weight(0.05F))
|
|
|
|
ShowSnackbar(scaffoldState = scaffoldState)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 社团Logo
|
|
*
|
|
* @param modifier
|
|
*/
|
|
@Composable
|
|
private fun Logo(model: RegAssociationViewModel = viewModel(), modifier: Modifier) {
|
|
val photoIntent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
|
|
photoIntent.type = "image/*"
|
|
val uri: Uri? by model.picture.observeAsState()
|
|
|
|
val resultLauncher =
|
|
rememberLauncherForActivityResult(contract = ActivityResultContracts.StartActivityForResult()) {
|
|
when (it.resultCode) {
|
|
Activity.RESULT_OK -> {
|
|
Logger.i("uri=${it.data?.data}")
|
|
it.data?.data?.let { it1 -> model.setPicture(it1) }
|
|
}
|
|
}
|
|
}
|
|
|
|
val loadPicture = {
|
|
//model.loadPicture(context)
|
|
resultLauncher.launch(photoIntent)
|
|
}
|
|
|
|
val launcher = rememberLauncherForActivityResult(
|
|
ActivityResultContracts.RequestPermission()
|
|
) { isGranted: Boolean ->
|
|
if (isGranted) {
|
|
// Permission Accepted: Do something
|
|
loadPicture()
|
|
} else {
|
|
// Permission Denied: Do something
|
|
Logger.w(model.deninedPermission)
|
|
}
|
|
}
|
|
|
|
|
|
val context = LocalContext.current
|
|
|
|
Box(contentAlignment = Alignment.Center, modifier = modifier) {
|
|
Row(
|
|
verticalAlignment = Alignment.CenterVertically,
|
|
horizontalArrangement = Arrangement.Center, modifier = Modifier
|
|
.fillMaxSize()
|
|
.border(width = 1.dp, color = Color.Black)
|
|
) {
|
|
|
|
if (uri == null) {
|
|
OutlinedButton(onClick = {
|
|
when (PackageManager.PERMISSION_GRANTED) {
|
|
ContextCompat.checkSelfPermission(
|
|
context,
|
|
Manifest.permission.READ_EXTERNAL_STORAGE
|
|
) -> {
|
|
// Some works that require permission
|
|
loadPicture()
|
|
}
|
|
else -> {
|
|
// Asking for permission
|
|
launcher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
|
|
}
|
|
}
|
|
}) {
|
|
Text(text = model.piciurePlaceHolder)
|
|
}
|
|
} else {
|
|
uri.let {
|
|
if (it != null) {
|
|
Row {
|
|
Image(
|
|
bitmap = BitmapFactory.decodeStream(
|
|
context.contentResolver.openInputStream(
|
|
it
|
|
)
|
|
)
|
|
.asImageBitmap(), contentDescription = null
|
|
)
|
|
IconButton(onClick = {
|
|
loadPicture()
|
|
}) {
|
|
Image(
|
|
painter = painterResource(id = R.drawable.ic_exchange_rate),
|
|
contentDescription = null
|
|
)
|
|
}
|
|
}
|
|
|
|
|
|
} else {
|
|
Text(text = model.errorPicture)
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
@Composable
|
|
private fun BottomButton(
|
|
modifier: Modifier = Modifier,
|
|
scaffoldModel: ScaffoldModel = viewModel(),
|
|
model: RegAssociationViewModel = viewModel()
|
|
) {
|
|
val context = LocalContext.current as RegAssociationActivity
|
|
Row(modifier = modifier, horizontalArrangement = Arrangement.Center) {
|
|
OutlinedButton(onClick = {
|
|
model.register { scaffoldModel.update(message = it) }
|
|
}, modifier = Modifier.background(color = MaterialTheme.colors.primary)) {
|
|
Text(text = model.register)
|
|
}
|
|
Spacer(modifier = Modifier.width(10.dp))
|
|
OutlinedButton(onClick = {
|
|
context.onBackPressed()
|
|
}, modifier = Modifier.background(color = MaterialTheme.colors.secondary)) {
|
|
Text(text = model.back)
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* 菜单标题
|
|
*
|
|
*/
|
|
@Composable
|
|
private fun Title(model: RegAssociationViewModel = viewModel()) {
|
|
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) {
|
|
Text(text = model.frameDesc, style = MaterialTheme.typography.h4)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 社团名称
|
|
* @param model
|
|
*/
|
|
@Composable
|
|
private fun Name(model: RegAssociationViewModel = viewModel()) {
|
|
BaseTextField(form = model.name, singeLine = true, modifier = Modifier.fillMaxWidth())
|
|
}
|
|
|
|
/**
|
|
* 社团简介
|
|
* @param model
|
|
*/
|
|
@Composable
|
|
private fun Desc(model: RegAssociationViewModel = viewModel(), modifier: Modifier) {
|
|
BaseTextField(form = model.desc, modifier = modifier)
|
|
}
|
|
|
|
}
|
|
|
|
|