Skip to content

Commit

Permalink
Remove remaining Handler parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
LouisCAD committed Aug 7, 2018
1 parent a118d64 commit c6a9df3
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,12 @@ import android.media.MediaRecorder
import android.util.Size
import com.beepiz.cameracoroutines.CamDevice
import com.beepiz.cameracoroutines.createAndUseSession
import com.beepiz.cameracoroutines.extensions.HandlerElement
import com.beepiz.cameracoroutines.openAndUseCamera
import com.beepiz.cameracoroutines.sample.extensions.CamCharacteristics.LensFacing
import com.beepiz.cameracoroutines.sample.extensions.outputSizes
import com.beepiz.cameracoroutines.sample.recording.VideoRecorder
import kotlinx.coroutines.experimental.CommonPool
import kotlinx.coroutines.experimental.async
import splitties.exceptions.illegal
import splitties.systemservices.cameraManager
import splitties.uithread.isUiThread
import kotlin.coroutines.experimental.coroutineContext
Expand All @@ -35,8 +33,6 @@ private suspend fun recordVideo(
) {
//TODO("Try coroutines experimental dispatcher")
//TODO("Try main thread async dispatcher for default UI thread usage")
val handler = coroutineContext[HandlerElement]?.handler
?: illegal("Required HandlerElement not found in the coroutineContext")
val camManager = cameraManager
val camId: String = camManager.cameraIdList.firstOrNull {
val characteristics = camManager.getCameraCharacteristics(it)
Expand All @@ -51,10 +47,10 @@ private suspend fun recordVideo(
setupForVideoRecording(videoSize, sensorOrientation, outputPath)
}
}
cameraManager.openAndUseCamera(camId, handler) { camera ->
cameraManager.openAndUseCamera(camId) { camera ->
recorderAsync.await().use { recorder ->
val surfaces = listOf(recorder.surface)
camera.createAndUseSession(surfaces, handler) { session ->
camera.createAndUseSession(surfaces) { session ->
session.awaitConfiguredState()
val captureRequest = session.createCaptureRequest(CamDevice.Template.RECORD) {
surfaces.forEach(it::addTarget)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,19 @@ package com.beepiz.cameracoroutines

import android.hardware.camera2.CameraCaptureSession
import android.hardware.camera2.CameraDevice
import android.os.Handler
import android.view.Surface
import com.beepiz.cameracoroutines.extensions.requireHandler
import kotlin.coroutines.experimental.coroutineContext

internal typealias CCS = CameraCaptureSession

suspend fun CameraDevice.createAndUseSession(
outputs: List<Surface>,
handler: Handler? = null,
block: suspend (CamCaptureSession) -> Unit
) = CamCaptureSession(this, handler).use {
createCaptureSession(outputs, it.sessionStateCallback, handler)
block(it)
) {
val handler = coroutineContext.requireHandler()
CamCaptureSession(this, handler).use {
createCaptureSession(outputs, it.sessionStateCallback, handler)
block(it)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,23 @@ package com.beepiz.cameracoroutines
import android.Manifest
import android.hardware.camera2.CameraDevice
import android.hardware.camera2.CameraManager
import android.os.Handler
import android.support.annotation.RequiresPermission
import com.beepiz.cameracoroutines.exceptions.CamStateException
import com.beepiz.cameracoroutines.extensions.requireHandler
import kotlinx.coroutines.experimental.CompletableDeferred
import kotlinx.coroutines.experimental.CoroutineStart
import kotlinx.coroutines.experimental.Deferred
import kotlinx.coroutines.experimental.android.HandlerContext
import kotlinx.coroutines.experimental.async
import kotlin.coroutines.experimental.coroutineContext

@RequiresPermission(Manifest.permission.CAMERA)
suspend fun <R> CameraManager.openAndUseCamera(
cameraId: String,
handler: Handler? = null,
block: suspend (CameraDevice) -> R
): R {
val context = if (handler == null) coroutineContext else coroutineContext + HandlerContext(handler).immediate
val context = coroutineContext
val openedCamera = CompletableDeferred<CameraDevice>()
val completion: Deferred<R> = async(context) {
val completion: Deferred<R> = async(context, start = CoroutineStart.LAZY) {
openedCamera.await().use { camera ->
block(camera)
}
Expand All @@ -45,7 +44,7 @@ suspend fun <R> CameraManager.openAndUseCamera(
closed.complete(Unit)
}
}
openCamera(cameraId, stateCallback, handler)
openCamera(cameraId, stateCallback, context.requireHandler())
return try {
completion.await()
} finally {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.beepiz.cameracoroutines.extensions
import android.os.Handler
import android.os.HandlerThread
import android.os.Looper
import splitties.exceptions.illegal
import kotlin.coroutines.experimental.AbstractCoroutineContextElement
import kotlin.coroutines.experimental.CoroutineContext

Expand All @@ -13,3 +14,6 @@ class HandlerElement(val handler: Handler) : AbstractCoroutineContextElement(Key
inline operator fun invoke(thread: HandlerThread) = HandlerElement(Handler(thread.looper))
}
}

fun CoroutineContext.requireHandler(): Handler = this[HandlerElement]?.handler
?: illegal("Required HandlerElement not found in the coroutineContext")

0 comments on commit c6a9df3

Please sign in to comment.