|
@@ -1,9 +1,11 @@
|
|
|
package io.nexilis.alpha.ui.main
|
|
|
|
|
|
-import android.graphics.Bitmap
|
|
|
+import android.Manifest
|
|
|
+import android.content.pm.PackageManager
|
|
|
+import android.net.Uri
|
|
|
+import android.widget.Toast
|
|
|
import androidx.activity.compose.rememberLauncherForActivityResult
|
|
|
import androidx.activity.result.contract.ActivityResultContracts
|
|
|
-import androidx.activity.result.launch
|
|
|
import androidx.compose.foundation.Image
|
|
|
import androidx.compose.foundation.layout.*
|
|
|
import androidx.compose.foundation.shape.CircleShape
|
|
@@ -15,29 +17,55 @@ import androidx.compose.runtime.livedata.observeAsState
|
|
|
import androidx.compose.ui.Alignment
|
|
|
import androidx.compose.ui.Modifier
|
|
|
import androidx.compose.ui.draw.clip
|
|
|
-import androidx.compose.ui.graphics.asImageBitmap
|
|
|
-import androidx.compose.ui.graphics.painter.BitmapPainter
|
|
|
import androidx.compose.ui.graphics.painter.Painter
|
|
|
import androidx.compose.ui.layout.ContentScale
|
|
|
import androidx.compose.ui.platform.LocalContext
|
|
|
import androidx.compose.ui.unit.dp
|
|
|
+import androidx.core.content.ContextCompat
|
|
|
+import androidx.core.content.FileProvider
|
|
|
import androidx.hilt.navigation.compose.hiltViewModel
|
|
|
import coil.compose.rememberAsyncImagePainter
|
|
|
import coil.request.ImageRequest
|
|
|
+import io.nexilis.alpha.BuildConfig
|
|
|
import io.nexilis.alpha.ui.viewmodel.MainViewModel
|
|
|
+import io.nexilis.service.core.createImageFile
|
|
|
import io.nexilis.service.data.viewmodels.BuddyViewModel
|
|
|
+import java.util.Objects
|
|
|
+
|
|
|
|
|
|
@Composable
|
|
|
fun Profile(contentPadding: PaddingValues = PaddingValues(0.dp), mainViewModel: MainViewModel) {
|
|
|
SideEffect {
|
|
|
mainViewModel.setTitle("Profile")
|
|
|
}
|
|
|
- var imageUri by remember { mutableStateOf<Bitmap?>(null) }
|
|
|
- val launcher = rememberLauncherForActivityResult(ActivityResultContracts.TakePicturePreview()) {
|
|
|
- imageUri = it
|
|
|
- }
|
|
|
val viewModel: BuddyViewModel = hiltViewModel()
|
|
|
val me by viewModel.me.observeAsState()
|
|
|
+ val context = LocalContext.current
|
|
|
+ val file = context.createImageFile()
|
|
|
+ val uri = FileProvider.getUriForFile(
|
|
|
+ Objects.requireNonNull(context),
|
|
|
+ BuildConfig.APPLICATION_ID + ".provider", file
|
|
|
+ )
|
|
|
+ var imageUri by remember { mutableStateOf<Uri>(Uri.EMPTY) }
|
|
|
+ val launcher = rememberLauncherForActivityResult(ActivityResultContracts.TakePicture()) {
|
|
|
+ if (it && uri.path?.isNotEmpty() == true) {
|
|
|
+ me?.let { me ->
|
|
|
+ viewModel.changeProfile(me.f_pin, file) {
|
|
|
+ imageUri = uri
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ val permissionLauncher = rememberLauncherForActivityResult(
|
|
|
+ ActivityResultContracts.RequestPermission()
|
|
|
+ ) {
|
|
|
+ if (it) {
|
|
|
+ Toast.makeText(context, "Permission Granted", Toast.LENGTH_SHORT).show()
|
|
|
+ launcher.launch(uri)
|
|
|
+ } else {
|
|
|
+ Toast.makeText(context, "Permission Denied", Toast.LENGTH_SHORT).show()
|
|
|
+ }
|
|
|
+ }
|
|
|
Column(
|
|
|
modifier = Modifier
|
|
|
.padding(contentPadding)
|
|
@@ -48,17 +76,16 @@ fun Profile(contentPadding: PaddingValues = PaddingValues(0.dp), mainViewModel:
|
|
|
Modifier.align(Alignment.CenterHorizontally),
|
|
|
contentAlignment = Alignment.BottomEnd,
|
|
|
) {
|
|
|
- val painter: Painter = imageUri?.let {
|
|
|
- BitmapPainter(it.asImageBitmap())
|
|
|
- } ?: run {
|
|
|
- rememberAsyncImagePainter(
|
|
|
+ val painter: Painter =
|
|
|
+ if (imageUri.path?.isNotEmpty() == true)
|
|
|
+ rememberAsyncImagePainter(imageUri)
|
|
|
+ else rememberAsyncImagePainter(
|
|
|
model = ImageRequest.Builder(LocalContext.current)
|
|
|
.data("https://digixplatform.com/filepalio/image/${me?.image_id}")
|
|
|
- .addHeader("Cookie" , "PHPSESSID=123;MOBILE=123")
|
|
|
+ .addHeader("Cookie", "PHPSESSID=123;MOBILE=123")
|
|
|
.crossfade(true)
|
|
|
.build()
|
|
|
)
|
|
|
- }
|
|
|
Image(
|
|
|
painter = painter, contentDescription = "", modifier = Modifier
|
|
|
.padding(top = 8.dp, end = 16.dp, bottom = 8.dp)
|
|
@@ -67,7 +94,13 @@ fun Profile(contentPadding: PaddingValues = PaddingValues(0.dp), mainViewModel:
|
|
|
contentScale = ContentScale.Crop
|
|
|
)
|
|
|
IconButton(onClick = {
|
|
|
- launcher.launch()
|
|
|
+ val permissionCheckResult =
|
|
|
+ ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA)
|
|
|
+ if (permissionCheckResult == PackageManager.PERMISSION_GRANTED) {
|
|
|
+ launcher.launch(uri)
|
|
|
+ } else {
|
|
|
+ permissionLauncher.launch(Manifest.permission.CAMERA)
|
|
|
+ }
|
|
|
}) {
|
|
|
Icon(
|
|
|
imageVector = Icons.Default.AddCircle,
|
|
@@ -100,7 +133,12 @@ fun Profile(contentPadding: PaddingValues = PaddingValues(0.dp), mainViewModel:
|
|
|
)
|
|
|
ListItem(
|
|
|
headlineContent = { Text("Phone", style = MaterialTheme.typography.bodySmall) },
|
|
|
- supportingContent = { Text("08112345678", style = MaterialTheme.typography.titleMedium) },
|
|
|
+ supportingContent = {
|
|
|
+ Text(
|
|
|
+ "08112345678",
|
|
|
+ style = MaterialTheme.typography.titleMedium
|
|
|
+ )
|
|
|
+ },
|
|
|
leadingContent = {
|
|
|
Icon(imageVector = Icons.Default.Call, contentDescription = "")
|
|
|
}
|