1 package net.osdn.gokigen.a01d.liveview;
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;
17 import net.osdn.gokigen.a01d.IChangeScene;
18 import net.osdn.gokigen.a01d.R;
27 public class LiveViewFragment extends Fragment implements IStatusViewDrawer
29 private final String TAG = this.toString();
30 private static final int COMMAND_MY_PROPERTY = 0x00000100;
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;
40 private IChangeScene changeScene = null;
42 private LiveViewClickListener onClickListener = null;
45 private TextView statusArea = null;
46 private CameraLiveImageView imageView = null;
47 //private CameraControlPanel cameraPanel = null;
50 private ImageView manualFocus = null;
51 private ImageView afLock = null;
52 private ImageView aeLock = null;
53 private ImageView focusAssist = null;
55 private ImageButton showGrid = null;
56 private ImageButton connectStatus = null;
58 private boolean imageViewCreated = false;
59 private View myView = null;
60 private String messageValue = "";
68 public void onCreate(Bundle savedInstanceState)
70 super.onCreate(savedInstanceState);
71 Log.v(TAG, "onCreate()");
73 if (liveViewListener == null)
75 liveViewListener = new CameraLiveViewListenerImpl();
81 if (onTouchListener == null)
83 onTouchListener = new OlyCameraLiveViewOnTouchListener(getContext().getApplicationContext());
85 if (statusListener == null)
87 statusListener = new CameraStatusListenerImpl(getContext().getApplicationContext(), this);
89 if (locationPicker == null)
91 locationPicker = new GpsLocationPicker(getContext().getApplicationContext(), onTouchListener);
101 public void onAttach(Context context)
103 super.onAttach(context);
104 Log.v(TAG, "onAttach()");
112 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
114 super.onCreateView(inflater, container, savedInstanceState);
116 Log.v(TAG, "onCreateView()");
118 if ((imageViewCreated)&&(myView != null))
121 Log.v(TAG, "onCreateView() : called again, so do nothing...");
124 View view = inflater.inflate(R.layout.fragment_live_view, container, false);
126 imageViewCreated = true;
128 imageView = view.findViewById(R.id.cameraLiveImageView);
130 if (onClickListener == null)
132 onClickListener = new LiveViewClickListener(imageView, this, changeScene);
136 imageView.setOnClickListener(onTouchListener);
137 imageView.setOnTouchListener(onTouchListener);
140 liveViewListener.setCameraLiveImageView(imageView);
143 factory.setAutoFocusFrameDisplay(imageView);
148 PhoneCameraView phoneCameraView = (PhoneCameraView) view.findViewById(R.id.phoneCameraView);
150 // カメラ画像の大きさを動的に調整(したい)
151 //phoneCameraView.getViewTreeObserver().addOnGlobalLayoutListener(phoneCameraView);
153 ImageView shutter = (ImageView) view.findViewById(R.id.shutterImageView);
154 shutter.setOnClickListener(onTouchListener);
156 ImageView config = (ImageView) view.findViewById(R.id.configImageView);
157 config.setOnClickListener(onTouchListener);
159 ImageView build = (ImageView) view.findViewById(R.id.buildImageView);
160 build.setOnClickListener(onTouchListener);
162 ImageButton gps = (ImageButton) view.findViewById(R.id.gpsLocationButton);
163 if ((locationPicker.prepare(camera.getCameraPropertyProvider()))&&(locationPicker.hasGps()))
166 updateGpsTrackingStatus();
168 // GPSが使用可能な状態のとき...ボタンを押せるようにする
169 gps.setOnClickListener(onTouchListener);
173 // GPSが利用不可のとき、、、ボタンは無効(非表示)にする
174 gps.setEnabled(false);
175 gps.setVisibility(View.INVISIBLE);
178 manualFocus = (ImageView) view.findViewById(R.id.manualFocusImageView);
179 manualFocus.setOnClickListener(onTouchListener);
181 afLock = (ImageView) view.findViewById(R.id.AutoFocusLockImageView);
182 afLock.setOnClickListener(onTouchListener);
184 aeLock = (ImageView) view.findViewById(R.id.AutoExposureLockImageView);
185 aeLock.setOnClickListener(onTouchListener);
187 focusAssist = (ImageView) view.findViewById(R.id.FocusAssistImageView);
188 focusAssist.setOnClickListener(onTouchListener);
192 view.findViewById(R.id.show_preference_button).setOnClickListener(onClickListener);
193 view.findViewById(R.id.camera_property_settings_button).setOnClickListener(onClickListener);
195 showGrid = view.findViewById(R.id.show_hide_grid_button);
196 showGrid.setOnClickListener(onClickListener);
199 connectStatus = view.findViewById(R.id.connect_disconnect_button);
200 connectStatus.setOnClickListener(onClickListener);
201 updateConnectionStatus();
203 statusArea = view.findViewById(R.id.informationMessageTextView);
215 public void prepare(IChangeScene sceneSelector)
217 this.changeScene = sceneSelector;
226 public void updateConnectionStatus()
230 int id = R.drawable.ic_cloud_off_black_24dp;
231 connectStatus.setImageDrawable(ResourcesCompat.getDrawable(getResources(), id, null));
232 connectStatus.invalidate();
233 imageView.invalidate();
246 public void updateGridIcon()
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();
262 * 作例表示モードの画像のURIを応答する
264 * @return Uri : 作例表示する画像のURI
266 private Uri isSetupSampleImageFile(String fileName)
270 File file = new File(fileName);
273 Log.v(TAG, "isSetupSampleImageFile() : " + file.toString());
274 return (Uri.fromFile(file));
282 Log.v(TAG, "isSetupSampleImageFile() : nothing");
287 * 画面下部の表示エリアの用途を切り替える
290 private void setupLowerDisplayArea()
293 ScalableImageViewPanel sampleImageView = (ScalableImageViewPanel) getActivity().findViewById(R.id.favoriteImageView);
294 PhoneCameraView phoneCameraView = (PhoneCameraView) getActivity().findViewById(R.id.phoneCameraView);
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"))
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();
320 statusListener.setDelegateListener(null);
321 sampleImageView.setOnClickListener(null);
322 sampleImageView.setOnTouchListener(null);
323 sampleImageView.setOnLongClickListener(null);
324 sampleImageView.setCameraPanelDrawer(false, null);
327 if (value.equals("1"))
330 uri = isSetupSampleImageFile(preferences.getString(IPreferencePropertyAccessor.SELECT_SAMPLE_IMAGE, ""));
335 phoneCameraView.setVisibility(View.GONE);
336 sampleImageView.setVisibility(View.VISIBLE);
337 sampleImageView.setImageURI(uri);
338 sampleImageView.invalidate();
343 phoneCameraView.setVisibility(View.VISIBLE);
344 sampleImageView.setVisibility(View.GONE);
347 phoneCameraView.setOnClickListener(onTouchListener);
348 phoneCameraView.setOnTouchListener(onTouchListener);
359 public void onStart()
362 Log.v(TAG, "onStart()");
370 public void onResume()
373 Log.v(TAG, "onResume() Start");
375 // 撮影モードかどうかを確認して、撮影モードではなかったら撮影モードに切り替える
376 if ((changeRunModeExecutor != null)&&(!changeRunModeExecutor.isRecordingMode()))
378 // Runモードを切り替える。(でも切り替えると、設定がクリアされてしまう...。
379 changeRunModeExecutor.changeRunMode(true);
383 camera.setCameraStatusListener(statusListener);
385 // 画面下部の表示エリアの用途を切り替える
386 setupLowerDisplayArea();
389 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getContext());
391 // グリッド・フォーカスアシストの情報を戻す
392 imageView.setShowGridFrame(preferences.getBoolean(IPreferencePropertyAccessor.SHOW_GRID_STATUS, false));
393 imageView.setFocusAssist(preferences.getBoolean(IPreferencePropertyAccessor.SHOW_FOCUS_ASSIST_STATUS, false));
394 updateCameraPropertyStatus();
397 updateStatusView(camera.getCameraStatusSummary(statusListener));
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();
406 updateGpsTrackingStatus();
409 if (statusListener != null)
411 statusListener.updateLevelGaugeChecking();
414 Log.v(TAG, "onResume() End");
422 public void onPause()
425 Log.v(TAG, "onPause() Start");
429 camera.stopLiveView();
430 camera.setLiveViewListener(null);
431 liveViewListener.setCameraLiveImageView(null);
433 if (locationPicker != null)
436 locationPicker.controlGps(false);
437 camera.clearGeolocation();
440 Log.v(TAG, "onPause() End");
448 public void setInterfaces(IOlyCameraCoordinator camera, MyInterfaceProvider factory)
450 Log.v(TAG, "setInterfaces()");
451 this.camera = camera;
452 this.factory = factory;
453 this.changeRunModeExecutor = camera.getChangeRunModeExecutor();
455 factory.setStatusInterface(this);
456 factory.setStatusViewDrawer(this);
457 //if (imageView != null)
459 // factory.setAutoFocusFrameDisplay(imageView);
465 public void updateFocusAssistStatus()
467 updateCameraPropertyStatus();
471 public void updateGridFrameStatus()
473 updateCameraPropertyStatus();
477 public void updateTakeMode()
479 updateCameraPropertyStatus();
483 public void updateDriveMode()
485 updateCameraPropertyStatus();
489 public void updateWhiteBalance()
491 updateCameraPropertyStatus();
495 public void updateBatteryLevel()
497 updateCameraPropertyStatus();
501 public void updateAeMode()
503 updateCameraPropertyStatus();
507 public void updateAeLockState()
509 updateCameraPropertyStatus();
513 public void updateCameraStatus()
515 updateCameraPropertyStatus();
519 public void updateCameraStatus(String message)
521 updateStatusView(message);
526 public void updateLevelGauge(String orientation, float roll, float pitch)
528 if (imageView == null)
533 // レベルゲージ(デジタル水準器の情報)が更新されたとき
534 //Log.v(TAG, String.format(Locale.getDefault(), "LEVEL GAUGE : %s roll: %3.3f pitch: %3.3f", orientation, roll, pitch));
537 if ((Float.isNaN(roll))||(Float.isNaN(pitch)))
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);
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);
560 public void showFavoriteSettingDialog()
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");
570 public void toggleTimerStatus()
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);
577 if (bracketing != null)
579 bracketing.setSelected(isBracketing);
583 private boolean isBracketing()
585 SharedPreferences preferences = android.support.v7.preference.PreferenceManager.getDefaultSharedPreferences(getContext());
586 boolean isBracketing = false;
587 if (preferences != null)
589 isBracketing = preferences.getBoolean(IPreferencePropertyAccessor.USE_BRACKETING, false);
591 return (isBracketing);
599 private void updateCameraPropertyStatus()
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)
611 checkFocusAssist = imageView.isFocusAssist();
612 checkShowGrid = imageView.isShowGrid();
614 final boolean isFocusAssist = checkFocusAssist;
615 final boolean isShowGrid = checkShowGrid;
617 runOnUiThread(new Runnable()
619 //カメラの状態(インジケータ)を更新する
622 if (camera == null) {
625 Log.v(TAG, "--- UPDATE CAMERA PROPERTY (START) ---");
626 if (manualFocus != null) {
627 manualFocus.setSelected(isManualFocus);
629 if (afLock != null) {
630 afLock.setSelected(isAfLock);
632 if (aeLock != null) {
633 aeLock.setSelected(isAeLock);
635 if ((focusAssist != null) && (imageView != null)) {
636 focusAssist.setSelected(isFocusAssist);
638 if ((showGrid != null) && (imageView != null)) {
639 showGrid.setSelected(isShowGrid);
641 if (bracketing != null)
643 bracketing.setSelected(isTimerOn);
645 Log.v(TAG, "--- UPDATE CAMERA PROPERTY (END) ---");
662 public IMessageDrawer getMessageDrawer()
664 return (imageView.getMessageDrawer());
671 public void updateStatusView(String message)
673 messageValue = message;
674 runOnUiThread(new Runnable()
677 * カメラの状態(ステータステキスト)を更新する
678 * (ステータステキストは、プライベート変数で保持して、書き換える)
683 if (statusArea != null)
685 statusArea.setText(messageValue);
692 public void toggleGpsTracking()
694 if (locationPicker == null)
698 locationPicker.controlGps(!locationPicker.isTracking());
699 updateGpsTrackingStatus();
703 public void updateGpsTrackingStatus()
705 Log.v(TAG, "updateGpsTrackingStatus()");
706 if ((myView == null)||(locationPicker == null))
708 Log.v(TAG, "updateGpsTrackingStatus() : null");
712 ImageButton gps = (ImageButton) myView.findViewById(R.id.gpsLocationButton);
713 int id = R.drawable.btn_location_off;
714 if (locationPicker.isTracking())
716 if (locationPicker.isFixedLocation())
719 id = R.drawable.btn_location_on;
724 id = R.drawable.btn_gps_not_fixed;
730 camera.clearGeolocation();
735 gps.setImageResource(id);
736 //gps.setImageDrawable(getContext().getResources().getDrawable(id));
747 private void runOnUiThread(Runnable action)
749 Activity activity = getActivity();
750 if (activity == null)
754 activity.runOnUiThread(action);