1 package jp.osdn.gokigen.gokigenassets.camera.vendor.sony
3 import android.util.Log
4 import android.view.KeyEvent
5 import android.view.View
6 import androidx.appcompat.app.AppCompatActivity
7 import jp.osdn.gokigen.gokigenassets.camera.preference.ICameraPreferenceProvider
8 import jp.osdn.gokigen.gokigenassets.camera.interfaces.*
9 import jp.osdn.gokigen.gokigenassets.camera.vendor.ICameraControlCoordinator
10 import jp.osdn.gokigen.gokigenassets.constants.IApplicationConstantConvert
11 import jp.osdn.gokigen.gokigenassets.liveview.ICachePositionProvider
12 import jp.osdn.gokigen.gokigenassets.liveview.IIndicatorControl
13 import jp.osdn.gokigen.gokigenassets.liveview.ILiveView
14 import jp.osdn.gokigen.gokigenassets.liveview.ILiveViewRefresher
15 import jp.osdn.gokigen.gokigenassets.liveview.focusframe.IAutoFocusFrameDisplay
16 import jp.osdn.gokigen.gokigenassets.liveview.image.CameraLiveViewListenerImpl
17 import jp.osdn.gokigen.gokigenassets.liveview.storeimage.StoreImage
18 import jp.osdn.gokigen.gokigenassets.preference.PreferenceAccessWrapper
19 import jp.osdn.gokigen.gokigenassets.scene.IInformationReceiver
20 import jp.osdn.gokigen.gokigenassets.scene.IVibrator
21 import jp.osdn.gokigen.gokigenassets.camera.vendor.sony.liveview.SonyLiveViewControl
22 import jp.osdn.gokigen.gokigenassets.camera.vendor.sony.operation.SonyCameraCaptureControl
23 import jp.osdn.gokigen.gokigenassets.camera.vendor.sony.operation.SonyCameraFocusControl
24 import jp.osdn.gokigen.gokigenassets.camera.vendor.sony.operation.SonyCameraZoomLensControl
25 import jp.osdn.gokigen.gokigenassets.camera.vendor.sony.wrapper.ISonyCameraApi
26 import jp.osdn.gokigen.gokigenassets.camera.vendor.sony.wrapper.ISonyCameraHolder
27 import jp.osdn.gokigen.gokigenassets.camera.vendor.sony.wrapper.connection.SonyCameraConnection
28 import jp.osdn.gokigen.gokigenassets.camera.vendor.sony.wrapper.eventlistener.SonyCameraEventObserver
29 import jp.osdn.gokigen.gokigenassets.camera.vendor.sony.wrapper.ISonyCamera
30 import jp.osdn.gokigen.gokigenassets.camera.vendor.sony.wrapper.SonyCameraApi
31 import jp.osdn.gokigen.gokigenassets.camera.vendor.sony.wrapper.eventlistener.ISonyCameraEventObserver
32 import jp.osdn.gokigen.gokigenassets.camera.vendor.sony.wrapper.eventlistener.SonyStatus
33 import org.json.JSONObject
34 import kotlin.collections.ArrayList
37 class SonyCameraControl(private val context: AppCompatActivity, private val vibrator : IVibrator, private val informationNotify : IInformationReceiver, private val preference: ICameraPreferenceProvider, provider: ICameraStatusReceiver, private val cameraCoordinator: ICameraControlCoordinator, private val number : Int = 0) : ISonyCameraHolder,
38 IDisplayInjector, ICameraControl, View.OnClickListener, View.OnLongClickListener, ICameraShutter, IKeyDown
40 private val sonyCameraStatus = SonyStatus(JSONObject())
41 private val liveViewListener = CameraLiveViewListenerImpl(context, informationNotify)
42 private val cameraConnection = SonyCameraConnection(context, provider, this, cameraCoordinator, number)
43 private val storeImage = StoreImage(context, liveViewListener)
45 private lateinit var cachePositionProvider : ICachePositionProvider
46 private lateinit var sonyCamera: ISonyCamera
47 private lateinit var sonyCameraApi: ISonyCameraApi
48 private lateinit var eventObserver: ISonyCameraEventObserver
49 private lateinit var liveViewControl: SonyLiveViewControl
50 private lateinit var focusControl: SonyCameraFocusControl
51 private lateinit var captureControl: SonyCameraCaptureControl
53 private val zoomControl = SonyCameraZoomLensControl()
54 //private var isStatusWatch = false
55 private var cameraPositionId = 0
59 private val TAG = SonyCameraControl::class.java.simpleName
60 private const val CONNECT_DELAY_MS : Long = 350
63 override fun prepare()
65 if (::sonyCamera.isInitialized)
67 Log.v(TAG, " prepare : ${sonyCamera.getFriendlyName()} ${sonyCamera.getModelName()}")
70 sonyCameraApi = SonyCameraApi(sonyCamera)
71 eventObserver = SonyCameraEventObserver.newInstance(context, sonyCameraApi, sonyCameraStatus)
72 liveViewControl = SonyLiveViewControl(context, informationNotify, liveViewListener, sonyCameraApi)
73 zoomControl.setCameraApi(sonyCameraApi)
74 sonyCameraStatus.setCameraApi(sonyCameraApi)
75 if (::focusControl.isInitialized)
77 focusControl.setCameraApi(sonyCameraApi)
78 sonyCameraStatus.setFocusControl(focusControl)
80 if (::captureControl.isInitialized)
82 captureControl.setCameraApi(sonyCameraApi)
92 Log.w(TAG, " ISonyCamera is not initialized...")
96 override fun startRecMode()
100 val apiCommands: List<String> = getApiCommands()
101 val index = apiCommands.indexOf("startRecMode")
105 Log.v(TAG, "----- THIS CAMERA NEEDS COMMAND 'startRecMode'.")
106 sonyCameraApi.startRecMode()
109 catch (e: java.lang.Exception)
115 override fun startEventWatch()
120 if (::eventObserver.isInitialized)
122 eventObserver.setEventListener(sonyCameraStatus)
123 eventObserver.activate()
124 eventObserver.start()
128 val holder = eventObserver.getCameraStatusHolder()
129 if (holder?.getLiveviewStatus() == true)
135 Log.v(TAG, " --- WAIT FOR LIVEVIEW ENABLE ---")
148 if (::liveViewControl.isInitialized)
150 liveViewControl.startLiveView(false)
160 override fun detectedCamera(camera: ISonyCamera)
162 Log.v(TAG, "detectedCamera()")
166 override fun getConnectionMethod(): String
171 override fun initialize()
173 Log.v(TAG, " --- initialize()")
174 // TODO("Not yet implemented")
177 override fun connectToCamera()
179 Log.v(TAG, " connectToCamera() : SONY ")
182 while (cameraCoordinator.isOtherCameraConnecting(number))
186 Thread.sleep(CONNECT_DELAY_MS)
193 cameraCoordinator.startConnectToCamera(number)
194 cameraConnection.connect()
196 catch (e : Exception)
202 override fun startCamera(isPreviewView: Boolean, cameraSequence: Int)
206 if (cameraConnection.getConnectionStatus() != ICameraConnectionStatus.CameraConnectionStatus.CONNECTED)
208 cameraConnection.startWatchWifiStatus(context)
212 cameraConnection.connect()
215 catch (e : Exception)
221 override fun finishCamera()
225 if (::eventObserver.isInitialized)
229 if (::liveViewControl.isInitialized)
231 liveViewControl.stopLiveView()
233 cameraConnection.disconnect(false)
234 cameraConnection.stopWatchWifiStatus(context)
236 catch (e : Exception)
242 override fun changeCaptureMode(mode: String)
244 Log.v(TAG, " --- changeCaptureMode(mode: $mode)")
247 override fun needRotateImage(): Boolean
252 override fun setRefresher(id: Int, refresher: ILiveViewRefresher, imageView: ILiveView, cachePosition : ICachePositionProvider)
256 liveViewListener.setRefresher(refresher)
257 imageView.setImageProvider(liveViewListener)
258 cachePositionProvider = cachePosition
260 catch (e : Exception)
266 override fun captureButtonReceiver(id: Int): View.OnClickListener
268 cameraPositionId = id
272 override fun onLongClickReceiver(id: Int): View.OnLongClickListener
274 cameraPositionId = id
278 override fun keyDownReceiver(id: Int): IKeyDown
280 cameraPositionId = id
284 override fun getFocusingControl(id: Int): IFocusingControl
286 cameraPositionId = id
287 return (focusControl)
290 override fun getDisplayInjector(): IDisplayInjector
295 override fun injectDisplay(frameDisplayer: IAutoFocusFrameDisplay, indicator: IIndicatorControl, focusingModeNotify: IFocusingModeNotify)
297 Log.v(TAG, "injectDisplay()")
298 focusControl = SonyCameraFocusControl(frameDisplayer, indicator)
299 captureControl = SonyCameraCaptureControl(frameDisplayer, indicator)
302 override fun onClick(v: View?)
310 IApplicationConstantConvert.ID_BUTTON_SHUTTER -> { doShutter() }
315 override fun doShutter()
319 Log.v(TAG, " doShutter()")
320 val isNotDriveShutter = captureImageLiveView()
321 if (isNotDriveShutter)
323 // シャッターを駆動させない(けど、バイブレーションで通知する)
324 vibrator.vibrate(IVibrator.VibratePattern.SIMPLE_SHORT)
327 if (::captureControl.isInitialized)
329 captureControl.doCapture(0)
332 catch (e : Exception)
338 override fun doShutterOff()
342 Log.v(TAG, " doShutterOff()")
343 if (::captureControl.isInitialized)
345 captureControl.doCapture(0)
348 catch (e : Exception)
354 override fun handleKeyDown(keyCode: Int, event: KeyEvent): Boolean
356 if ((event.action == KeyEvent.ACTION_DOWN)&&((keyCode == KeyEvent.KEYCODE_VOLUME_UP)||(keyCode == KeyEvent.KEYCODE_CAMERA)))
364 private fun captureImageLiveView() : Boolean
368 // preferenceから設定を取得する
369 val captureBothCamera = PreferenceAccessWrapper(context).getBoolean(
370 IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW, IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW_DEFAULT_VALUE)
371 val notUseShutter = PreferenceAccessWrapper(context).getBoolean(
372 IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_ONLY_LIVEVIEW_IMAGE, IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_ONLY_LIVEVIEW_IMAGE_DEFAULT_VALUE)
373 if ((captureBothCamera)&&(liveViewListener.isImageReceived()))
375 // ライブビュー画像を保管する場合...
376 val thread = Thread { storeImage.doStore(cameraPositionId, false, cachePositionProvider.getCachePosition()) }
386 return (notUseShutter)
388 catch (e : Exception)
395 private fun getApiCommands(): List<String>
397 Log.v(TAG, " --- getApiCommands() ")
400 var apiList = sonyCameraApi.getAvailableApiList()?.getString("result")
401 apiList = apiList?.replace("[", "")?.replace("]", "")?.replace("\"", "")
402 val apiListSplit = apiList?.split(",".toRegex())?.toTypedArray()
403 return (apiListSplit?.toList() ?: ArrayList())
412 override fun onLongClick(v: View?): Boolean
417 override fun setNeighborCameraControl(index: Int, camera0: ICameraControl?, camera1: ICameraControl?, camera2: ICameraControl?, camera3: ICameraControl?) { }
418 override fun setNeighborCameraControlFinished() { }
420 override fun getCameraStatus(): ICameraStatus
422 return (sonyCameraStatus)
425 override fun getCameraNumber(): Int