OSDN Git Service

dec536dc29c3db0891e66e7da965cf225a057d6d
[gokigen/mangle.git] / app / src / main / java / jp / osdn / gokigen / gokigenassets / camera / vendor / sony / SonyCameraControl.kt
1 package jp.osdn.gokigen.gokigenassets.camera.vendor.sony
2
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
35
36
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
39 {
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)
44
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
52
53     private val zoomControl = SonyCameraZoomLensControl()
54     //private var isStatusWatch = false
55     private var cameraPositionId = 0
56
57     companion object
58     {
59         private val TAG = SonyCameraControl::class.java.simpleName
60         private const val CONNECT_DELAY_MS : Long = 350
61     }
62
63     override fun prepare()
64     {
65         if (::sonyCamera.isInitialized)
66         {
67             Log.v(TAG, " prepare : ${sonyCamera.getFriendlyName()} ${sonyCamera.getModelName()}")
68             try
69             {
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)
76                 {
77                     focusControl.setCameraApi(sonyCameraApi)
78                     sonyCameraStatus.setFocusControl(focusControl)
79                 }
80                 if (::captureControl.isInitialized)
81                 {
82                     captureControl.setCameraApi(sonyCameraApi)
83                 }
84             }
85             catch (e: Exception)
86             {
87                 e.printStackTrace()
88             }
89         }
90         else
91         {
92             Log.w(TAG, " ISonyCamera is not initialized...")
93         }
94     }
95
96     override fun startRecMode()
97     {
98         try
99         {
100             val apiCommands: List<String> = getApiCommands()
101             val index = apiCommands.indexOf("startRecMode")
102             if (index > 0)
103             {
104                 // startRecMode発行
105                 Log.v(TAG, "----- THIS CAMERA NEEDS COMMAND 'startRecMode'.")
106                 sonyCameraApi.startRecMode()
107             }
108         }
109         catch (e: java.lang.Exception)
110         {
111             e.printStackTrace()
112         }
113     }
114
115     override fun startEventWatch()
116     {
117         try
118         {
119             var retryCount = 2
120             if (::eventObserver.isInitialized)
121             {
122                 eventObserver.setEventListener(sonyCameraStatus)
123                 eventObserver.activate()
124                 eventObserver.start()
125             }
126             while (true)
127             {
128                 val holder = eventObserver.getCameraStatusHolder()
129                 if (holder?.getLiveviewStatus() == true)
130                 {
131                     break
132                 }
133                 try
134                 {
135                     Log.v(TAG, " --- WAIT FOR LIVEVIEW ENABLE ---")
136                     Thread.sleep(1500)
137                     retryCount--
138                     if (retryCount < 0)
139                     {
140                         break
141                     }
142                 }
143                 catch (e: Exception)
144                 {
145                     e.printStackTrace()
146                 }
147             }
148             if (::liveViewControl.isInitialized)
149             {
150                 liveViewControl.startLiveView(false)
151             }
152
153         }
154         catch (e: Exception)
155         {
156             e.printStackTrace()
157         }
158     }
159
160     override fun detectedCamera(camera: ISonyCamera)
161     {
162         Log.v(TAG, "detectedCamera()")
163         sonyCamera = camera
164     }
165
166     override fun getConnectionMethod(): String
167     {
168         return ("SONY")
169     }
170
171     override fun initialize()
172     {
173         Log.v(TAG, " --- initialize()")
174         // TODO("Not yet implemented")
175     }
176
177     override fun connectToCamera()
178     {
179         Log.v(TAG, " connectToCamera() : SONY ")
180         try
181         {
182             while (cameraCoordinator.isOtherCameraConnecting(number))
183             {
184                 try
185                 {
186                     Thread.sleep(CONNECT_DELAY_MS)
187                 }
188                 catch (e: Exception)
189                 {
190                     e.printStackTrace()
191                 }
192             }
193             cameraCoordinator.startConnectToCamera(number)
194             cameraConnection.connect()
195         }
196         catch (e : Exception)
197         {
198             e.printStackTrace()
199         }
200     }
201
202     override fun startCamera(isPreviewView: Boolean, cameraSequence: Int)
203     {
204         try
205         {
206             if (cameraConnection.getConnectionStatus() != ICameraConnectionStatus.CameraConnectionStatus.CONNECTED)
207             {
208                 cameraConnection.startWatchWifiStatus(context)
209             }
210             else
211             {
212                 cameraConnection.connect()
213             }
214         }
215         catch (e : Exception)
216         {
217             e.printStackTrace()
218         }
219     }
220
221     override fun finishCamera()
222     {
223         try
224         {
225             if (::eventObserver.isInitialized)
226             {
227                 eventObserver.stop()
228             }
229             if (::liveViewControl.isInitialized)
230             {
231                 liveViewControl.stopLiveView()
232             }
233             cameraConnection.disconnect(false)
234             cameraConnection.stopWatchWifiStatus(context)
235         }
236         catch (e : Exception)
237         {
238             e.printStackTrace()
239         }
240     }
241
242     override fun changeCaptureMode(mode: String)
243     {
244         Log.v(TAG, " --- changeCaptureMode(mode: $mode)")
245     }
246
247     override fun needRotateImage(): Boolean
248     {
249         return (false)
250     }
251
252     override fun setRefresher(id: Int, refresher: ILiveViewRefresher, imageView: ILiveView, cachePosition : ICachePositionProvider)
253     {
254         try
255         {
256             liveViewListener.setRefresher(refresher)
257             imageView.setImageProvider(liveViewListener)
258             cachePositionProvider = cachePosition
259         }
260         catch (e : Exception)
261         {
262             e.printStackTrace()
263         }
264     }
265
266     override fun captureButtonReceiver(id: Int): View.OnClickListener
267     {
268         cameraPositionId = id
269         return (this)
270     }
271
272     override fun onLongClickReceiver(id: Int): View.OnLongClickListener
273     {
274         cameraPositionId = id
275         return (this)
276     }
277
278     override fun keyDownReceiver(id: Int): IKeyDown
279     {
280         cameraPositionId = id
281         return (this)
282     }
283
284     override fun getFocusingControl(id: Int): IFocusingControl
285     {
286         cameraPositionId = id
287         return (focusControl)
288     }
289
290     override fun getDisplayInjector(): IDisplayInjector
291     {
292         return (this)
293     }
294
295     override fun injectDisplay(frameDisplayer: IAutoFocusFrameDisplay, indicator: IIndicatorControl, focusingModeNotify: IFocusingModeNotify)
296     {
297         Log.v(TAG, "injectDisplay()")
298         focusControl = SonyCameraFocusControl(frameDisplayer, indicator)
299         captureControl = SonyCameraCaptureControl(frameDisplayer, indicator)
300     }
301
302     override fun onClick(v: View?)
303     {
304         if (v == null)
305         {
306             return
307         }
308         when (v.id)
309         {
310             IApplicationConstantConvert.ID_BUTTON_SHUTTER -> { doShutter() }
311             else -> { }
312         }
313     }
314
315     override fun doShutter()
316     {
317         try
318         {
319             Log.v(TAG, " doShutter()")
320             val isNotDriveShutter = captureImageLiveView()
321             if (isNotDriveShutter)
322             {
323                 //  シャッターを駆動させない(けど、バイブレーションで通知する)
324                 vibrator.vibrate(IVibrator.VibratePattern.SIMPLE_SHORT)
325                 return
326             }
327             if (::captureControl.isInitialized)
328             {
329                 captureControl.doCapture(0)
330             }
331         }
332         catch (e : Exception)
333         {
334             e.printStackTrace()
335         }
336     }
337
338     override fun doShutterOff()
339     {
340         try
341         {
342             Log.v(TAG, " doShutterOff()")
343             if (::captureControl.isInitialized)
344             {
345                 captureControl.doCapture(0)
346             }
347         }
348         catch (e : Exception)
349         {
350             e.printStackTrace()
351         }
352     }
353
354     override fun handleKeyDown(keyCode: Int, event: KeyEvent): Boolean
355     {
356         if ((event.action == KeyEvent.ACTION_DOWN)&&((keyCode == KeyEvent.KEYCODE_VOLUME_UP)||(keyCode == KeyEvent.KEYCODE_CAMERA)))
357         {
358             doShutter()
359             return (true)
360         }
361         return (false)
362     }
363
364     private fun captureImageLiveView() : Boolean
365     {
366         try
367         {
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()))
374             {
375                 // ライブビュー画像を保管する場合...
376                 val thread = Thread { storeImage.doStore(cameraPositionId, false, cachePositionProvider.getCachePosition()) }
377                 try
378                 {
379                     thread.start()
380                 }
381                 catch (e: Exception)
382                 {
383                     e.printStackTrace()
384                 }
385             }
386             return (notUseShutter)
387         }
388         catch (e : Exception)
389         {
390             e.printStackTrace()
391         }
392         return (false)
393     }
394
395     private fun getApiCommands(): List<String>
396     {
397         Log.v(TAG, " --- getApiCommands() ")
398         try
399         {
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())
404         }
405         catch (e: Exception)
406         {
407             e.printStackTrace()
408         }
409         return (ArrayList())
410     }
411
412     override fun onLongClick(v: View?): Boolean
413     {
414         return (false)
415     }
416
417     override fun setNeighborCameraControl(index: Int, camera0: ICameraControl?, camera1: ICameraControl?, camera2: ICameraControl?, camera3: ICameraControl?) { }
418     override fun setNeighborCameraControlFinished() { }
419
420     override fun getCameraStatus(): ICameraStatus
421     {
422         return (sonyCameraStatus)
423     }
424
425     override fun getCameraNumber(): Int
426     {
427         return (number)
428     }
429 }