From ab67ca35e1df3dac4d4ec0dd95de8db9a7a80ccb Mon Sep 17 00:00:00 2001 From: Infi Date: Tue, 11 Jul 2023 23:59:42 +0200 Subject: [PATCH] feat: "take a photo" button Signed-off-by: Infi --- .../components/media/InbuiltMediaPicker.kt | 13 ++++-- .../chat/views/channel/ChannelScreen.kt | 40 ++++++++++++++++--- 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/chat/revolt/components/media/InbuiltMediaPicker.kt b/app/src/main/java/chat/revolt/components/media/InbuiltMediaPicker.kt index 2b060c84..731b6ccc 100644 --- a/app/src/main/java/chat/revolt/components/media/InbuiltMediaPicker.kt +++ b/app/src/main/java/chat/revolt/components/media/InbuiltMediaPicker.kt @@ -118,8 +118,9 @@ fun InbuiltMediaPicker( val projection = arrayOf( MediaStore.Images.ImageColumns._ID, MediaStore.Images.ImageColumns.RESOLUTION, + MediaStore.Images.ImageColumns.ORIENTATION, MediaStore.Images.ImageColumns.MIME_TYPE, - MediaStore.Video.VideoColumns.DURATION + MediaStore.Video.VideoColumns.DURATION, ) val selection: String? = null @@ -143,6 +144,10 @@ fun InbuiltMediaPicker( cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns._ID)) val resolution = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.RESOLUTION)) + val orientation = + cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.ORIENTATION)) + + val swapDimensions = orientation == 90 || orientation == 270 val isVideo = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.MIME_TYPE)) @@ -164,11 +169,13 @@ fun InbuiltMediaPicker( if (resolution == null) continue + val (width, height) = resolution.split("×").map { it.toInt() } + images.add( Media( uri = contentUri, - width = resolution.split("×")[0].toInt(), - height = resolution.split("×")[1].toInt(), + width = if (swapDimensions) height else width, + height = if (swapDimensions) width else height, duration = videoDuration ) ) diff --git a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt b/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt index dd090f8c..b94d2d8a 100644 --- a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt +++ b/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt @@ -1,7 +1,10 @@ package chat.revolt.screens.chat.views.channel +import android.content.ContentValues import android.net.Uri import android.os.Build +import android.os.Environment +import android.provider.MediaStore import android.widget.Toast import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts @@ -40,6 +43,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment @@ -153,6 +157,17 @@ fun ChannelScreen( } } + val capturedPhotoUri = rememberSaveable { mutableStateOf(null) } + val pickCameraLauncher = rememberLauncherForActivityResult( + contract = ActivityResultContracts.TakePicture() + ) { uriUpdated -> + if (uriUpdated) { + capturedPhotoUri.value?.let { uri -> + processFileUri(uri) + } + } + } + val scrollDownFABPadding by animateDpAsState( if (viewModel.typingUsers.isNotEmpty()) 25.dp else 0.dp, animationSpec = RevoltTweenDp, @@ -472,11 +487,26 @@ fun ChannelScreen( viewModel.inbuiltFilePickerOpen = false }, onOpenCamera = { - Toast.makeText( - context, - "This will open the camera one day", - Toast.LENGTH_SHORT - ).show() + // Create a new content URI to store the captured image. + val contentResolver = context.contentResolver + val contentValues = ContentValues().apply { + put( + MediaStore.MediaColumns.DISPLAY_NAME, + "RVL_${System.currentTimeMillis()}.jpg" + ) + put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg") + put( + MediaStore.MediaColumns.RELATIVE_PATH, + Environment.DIRECTORY_PICTURES + ) + } + + capturedPhotoUri.value = contentResolver.insert( + MediaStore.Images.Media.EXTERNAL_CONTENT_URI, + contentValues + ) + + pickCameraLauncher.launch(capturedPhotoUri.value) viewModel.inbuiltFilePickerOpen = false }, onClose = {