OSDN Git Service

アイコンを追加。
[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      */
280     @Override
281     public void bracketingControl()
282     {
283         // ダミー
284     }
285
286     /**
287      *   インターバル&ブラケッティング撮影の実行
288      *
289      *     @param bracketingStyle : ブラケッティングスタイル
290      *     @param bracketingCount : 撮影枚数
291      *     @param durationSeconds : 撮影間隔(単位:秒)
292      *
293      */
294     @Override
295     public void bracketingShot(int bracketingStyle, int bracketingCount, int durationSeconds)
296     {
297         bracketingShot.bracketingShot(bracketingStyle, bracketingCount, durationSeconds);
298     }
299
300     /**
301      *   撮影確認画像を生成するか設定する
302      *
303      */
304     @Override
305     public void setRecViewMode(boolean isRecViewMode)
306     {
307         try
308         {
309             String value = "<" + IOlyCameraProperty.REC_PREVIEW + "/";
310             if (isRecViewMode)
311             {
312                 value = value + "ON>";
313             }
314             else
315             {
316                 value = value + "OFF>";
317             }
318             propertyProxy.setCameraPropertyValue(IOlyCameraProperty.REC_PREVIEW, value);
319         }
320         catch (Exception e)
321         {
322             e.printStackTrace();
323         }
324     }
325
326
327     @Override
328     public void toggleAutoExposure()
329     {
330         try
331         {
332             if (isAELock())
333             {
334                 Log.v(TAG, "toggleAutoExposure() : unlockAutoExposure()");
335                 camera.unlockAutoExposure();
336             }
337             else
338             {
339                 Log.v(TAG, "toggleAutoExposure() : lockAutoExposure()");
340                 camera.lockAutoExposure();
341             }
342             updateIndicatorScreen(false);
343         }
344         catch (Exception e)
345         {
346             e.printStackTrace();
347         }
348         cameraStatusDisplay.updateAeLockState();
349     }
350
351     /**
352      *   AF/MF の切り替えを行う
353      *
354      */
355     @Override
356     public void toggleManualFocus()
357     {
358         try
359         {
360             boolean isHideFocusFrame = false;
361             String property_name = IOlyCameraProperty.FOCUS_STILL;
362             String poverty_value = "<" + IOlyCameraProperty.FOCUS_STILL + "/";
363
364             // マニュアルフォーカス切替え
365             if (!isManualFocus)
366             {
367                 // AF -> MF  : オートフォーカスを解除して設定する
368                 Log.v(TAG, "toggleManualFocus() : to " + IOlyCameraProperty.FOCUS_MF);
369                 poverty_value = poverty_value + IOlyCameraProperty.FOCUS_MF + ">";
370                 camera.unlockAutoFocus();
371                 camera.setCameraPropertyValue(property_name, poverty_value);
372                 isHideFocusFrame = true;
373             }
374             else
375             {
376                 // MF -> AF
377                 Log.v(TAG, "toggleManualFocus() : to " + IOlyCameraProperty.FOCUS_SAF);
378                 poverty_value = poverty_value + IOlyCameraProperty.FOCUS_SAF + ">";
379                 camera.setCameraPropertyValue(property_name, poverty_value);
380             }
381             updateIndicatorScreen(isHideFocusFrame);
382         }
383         catch (Exception e)
384         {
385             e.printStackTrace();
386         }
387     }
388
389     private void updateIndicatorScreen(boolean isHideFocusFrame)
390     {
391         isManualFocus();
392         if (isHideFocusFrame)
393         {
394             isAutoFocusLocked = false;
395             focusFrameDisplay.hideFocusFrame();
396         }
397         cameraStatusDisplay.updateCameraStatus();
398     }
399
400     @Override
401     public boolean isManualFocus()
402     {
403         isManualFocus = propertyProxy.isManualFocus();
404         return (isManualFocus);
405     }
406
407     @Override
408     public boolean isAFLock()
409     {
410         return (isAutoFocusLocked);
411     }
412
413     @Override
414     public boolean isAELock()
415     {
416         return (propertyProxy.isExposureLocked());
417     }
418
419 /*
420     @Override
421     public void setCameraStatusListener(OLYCameraStatusListener listener)
422     {
423         camera.setCameraStatusListener(listener);
424     }
425
426     @Override
427     public String getCameraStatusSummary(ICameraStatusSummary decoder)
428     {
429         return (decoder.getCameraStatusMessage(camera, ""));
430     }
431 */
432
433     /**
434      *   ステータス表示をすべて更新する
435      *
436      */
437     @Override
438     public void updateStatusAll()
439     {
440         cameraStatusDisplay.updateCameraStatusAll();
441     }
442
443     @Nullable
444     @Override
445     public ICameraStatusWatcher getStatusWatcher()
446     {
447         return (null);
448     }
449
450     @Override
451     public void changeRunMode(boolean isRecording)
452     {
453         OLYCamera.RunMode runMode = (isRecording) ? OLYCamera.RunMode.Recording : OLYCamera.RunMode.Playback;
454         Log.v(TAG, "changeRunMode() : " + runMode);
455         try
456         {
457             camera.changeRunMode(runMode);
458         }
459         catch (Exception e)
460         {
461             e.printStackTrace();
462         }
463     }
464
465     @Override
466     public boolean isRecordingMode()
467     {
468         boolean isRecordingMode = false;
469         try
470         {
471             OLYCamera.RunMode runMode = camera.getRunMode();
472             isRecordingMode =  (runMode == OLYCamera.RunMode.Recording);
473         }
474         catch (Exception e)
475         {
476             e.printStackTrace();
477         }
478
479         return (isRecordingMode);
480     }
481
482     @Override
483     public IOlyCameraPropertyProvider getCameraPropertyProvider()
484     {
485         return (propertyProxy);
486     }
487
488     @Override
489     public ICameraPropertyLoadSaveOperations getCameraPropertyLoadSaveOperations()
490     {
491         return (loadSaveOperations);
492     }
493
494     @Override
495     public ILoadSaveCameraProperties getLoadSaveCameraProperties()
496     {
497         return (loadSaveCameraProperties);
498     }
499
500     @Override
501     public ICameraRunMode getChangeRunModeExecutor()
502     {
503         return (this);
504     }
505
506     @Override
507     public ICameraConnection getConnectionInterface()
508     {
509         return (cameraConnection);
510     }
511
512     @Override
513     public IZoomLensHolder getZoomLensHolder()
514     {
515         return (zoomLensHolder);
516     }
517
518     @Override
519     public ILevelGauge getLevelGauge()
520     {
521         return (levelMeter);
522     }
523
524     @Override
525     public @NonNull ICameraFeatureDispatcher getFeatureDispatcher(@NonNull AppCompatActivity context, @NonNull IShowInformation statusDrawer, @NonNull ICameraController camera, @NonNull PreferenceDataStore preferenceAccessWrapper, @NonNull ILiveImageStatusNotify liveImageView)
526     {
527         if (featureDispatcher == null)
528         {
529             featureDispatcher = new FeatureDispatcher(context, statusDrawer, camera, preferenceAccessWrapper, liveImageView);
530         }
531         return (featureDispatcher);
532     }
533
534     @Override
535     public void onAfLockUpdate(boolean isAfLocked)
536     {
537         isAutoFocusLocked = isAfLocked;
538         updateIndicatorScreen(false);
539     }
540
541     @Override
542     public void onShootingStatusUpdate(shootingStatus status)
543     {
544         Log.v(TAG, " ShootingStatus : " + status);
545     }
546
547     @Override
548     public OLYCamera getOLYCamera()
549     {
550         return (camera);
551     }
552
553 }