OSDN Git Service

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