``` 1fun start() : Observable { Observable ...
# rx
u
Copy code
1fun start() : Observable {
	Observable
                .fromCallable {                   cameraId               }
                .flatMap { openCameraObservable(cameraManager, it) }
                .filter { it is CameraOpenEvent.Opened }
                .flatMap { createCaptureSessionObservable(it.cameraDevice, surfaceTexture) }
                .filter { it is CaptureSessionEvent.Configured }
}

fun stop() {
//        session?.close()
//        session = null
//
//        camera?.close()
//        camera = null
    }


private fun openCameraObservable(cameraManager: CameraManager, cameraId: String): Observable<CameraOpenEvent> {
        return Observable.create { emitter ->
            try {
                var _camera: CameraDevice? = null
                cameraManager.openCamera(cameraId, object : CameraDevice.StateCallback() {
                    override fun onOpened(camera: CameraDevice) {
                        _camera = camera
                        if (!emitter.isDisposed) emitter.onNext(CameraOpenEvent.Opened(camera))
                    }

                    override fun onClosed(camera: CameraDevice) {
                        _camera = camera
                        if (!emitter.isDisposed) {
                            emitter.onNext(CameraOpenEvent.Closed(camera))
                            emitter.onComplete()
                        }
                    }

                    override fun onDisconnected(camera: CameraDevice) {
                        _camera = camera
                        if (!emitter.isDisposed) {
                            emitter.onNext(CameraOpenEvent.Disconnected(camera))
                            emitter.onComplete()
                        }
                    }

                    override fun onError(camera: CameraDevice, error: Int) {
                        _camera = camera
                        if (!emitter.isDisposed) {
                            emitter.onError(IllegalStateException("Camera opening failed. Error code $error"))
                        }
                    }
                }, null)

                emitter.setCancellable { _camera?.close() }

            } catch (ex: CameraAccessException) {
                if (!emitter.isDisposed) emitter.onError(ex)
            }
        }
    }