|
@@ -1,11 +1,17 @@
|
|
|
package com.iscs.bozzys.ui.pages.profile.face
|
|
package com.iscs.bozzys.ui.pages.profile.face
|
|
|
|
|
|
|
|
|
|
+import android.Manifest
|
|
|
import android.content.Context
|
|
import android.content.Context
|
|
|
import android.content.Intent
|
|
import android.content.Intent
|
|
|
|
|
+import android.content.pm.PackageManager
|
|
|
|
|
+import android.os.Build
|
|
|
|
|
+import androidx.activity.result.contract.ActivityResultContracts
|
|
|
import androidx.compose.foundation.clickable
|
|
import androidx.compose.foundation.clickable
|
|
|
|
|
+import androidx.compose.foundation.layout.Box
|
|
|
import androidx.compose.foundation.layout.Column
|
|
import androidx.compose.foundation.layout.Column
|
|
|
import androidx.compose.foundation.layout.PaddingValues
|
|
import androidx.compose.foundation.layout.PaddingValues
|
|
|
import androidx.compose.foundation.layout.Row
|
|
import androidx.compose.foundation.layout.Row
|
|
|
|
|
+import androidx.compose.foundation.layout.fillMaxSize
|
|
|
import androidx.compose.foundation.layout.fillMaxWidth
|
|
import androidx.compose.foundation.layout.fillMaxWidth
|
|
|
import androidx.compose.foundation.layout.height
|
|
import androidx.compose.foundation.layout.height
|
|
|
import androidx.compose.foundation.layout.padding
|
|
import androidx.compose.foundation.layout.padding
|
|
@@ -33,19 +39,23 @@ import androidx.lifecycle.viewmodel.compose.viewModel
|
|
|
import coil.compose.AsyncImage
|
|
import coil.compose.AsyncImage
|
|
|
import com.iscs.bozzys.R
|
|
import com.iscs.bozzys.R
|
|
|
import com.iscs.bozzys.api.UserCharacteristic
|
|
import com.iscs.bozzys.api.UserCharacteristic
|
|
|
|
|
+import com.iscs.bozzys.ui.common.Empty
|
|
|
import com.iscs.bozzys.ui.common.PageBase
|
|
import com.iscs.bozzys.ui.common.PageBase
|
|
|
import com.iscs.bozzys.ui.common.Title
|
|
import com.iscs.bozzys.ui.common.Title
|
|
|
import com.iscs.bozzys.ui.dialog.TipsDialog
|
|
import com.iscs.bozzys.ui.dialog.TipsDialog
|
|
|
import com.iscs.bozzys.ui.pages.compose.CardBox
|
|
import com.iscs.bozzys.ui.pages.compose.CardBox
|
|
|
import com.iscs.bozzys.ui.pages.vm.VMFace
|
|
import com.iscs.bozzys.ui.pages.vm.VMFace
|
|
|
import com.iscs.bozzys.utils.DateUtil.getShowDateOrTime
|
|
import com.iscs.bozzys.utils.DateUtil.getShowDateOrTime
|
|
|
|
|
+import com.iscs.bozzys.utils.SystemUtil.uriToFile
|
|
|
|
|
+import java.io.File
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 打开人脸录入界面
|
|
* 打开人脸录入界面
|
|
|
*/
|
|
*/
|
|
|
-fun Context.openPageFace(userId: Int) {
|
|
|
|
|
|
|
+fun Context.openPageFace(userId: Int, username: String) {
|
|
|
startActivity(Intent(this, PageFace::class.java).apply {
|
|
startActivity(Intent(this, PageFace::class.java).apply {
|
|
|
putExtra("userId", userId)
|
|
putExtra("userId", userId)
|
|
|
|
|
+ putExtra("username", username)
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -54,10 +64,43 @@ fun Context.openPageFace(userId: Int) {
|
|
|
*/
|
|
*/
|
|
|
class PageFace : PageBase() {
|
|
class PageFace : PageBase() {
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // 跳转到选择照片页面
|
|
|
|
|
+ private val imageLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
|
|
|
|
|
+ uriToFile(uri)?.let { onImagePickerFinish(it) }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 照片选择成功回调
|
|
|
|
|
+ private var onImagePickerFinish: (file: File) -> Unit = {}
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 执行照片选择
|
|
|
|
|
+ */
|
|
|
|
|
+ private fun pickerImage(done: (file: File) -> Unit) {
|
|
|
|
|
+ this.onImagePickerFinish = done
|
|
|
|
|
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
|
|
|
|
|
+ if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
|
|
|
|
+ requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 1001)
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ imageLauncher.launch("image/*")
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取用户id
|
|
|
|
|
+ */
|
|
|
private fun getUserId(): Int {
|
|
private fun getUserId(): Int {
|
|
|
return intent.getIntExtra("userId", 0)
|
|
return intent.getIntExtra("userId", 0)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 从页面携带数据中获取用户名称
|
|
|
|
|
+ */
|
|
|
|
|
+ private fun getUsername(): String {
|
|
|
|
|
+ return intent.getStringExtra("username") ?: ""
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
@Composable
|
|
@Composable
|
|
|
override fun GetViews(pv: PaddingValues) {
|
|
override fun GetViews(pv: PaddingValues) {
|
|
|
val vm: VMFace = viewModel()
|
|
val vm: VMFace = viewModel()
|
|
@@ -65,22 +108,29 @@ class PageFace : PageBase() {
|
|
|
LaunchedEffect(Unit) {
|
|
LaunchedEffect(Unit) {
|
|
|
vm.loading.initLoading()
|
|
vm.loading.initLoading()
|
|
|
vm.toast.initToast()
|
|
vm.toast.initToast()
|
|
|
- vm.init(getUserId())
|
|
|
|
|
|
|
+ vm.init(getUserId(), getUsername())
|
|
|
}
|
|
}
|
|
|
- Column() {
|
|
|
|
|
- Title(pv, "人脸")
|
|
|
|
|
- Column(
|
|
|
|
|
- modifier = Modifier
|
|
|
|
|
- .padding(horizontal = 16.dp, vertical = 8.dp)
|
|
|
|
|
- .verticalScroll(rememberScrollState())
|
|
|
|
|
- ) {
|
|
|
|
|
- state.faceList.forEach { FaceListItem(vm, it) }
|
|
|
|
|
|
|
+ Column {
|
|
|
|
|
+ Title(pv, "人脸", rightShow = true, rightIcon = R.drawable.add, rightClick = {
|
|
|
|
|
+ pickerImage { vm.uploadUserFace(it) }
|
|
|
|
|
+ })
|
|
|
|
|
+ Box(contentAlignment = Alignment.Center) {
|
|
|
|
|
+ Column(
|
|
|
|
|
+ modifier = Modifier
|
|
|
|
|
+ .padding(horizontal = 16.dp, vertical = 8.dp)
|
|
|
|
|
+ .fillMaxSize()
|
|
|
|
|
+ .verticalScroll(rememberScrollState())
|
|
|
|
|
+ ) {
|
|
|
|
|
+ state.faceList.forEach { FaceListItem(vm, it) }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (state.faceList.isEmpty() && !state.isFirstLoad) Empty(tips = "暂无人脸数据")
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 人脸特诊数据
|
|
|
|
|
|
|
+ * 人脸特征数据
|
|
|
*/
|
|
*/
|
|
|
@Composable
|
|
@Composable
|
|
|
fun FaceListItem(vm: VMFace, face: UserCharacteristic) {
|
|
fun FaceListItem(vm: VMFace, face: UserCharacteristic) {
|