mirror of
https://github.com/Myzel394/Alibi.git
synced 2025-06-18 23:05:26 +02:00
commit
24928661c5
@ -1,56 +1,56 @@
|
||||
package app.myzel394.alibi.ui.components.RecorderScreen.atoms
|
||||
|
||||
import android.util.Log
|
||||
import android.view.ViewGroup
|
||||
import androidx.camera.core.CameraSelector
|
||||
import androidx.camera.core.Preview
|
||||
import androidx.camera.lifecycle.ProcessCameraProvider
|
||||
import androidx.camera.view.PreviewView
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalLifecycleOwner
|
||||
import androidx.compose.ui.viewinterop.AndroidView
|
||||
import app.myzel394.alibi.ui.utils.getCameraProvider
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
@Composable
|
||||
fun CameraPreview(
|
||||
modifier: Modifier = Modifier,
|
||||
scaleType: PreviewView.ScaleType = PreviewView.ScaleType.FILL_CENTER,
|
||||
modifier: Modifier,
|
||||
cameraSelector: CameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
|
||||
) {
|
||||
val coroutineScope = rememberCoroutineScope()
|
||||
val lifecycleOwner = LocalLifecycleOwner.current
|
||||
|
||||
Box(modifier = modifier) {
|
||||
// Video preview
|
||||
AndroidView(
|
||||
modifier = modifier,
|
||||
factory = { context ->
|
||||
val previewView = PreviewView(context).apply {
|
||||
this.scaleType = scaleType
|
||||
layoutParams = ViewGroup.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.MATCH_PARENT
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
)
|
||||
}
|
||||
|
||||
// CameraX Preview UseCase
|
||||
val previewUseCase = Preview.Builder()
|
||||
.build()
|
||||
.also {
|
||||
it.setSurfaceProvider(previewView.surfaceProvider)
|
||||
}
|
||||
.also { it.setSurfaceProvider(previewView.surfaceProvider) }
|
||||
|
||||
coroutineScope.launch {
|
||||
val cameraProvider = ProcessCameraProvider.getInstance(context).get()
|
||||
val cameraProvider = context.getCameraProvider()
|
||||
try {
|
||||
// Must unbind the use-cases before rebinding them.
|
||||
cameraProvider.unbindAll()
|
||||
cameraProvider.bindToLifecycle(
|
||||
lifecycleOwner, cameraSelector, previewUseCase
|
||||
lifecycleOwner,
|
||||
cameraSelector,
|
||||
previewUseCase
|
||||
)
|
||||
} catch (ex: Exception) {
|
||||
Log.e("CameraPreview", "Use case binding failed", ex)
|
||||
}
|
||||
}
|
||||
|
||||
previewView
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
@ -33,6 +33,7 @@ import androidx.compose.ui.platform.LocalDensity
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
import app.myzel394.alibi.R
|
||||
import app.myzel394.alibi.ui.components.RecorderScreen.atoms.CameraPreview
|
||||
import app.myzel394.alibi.dataStore
|
||||
import app.myzel394.alibi.ui.components.RecorderScreen.atoms.SaveCurrentNowModal
|
||||
import app.myzel394.alibi.ui.components.RecorderScreen.atoms.TorchStatus
|
||||
@ -54,6 +55,11 @@ fun VideoRecordingStatus(
|
||||
|
||||
when (orientation) {
|
||||
Configuration.ORIENTATION_LANDSCAPE -> {
|
||||
Box {
|
||||
CameraPreview(
|
||||
modifier = Modifier,
|
||||
cameraSelector = videoRecorder.cameraSelector
|
||||
)
|
||||
Row(
|
||||
modifier = Modifier.fillMaxSize(),
|
||||
horizontalArrangement = Arrangement.SpaceEvenly,
|
||||
@ -88,8 +94,15 @@ fun VideoRecordingStatus(
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else -> {
|
||||
Box {
|
||||
CameraPreview(
|
||||
modifier = Modifier,
|
||||
cameraSelector = videoRecorder.cameraSelector
|
||||
)
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
@ -97,8 +110,6 @@ fun VideoRecordingStatus(
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
verticalArrangement = Arrangement.SpaceBetween,
|
||||
) {
|
||||
Box {}
|
||||
|
||||
Column(
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
verticalArrangement = Arrangement
|
||||
@ -120,6 +131,7 @@ fun VideoRecordingStatus(
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
16
app/src/main/java/app/myzel394/alibi/ui/utils/Context.kt
Normal file
16
app/src/main/java/app/myzel394/alibi/ui/utils/Context.kt
Normal file
@ -0,0 +1,16 @@
|
||||
package app.myzel394.alibi.ui.utils
|
||||
|
||||
import android.content.Context
|
||||
import androidx.camera.lifecycle.ProcessCameraProvider
|
||||
import androidx.core.content.ContextCompat
|
||||
import kotlin.coroutines.resume
|
||||
import kotlin.coroutines.suspendCoroutine
|
||||
|
||||
suspend fun Context.getCameraProvider(): ProcessCameraProvider = suspendCoroutine { continuation ->
|
||||
ProcessCameraProvider.getInstance(this).also { future ->
|
||||
future.addListener({
|
||||
continuation.resume(future.get())
|
||||
}, ContextCompat.getMainExecutor(this))
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user