1 package jp.osdn.gokigen.gokigenassets.camera.vendor.camerax.operation
3 import android.annotation.SuppressLint
4 import android.graphics.PointF
5 import android.graphics.RectF
6 import android.util.Log
7 import android.view.MotionEvent
8 import androidx.camera.camera2.interop.Camera2CameraControl
9 import androidx.camera.camera2.interop.Camera2CameraInfo
10 import androidx.camera.core.ExposureState
11 import androidx.camera.core.FocusMeteringAction
12 import androidx.camera.core.SurfaceOrientedMeteringPointFactory
13 import jp.osdn.gokigen.gokigenassets.camera.interfaces.IDisplayInjector
14 import jp.osdn.gokigen.gokigenassets.camera.interfaces.IFocusingControl
15 import jp.osdn.gokigen.gokigenassets.camera.interfaces.IFocusingModeNotify
16 import jp.osdn.gokigen.gokigenassets.liveview.IIndicatorControl
17 import jp.osdn.gokigen.gokigenassets.liveview.focusframe.IAutoFocusFrameDisplay
19 class CameraXCameraControl : IFocusingControl, IDisplayInjector
21 private var isCameraControlPrepared: Boolean = false
22 private var isFrameDisplayPrepared: Boolean = false
23 private lateinit var cameraXCameraControl: androidx.camera.core.CameraControl
24 private lateinit var cameraXCameraInfo: androidx.camera.core.CameraInfo
25 private lateinit var frameDisplay: IAutoFocusFrameDisplay
26 private lateinit var indicatorControl: IIndicatorControl
27 private lateinit var focusModeNotify: IFocusingModeNotify
31 private val TAG = CameraXCameraControl::class.java.simpleName
34 fun setCameraControl(camera: androidx.camera.core.Camera)
36 cameraXCameraControl = camera.cameraControl
37 cameraXCameraInfo = camera.cameraInfo
38 isCameraControlPrepared = true
42 override fun injectDisplay(frameDisplayer: IAutoFocusFrameDisplay, indicator: IIndicatorControl, focusingModeNotify: IFocusingModeNotify)
44 Log.v(TAG, " injectDisplay()")
45 frameDisplay = frameDisplayer
46 indicatorControl = indicator
47 focusModeNotify = focusingModeNotify
48 isFrameDisplayPrepared = true
52 override fun driveAutoFocus(motionEvent: MotionEvent?): Boolean
54 //Log.v(TAG, "driveAutoFocus()")
55 if ((!isCameraControlPrepared) || (!isFrameDisplayPrepared) || (motionEvent == null) || (motionEvent.action != MotionEvent.ACTION_DOWN))
61 val point: PointF? = frameDisplay.getPointWithEvent(motionEvent)
62 if ((point != null) && (frameDisplay.isContainsPoint(point)))
75 override fun unlockAutoFocus()
77 if (!isCameraControlPrepared)
79 cameraXCameraControl.cancelFocusAndMetering()
84 override fun halfPressShutter(isPressed: Boolean)
89 if ((isCameraControlPrepared) && (isFrameDisplayPrepared)) {
93 SurfaceOrientedMeteringPointFactory(1.0f, 1.0f).createPoint(.5f, .5f)
95 FocusMeteringAction.Builder(autoFocusPoint, FocusMeteringAction.FLAG_AF)
96 //.addPoint(autoFocusPoint, FocusMeteringAction.FLAG_AE)
97 .apply { disableAutoCancel() }.build()
98 cameraXCameraControl.startFocusAndMetering(action)
100 cameraXCameraControl.cancelFocusAndMetering()
102 } catch (e: Exception) {
109 catch (e : Exception)
115 private fun lockAutoFocus(point : PointF)
119 Log.v(TAG, "lockAutoFocus() : [$point]")
120 val thread = Thread {
123 //val autoFocusPoint = SurfaceOrientedMeteringPointFactory(1.0f, 1.0f).createPoint(point.x, point.y)
124 val autoFocusPoint = SurfaceOrientedMeteringPointFactory(1.0f, 1.0f).createPoint(point.y, point.x)
125 val action = FocusMeteringAction.Builder(autoFocusPoint, FocusMeteringAction.FLAG_AF)
126 //FocusMeteringAction.Builder(autoFocusPoint)
127 // .addPoint(autoFocusPoint, FocusMeteringAction.FLAG_AE)
128 .apply { disableAutoCancel() }.build()
129 cameraXCameraControl.startFocusAndMetering(action)
132 getPreFocusFrameRect(point),
133 IAutoFocusFrameDisplay.FocusFrameStatus.Running,
137 catch (e : Exception)
144 catch (e : Exception)
150 private fun getPreFocusFrameRect(point: PointF): RectF
152 val focusWidth = 0.075f // 0.075 is rough estimate.
153 val focusHeight = 0.075f
154 return RectF(point.x - focusWidth / 2.0f, point.y - focusHeight / 2.0f, point.x + focusWidth / 2.0f, point.y + focusHeight / 2.0f)
157 private fun showFocusFrame(rect: RectF, status: IAutoFocusFrameDisplay.FocusFrameStatus, duration: Float)
159 frameDisplay.showFocusFrame(rect, status, duration)
160 indicatorControl.onAfLockUpdate(IAutoFocusFrameDisplay.FocusFrameStatus.Focused === status)
163 fun getExposureState() : ExposureState?
167 if (::cameraXCameraInfo.isInitialized)
169 return (cameraXCameraInfo.exposureState)
172 catch (e : Exception)
179 fun setExposureCompensation(indexValue : Int)
183 if (::cameraXCameraControl.isInitialized)
185 cameraXCameraControl.setExposureCompensationIndex(indexValue)
188 catch (e : Exception)
196 @SuppressLint("UnsafeOptInUsageError")
197 fun getCamera2CameraInfo() : Camera2CameraInfo?
201 if (::cameraXCameraInfo.isInitialized)
203 return (Camera2CameraInfo.from(cameraXCameraInfo))
206 catch (e : Exception)
214 @SuppressLint("UnsafeOptInUsageError")
215 fun getCamera2CameraControl() : Camera2CameraControl?
219 if (::cameraXCameraControl.isInitialized)
221 return (Camera2CameraControl.from(cameraXCameraControl))
224 catch (e : Exception)