OSDN Git Service

initial
[gokigen/A01d.git] / app / src / main / java / net / osdn / gokigen / a01d / liveview / LiveViewFragment.java
1 package net.osdn.gokigen.a01d.liveview;
2
3 import android.app.Activity;
4 import android.content.Context;
5 import android.net.Uri;
6 import android.os.Bundle;
7 import android.support.v4.app.Fragment;
8 import android.support.v4.content.res.ResourcesCompat;
9 import android.util.Log;
10 import android.view.LayoutInflater;
11 import android.view.View;
12 import android.view.ViewGroup;
13 import android.widget.ImageButton;
14 import android.widget.ImageView;
15 import android.widget.TextView;
16
17 import net.osdn.gokigen.a01d.IChangeScene;
18 import net.osdn.gokigen.a01d.R;
19
20 import java.io.File;
21
22
23 /**
24  *  撮影用ライブビュー画面
25  *
26  */
27 public class LiveViewFragment extends Fragment implements IStatusViewDrawer
28 {
29     private final String TAG = this.toString();
30     private static final int COMMAND_MY_PROPERTY = 0x00000100;
31
32 //    private IOlyCameraCoordinator camera = null;
33 //    private MyInterfaceProvider factory = null;
34 //    private ICameraRunMode changeRunModeExecutor = null;
35 //    private OlyCameraLiveViewOnTouchListener onTouchListener = null;
36     private CameraLiveViewListenerImpl liveViewListener = null;
37 //    private CameraStatusListenerImpl statusListener = null;
38 //    private IGpsLocationPicker locationPicker = null;
39
40     private IChangeScene changeScene = null;
41
42     private LiveViewClickListener onClickListener = null;
43
44
45     private TextView statusArea = null;
46     private CameraLiveImageView imageView = null;
47     //private CameraControlPanel cameraPanel = null;
48
49 /*
50     private ImageView manualFocus = null;
51     private ImageView afLock = null;
52     private ImageView aeLock = null;
53     private ImageView focusAssist = null;
54 */
55     private ImageButton showGrid = null;
56     private ImageButton connectStatus = null;
57
58     private boolean imageViewCreated = false;
59     private View myView = null;
60     private String messageValue = "";
61
62
63     /**
64      *
65      *
66      */
67     @Override
68     public void onCreate(Bundle savedInstanceState)
69     {
70         super.onCreate(savedInstanceState);
71         Log.v(TAG, "onCreate()");
72
73         if (liveViewListener == null)
74         {
75             liveViewListener = new CameraLiveViewListenerImpl();
76         }
77
78
79 /*
80
81         if (onTouchListener == null)
82         {
83             onTouchListener = new OlyCameraLiveViewOnTouchListener(getContext().getApplicationContext());
84         }
85         if (statusListener == null)
86         {
87             statusListener = new CameraStatusListenerImpl(getContext().getApplicationContext(), this);
88         }
89         if (locationPicker == null)
90         {
91             locationPicker = new GpsLocationPicker(getContext().getApplicationContext(), onTouchListener);
92         }
93 */
94     }
95
96     /**
97      *
98      *
99      */
100     @Override
101     public void onAttach(Context context)
102     {
103         super.onAttach(context);
104         Log.v(TAG, "onAttach()");
105     }
106
107     /**
108      *
109      *
110      */
111     @Override
112     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
113     {
114         super.onCreateView(inflater, container, savedInstanceState);
115
116         Log.v(TAG, "onCreateView()");
117
118         if ((imageViewCreated)&&(myView != null))
119         {
120             // Viewを再利用。。。
121             Log.v(TAG, "onCreateView() : called again, so do nothing...");
122             return (myView);
123         }
124         View view = inflater.inflate(R.layout.fragment_live_view, container, false);
125         myView = view;
126         imageViewCreated = true;
127
128         imageView = view.findViewById(R.id.cameraLiveImageView);
129
130         if (onClickListener == null)
131         {
132             onClickListener = new LiveViewClickListener(imageView, this, changeScene);
133         }
134
135         /*
136         imageView.setOnClickListener(onTouchListener);
137         imageView.setOnTouchListener(onTouchListener);
138 */
139 /*
140         liveViewListener.setCameraLiveImageView(imageView);
141         if (factory != null)
142         {
143             factory.setAutoFocusFrameDisplay(imageView);
144         }
145 */
146 /*
147         // 画面下部のスマホカメラ領域
148         PhoneCameraView phoneCameraView = (PhoneCameraView) view.findViewById(R.id.phoneCameraView);
149
150         // カメラ画像の大きさを動的に調整(したい)
151         //phoneCameraView.getViewTreeObserver().addOnGlobalLayoutListener(phoneCameraView);
152
153         ImageView shutter = (ImageView) view.findViewById(R.id.shutterImageView);
154         shutter.setOnClickListener(onTouchListener);
155
156         ImageView config = (ImageView) view.findViewById(R.id.configImageView);
157         config.setOnClickListener(onTouchListener);
158
159         ImageView build = (ImageView) view.findViewById(R.id.buildImageView);
160         build.setOnClickListener(onTouchListener);
161
162         ImageButton gps = (ImageButton) view.findViewById(R.id.gpsLocationButton);
163         if ((locationPicker.prepare(camera.getCameraPropertyProvider()))&&(locationPicker.hasGps()))
164         {
165             // GPSボタンの状態を更新しておく
166             updateGpsTrackingStatus();
167
168             // GPSが使用可能な状態のとき...ボタンを押せるようにする
169             gps.setOnClickListener(onTouchListener);
170         }
171         else
172         {
173             // GPSが利用不可のとき、、、ボタンは無効(非表示)にする
174             gps.setEnabled(false);
175             gps.setVisibility(View.INVISIBLE);
176         }
177
178         manualFocus = (ImageView) view.findViewById(R.id.manualFocusImageView);
179         manualFocus.setOnClickListener(onTouchListener);
180
181         afLock = (ImageView) view.findViewById(R.id.AutoFocusLockImageView);
182         afLock.setOnClickListener(onTouchListener);
183
184         aeLock = (ImageView) view.findViewById(R.id.AutoExposureLockImageView);
185         aeLock.setOnClickListener(onTouchListener);
186
187         focusAssist = (ImageView) view.findViewById(R.id.FocusAssistImageView);
188         focusAssist.setOnClickListener(onTouchListener);
189 */
190        try
191        {
192            view.findViewById(R.id.show_preference_button).setOnClickListener(onClickListener);
193            view.findViewById(R.id.camera_property_settings_button).setOnClickListener(onClickListener);
194
195            showGrid = view.findViewById(R.id.show_hide_grid_button);
196            showGrid.setOnClickListener(onClickListener);
197            updateGridIcon();
198
199            connectStatus = view.findViewById(R.id.connect_disconnect_button);
200            connectStatus.setOnClickListener(onClickListener);
201            updateConnectionStatus();
202
203            statusArea = view.findViewById(R.id.informationMessageTextView);
204        }
205        catch (Exception e)
206        {
207            e.printStackTrace();
208        }
209        return (view);
210     }
211
212     /**
213      *
214      */
215     public void prepare(IChangeScene sceneSelector)
216     {
217         this.changeScene = sceneSelector;
218     }
219
220
221     /**
222      *  カメラとの接続状態の更新
223      *
224      */
225     @Override
226     public void updateConnectionStatus()
227     {
228         try
229         {
230             int id = R.drawable.ic_cloud_off_black_24dp;
231             connectStatus.setImageDrawable(ResourcesCompat.getDrawable(getResources(), id, null));
232             connectStatus.invalidate();
233             imageView.invalidate();
234         }
235         catch (Exception e)
236         {
237             e.printStackTrace();
238         }
239     }
240
241     /**
242      *  グリッドの表示・非表示の更新
243      *
244      */
245     @Override
246     public void updateGridIcon()
247     {
248         try
249         {
250             int id = (imageView.isShowGrid()) ? R.drawable.ic_grid_off_black_24dp : R.drawable.ic_grid_on_black_24dp;
251             showGrid.setImageDrawable(ResourcesCompat.getDrawable(getResources(), id, null));
252             showGrid.invalidate();
253             imageView.invalidate();
254         }
255         catch (Exception e)
256         {
257             e.printStackTrace();
258         }
259     }
260
261     /**
262      *   作例表示モードの画像のURIを応答する
263      *
264      * @return Uri : 作例表示する画像のURI
265      */
266     private Uri isSetupSampleImageFile(String fileName)
267     {
268         try
269         {
270             File file = new File(fileName);
271             if (file.exists())
272             {
273                 Log.v(TAG, "isSetupSampleImageFile() : " + file.toString());
274                 return (Uri.fromFile(file));
275             }
276         }
277         catch (Exception e)
278         {
279             e.printStackTrace();
280         }
281
282         Log.v(TAG, "isSetupSampleImageFile() : nothing");
283         return (null);
284     }
285
286     /**
287      *   画面下部の表示エリアの用途を切り替える
288      *
289      */
290     private void setupLowerDisplayArea()
291     {
292 /*
293         ScalableImageViewPanel sampleImageView = (ScalableImageViewPanel) getActivity().findViewById(R.id.favoriteImageView);
294         PhoneCameraView phoneCameraView = (PhoneCameraView) getActivity().findViewById(R.id.phoneCameraView);
295
296         SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
297         String value = preferences.getString(IPreferencePropertyAccessor.SHOW_SAMPLE_IMAGE, IPreferencePropertyAccessor.SHOW_SAMPLE_IMAGE_DEFAULT_VALUE);
298         if (value.equals("2"))
299         {
300             // 操作パネル表示モード
301             try
302             {
303                 phoneCameraView.setVisibility(View.GONE);
304                 sampleImageView.setVisibility(View.VISIBLE);
305                 CameraControlPanel cameraPanel = new CameraControlPanel(sampleImageView, camera.getCameraPropertyProvider());
306                 statusListener.setDelegateListener(cameraPanel);
307                 sampleImageView.setOnClickListener(cameraPanel);
308                 sampleImageView.setOnTouchListener(cameraPanel);
309                 sampleImageView.setOnLongClickListener(cameraPanel);
310                 sampleImageView.setCameraPanelDrawer(true, cameraPanel);
311                 sampleImageView.invalidate();
312                 return;
313             }
314             catch (Exception e)
315             {
316                 e.printStackTrace();
317             }
318         }
319
320         statusListener.setDelegateListener(null);
321         sampleImageView.setOnClickListener(null);
322         sampleImageView.setOnTouchListener(null);
323         sampleImageView.setOnLongClickListener(null);
324         sampleImageView.setCameraPanelDrawer(false, null);
325
326         Uri uri = null;
327         if (value.equals("1"))
328         {
329             // 作例表示用の画像を取得
330             uri = isSetupSampleImageFile(preferences.getString(IPreferencePropertyAccessor.SELECT_SAMPLE_IMAGE, ""));
331         }
332         if (uri != null)
333         {
334             // 作例表示モード
335             phoneCameraView.setVisibility(View.GONE);
336             sampleImageView.setVisibility(View.VISIBLE);
337             sampleImageView.setImageURI(uri);
338             sampleImageView.invalidate();
339         }
340         else
341         {
342             // デュアルカメラモード
343             phoneCameraView.setVisibility(View.VISIBLE);
344             sampleImageView.setVisibility(View.GONE);
345
346             // カメラの画像にタッチリスナを付与
347             phoneCameraView.setOnClickListener(onTouchListener);
348             phoneCameraView.setOnTouchListener(onTouchListener);
349         }
350 */
351     }
352
353     /**
354      *
355      *
356      *
357      */
358     @Override
359     public void onStart()
360     {
361         super.onStart();
362         Log.v(TAG, "onStart()");
363     }
364
365     /**
366      *
367      *
368      */
369     @Override
370     public void onResume()
371     {
372         super.onResume();
373         Log.v(TAG, "onResume() Start");
374 /*
375         // 撮影モードかどうかを確認して、撮影モードではなかったら撮影モードに切り替える
376         if ((changeRunModeExecutor != null)&&(!changeRunModeExecutor.isRecordingMode()))
377         {
378             // Runモードを切り替える。(でも切り替えると、設定がクリアされてしまう...。
379             changeRunModeExecutor.changeRunMode(true);
380         }
381
382         // ステータスの変更を通知してもらう
383         camera.setCameraStatusListener(statusListener);
384
385         // 画面下部の表示エリアの用途を切り替える
386         setupLowerDisplayArea();
387
388         // propertyを取得
389         SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getContext());
390
391         // グリッド・フォーカスアシストの情報を戻す
392         imageView.setShowGridFrame(preferences.getBoolean(IPreferencePropertyAccessor.SHOW_GRID_STATUS, false));
393         imageView.setFocusAssist(preferences.getBoolean(IPreferencePropertyAccessor.SHOW_FOCUS_ASSIST_STATUS, false));
394         updateCameraPropertyStatus();
395
396         // ステータスの初期情報を表示する
397         updateStatusView(camera.getCameraStatusSummary(statusListener));
398
399         // ライブビューの開始
400         camera.changeLiveViewSize(preferences.getString(IPreferencePropertyAccessor.LIVE_VIEW_QUALITY, IPreferencePropertyAccessor.LIVE_VIEW_QUALITY_DEFAULT_VALUE));
401         camera.setLiveViewListener(liveViewListener);
402         liveViewListener.setCameraLiveImageView(imageView);
403         camera.startLiveView();
404
405         // GPSボタンの更新
406         updateGpsTrackingStatus();
407
408         // デジタル水準器を有効にするかどうか
409         if (statusListener != null)
410         {
411             statusListener.updateLevelGaugeChecking();
412         }
413 */
414         Log.v(TAG, "onResume() End");
415     }
416
417     /**
418      *
419      *
420      */
421     @Override
422     public void onPause()
423     {
424         super.onPause();
425         Log.v(TAG, "onPause() Start");
426
427 /*
428         // ライブビューの停止
429         camera.stopLiveView();
430         camera.setLiveViewListener(null);
431         liveViewListener.setCameraLiveImageView(null);
432
433         if (locationPicker != null)
434         {
435             // GPS監視の終了
436             locationPicker.controlGps(false);
437             camera.clearGeolocation();
438         }
439 */
440         Log.v(TAG, "onPause() End");
441     }
442
443     /**
444      * カメラクラスをセットする
445      *
446      */
447 /*
448     public void setInterfaces(IOlyCameraCoordinator camera, MyInterfaceProvider factory)
449     {
450         Log.v(TAG, "setInterfaces()");
451         this.camera = camera;
452         this.factory = factory;
453         this.changeRunModeExecutor = camera.getChangeRunModeExecutor();
454
455         factory.setStatusInterface(this);
456         factory.setStatusViewDrawer(this);
457         //if (imageView != null)
458         {
459         //    factory.setAutoFocusFrameDisplay(imageView);
460         }
461     }
462 */
463 /*
464     @Override
465     public void updateFocusAssistStatus()
466     {
467         updateCameraPropertyStatus();
468     }
469
470     @Override
471     public void updateGridFrameStatus()
472     {
473         updateCameraPropertyStatus();
474     }
475
476     @Override
477     public void updateTakeMode()
478     {
479         updateCameraPropertyStatus();
480     }
481
482     @Override
483     public void updateDriveMode()
484     {
485         updateCameraPropertyStatus();
486     }
487
488     @Override
489     public void updateWhiteBalance()
490     {
491         updateCameraPropertyStatus();
492     }
493
494     @Override
495     public void updateBatteryLevel()
496     {
497         updateCameraPropertyStatus();
498     }
499
500     @Override
501     public void updateAeMode()
502     {
503         updateCameraPropertyStatus();
504     }
505
506     @Override
507     public void updateAeLockState()
508     {
509         updateCameraPropertyStatus();
510     }
511
512     @Override
513     public void updateCameraStatus()
514     {
515         updateCameraPropertyStatus();
516     }
517
518     @Override
519     public void updateCameraStatus(String message)
520     {
521         updateStatusView(message);
522     }
523 */
524 /*
525     @Override
526     public void updateLevelGauge(String orientation, float roll, float pitch)
527     {
528         if (imageView == null)
529         {
530             return;
531         }
532
533         // レベルゲージ(デジタル水準器の情報)が更新されたとき
534         //Log.v(TAG, String.format(Locale.getDefault(), "LEVEL GAUGE : %s roll: %3.3f pitch: %3.3f", orientation, roll, pitch));
535         try
536         {
537             if ((Float.isNaN(roll))||(Float.isNaN(pitch)))
538             {
539                 // roll と pitch のどちらかがNaNなら、表示を消す
540                 imageView.getMessageDrawer().setMessageToShow(IMessageDrawer.MessageArea.LOWRIGHT, Color.argb(0xff, 0x6e, 0x6e, 0x6e), IMessageDrawer.SIZE_STD, "");
541                 imageView.getMessageDrawer().setLevelToShow(IMessageDrawer.LevelArea.LEVEL_HORIZONTAL, Float.NaN);
542                 imageView.getMessageDrawer().setLevelToShow(IMessageDrawer.LevelArea.LEVEL_VERTICAL, Float.NaN);
543                 return;
544             }
545
546             // 傾きのデータを設定する
547             String message = String.format(Locale.getDefault(), "[%3.1f, %3.1f]", roll, pitch);
548             imageView.getMessageDrawer().setMessageToShow(IMessageDrawer.MessageArea.LOWRIGHT, Color.argb(0xff, 0x6e, 0x6e, 0x6e), IMessageDrawer.SIZE_STD, message);
549             imageView.getMessageDrawer().setLevelToShow(IMessageDrawer.LevelArea.LEVEL_HORIZONTAL, roll);
550             imageView.getMessageDrawer().setLevelToShow(IMessageDrawer.LevelArea.LEVEL_VERTICAL, pitch);
551         }
552         catch (Exception e)
553         {
554             e.printStackTrace();
555         }
556     }
557 */
558 /*
559     @Override
560     public void showFavoriteSettingDialog()
561     {
562         LoadSaveMyCameraPropertyDialog dialog = new LoadSaveMyCameraPropertyDialog();
563         dialog.setTargetFragment(this, COMMAND_MY_PROPERTY);
564         dialog.setPropertyOperationsHolder(new CameraPropertyLoadSaveOperations(getActivity(), camera.getLoadSaveCameraProperties(), this));
565         dialog.show(getChildFragmentManager(), "my_dialog");
566     }
567 */
568 /*
569     @Override
570     public void toggleTimerStatus()
571     {
572         boolean isBracketing = !isBracketing();
573         SharedPreferences preferences = android.support.v7.preference.PreferenceManager.getDefaultSharedPreferences(getContext());
574         SharedPreferences.Editor editor = preferences.edit();
575         editor.putBoolean(IPreferencePropertyAccessor.USE_BRACKETING, isBracketing);
576         editor.apply();
577         if (bracketing != null)
578         {
579             bracketing.setSelected(isBracketing);
580         }
581     }
582
583     private boolean isBracketing()
584     {
585         SharedPreferences preferences = android.support.v7.preference.PreferenceManager.getDefaultSharedPreferences(getContext());
586         boolean isBracketing = false;
587         if (preferences != null)
588         {
589             isBracketing = preferences.getBoolean(IPreferencePropertyAccessor.USE_BRACKETING, false);
590         }
591         return (isBracketing);
592     }
593 */
594     /**
595      *
596      *
597      */
598 /*
599     private void updateCameraPropertyStatus()
600     {
601         try
602         {
603             final boolean isManualFocus = camera.isManualFocus();
604             final boolean isAfLock = camera.isAFLock();
605             final boolean isAeLock = camera.isAELock();
606             final boolean isTimerOn = isBracketing();
607             boolean checkFocusAssist = false;
608             boolean checkShowGrid = false;
609             if (imageView != null)
610             {
611                 checkFocusAssist = imageView.isFocusAssist();
612                 checkShowGrid = imageView.isShowGrid();
613             }
614             final boolean isFocusAssist = checkFocusAssist;
615             final boolean isShowGrid = checkShowGrid;
616
617             runOnUiThread(new Runnable()
618             {
619                 //カメラの状態(インジケータ)を更新する
620                 @Override
621                 public void run() {
622                     if (camera == null) {
623                         return;
624                     }
625                     Log.v(TAG, "--- UPDATE CAMERA PROPERTY (START) ---");
626                     if (manualFocus != null) {
627                         manualFocus.setSelected(isManualFocus);
628                     }
629                     if (afLock != null) {
630                         afLock.setSelected(isAfLock);
631                     }
632                     if (aeLock != null) {
633                         aeLock.setSelected(isAeLock);
634                     }
635                     if ((focusAssist != null) && (imageView != null)) {
636                         focusAssist.setSelected(isFocusAssist);
637                     }
638                     if ((showGrid != null) && (imageView != null)) {
639                         showGrid.setSelected(isShowGrid);
640                     }
641                     if (bracketing != null)
642                     {
643                         bracketing.setSelected(isTimerOn);
644                     }
645                     Log.v(TAG, "--- UPDATE CAMERA PROPERTY (END) ---");
646                 }
647             });
648         }
649         catch (Exception e)
650         {
651             e.printStackTrace();
652         }
653     }
654 */
655
656     /**
657      *
658      *
659      */
660 /*
661     @Override
662     public IMessageDrawer getMessageDrawer()
663     {
664         return (imageView.getMessageDrawer());
665     }
666 */
667     /**
668      *   表示エリアに文字を表示する
669      *
670      */
671     public void updateStatusView(String message)
672     {
673         messageValue = message;
674         runOnUiThread(new Runnable()
675         {
676             /**
677              * カメラの状態(ステータステキスト)を更新する
678              * (ステータステキストは、プライベート変数で保持して、書き換える)
679              */
680             @Override
681             public void run()
682             {
683                 if (statusArea != null)
684                 {
685                     statusArea.setText(messageValue);
686                 }
687             }
688         });
689     }
690 /*
691     @Override
692     public void toggleGpsTracking()
693     {
694         if (locationPicker == null)
695         {
696             return;
697         }
698         locationPicker.controlGps(!locationPicker.isTracking());
699         updateGpsTrackingStatus();
700     }
701
702     @Override
703     public void updateGpsTrackingStatus()
704     {
705         Log.v(TAG, "updateGpsTrackingStatus()");
706         if ((myView == null)||(locationPicker == null))
707         {
708             Log.v(TAG, "updateGpsTrackingStatus() : null");
709             return;
710         }
711
712         ImageButton gps = (ImageButton) myView.findViewById(R.id.gpsLocationButton);
713         int id = R.drawable.btn_location_off;
714         if (locationPicker.isTracking())
715         {
716             if (locationPicker.isFixedLocation())
717             {
718                 // 位置が確定している
719                 id = R.drawable.btn_location_on;
720             }
721             else
722             {
723                 // 位置検索中だが未確定...
724                 id = R.drawable.btn_gps_not_fixed;
725             }
726         }
727         else
728         {
729             // 位置情報をクリアする
730             camera.clearGeolocation();
731         }
732         try
733         {
734             // ボタンの表示を変える
735             gps.setImageResource(id);
736             //gps.setImageDrawable(getContext().getResources().getDrawable(id));
737             gps.invalidate();
738         }
739         catch (Exception e)
740         {
741             e.printStackTrace();
742         }
743     }
744 */
745
746
747     private void runOnUiThread(Runnable action)
748     {
749         Activity activity = getActivity();
750         if (activity == null)
751         {
752             return;
753         }
754         activity.runOnUiThread(action);
755     }
756 }