1 package net.osdn.gokigen.gr2control.liveview;
3 import android.app.Activity;
4 import android.content.Context;
5 import android.content.SharedPreferences;
6 import android.graphics.Color;
7 import android.graphics.drawable.Drawable;
8 import android.os.Bundle;
9 import android.os.Vibrator;
10 import android.support.annotation.NonNull;
11 import android.support.v4.app.Fragment;
12 import android.support.v4.app.FragmentManager;
13 import android.support.v4.content.ContextCompat;
14 import android.support.v4.content.res.ResourcesCompat;
15 import android.support.v4.graphics.drawable.DrawableCompat;
16 import android.support.v7.app.ActionBar;
17 import android.support.v7.app.AppCompatActivity;
18 import android.support.v7.preference.PreferenceManager;
19 import android.util.Log;
20 import android.view.LayoutInflater;
21 import android.view.View;
22 import android.view.ViewGroup;
23 import android.widget.Button;
24 import android.widget.ImageView;
25 import android.widget.TextView;
27 import net.osdn.gokigen.gr2control.R;
28 import net.osdn.gokigen.gr2control.camera.ICameraButtonControl;
29 import net.osdn.gokigen.gr2control.camera.ICameraConnection;
30 import net.osdn.gokigen.gr2control.camera.ICameraInformation;
31 import net.osdn.gokigen.gr2control.camera.ICameraRunMode;
32 import net.osdn.gokigen.gr2control.camera.ICameraStatus;
33 import net.osdn.gokigen.gr2control.camera.ICameraStatusWatcher;
34 import net.osdn.gokigen.gr2control.camera.IDisplayInjector;
35 import net.osdn.gokigen.gr2control.camera.IFocusingModeNotify;
36 import net.osdn.gokigen.gr2control.camera.IInterfaceProvider;
37 import net.osdn.gokigen.gr2control.camera.ILiveViewControl;
38 import net.osdn.gokigen.gr2control.camera.IZoomLensControl;
39 import net.osdn.gokigen.gr2control.camera.olympus.myolycameraprops.LoadSaveCameraProperties;
40 import net.osdn.gokigen.gr2control.camera.olympus.myolycameraprops.LoadSaveMyCameraPropertyDialog;
41 import net.osdn.gokigen.gr2control.liveview.liveviewlistener.ILiveViewListener;
42 import net.osdn.gokigen.gr2control.preference.IPreferencePropertyAccessor;
43 import net.osdn.gokigen.gr2control.scene.IChangeScene;
45 import static android.content.Context.VIBRATOR_SERVICE;
51 public class LiveViewFragment extends Fragment implements IStatusViewDrawer, IFocusingModeNotify, IFavoriteSettingDialogKicker, ICameraStatusUpdateNotify, LiveViewKeyPanelClickListener.KeyPanelFeedback
53 private final String TAG = this.toString();
55 private ILiveViewControl liveViewControl = null;
56 private IZoomLensControl zoomLensControl = null;
57 private IInterfaceProvider interfaceProvider = null;
58 private IDisplayInjector interfaceInjector = null;
59 //private OlympusCameraLiveViewListenerImpl liveViewListener = null;
60 private IChangeScene changeScene = null;
61 private ICameraInformation cameraInformation = null;
62 private ICameraStatusWatcher statusWatcher = null;
63 private LiveViewClickTouchListener onClickTouchListener = null;
64 private LiveViewControlPanelClickListener onPanelClickListener = null;
65 private LiveViewKeyPanelClickListener onKeyPanelClickListener = null;
67 private TextView statusArea = null;
68 private TextView focalLengthArea = null;
69 private CameraLiveImageView imageView = null;
71 private ImageView manualFocus = null;
72 private ImageView showGrid = null;
73 private ImageView connectStatus = null;
74 private Button changeLiveViewScale = null;
76 private boolean imageViewCreated = false;
77 private View myView = null;
78 private String messageValue = "";
80 private ICameraConnection.CameraConnectionStatus currentConnectionStatus = ICameraConnection.CameraConnectionStatus.UNKNOWN;
82 public static LiveViewFragment newInstance(IChangeScene sceneSelector, @NonNull IInterfaceProvider provider)
84 LiveViewFragment instance = new LiveViewFragment();
85 instance.prepare(sceneSelector, provider);
87 // パラメータはBundleにまとめておく
88 Bundle arguments = new Bundle();
89 //arguments.putString("title", title);
90 //arguments.putString("message", message);
91 instance.setArguments(arguments);
101 public void onCreate(Bundle savedInstanceState)
103 super.onCreate(savedInstanceState);
104 Log.v(TAG, "onCreate()");
106 if (liveViewListener == null)
108 liveViewListener = new OlympusCameraLiveViewListenerImpl();
118 public void onAttach(Context context)
120 super.onAttach(context);
121 Log.v(TAG, "onAttach()");
129 public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
131 super.onCreateView(inflater, container, savedInstanceState);
133 Log.v(TAG, "onCreateView()");
134 if ((imageViewCreated)&&(myView != null))
137 Log.v(TAG, "onCreateView() : called again, so do nothing... : " + myView);
141 View view = inflater.inflate(R.layout.fragment_live_view, container, false);
143 imageViewCreated = true;
147 imageView = view.findViewById(R.id.cameraLiveImageView);
148 if (interfaceInjector != null)
150 interfaceInjector.injectDisplay(imageView, imageView, this);
154 Log.v(TAG, "interfaceInjector is NULL...");
156 Activity activity = this.getActivity();
157 Vibrator vibrator = (activity != null) ? (Vibrator) activity.getSystemService(VIBRATOR_SERVICE) : null;
158 if ((onClickTouchListener == null)&&(activity != null))
160 onClickTouchListener = new LiveViewClickTouchListener(activity, imageView, this, changeScene, interfaceProvider, this);
162 imageView.setOnClickListener(onClickTouchListener);
163 imageView.setOnTouchListener(onClickTouchListener);
165 setOnClickListener(view, R.id.hideControlPanelTextView);
166 setOnClickListener(view, R.id.showControlPanelTextView);
167 setOnClickListener(view, R.id.showKeyPanelImageView);
168 setOnClickListener(view, R.id.hideKeyPanelTextView);
169 setOnClickListener(view, R.id.shutter_button);
170 setOnClickListener(view, R.id.focusUnlockImageView);
171 setOnClickListener(view, R.id.show_images_button);
172 setOnClickListener(view, R.id.camera_power_off_button);
173 setOnClickListener(view, R.id.show_preference_button);
174 setOnClickListener(view, R.id.show_hide_grid_button);
175 setOnClickListener(view, R.id.zoom_in_button);
176 setOnClickListener(view, R.id.zoom_out_button);
177 setOnClickListener(view, R.id.specialButtonImageView);
179 if (onPanelClickListener == null)
181 onPanelClickListener = new LiveViewControlPanelClickListener(activity, interfaceProvider);
183 setPanelClickListener(view, R.id.takemodeTextView);
184 setPanelClickListener(view, R.id.shutterSpeedTextView);
185 setPanelClickListener(view, R.id.apertureValueTextView);
186 setPanelClickListener(view, R.id.exposureCompensationTextView);
187 setPanelClickListener(view, R.id.aeModeImageView);
188 setPanelClickListener(view, R.id.whiteBalanceTextView);
189 setPanelClickListener(view, R.id.isoSensitivityTextView);
190 setPanelClickListener(view, R.id.setEffectImageView);
192 if (onKeyPanelClickListener == null)
194 onKeyPanelClickListener = new LiveViewKeyPanelClickListener(interfaceProvider, this, vibrator);
196 setKeyPanelClickListener(view, R.id.button_front_left);
197 setKeyPanelClickListener(view, R.id.button_front_right);
198 setKeyPanelClickListener(view, R.id.button_adjust_left);
199 setKeyPanelClickListener(view, R.id.button_adjust_enter);
200 setKeyPanelClickListener(view, R.id.button_adjust_right);
201 setKeyPanelClickListener(view, R.id.button_toggle_aeaf);
202 setKeyPanelClickListener(view, R.id.lever_ael_caf);
203 setKeyPanelClickListener(view, R.id.button_up);
204 setKeyPanelClickListener(view, R.id.button_left);
205 setKeyPanelClickListener(view, R.id.button_center_enter);
206 setKeyPanelClickListener(view, R.id.button_right);
207 setKeyPanelClickListener(view, R.id.button_down);
208 setKeyPanelClickListener(view, R.id.button_function_1);
209 setKeyPanelClickListener(view, R.id.button_function_2);
210 setKeyPanelClickListener(view, R.id.button_function_3);
211 setKeyPanelClickListener(view, R.id.button_plus);
212 setKeyPanelClickListener(view, R.id.button_minus);
213 setKeyPanelClickListener(view, R.id.button_playback);
214 setKeyPanelClickListener(view, R.id.button_acclock);
215 setKeyPanelClickListener(view, R.id.button_lcd_onoff);
216 setKeyPanelClickListener(view, R.id.button_highlight);
218 connectStatus = view.findViewById(R.id.connect_disconnect_button);
219 if (connectStatus != null)
221 connectStatus.setOnClickListener(onClickTouchListener);
224 View keyPanel = view.findViewById(R.id.showKeyPanelImageView);
225 ICameraButtonControl buttonControl = interfaceProvider.getButtonControl();
226 if (keyPanel != null)
228 keyPanel.setVisibility((buttonControl == null) ? View.INVISIBLE : View.VISIBLE);
229 keyPanel.invalidate();
240 private void setOnClickListener(View view, int id)
244 View button = view.findViewById(id);
247 button.setOnClickListener(onClickTouchListener);
256 private void setPanelClickListener(View view, int id)
260 View button = view.findViewById(id);
263 button.setOnClickListener(onPanelClickListener);
272 private void setKeyPanelClickListener(View view, int id)
276 View button = view.findViewById(id);
279 button.setOnClickListener(onKeyPanelClickListener);
291 private void prepare(IChangeScene sceneSelector, IInterfaceProvider interfaceProvider)
293 Log.v(TAG, "prepare()");
295 this.changeScene = sceneSelector;
296 this.interfaceProvider = interfaceProvider;
297 this.interfaceInjector = interfaceProvider.getDisplayInjector();
298 this.liveViewControl = interfaceProvider.getLiveViewControl();
299 this.zoomLensControl = interfaceProvider.getZoomLensControl();
300 this.cameraInformation = interfaceProvider.getCameraInformation();
301 this.statusWatcher = interfaceProvider.getCameraStatusWatcher();
309 public void updateConnectionStatus(final ICameraConnection.CameraConnectionStatus connectionStatus)
313 currentConnectionStatus = connectionStatus;
314 runOnUiThread(new Runnable()
319 int id = R.drawable.ic_cloud_off_black_24dp;
320 if (currentConnectionStatus == ICameraConnection.CameraConnectionStatus.CONNECTING)
322 id = R.drawable.ic_cloud_queue_black_24dp;
324 else if (currentConnectionStatus == ICameraConnection.CameraConnectionStatus.CONNECTED)
326 id = R.drawable.ic_cloud_done_black_24dp;
328 if (connectStatus != null)
330 connectStatus.setImageDrawable(ResourcesCompat.getDrawable(getResources(), id, null));
331 connectStatus.invalidate();
333 if (imageView != null)
335 imageView.invalidate();
352 public void updateGridIcon()
356 Activity activity = getActivity();
357 if (activity != null)
359 if (showGrid == null) {
360 showGrid = activity.findViewById(R.id.show_hide_grid_button);
362 activity.runOnUiThread(new Runnable() {
366 int id = (imageView.isShowGrid()) ? R.drawable.ic_grid_off_black_24dp : R.drawable.ic_grid_on_black_24dp;
367 if (showGrid != null)
369 showGrid.setImageDrawable(ResourcesCompat.getDrawable(getResources(), id, null));
370 showGrid.invalidate();
372 imageView.invalidate();
388 public void changedFocusingMode()
392 if ((cameraInformation == null)||(manualFocus == null))
396 runOnUiThread(new Runnable()
401 if (currentConnectionStatus == ICameraConnection.CameraConnectionStatus.CONNECTED)
403 manualFocus.setSelected(cameraInformation.isManualFocus());
404 manualFocus.invalidate();
416 public void updateLiveViewScale(boolean isChangeScale)
420 Log.v(TAG, "updateLiveViewScale() : " + isChangeScale);
423 liveViewControl.updateMagnifyingLiveViewScale(isChangeScale);
426 float scale = liveViewControl.getMagnifyingLiveViewScale();
427 final String datavalue = "LV: " + scale;
430 float digitalZoom = liveViewControl.getDigitalZoomScale();
431 final String digitalValue = (digitalZoom > 1.0f) ? "D x" + digitalZoom : "";
434 runOnUiThread(new Runnable()
439 changeLiveViewScale.setText(datavalue);
440 changeLiveViewScale.postInvalidate();
442 focalLengthArea.setText(digitalValue);
443 focalLengthArea.postInvalidate();
459 public void onStart()
462 Log.v(TAG, "onStart()");
470 public void onResume()
473 Log.v(TAG, "onResume() Start");
475 AppCompatActivity activity = (AppCompatActivity)getActivity();
476 if (activity != null)
478 ActionBar bar = activity.getSupportActionBar();
481 bar.hide(); // ActionBarの表示を消す
485 // 撮影モードかどうかを確認して、撮影モードではなかったら撮影モードに切り替える
486 ICameraRunMode changeRunModeExecutor = interfaceProvider.getCameraRunMode();
487 if ((changeRunModeExecutor != null)&&(!changeRunModeExecutor.isRecordingMode()))
489 // Runモードを切り替える。(でも切り替えると、設定がクリアされてしまう...。)
490 changeRunModeExecutor.changeRunMode(true);
496 Context context = getContext();
499 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getContext());
501 // グリッド・フォーカスアシストの情報を戻す
502 boolean showGrid = preferences.getBoolean(IPreferencePropertyAccessor.SHOW_GRID_STATUS, false);
503 if ((imageView != null) && (imageView.isShowGrid() != showGrid)) {
504 imageView.toggleShowGridFrame();
505 imageView.postInvalidate();
508 if (currentConnectionStatus == ICameraConnection.CameraConnectionStatus.CONNECTED)
517 Log.v(TAG, "onResume() End");
525 public void onPause()
528 Log.v(TAG, "onPause() Start");
533 liveViewControl.stopLiveView();
541 Log.v(TAG, "onPause() End");
549 public void updateStatusView(String message)
551 messageValue = message;
552 runOnUiThread(new Runnable()
555 * カメラの状態(ステータステキスト)を更新する
556 * (ステータステキストは、プライベート変数で保持して、書き換える)
561 if (statusArea != null)
563 statusArea.setText(messageValue);
564 statusArea.invalidate();
575 public void startLiveView()
577 ICameraConnection.CameraConnectionMethod connectionMethod = interfaceProvider.getCammeraConnectionMethod();
578 if (liveViewControl == null)
580 if (connectionMethod == ICameraConnection.CameraConnectionMethod.OPC)
582 Log.v(TAG, "startLiveView() : liveViewControl is null.");
588 prepare(changeScene, interfaceProvider);
594 Context context = getContext();
595 boolean isCameraScreen = true;
598 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
599 liveViewControl.changeLiveViewSize(preferences.getString(IPreferencePropertyAccessor.LIVE_VIEW_QUALITY, IPreferencePropertyAccessor.LIVE_VIEW_QUALITY_DEFAULT_VALUE));
600 isCameraScreen = preferences.getBoolean(IPreferencePropertyAccessor.GR2_DISPLAY_CAMERA_VIEW, true);
602 ILiveViewListener lvListener = interfaceProvider.getLiveViewListener();
603 if (lvListener != null)
605 lvListener.setCameraLiveImageView(imageView);
607 liveViewControl.startLiveView(isCameraScreen); // false : ライブビューのみ、 true : カメラ画面をミラー
612 // ここでズームレンズ制御ができるか確認する
613 if ((zoomLensControl != null)&&(zoomLensControl.canZoom()))
615 //Log.v(TAG, "CAN ZOOM LENS");
616 updateZoomlensControl(true);
620 //Log.v(TAG, "NO ZOOM LENS");
621 updateZoomlensControl(false);
635 public void showFavoriteSettingDialog()
639 Log.v(TAG, "showFavoriteSettingDialog()");
640 LoadSaveMyCameraPropertyDialog dialog = LoadSaveMyCameraPropertyDialog.newInstance(new LoadSaveCameraProperties(getActivity(), interfaceProvider.getOlympusInterfaceProvider()));
641 dialog.show(getChildFragmentManager(), "favorite_dialog");
654 private void updateZoomlensControl(final boolean isVisible)
656 runOnUiThread(new Runnable() {
659 // isVisibleがtrueなら、ズームレンズボタンを有効にする
660 Activity activity = getActivity();
661 if (activity != null)
665 View view1 = activity.findViewById(R.id.zoom_out_button);
668 view1.setVisibility((isVisible) ? View.VISIBLE : View.INVISIBLE);
672 View view2 = activity.findViewById(R.id.zoom_in_button);
675 view2.setVisibility((isVisible) ? View.VISIBLE : View.INVISIBLE);
692 private void startWatchStatus()
694 if (statusWatcher != null)
696 statusWatcher.startStatusWatch(this);
704 private void stopWatchStatus()
706 if (statusWatcher != null)
708 statusWatcher.stopStatusWatch();
716 private void runOnUiThread(Runnable action)
718 Activity activity = getActivity();
719 if (activity == null)
723 activity.runOnUiThread(action);
727 public void updatedTakeMode(final String mode)
731 final Activity activity = getActivity();
732 if (activity == null)
736 activity.runOnUiThread(new Runnable()
741 TextView view = activity.findViewById(R.id.takemodeTextView);
757 public void updatedShutterSpeed(final String tv)
761 final String shutterSpeed = tv.replace(".", "/");
762 final Activity activity = getActivity();
763 if (activity == null)
767 activity.runOnUiThread(new Runnable()
772 TextView view = activity.findViewById(R.id.shutterSpeedTextView);
774 view.setText(shutterSpeed);
788 public void updatedAperture(final String av)
792 final String apertureValue = (av.length() > 1) ? ("F" + av) : "";
793 final Activity activity = getActivity();
794 if (activity == null)
798 activity.runOnUiThread(new Runnable()
803 TextView view = activity.findViewById(R.id.apertureValueTextView);
806 view.setText(apertureValue);
819 public void updatedExposureCompensation(final String xv)
823 final Activity activity = getActivity();
824 if (activity == null)
828 activity.runOnUiThread(new Runnable()
833 TextView view = activity.findViewById(R.id.exposureCompensationTextView);
849 public void updatedMeteringMode(final String meteringMode)
853 Log.v(TAG, "updatedMeteringMode() : " + meteringMode);
854 final Activity activity = getActivity();
855 if ((activity == null)||(meteringMode == null))
860 int iconId = R.drawable.ic_crop_free_black_24dp;
861 switch (meteringMode)
863 case ICameraStatus.AE_STATUS_MULTI:
864 case ICameraStatus.AE_STATUS_ESP:
865 iconId = R.drawable.ic_crop_free_black_24dp;
867 case ICameraStatus.AE_STATUS_CENTER:
868 case ICameraStatus.AE_STATUS_CENTER2:
869 iconId = R.drawable.ic_center_focus_weak_black_24dp;
871 case ICameraStatus.AE_STATUS_SPOT:
872 case ICameraStatus.AE_STATUS_PINPOINT:
873 iconId = R.drawable.ic_filter_center_focus_black_24dp;
876 final int id = iconId;
877 activity.runOnUiThread(new Runnable()
882 ImageView view = activity.findViewById(R.id.aeModeImageView);
885 view.setImageDrawable(ResourcesCompat.getDrawable(getResources(), id, null));
898 public void updatedWBMode(final String wbMode)
900 // とりあえず何もしない... 選択肢は以下 (Ricohの場合...)
901 // auto, multiAuto, daylight, shade, cloud, tungsten, warmWhiteFluorescent, daylightFluorescent, dayWhiteFluorescent, coolWhiteFluorescent, incandescent,manual1, cte, custom
909 public void updateRemainBattery(final int percentage)
913 final Activity activity = getActivity();
914 if (activity == null)
921 iconId = R.drawable.ic_battery_alert_black_24dp;
923 else if (percentage < 60)
925 iconId = R.drawable.ic_battery_20_black_24dp;
927 else if (percentage < 80)
929 iconId = R.drawable.ic_battery_60_black_24dp;
933 iconId = R.drawable.ic_battery_full_black_24dp;
935 final int id = iconId;
936 activity.runOnUiThread(new Runnable()
941 ImageView view = activity.findViewById(R.id.currentBatteryImageView);
944 Drawable target = ResourcesCompat.getDrawable(getResources(), id, null);
947 if (percentage <= 20)
949 DrawableCompat.setTint(target, Color.RED);
950 } else if (percentage <= 40)
952 DrawableCompat.setTint(target, Color.YELLOW);
954 view.setImageDrawable(target);
968 public void updateFocusedStatus(final boolean focused, final boolean focusLocked)
970 Activity activity = getActivity();
973 if (activity != null)
975 activity.runOnUiThread(new Runnable() {
978 ImageView view = getActivity().findViewById(R.id.focusUnlockImageView);
981 Drawable icon = ResourcesCompat.getDrawable(getResources(), R.drawable.ic_center_focus_strong_black_24dp, null);
984 DrawableCompat.setTint(icon, Color.GREEN);
985 view.setImageDrawable(icon);
990 Drawable icon = ResourcesCompat.getDrawable(getResources(), R.drawable.ic_focus_free_black_24dp, null);
993 int color = Color.BLACK;
998 DrawableCompat.setTint(icon, color);
999 view.setImageDrawable(icon);
1009 e.printStackTrace();
1014 public void updateIsoSensitivity(String sv)
1016 Log.v(TAG, "updateIsoSensitivity : " + sv);
1020 public void updateWarning(String warning)
1022 Log.v(TAG, "updateWarning : " + warning);
1026 public void updateStorageStatus(String status)
1028 Log.v(TAG, "updateStorageStatus : " + status);
1032 public void updateToggleButton(boolean isOn)
1036 Activity activity = getActivity();
1037 if (activity != null)
1039 ImageView imageView = activity.findViewById(R.id.button_toggle_aeaf);
1042 imageView.setImageDrawable(ContextCompat.getDrawable(activity,R.drawable.ic_radio_button_checked_black_24dp));
1046 imageView.setImageDrawable(ContextCompat.getDrawable(activity,R.drawable.ic_radio_button_unchecked_black_24dp));
1048 imageView.invalidate();
1053 e.printStackTrace();
1058 public void updateLcdOnOff(boolean isOn)
1060 Log.v(TAG, "updateLcdOnOff() " + isOn);
1064 public void updateAFLlever(boolean isCaf)
1068 Activity activity = getActivity();
1069 if (activity != null)
1071 TextView textView = activity.findViewById(R.id.lever_ael_caf);
1074 textView.setText(getString(R.string.label_c_af));
1078 textView.setText(getString(R.string.label_aelock));
1080 textView.invalidate();
1085 e.printStackTrace();