OSDN Git Service

1c5b66e7efa14d9c80e8707e6da30296072f1eb6
[gokigen/PKRemote.git] / app / src / main / java / net / osdn / gokigen / pkremote / preference / olympus / OpcPreferenceFragment.java
1 package net.osdn.gokigen.pkremote.preference.olympus;
2
3
4 import android.app.ProgressDialog;
5 import android.content.Context;
6 import android.content.SharedPreferences;
7 import android.os.Bundle;
8 import android.util.Log;
9
10 import net.osdn.gokigen.pkremote.R;
11 import net.osdn.gokigen.pkremote.camera.interfaces.IInterfaceProvider;
12 import net.osdn.gokigen.pkremote.camera.interfaces.control.ICameraRunMode;
13 import net.osdn.gokigen.pkremote.camera.interfaces.status.ICameraHardwareStatus;
14 import net.osdn.gokigen.pkremote.camera.vendor.olympus.operation.CameraPowerOff;
15 import net.osdn.gokigen.pkremote.camera.vendor.olympus.wrapper.property.IOlyCameraProperty;
16 import net.osdn.gokigen.pkremote.camera.vendor.olympus.wrapper.property.IOlyCameraPropertyProvider;
17 import net.osdn.gokigen.pkremote.logcat.LogCatViewer;
18 import net.osdn.gokigen.pkremote.preference.IPreferencePropertyAccessor;
19 import net.osdn.gokigen.pkremote.scene.IChangeScene;
20
21 import java.util.HashMap;
22 import java.util.Locale;
23 import java.util.Map;
24
25 import androidx.annotation.NonNull;
26 import androidx.appcompat.app.AppCompatActivity;
27 import androidx.fragment.app.FragmentActivity;
28 import androidx.preference.CheckBoxPreference;
29 import androidx.preference.ListPreference;
30 import androidx.preference.Preference;
31 import androidx.preference.PreferenceFragmentCompat;
32 import androidx.preference.PreferenceManager;
33 import jp.co.olympus.camerakit.OLYCamera;
34
35 /**
36  *   SettingFragment
37  *
38  */
39 public class OpcPreferenceFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener, OpcPreferenceSynchronizer.IPropertySynchronizeCallback
40 {
41     private final String TAG = toString();
42     private IOlyCameraPropertyProvider propertyInterface = null;
43     private ICameraHardwareStatus hardwareStatusInterface = null;
44     private ICameraRunMode changeRunModeExecutor = null;
45     private CameraPowerOff powerOffController = null;
46     private LogCatViewer logCatViewer = null;
47     private SharedPreferences preferences = null;
48     private ProgressDialog busyDialog = null;
49     private OpcPreferenceSynchronizer opcPreferenceSynchronizer = null;
50
51
52     public static OpcPreferenceFragment newInstance(@NonNull AppCompatActivity context, @NonNull IInterfaceProvider factory, @NonNull IChangeScene changeScene)
53     {
54         OpcPreferenceFragment instance = new OpcPreferenceFragment();
55         instance.setInterface(context, factory, changeScene);
56
57         // パラメータはBundleにまとめておく
58         Bundle arguments = new Bundle();
59         //arguments.putString("title", title);
60         //arguments.putString("message", message);
61         instance.setArguments(arguments);
62
63         return (instance);
64     }
65
66     /**
67      *
68      *
69      */
70     private void setInterface(@NonNull AppCompatActivity context, @NonNull IInterfaceProvider factory, @NonNull IChangeScene changeScene)
71     {
72         Log.v(TAG, "setInterface()");
73         this.propertyInterface = factory.getOlympusInterfaceProvider().getCameraPropertyProvider();
74         this.changeRunModeExecutor = factory.getCameraRunMode();
75         hardwareStatusInterface = factory.getHardwareStatus();
76         powerOffController = new CameraPowerOff(context, changeScene);
77         powerOffController.prepare();
78         logCatViewer = new LogCatViewer(changeScene);
79         logCatViewer.prepare();
80     }
81
82     /**
83      *
84      *
85      */
86     @Override
87     public void onAttach(Context activity)
88     {
89         super.onAttach(activity);
90         Log.v(TAG, "onAttach()");
91
92         // Preference をつかまえる
93         preferences = PreferenceManager.getDefaultSharedPreferences(activity);
94         if (opcPreferenceSynchronizer == null)
95         {
96             opcPreferenceSynchronizer = new OpcPreferenceSynchronizer(this.propertyInterface, preferences, this);
97         }
98
99         // Preference を初期設定する
100         initializePreferences();
101
102         preferences.registerOnSharedPreferenceChangeListener(this);
103     }
104
105     /**
106      * Preferenceの初期化...
107      */
108     private void initializePreferences()
109     {
110         Map<String, ?> items = preferences.getAll();
111         SharedPreferences.Editor editor = preferences.edit();
112
113         if (!items.containsKey(IPreferencePropertyAccessor.LIVE_VIEW_QUALITY))
114         {
115             editor.putString(IPreferencePropertyAccessor.LIVE_VIEW_QUALITY, IPreferencePropertyAccessor.LIVE_VIEW_QUALITY_DEFAULT_VALUE);
116         }
117         if (!items.containsKey(IPreferencePropertyAccessor.SOUND_VOLUME_LEVEL))
118         {
119             editor.putString(IPreferencePropertyAccessor.SOUND_VOLUME_LEVEL, IPreferencePropertyAccessor.SOUND_VOLUME_LEVEL_DEFAULT_VALUE);
120         }
121         if (!items.containsKey(IPreferencePropertyAccessor.RAW))
122         {
123             editor.putBoolean(IPreferencePropertyAccessor.RAW, true);
124         }
125         if (!items.containsKey(IPreferencePropertyAccessor.AUTO_CONNECT_TO_CAMERA))
126         {
127             editor.putBoolean(IPreferencePropertyAccessor.AUTO_CONNECT_TO_CAMERA, true);
128         }
129         if (!items.containsKey(IPreferencePropertyAccessor.CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW))
130         {
131             editor.putBoolean(IPreferencePropertyAccessor.CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW, true);
132         }
133         if (!items.containsKey(IPreferencePropertyAccessor.CONNECTION_METHOD))
134         {
135             editor.putString(IPreferencePropertyAccessor.CONNECTION_METHOD, IPreferencePropertyAccessor.CONNECTION_METHOD_DEFAULT_VALUE);
136         }
137         if (!items.containsKey(IPreferencePropertyAccessor.SHARE_AFTER_SAVE)) {
138             editor.putBoolean(IPreferencePropertyAccessor.SHARE_AFTER_SAVE, false);
139         }
140         if (!items.containsKey(IPreferencePropertyAccessor.USE_PLAYBACK_MENU)) {
141             editor.putBoolean(IPreferencePropertyAccessor.USE_PLAYBACK_MENU, true);
142         }
143         if (!items.containsKey(IPreferencePropertyAccessor.GR2_DISPLAY_CAMERA_VIEW)) {
144             editor.putBoolean(IPreferencePropertyAccessor.GR2_DISPLAY_CAMERA_VIEW, true);
145         }
146         if (!items.containsKey(IPreferencePropertyAccessor.GR2_LCD_SLEEP)) {
147             editor.putBoolean(IPreferencePropertyAccessor.GR2_LCD_SLEEP, false);
148         }
149         if (!items.containsKey(IPreferencePropertyAccessor.USE_GR2_SPECIAL_COMMAND)) {
150             editor.putBoolean(IPreferencePropertyAccessor.USE_GR2_SPECIAL_COMMAND, true);
151         }
152         if (!items.containsKey(IPreferencePropertyAccessor.PENTAX_CAPTURE_AFTER_AF)) {
153             editor.putBoolean(IPreferencePropertyAccessor.PENTAX_CAPTURE_AFTER_AF, false);
154         }
155         if (!items.containsKey(IPreferencePropertyAccessor.SMALL_PICTURE_SIZE)) {
156             editor.putString(IPreferencePropertyAccessor.SMALL_PICTURE_SIZE, IPreferencePropertyAccessor.SMALL_PICTURE_SIZE_DEFAULT_VALUE);
157         }
158         if (!items.containsKey(IPreferencePropertyAccessor.PEN_SMALL_PICTURE_SIZE)) {
159             editor.putString(IPreferencePropertyAccessor.PEN_SMALL_PICTURE_SIZE, IPreferencePropertyAccessor.PEN_SMALL_PICTURE_SIZE_DEFAULT_VALUE);
160         }
161         editor.apply();
162     }
163
164     /**
165      *
166      *
167      */
168     @Override
169     public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
170     {
171         Log.v(TAG, "onCreatePreferences()");
172
173         //super.onCreate(savedInstanceState);
174         addPreferencesFromResource(R.xml.preferences_opc);
175
176         {
177             final HashMap<String, String> sizeTable = new HashMap<>();
178             sizeTable.put("QVGA", "(320x240)");
179             sizeTable.put("VGA", "(640x480)");
180             sizeTable.put("SVGA", "(800x600)");
181             sizeTable.put("XGA", "(1024x768)");
182             sizeTable.put("QUAD_VGA", "(1280x960)");
183
184             ListPreference liveViewQuality = (ListPreference) findPreference(IPreferencePropertyAccessor.LIVE_VIEW_QUALITY);
185             liveViewQuality.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
186                 @Override
187                 public boolean onPreferenceChange(Preference preference, Object newValue) {
188                     String key = (String) newValue;
189                     preference.setSummary(newValue + " " + sizeTable.get(key));
190                     return (true);
191                 }
192             });
193             liveViewQuality.setSummary(liveViewQuality.getValue() + " " + sizeTable.get(liveViewQuality.getValue()));
194
195             ListPreference connectionMethod = (ListPreference) findPreference(IPreferencePropertyAccessor.CONNECTION_METHOD);
196             connectionMethod.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
197                 @Override
198                 public boolean onPreferenceChange(Preference preference, Object newValue) {
199                     preference.setSummary(newValue + " ");
200                     return (true);
201                 }
202             });
203             connectionMethod.setSummary(connectionMethod.getValue() + " ");
204
205             ListPreference smallPictureSize = (ListPreference) findPreference(IPreferencePropertyAccessor.SMALL_PICTURE_SIZE);
206             smallPictureSize.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
207                 @Override
208                 public boolean onPreferenceChange(Preference preference, Object newValue) {
209                     preference.setSummary(newValue + " ");
210                     return (true);
211                 }
212             });
213             smallPictureSize.setSummary(smallPictureSize.getValue() + " ");
214         }
215         findPreference("exit_application").setOnPreferenceClickListener(powerOffController);
216         findPreference("debug_info").setOnPreferenceClickListener(logCatViewer);
217     }
218
219     /**
220      * ハードウェアのサマリ情報を取得し設定する
221      */
222     private void setHardwareSummary()
223     {
224         // レンズ状態
225         findPreference("lens_status").setSummary(hardwareStatusInterface.getLensMountStatus());
226
227         // メディア状態
228         findPreference("media_status").setSummary(hardwareStatusInterface.getMediaMountStatus());
229
230         // 焦点距離
231         String focalLength;
232         float minLength = hardwareStatusInterface.getMinimumFocalLength();
233         float maxLength = hardwareStatusInterface.getMaximumFocalLength();
234         float actualLength = hardwareStatusInterface.getActualFocalLength();
235         if (minLength == maxLength)
236         {
237             focalLength = String.format(Locale.ENGLISH, "%3.0fmm", actualLength);
238         }
239         else
240         {
241             focalLength = String.format(Locale.ENGLISH, "%3.0fmm - %3.0fmm (%3.0fmm)", minLength, maxLength, actualLength);
242         }
243         findPreference("focal_length").setSummary(focalLength);
244
245         // カメラのバージョン
246         try
247         {
248             Map<String, Object> hardwareInformation = hardwareStatusInterface.inquireHardwareInformation();
249             findPreference("camera_version").setSummary((String) hardwareInformation.get(OLYCamera.HARDWARE_INFORMATION_CAMERA_FIRMWARE_VERSION_KEY));
250
251             // 取得した一覧はログに出力する。)
252             Log.v(TAG, "- - - - - - - - - -");
253             for (Map.Entry<String, Object> entry : hardwareInformation.entrySet())
254             {
255                 String value = (String) entry.getValue();
256                 Log.v(TAG, entry.getKey() + " : " + value);
257             }
258             Log.v(TAG, "- - - - - - - - - -");
259         }
260         catch (Exception e)
261         {
262             findPreference("camera_version").setSummary("Unknown");
263             e.printStackTrace();
264         }
265     }
266
267     /**
268      *
269      *
270      */
271     private void setCameraProperty(String name, String value)
272     {
273         try
274         {
275             String propertyValue = "<" + name + "/" + value + ">";
276             Log.v(TAG, "setCameraProperty() : " + propertyValue);
277             propertyInterface.setCameraPropertyValue(name, propertyValue);
278         }
279         catch (Exception e)
280         {
281             e.printStackTrace();
282         }
283     }
284
285     /**
286      *
287      *
288      */
289     @Override
290     public void onResume()
291     {
292         super.onResume();
293         Log.v(TAG, "onResume() Start");
294
295         // 撮影モードかどうかを確認して、撮影モードではなかったら撮影モードに切り替える
296         if ((changeRunModeExecutor != null) && (!changeRunModeExecutor.isRecordingMode()))
297         {
298             // Runモードを切り替える。(でも切り替えると、設定がクリアされてしまう...。
299             changeRunModeExecutor.changeRunMode(true);
300         }
301         synchronizeCameraProperties(true);
302         Log.v(TAG, "onResume() End");
303
304     }
305
306     /**
307      *
308      *
309      */
310     @Override
311     public void onPause()
312     {
313         super.onPause();
314         Log.v(TAG, "onPause() Start");
315
316         // Preference変更のリスナを解除
317         preferences.unregisterOnSharedPreferenceChangeListener(this);
318
319         Log.v(TAG, "onPause() End");
320     }
321
322     /**
323      * カメラプロパティとPreferenceとの同期処理を実行
324      */
325     private void synchronizeCameraProperties(boolean isPropertyLoad)
326     {
327         // 実行中ダイアログを取得する
328         busyDialog = new ProgressDialog(getActivity());
329         busyDialog.setTitle(getString(R.string.dialog_title_loading_properties));
330         busyDialog.setMessage(getString(R.string.dialog_message_loading_properties));
331         busyDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
332         busyDialog.setCancelable(false);
333         busyDialog.show();
334
335         // データ読み込み処理(別スレッドで実行)
336         if (isPropertyLoad)
337         {
338             new Thread(opcPreferenceSynchronizer).start();
339         }
340     }
341
342     /**
343      * Preferenceが更新された時に呼び出される処理
344      *
345      * @param sharedPreferences sharedPreferences
346      * @param key               変更されたキー
347      */
348     @Override
349     public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
350     {
351         Log.v(TAG, "onSharedPreferenceChanged() : " + key);
352         String propertyValue;
353         boolean value;
354         if (key != null)
355         {
356             switch (key)
357             {
358                 case IPreferencePropertyAccessor.RAW:
359                     value = preferences.getBoolean(key, true);
360                     setBooleanPreference(key, key, value);
361                     propertyValue = (value) ? "ON" : "OFF";
362                     setCameraProperty(IOlyCameraProperty.RAW, propertyValue);
363                     break;
364
365                 case IPreferencePropertyAccessor.AUTO_CONNECT_TO_CAMERA:
366                     value = preferences.getBoolean(key, true);
367                     Log.v(TAG, " " + key + " , " + value);
368                     break;
369
370                 case IPreferencePropertyAccessor.CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW:
371                     value = preferences.getBoolean(key, true);
372                     Log.v(TAG, " " + key + " , " + value);
373                     break;
374
375                 case IPreferencePropertyAccessor.SHARE_AFTER_SAVE:
376                     value = preferences.getBoolean(key, false);
377                     Log.v(TAG, " " + key + " , " + value);
378                     break;
379
380                 case IPreferencePropertyAccessor.USE_PLAYBACK_MENU:
381                     value = preferences.getBoolean(key, true);
382                     Log.v(TAG, " " + key + " , " + value);
383                     break;
384
385                 default:
386                     String strValue = preferences.getString(key, "");
387                     setListPreference(key, key, strValue);
388                     String propertyKey = convertKeyFromPreferenceToCameraPropertyKey(key);
389                     if (propertyKey != null)
390                     {
391                         setCameraProperty(propertyKey, strValue);
392                     }
393                     break;
394             }
395         }
396     }
397
398     /**
399      * ListPreference の表示データを設定
400      *
401      * @param pref_key     Preference(表示)のキー
402      * @param key          Preference(データ)のキー
403      * @param defaultValue Preferenceのデフォルト値
404      */
405     private void setListPreference(String pref_key, String key, String defaultValue)
406     {
407         ListPreference pref;
408         pref = (ListPreference) findPreference(pref_key);
409         String value = preferences.getString(key, defaultValue);
410         if (pref != null)
411         {
412             pref.setValue(value);
413             pref.setSummary(value);
414         }
415     }
416
417     /**
418      * BooleanPreference の表示データを設定
419      *
420      * @param pref_key     Preference(表示)のキー
421      * @param key          Preference(データ)のキー
422      * @param defaultValue Preferenceのデフォルト値
423      */
424     private void setBooleanPreference(String pref_key, String key, boolean defaultValue)
425     {
426         CheckBoxPreference pref = (CheckBoxPreference) findPreference(pref_key);
427         if (pref != null)
428         {
429             boolean value = preferences.getBoolean(key, defaultValue);
430             pref.setChecked(value);
431         }
432     }
433
434     /**
435      *
436      *
437      */
438     private String convertKeyFromPreferenceToCameraPropertyKey(String key)
439     {
440         String target = null;
441         if (key == null)
442         {
443             return (null);
444         }
445         switch (key)
446         {
447             case IPreferencePropertyAccessor.SOUND_VOLUME_LEVEL:
448                 target = IOlyCameraProperty.SOUND_VOLUME_LEVEL;
449                 break;
450
451             default:
452                 // target == null
453                 break;
454         }
455         return (target);
456     }
457
458     /**
459      * カメラプロパティの同期処理終了通知
460      */
461     @Override
462     public void synchronizedProperty()
463     {
464         FragmentActivity activity = getActivity();
465         if (activity == null)
466         {
467             try
468             {
469                 busyDialog.dismiss();
470                 busyDialog = null;
471             }
472             catch (Exception e)
473             {
474                 e.printStackTrace();
475             }
476             return;
477         }
478         activity.runOnUiThread(new Runnable() {
479             @Override
480             public void run() {
481                 try {
482                     // Preferenceの画面に反映させる
483                     setListPreference(IPreferencePropertyAccessor.SOUND_VOLUME_LEVEL, IPreferencePropertyAccessor.SOUND_VOLUME_LEVEL, IPreferencePropertyAccessor.SOUND_VOLUME_LEVEL_DEFAULT_VALUE);
484                     setBooleanPreference(IPreferencePropertyAccessor.RAW, IPreferencePropertyAccessor.RAW, true);
485                     setBooleanPreference(IPreferencePropertyAccessor.AUTO_CONNECT_TO_CAMERA, IPreferencePropertyAccessor.AUTO_CONNECT_TO_CAMERA, true);
486                     setBooleanPreference(IPreferencePropertyAccessor.SHARE_AFTER_SAVE, IPreferencePropertyAccessor.SHARE_AFTER_SAVE, false);
487
488                     // カメラキットのバージョン
489                     findPreference(IPreferencePropertyAccessor.CAMERAKIT_VERSION).setSummary(OLYCamera.getVersion());
490                     if (hardwareStatusInterface != null)
491                     {
492                         // その他のハードウェア情報の情報設定
493                         setHardwareSummary();
494                     }
495
496                     // 実行中ダイアログを消す
497                     busyDialog.dismiss();
498                     busyDialog = null;
499                 }
500                 catch (Exception e)
501                 {
502                     e.printStackTrace();
503                 }
504             }
505         });
506     }
507 }