1 package jp.sfjp.gokigen.a01c.olycamerawrapper.dispatcher;
3 import android.util.Log;
4 import android.view.MotionEvent;
6 import androidx.annotation.NonNull;
7 import androidx.appcompat.app.AppCompatActivity;
9 import jp.sfjp.gokigen.a01c.ConfirmationDialog;
10 import jp.sfjp.gokigen.a01c.ICameraFeatureDispatcher;
11 import jp.sfjp.gokigen.a01c.IShowInformation;
12 import jp.sfjp.gokigen.a01c.R;
13 import jp.sfjp.gokigen.a01c.liveview.ILiveImageStatusNotify;
14 import jp.sfjp.gokigen.a01c.olycamerawrapper.IOlyCameraCoordinator;
15 import jp.sfjp.gokigen.a01c.olycamerawrapper.IZoomLensHolder;
16 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.IOlyCameraProperty;
17 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.IOlyCameraPropertyProvider;
18 import jp.sfjp.gokigen.a01c.olycamerawrapper.takepicture.IBracketingShotStyle;
19 import jp.sfjp.gokigen.a01c.preference.PreferenceAccessWrapper;
26 public class FeatureDispatcher implements ICameraFeatureDispatcher
28 private final String TAG = toString();
30 private final AppCompatActivity activity;
31 private final IShowInformation statusDrawer;
32 private final IOlyCameraCoordinator camera;
33 private final ILiveImageStatusNotify liveImageView;
34 private final PreferenceAccessWrapper preferences;
36 public FeatureDispatcher(@NonNull AppCompatActivity context, @NonNull IShowInformation statusDrawer, @NonNull IOlyCameraCoordinator camera, ILiveImageStatusNotify liveImageView)
38 this.activity = context;
39 this.statusDrawer = statusDrawer;
41 this.liveImageView = liveImageView;
42 this.preferences = new PreferenceAccessWrapper(context);
48 * @param objectId 操作したオブジェクト
50 * @param defaultAction 標準機能
53 public boolean dispatchAction(int objectId, @NonNull String key, int defaultAction)
55 int featureNumber = preferences.getInt(key, defaultAction);
56 if (featureNumber <= ICameraFeatureDispatcher.FEATURE_ACTION_NONE)
63 int duration = IShowInformation.VIBRATE_PATTERN_SIMPLE_SHORT;
64 switch (featureNumber)
66 case ICameraFeatureDispatcher.FEATURE_SETTINGS:
69 duration =IShowInformation.VIBRATE_PATTERN_NONE;
71 case ICameraFeatureDispatcher.FEATURE_TOGGLE_SHOW_GRID:
73 changeShowGrid(objectId);
75 case ICameraFeatureDispatcher.FEATURE_SHUTTER_SINGLESHOT:
78 //duration =IShowInformation.VIBRATE_PATTERN_NONE;
80 case ICameraFeatureDispatcher.FEATURE_CHANGE_TAKEMODE:
84 case ICameraFeatureDispatcher.FEATURE_CHAGE_AE_LOCK_MODE:
88 case ICameraFeatureDispatcher.FEATURE_EXPOSURE_BIAS_DOWN:
90 changeExposureBiasValueDown();
92 case ICameraFeatureDispatcher.FEATURE_EXPOSURE_BIAS_UP:
94 changeExposureBiasValueUp();
96 case ICameraFeatureDispatcher.FEATURE_APERTURE_DOWN:
98 changeApertureValueDown();
100 case ICameraFeatureDispatcher.FEATURE_APERTURE_UP:
102 changeApertureValueUp();
104 case ICameraFeatureDispatcher.FEATURE_SHUTTER_SPEED_DOWN:
106 changeShutterSpeedDown();
108 case ICameraFeatureDispatcher.FEATURE_SHUTTER_SPEED_UP:
110 changeShutterSpeedUp();
112 case ICameraFeatureDispatcher.FEATURE_COLORTONE_DOWN:
114 changeColorToneDown();
116 case ICameraFeatureDispatcher.FEATURE_COLORTONE_UP:
120 case ICameraFeatureDispatcher.FEATURE_ART_FILTER_DOWN:
122 changeArtFilterDown();
124 case ICameraFeatureDispatcher.FEATURE_ART_FILTER_UP:
128 case ICameraFeatureDispatcher.FEATURE_TOGGLE_SHOW_LEVEL_GAUGE:
130 changeShowLevelGauge();
132 case ICameraFeatureDispatcher.FEATURE_CHANGE_TAKEMODE_REVERSE:
134 changeTakeModeReverse();
136 case ICameraFeatureDispatcher.FEATURE_CONTROL_MOVIE:
140 case ICameraFeatureDispatcher.FEATURE_AE_DOWN:
144 case ICameraFeatureDispatcher.FEATURE_AE_UP:
148 case ICameraFeatureDispatcher.FEATURE_ISO_DOWN:
150 changeIsoSensitivityDown();
152 case ICameraFeatureDispatcher.FEATURE_ISO_UP:
154 changeIsoSensitivityUp();
156 case ICameraFeatureDispatcher.FEATURE_WB_DOWN:
158 changeWhiteBalanceDown();
160 case ICameraFeatureDispatcher.FEATURE_WB_UP:
162 changeWhiteBalanceUp();
164 case ICameraFeatureDispatcher.FEATURE_QUALITY_MOVIE_DOWN:
166 changeMovieQualityModeDown();
168 case ICameraFeatureDispatcher.FEATURE_QUALITY_MOVIE_UP:
170 changeMovieQualityModeUp();
172 case ICameraFeatureDispatcher.FEATURE_SHORT_MOVIE_RECORD_TIME_DOWN:
174 changeShortMovieRecordLengthDown();
176 case ICameraFeatureDispatcher.FEATURE_SHORT_MOVIE_RECORD_TIME_UP:
178 changeShortMovieRecordLengthUp();
180 case ICameraFeatureDispatcher.FEATURE_EXPOSE_MOVIE_SELECT_DOWN:
182 changeMovieTakeModeDown();
184 case ICameraFeatureDispatcher.FEATURE_EXPOSE_MOVIE_SELECT_UP:
186 changeMovieTakeModeUp();
188 case FEATURE_CHANGE_AF_MF:
192 case FEATURE_CHANGE_AE:
196 case FEATURE_CHANGE_AE_REVERSE:
201 case FEATURE_SHOT_INTERVAL_3SEC:
206 case FEATURE_SHOT_INTERVAL_5SEC:
211 case FEATURE_SHOT_INTERVAL_10SEC:
215 case FEATURE_SHOT_BRACKET_EXPOSURE:
217 bracketingShot(IBracketingShotStyle.BRACKET_EXPREV, 5);
220 case FEATURE_SHOT_BRACKET_APERATURE:
222 bracketingShot(IBracketingShotStyle.BRACKET_APERTURE, 5);
225 case FEATURE_SHOT_BRACKET_SHUTTER:
227 bracketingShot(IBracketingShotStyle.BRACKET_SHUTTER, 5);
230 case FEATURE_SHOT_BRACKET_COLORTONE:
232 bracketingShot(IBracketingShotStyle.BRACKET_COLOR_TONE, 11);
235 case FEATURE_SHOT_BRACKET_WB:
236 // ホワイトバランスブラケット撮影を行う
237 bracketingShot(IBracketingShotStyle.BRACKET_WB, 7);
240 case FEATURE_SHOT_BRACKET_ART_FILTER:
241 // アートフィルターブラケット撮影を行う
242 bracketingShot(IBracketingShotStyle.BRACKET_ART_FILTER, 5);
245 case FEATURE_SHOT_BRACKET_ISO:
247 bracketingShot(IBracketingShotStyle.BRACKET_ISO, 3);
250 case FEATURE_SHOW_FAVORITE_DIALOG:
252 showFavoriteDialog();
255 case FEATURE_LENS_ZOOMIN:
256 // ズームイン(パワーズームレンズ装着時)
257 if (!driveZoomLens(1))
259 duration =IShowInformation.VIBRATE_PATTERN_NONE;
263 case FEATURE_LENS_ZOOMOUT:
264 // ズームアウト(パワーズームレンズ装着時)
265 if (!driveZoomLens(-1))
267 duration =IShowInformation.VIBRATE_PATTERN_NONE;
271 case FEATURE_LENS_ZOOMIN_2X:
272 // ズームイン(パワーズームレンズ装着時)
273 if (!driveZoomLens(2))
275 duration =IShowInformation.VIBRATE_PATTERN_NONE;
279 case FEATURE_LENS_ZOOMOUT_2X:
280 // ズームアウト(パワーズームレンズ装着時)
281 if (!driveZoomLens(-2))
283 duration =IShowInformation.VIBRATE_PATTERN_NONE;
287 case FEATURE_DIGITAL_ZOOM_RESET:
292 case FEATURE_DIGITAL_ZOOM_CHANGE:
294 if (!driveDigitalZoom(0))
296 duration =IShowInformation.VIBRATE_PATTERN_NONE;
299 case FEATURE_DIGITAL_ZOOMIN:
301 if (!driveDigitalZoom(1))
303 duration =IShowInformation.VIBRATE_PATTERN_NONE;
307 case FEATURE_DIGITAL_ZOOMOUT:
309 if (!driveDigitalZoom(-1))
311 duration =IShowInformation.VIBRATE_PATTERN_NONE;
315 case FEATURE_CHANGE_LIVEVIEW_MAGNIFY_X5:
317 if (!changeLiveViewMagnify(5))
319 duration =IShowInformation.VIBRATE_PATTERN_NONE;
323 case FEATURE_CHANGE_LIVEVIEW_MAGNIFY_X7:
325 if (!changeLiveViewMagnify(7))
327 duration =IShowInformation.VIBRATE_PATTERN_NONE;
331 case FEATURE_CHANGE_LIVEVIEW_MAGNIFY_X10:
333 if (!changeLiveViewMagnify(10))
335 duration =IShowInformation.VIBRATE_PATTERN_NONE;
339 case FEATURE_CHANGE_LIVEVIEW_MAGNIFY_X14:
341 if (!changeLiveViewMagnify(14))
343 duration =IShowInformation.VIBRATE_PATTERN_NONE;
349 duration =IShowInformation.VIBRATE_PATTERN_NONE;
354 statusDrawer.vibrate(duration);
359 public boolean dispatchAreaAction(MotionEvent event, int areaFeatureNumber)
362 switch (areaFeatureNumber)
364 case ICameraFeatureDispatcher.FEATURE_AREA_ACTION_DRIVE_AUTOFOCUS:
365 ret = camera.driveAutoFocus(event);
368 case ICameraFeatureDispatcher.FEATURE_AREA_ACTION_NOT_CONNECTED:
372 // 実験... WIFIステート設定画面を開く
373 //Intent intent = new Intent(ACTION_ADD_NETWORK_SETTINGS);
374 Intent intent = new Intent(ACTION_NETWORK_SETTINGS);
375 context.startActivity(intent);
384 case ICameraFeatureDispatcher.FEATURE_AREA_ACTION_CHECK_CONTAINS_AUTOFOCUS_AREA:
385 // AUTOFOCUS エリアに含まれているかどうかチェックする
386 ret = camera.isContainsAutoFocusPoint(event);
389 case FEATURE_AREA_ACTION_NONE:
403 public String getTakeMode()
405 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
406 return (propertyProxy.getCameraPropertyValueTitle(propertyProxy.getCameraPropertyValue(IOlyCameraProperty.TAKE_MODE)));
411 * (P > A > S > M > ART > movie > iAuto > ...)
413 private void changeTakeMode()
415 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
416 String propetyValue = propertyProxy.getCameraPropertyValueTitle(propertyProxy.getCameraPropertyValue(IOlyCameraProperty.TAKE_MODE));
417 if (propetyValue == null)
422 String targetMode = "<" + IOlyCameraProperty.TAKE_MODE; // 変更先モード
423 switch (propetyValue)
426 targetMode = targetMode + "/A>";
430 targetMode = targetMode + "/S>";
434 targetMode = targetMode + "/M>";
438 targetMode = targetMode + "/ART>";
442 targetMode = targetMode + "/movie>";
446 targetMode = targetMode + "/iAuto>";
451 targetMode = targetMode + "/P>";
454 Log.v(TAG, "changeTakeMode() " + targetMode);
455 propertyProxy.setCameraPropertyValue(IOlyCameraProperty.TAKE_MODE, targetMode);
456 camera.unlockAutoFocus();
459 //camera.updateTakeMode();
464 * (iAuto < P < A < S < M < ART < movie < iAuto < ...)
466 private void changeTakeModeReverse()
468 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
469 String propetyValue = propertyProxy.getCameraPropertyValueTitle(propertyProxy.getCameraPropertyValue(IOlyCameraProperty.TAKE_MODE));
470 if (propetyValue == null)
475 String targetMode = "<" + IOlyCameraProperty.TAKE_MODE; // 変更先モード
476 switch (propetyValue)
479 targetMode = targetMode + "/iAuto>";
483 targetMode = targetMode + "/P>";
487 targetMode = targetMode + "/A>";
491 targetMode = targetMode + "/S>";
495 targetMode = targetMode + "/M>";
498 targetMode = targetMode + "/ART>";
502 targetMode = targetMode + "/movie>";
505 Log.v(TAG, "changeTakeMode() " + targetMode);
506 propertyProxy.setCameraPropertyValue(IOlyCameraProperty.TAKE_MODE, targetMode);
507 camera.unlockAutoFocus();
510 //camera.updateTakeMode();
515 * (現在は、連続撮影モードについてはまだ非対応)
517 private void pushShutterButton()
527 private void movieControl()
529 camera.movieControl();
535 private void toggleAfMf()
537 camera.toggleManualFocus();
541 * グリッド表示の ON/OFFを切り替える
544 private void changeShowGrid(int objectId)
546 liveImageView.toggleShowGridFrame();
547 updateGridStatusButton(objectId);
551 * デジタル水準器の ON/OFFを切り替える
554 private void changeShowLevelGauge()
556 liveImageView.toggleShowLevelGauge();
563 private void changeAeLockMode()
565 camera.toggleAutoExposure();
569 * グリッドフレームの表示・非表示ボタンを更新する
572 private void updateGridStatusButton(int buttonId)
575 if (liveImageView.isShowGrid())
577 // グリッドがON状態、グリッドをOFFにするボタンを出す
578 btnResId = R.drawable.btn_ic_grid_off;
582 // グリッドがOFF状態、グリッドをONにするボタンを出す
583 btnResId = R.drawable.btn_ic_grid_on;
585 statusDrawer.setButtonDrawable(buttonId, btnResId);
591 private void changeExposureBiasValueDown()
593 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
594 propertyProxy.updateCameraPropertyDown(IOlyCameraProperty.EXPOSURE_COMPENSATION);
601 private void changeExposureBiasValueUp()
603 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
604 propertyProxy.updateCameraPropertyUp(IOlyCameraProperty.EXPOSURE_COMPENSATION);
610 private void changeApertureValueDown()
612 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
613 propertyProxy.updateCameraPropertyDown(IOlyCameraProperty.APERTURE);
620 private void changeApertureValueUp()
622 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
623 propertyProxy.updateCameraPropertyUp(IOlyCameraProperty.APERTURE);
629 private void changeShutterSpeedDown()
631 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
632 propertyProxy.updateCameraPropertyDown(IOlyCameraProperty.SHUTTER_SPEED);
639 private void changeShutterSpeedUp()
641 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
642 propertyProxy.updateCameraPropertyUp(IOlyCameraProperty.SHUTTER_SPEED);
647 * 仕上がり・ピクチャーモードを1段階下げる
649 private void changeColorToneDown()
651 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
652 propertyProxy.updateCameraPropertyDown(IOlyCameraProperty.COLOR_TONE);
656 * 仕上がり・ピクチャーモードを1段階あげる
659 private void changeColorToneUp()
661 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
662 propertyProxy.updateCameraPropertyUp(IOlyCameraProperty.COLOR_TONE);
669 private void changeArtFilterDown()
671 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
672 propertyProxy.updateCameraPropertyDown(IOlyCameraProperty.ART_FILTER);
679 private void changeArtFilterUp()
681 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
682 propertyProxy.updateCameraPropertyUp(IOlyCameraProperty.ART_FILTER);
690 private void changeAEModeDown()
692 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
693 propertyProxy.updateCameraPropertyDown(IOlyCameraProperty.AE_MODE);
700 private void changeAEModeUp()
702 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
703 propertyProxy.updateCameraPropertyUp(IOlyCameraProperty.AE_MODE);
710 private void changeAEMode(int direction)
712 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
713 propertyProxy.changeCameraProperty(IOlyCameraProperty.AE_MODE, direction);
720 private void changeIsoSensitivityDown()
722 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
723 propertyProxy.updateCameraPropertyDown(IOlyCameraProperty.ISO_SENSITIVITY);
730 private void changeIsoSensitivityUp()
732 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
733 propertyProxy.updateCameraPropertyUp(IOlyCameraProperty.ISO_SENSITIVITY);
741 private void changeWhiteBalanceDown()
743 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
744 propertyProxy.updateCameraPropertyDown(IOlyCameraProperty.WB_MODE);
751 private void changeWhiteBalanceUp()
753 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
754 propertyProxy.updateCameraPropertyUp(IOlyCameraProperty.WB_MODE);
761 private void changeMovieQualityModeDown()
763 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
764 propertyProxy.updateCameraPropertyDown(IOlyCameraProperty.QUALITY_MOVIE);
771 private void changeMovieQualityModeUp()
773 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
774 propertyProxy.updateCameraPropertyUp(IOlyCameraProperty.QUALITY_MOVIE);
779 * 動画撮影モードがショートムービーのときの撮影時間を1段階さげる
782 private void changeShortMovieRecordLengthDown()
784 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
785 propertyProxy.updateCameraPropertyDown(IOlyCameraProperty.SHORT_MOVIE_RECORD_TIME);
789 * 動画撮影モードがショートムービーのときの撮影時間を1段階あげる
792 private void changeShortMovieRecordLengthUp()
794 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
795 propertyProxy.updateCameraPropertyUp(IOlyCameraProperty.SHORT_MOVIE_RECORD_TIME);
803 private void changeMovieTakeModeDown()
805 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
806 propertyProxy.updateCameraPropertyDown(IOlyCameraProperty.TAKE_MODE_MOVIE);
813 private void changeMovieTakeModeUp()
815 IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
816 propertyProxy.updateCameraPropertyUp(IOlyCameraProperty.TAKE_MODE_MOVIE);
822 * @param waitSeconds 撮影待ち時間(単位:秒)
824 private void intervalOneShot(int waitSeconds)
826 camera.bracketingShot(IBracketingShotStyle.BRACKET_NONE, 1, waitSeconds);
832 * @param style 撮影スタイル
835 private void bracketingShot(int style, int count)
837 camera.bracketingShot(style, count, 0);
845 private void showFavoriteDialog()
848 statusDrawer.showFavoriteSettingsDialog();
854 * @param direction ズーム操作の方向
857 private boolean driveZoomLens(int direction)
859 boolean isExecute = false;
860 IZoomLensHolder zoom = camera.getZoomLensHolder();
869 zoom.driveZoomLens(direction);
881 private void resetDigitalZoom()
883 IZoomLensHolder zoom = camera.getZoomLensHolder();
887 zoom.changeDigitalZoomScale(1.0f, false);
891 private boolean driveDigitalZoom(int zoomType)
893 boolean isExecute = false;
894 IZoomLensHolder zoom = camera.getZoomLensHolder();
899 float magnify = zoomType;
905 float currentScale = zoom.getCurrentDigitalZoomScale();
906 float targetScale = currentScale + magnify * 0.5f;
907 zoom.changeDigitalZoomScale(targetScale, (zoomType == 0));
915 * ライブビューのサイズを指定した倍率に拡大する(拡大中の場合にはもとに戻す。)
918 * @return 実行した場合true, 実行しなかった場合はfalse
920 private boolean changeLiveViewMagnify(int scale)
922 boolean isExecute = false;
923 IZoomLensHolder zoom = camera.getZoomLensHolder();
926 isExecute = zoom.magnifyLiveView(scale);
935 private void showSettingsScreen()
939 Log.v(TAG, " --- showSettingsScreen() ---");
940 ConfirmationDialog confirmation = new ConfirmationDialog(activity);
941 confirmation.show(R.string.change_title_from_opc_to_theta, R.string.change_message_from_opc_to_theta, new ConfirmationDialog.Callback() {
943 public void confirm() {
944 Log.v(TAG, " --- CONFIRMED! --- ");