OSDN Git Service

3797937643b18d194351637cfb1a5f9138445976
[gokigen/A01c.git] / wear / src / main / java / jp / sfjp / gokigen / a01c / olycamerawrapper / OlyCameraCoordinator.java
1 package jp.sfjp.gokigen.a01c.olycamerawrapper;
2
3 import android.app.Activity;
4 import android.graphics.PointF;
5 import android.graphics.RectF;
6 import android.util.Log;
7 import android.view.MotionEvent;
8 import android.widget.Toast;
9
10 import androidx.annotation.NonNull;
11 import androidx.annotation.Nullable;
12 import androidx.appcompat.app.AppCompatActivity;
13 import androidx.preference.PreferenceDataStore;
14 import androidx.preference.PreferenceManager;
15
16 import jp.co.olympus.camerakit.OLYCamera;
17
18 import jp.sfjp.gokigen.a01c.ICameraConnection;
19 import jp.sfjp.gokigen.a01c.ICameraController;
20 import jp.sfjp.gokigen.a01c.ICameraFeatureDispatcher;
21 import jp.sfjp.gokigen.a01c.ICameraStatusWatcher;
22 import jp.sfjp.gokigen.a01c.IShowInformation;
23 import jp.sfjp.gokigen.a01c.R;
24 import jp.sfjp.gokigen.a01c.liveview.CameraLiveViewListenerImpl;
25 import jp.sfjp.gokigen.a01c.liveview.IAutoFocusFrameDisplay;
26 import jp.sfjp.gokigen.a01c.liveview.ICameraStatusReceiver;
27 import jp.sfjp.gokigen.a01c.liveview.ILiveImageStatusNotify;
28 import jp.sfjp.gokigen.a01c.olycamerawrapper.dispatcher.FeatureDispatcher;
29 import jp.sfjp.gokigen.a01c.olycamerawrapper.indicator.CameraStatusDisplay;
30 import jp.sfjp.gokigen.a01c.olycamerawrapper.indicator.ICameraStatusDisplay;
31 import jp.sfjp.gokigen.a01c.olycamerawrapper.listeners.CameraPropertyListenerImpl;
32 import jp.sfjp.gokigen.a01c.olycamerawrapper.listeners.CameraRecordingListenerImpl;
33 import jp.sfjp.gokigen.a01c.olycamerawrapper.listeners.CameraStatusListenerImpl;
34 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.ICameraPropertyLoadSaveOperations;
35 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.ILoadSaveCameraProperties;
36 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.IOlyCameraProperty;
37 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.IOlyCameraPropertyProvider;
38 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.LoadSaveCameraProperties;
39 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.OlyCameraPropertyProxy;
40 import jp.sfjp.gokigen.a01c.olycamerawrapper.takepicture.AutoFocusControl;
41 import jp.sfjp.gokigen.a01c.olycamerawrapper.takepicture.BracketingShotControl;
42 import jp.sfjp.gokigen.a01c.olycamerawrapper.takepicture.MovieRecordingControl;
43 import jp.sfjp.gokigen.a01c.olycamerawrapper.takepicture.SingleShotControl;
44 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.CameraPropertyLoadSaveOperations;
45 import jp.sfjp.gokigen.a01c.preference.IPreferenceCameraPropertyAccessor;
46
47 /**
48  *   OlyCameraCoordinator : Olympus Air との接続、切断の間をとりもつクラス。
49  *                         (OLYCameraクラスの実体を保持する)
50  *
51  *    1. クラスを作成する
52  *    2. connectWifi() でカメラと接続する
53  *    3. disconnect() でカメラと切断する
54  *
55  *    X. onDisconnectedByError() でカメラの通信状態が変更されたことを受信する
56  *    o. CameraInteractionCoordinator.ICameraCallback でカメラとの接続状態を通知する
57  *
58  */
59 public class OlyCameraCoordinator implements ICameraController, IIndicatorControl, ICameraRunMode, IOLYCameraObjectProvider
60 {
61     private final String TAG = toString();
62     private final IAutoFocusFrameDisplay focusFrameDisplay;
63     private final OLYCamera camera;
64     private final Activity context;
65
66     // 本クラスの配下のカメラ制御クラス群
67     private final AutoFocusControl autoFocus;
68     private final SingleShotControl singleShot;
69     private final MovieRecordingControl movieControl;
70     private final BracketingShotControl bracketingShot;
71     private final OlyCameraPropertyProxy propertyProxy;
72     private final CameraPropertyLoadSaveOperations loadSaveOperations;
73     private final LoadSaveCameraProperties loadSaveCameraProperties;
74     private final OlyCameraConnection cameraConnection;
75     private final ICameraStatusDisplay cameraStatusDisplay;
76     private final LevelMeterHolder levelMeter;
77     private final ZoomLensHolder zoomLensHolder;
78
79     private boolean isManualFocus = false;
80     private boolean isAutoFocusLocked = false;
81     //private boolean isExposureLocked = false;
82
83     private FeatureDispatcher featureDispatcher = null;
84
85
86     /**
87      * コンストラクタ
88      */
89     public OlyCameraCoordinator(Activity context, IAutoFocusFrameDisplay focusFrameDisplay, IShowInformation showInformation, ICameraStatusReceiver receiver)
90     {
91         this.context = context;
92         this.focusFrameDisplay = focusFrameDisplay;
93
94         // OLYMPUS CAMERA クラスの初期化、リスナの設定
95         camera = new OLYCamera();
96         camera.setContext(context.getApplicationContext());
97
98         this.cameraConnection = new OlyCameraConnection(context, camera, receiver);
99         camera.setConnectionListener(cameraConnection);
100
101         // 本クラスの配下のカメラ制御クラス群の設定
102         autoFocus = new AutoFocusControl(camera, focusFrameDisplay, this); // AF制御
103         singleShot = new SingleShotControl(camera, focusFrameDisplay, this, showInformation);  // 1枚撮影
104         movieControl = new MovieRecordingControl(context, camera, showInformation); // ムービー撮影
105         bracketingShot = new BracketingShotControl(camera, focusFrameDisplay, this, showInformation);  // ブラケッティング&インターバル撮影
106         propertyProxy = new OlyCameraPropertyProxy(camera); // カメラプロパティ
107         cameraStatusDisplay = new CameraStatusDisplay(propertyProxy, showInformation);  // 画面表示
108         this.levelMeter = new LevelMeterHolder(showInformation, PreferenceManager.getDefaultSharedPreferences(context).getBoolean(IPreferenceCameraPropertyAccessor.SHOW_LEVEL_GAUGE_STATUS, false));  // デジタル水準器
109         camera.setCameraStatusListener(new CameraStatusListenerImpl(context, cameraStatusDisplay, levelMeter));
110         camera.setCameraPropertyListener(new CameraPropertyListenerImpl(cameraStatusDisplay));
111         camera.setRecordingListener(new CameraRecordingListenerImpl(context, showInformation));
112         loadSaveCameraProperties = new LoadSaveCameraProperties(context, propertyProxy, this);
113         loadSaveOperations = new CameraPropertyLoadSaveOperations(context, loadSaveCameraProperties, cameraStatusDisplay);
114         zoomLensHolder = new ZoomLensHolder(camera);
115     }
116
117     @Override
118     public void connectFinished()
119     {
120         // 何もしない
121     }
122
123     @Override
124     public void setLiveViewListener(@NonNull CameraLiveViewListenerImpl listener)
125     {
126         Log.v(TAG, "setLiveViewListener()");
127         try
128         {
129             camera.setLiveViewListener(listener);
130         }
131         catch (Exception e)
132         {
133             e.printStackTrace();
134         }
135     }
136
137     /**
138      *   ライブビューの解像度を設定する
139      *
140      */
141     @Override
142     public void changeLiveViewSize(String size)
143     {
144         Log.v(TAG, "changeLiveViewSize() : " + size);
145         try
146         {
147             camera.changeLiveViewSize(CameraPropertyUtilities.toLiveViewSizeType(size));
148         }
149         catch (Exception e)
150         {
151             e.printStackTrace();
152         }
153     }
154
155     /**
156      *   ライブビューの開始
157      *
158      */
159     @Override
160     public void startLiveView()
161     {
162         Log.v(TAG, "startLiveView()");
163         try
164         {
165             camera.startLiveView();
166         }
167         catch (Exception e)
168         {
169             e.printStackTrace();
170         }
171     }
172
173     /**
174      *   ライブビューの終了
175      *
176      */
177     @Override
178     public void stopLiveView()
179     {
180         Log.v(TAG, "stopLiveView()");
181         try
182         {
183             camera.stopLiveView();
184         }
185         catch (Exception e)
186         {
187             e.printStackTrace();
188         }
189     }
190
191     /**
192      *   撮影モードの更新
193      *
194      */
195     @Override
196     public void updateTakeMode()
197     {
198         cameraStatusDisplay.updateTakeMode();
199     }
200
201     /**
202      *   フォーカスロックの実行
203      */
204     public boolean driveAutoFocus(MotionEvent event)
205     {
206         if (event.getAction() != MotionEvent.ACTION_DOWN)
207         {
208             return (false);
209         }
210         PointF point = focusFrameDisplay.getPointWithEvent(event);
211         return ((focusFrameDisplay.isContainsPoint(point)) && autoFocus.lockAutoFocus(point));
212     }
213
214     /**
215      *   オートフォーカスのポイントに含まれているか確認する (trueだったら含まれる)
216      *
217      */
218     @Override
219     public boolean isContainsAutoFocusPoint(MotionEvent event)
220     {
221         //// 以下の機能は、タッチイベントの受信時のみ動作させる
222         //if (event.getAction() != MotionEvent.ACTION_DOWN)
223         //{
224         //    return (false);
225         //}
226         try
227         {
228             // タッチした位置を取得する
229             PointF point = focusFrameDisplay.getPointWithEvent(event);
230
231             // AFの有効座標を取得する
232             RectF rect = camera.getAutoFocusEffectiveArea();
233             //Log.v(TAG, "AF POINT (" + point.x + "," + point.y + ")");
234             //Log.v(TAG, "AF EFFECTIVE AREA (" + rect.left + "," + rect.left + ") - (" + rect.right + "," + rect.bottom + ")");
235             return (rect.contains(point.x, point.y));
236         }
237         catch (Exception e)
238         {
239             e.printStackTrace();
240         }
241         return (false);
242     }
243
244     /**
245      *   フォーカスロックの解除
246      */
247     public void unlockAutoFocus()
248     {
249         autoFocus.unlockAutoFocus();
250         focusFrameDisplay.hideFocusFrame();
251         isAutoFocusLocked = false;
252     }
253
254     /**
255      *   画像を1枚撮影
256      */
257     @Override
258     public void singleShot()
259     {
260         singleShot.singleShot();
261         {
262             // 撮影の表示をToastで行う (成功とか失敗とか言っていない)
263             Toast.makeText(context, R.string.shoot_camera, Toast.LENGTH_SHORT).show();
264         }
265     }
266
267     /**
268      *   ムービーの撮影・停止
269      */
270     @Override
271     public void movieControl()
272     {
273         movieControl.movieControl();
274     }
275
276     /**
277      *   インターバル&ブラケッティング撮影の実行
278      *
279      *     @param bracketingStyle : ブラケッティングスタイル
280      *     @param bracketingCount : 撮影枚数
281      *     @param durationSeconds : 撮影間隔(単位:秒)
282      *
283      */
284     @Override
285     public void bracketingShot(int bracketingStyle, int bracketingCount, int durationSeconds)
286     {
287         bracketingShot.bracketingShot(bracketingStyle, bracketingCount, durationSeconds);
288     }
289
290     /**
291      *   撮影確認画像を生成するか設定する
292      *
293      */
294     @Override
295     public void setRecViewMode(boolean isRecViewMode)
296     {
297         try
298         {
299             String value = "<" + IOlyCameraProperty.REC_PREVIEW + "/";
300             if (isRecViewMode)
301             {
302                 value = value + "ON>";
303             }
304             else
305             {
306                 value = value + "OFF>";
307             }
308             propertyProxy.setCameraPropertyValue(IOlyCameraProperty.REC_PREVIEW, value);
309         }
310         catch (Exception e)
311         {
312             e.printStackTrace();
313         }
314     }
315
316
317     @Override
318     public void toggleAutoExposure()
319     {
320         try
321         {
322             if (isAELock())
323             {
324                 Log.v(TAG, "toggleAutoExposure() : unlockAutoExposure()");
325                 camera.unlockAutoExposure();
326             }
327             else
328             {
329                 Log.v(TAG, "toggleAutoExposure() : lockAutoExposure()");
330                 camera.lockAutoExposure();
331             }
332             updateIndicatorScreen(false);
333         }
334         catch (Exception e)
335         {
336             e.printStackTrace();
337         }
338         cameraStatusDisplay.updateAeLockState();
339     }
340
341     /**
342      *   AF/MF の切り替えを行う
343      *
344      */
345     @Override
346     public void toggleManualFocus()
347     {
348         try
349         {
350             boolean isHideFocusFrame = false;
351             String property_name = IOlyCameraProperty.FOCUS_STILL;
352             String poverty_value = "<" + IOlyCameraProperty.FOCUS_STILL + "/";
353
354             // マニュアルフォーカス切替え
355             if (!isManualFocus)
356             {
357                 // AF -> MF  : オートフォーカスを解除して設定する
358                 Log.v(TAG, "toggleManualFocus() : to " + IOlyCameraProperty.FOCUS_MF);
359                 poverty_value = poverty_value + IOlyCameraProperty.FOCUS_MF + ">";
360                 camera.unlockAutoFocus();
361                 camera.setCameraPropertyValue(property_name, poverty_value);
362                 isHideFocusFrame = true;
363             }
364             else
365             {
366                 // MF -> AF
367                 Log.v(TAG, "toggleManualFocus() : to " + IOlyCameraProperty.FOCUS_SAF);
368                 poverty_value = poverty_value + IOlyCameraProperty.FOCUS_SAF + ">";
369                 camera.setCameraPropertyValue(property_name, poverty_value);
370             }
371             updateIndicatorScreen(isHideFocusFrame);
372         }
373         catch (Exception e)
374         {
375             e.printStackTrace();
376         }
377     }
378
379     private void updateIndicatorScreen(boolean isHideFocusFrame)
380     {
381         isManualFocus();
382         if (isHideFocusFrame)
383         {
384             isAutoFocusLocked = false;
385             focusFrameDisplay.hideFocusFrame();
386         }
387         cameraStatusDisplay.updateCameraStatus();
388     }
389
390     @Override
391     public boolean isManualFocus()
392     {
393         isManualFocus = propertyProxy.isManualFocus();
394         return (isManualFocus);
395     }
396
397     @Override
398     public boolean isAFLock()
399     {
400         return (isAutoFocusLocked);
401     }
402
403     @Override
404     public boolean isAELock()
405     {
406         return (propertyProxy.isExposureLocked());
407     }
408
409 /*
410     @Override
411     public void setCameraStatusListener(OLYCameraStatusListener listener)
412     {
413         camera.setCameraStatusListener(listener);
414     }
415
416     @Override
417     public String getCameraStatusSummary(ICameraStatusSummary decoder)
418     {
419         return (decoder.getCameraStatusMessage(camera, ""));
420     }
421 */
422
423     /**
424      *   ステータス表示をすべて更新する
425      *
426      */
427     @Override
428     public void updateStatusAll()
429     {
430         cameraStatusDisplay.updateCameraStatusAll();
431     }
432
433     @Nullable
434     @Override
435     public ICameraStatusWatcher getStatusWatcher()
436     {
437         return (null);
438     }
439
440     @Override
441     public void changeRunMode(boolean isRecording)
442     {
443         OLYCamera.RunMode runMode = (isRecording) ? OLYCamera.RunMode.Recording : OLYCamera.RunMode.Playback;
444         Log.v(TAG, "changeRunMode() : " + runMode);
445         try
446         {
447             camera.changeRunMode(runMode);
448         }
449         catch (Exception e)
450         {
451             e.printStackTrace();
452         }
453     }
454
455     @Override
456     public boolean isRecordingMode()
457     {
458         boolean isRecordingMode = false;
459         try
460         {
461             OLYCamera.RunMode runMode = camera.getRunMode();
462             isRecordingMode =  (runMode == OLYCamera.RunMode.Recording);
463         }
464         catch (Exception e)
465         {
466             e.printStackTrace();
467         }
468
469         return (isRecordingMode);
470     }
471
472     @Override
473     public IOlyCameraPropertyProvider getCameraPropertyProvider()
474     {
475         return (propertyProxy);
476     }
477
478     @Override
479     public ICameraPropertyLoadSaveOperations getCameraPropertyLoadSaveOperations()
480     {
481         return (loadSaveOperations);
482     }
483
484     @Override
485     public ILoadSaveCameraProperties getLoadSaveCameraProperties()
486     {
487         return (loadSaveCameraProperties);
488     }
489
490     @Override
491     public ICameraRunMode getChangeRunModeExecutor()
492     {
493         return (this);
494     }
495
496     @Override
497     public ICameraConnection getConnectionInterface()
498     {
499         return (cameraConnection);
500     }
501
502     @Override
503     public IZoomLensHolder getZoomLensHolder()
504     {
505         return (zoomLensHolder);
506     }
507
508     @Override
509     public ILevelGauge getLevelGauge()
510     {
511         return (levelMeter);
512     }
513
514     @Override
515     public @NonNull ICameraFeatureDispatcher getFeatureDispatcher(@NonNull AppCompatActivity context, @NonNull IShowInformation statusDrawer, @NonNull ICameraController camera, @NonNull PreferenceDataStore preferenceAccessWrapper, @NonNull ILiveImageStatusNotify liveImageView)
516     {
517         if (featureDispatcher == null)
518         {
519             featureDispatcher = new FeatureDispatcher(context, statusDrawer, camera, preferenceAccessWrapper, liveImageView);
520         }
521         return (featureDispatcher);
522     }
523
524     @Override
525     public void onAfLockUpdate(boolean isAfLocked)
526     {
527         isAutoFocusLocked = isAfLocked;
528         updateIndicatorScreen(false);
529     }
530
531     @Override
532     public void onShootingStatusUpdate(shootingStatus status)
533     {
534         Log.v(TAG, " ShootingStatus : " + status);
535     }
536
537     @Override
538     public OLYCamera getOLYCamera()
539     {
540         return (camera);
541     }
542
543 }