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.reg_association,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) }