1 package net.osdn.gokigen.a01d.preference;
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;
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;
28 import java.util.HashMap;
29 import java.util.Locale;
32 import jp.co.olympus.camerakit.OLYCamera;
39 public class PreferenceFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener, PreferenceSynchronizer.IPropertySynchronizeCallback
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;
56 public void setInterface(AppCompatActivity context, IInterfaceProvider factory, IChangeScene changeScene)
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();
75 public void onAttach(Context activity)
77 super.onAttach(activity);
78 Log.v(TAG, "onAttach()");
81 preferences = PreferenceManager.getDefaultSharedPreferences(activity);
82 if (preferenceSynchronizer == null)
84 preferenceSynchronizer = new PreferenceSynchronizer(this.propertyInterface, preferences, this);
88 initializePreferences();
90 preferences.registerOnSharedPreferenceChangeListener(this);
96 private void initializePreferences()
98 Map<String, ?> items = preferences.getAll();
99 SharedPreferences.Editor editor = preferences.edit();
101 if (!items.containsKey(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.TAKE_MODE))
103 editor.putString(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.TAKE_MODE, net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.TAKE_MODE_DEFAULT_VALUE);
105 if (!items.containsKey(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.LIVE_VIEW_QUALITY))
107 editor.putString(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.LIVE_VIEW_QUALITY, net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.LIVE_VIEW_QUALITY_DEFAULT_VALUE);
109 if (!items.containsKey(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.SOUND_VOLUME_LEVEL))
111 editor.putString(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.SOUND_VOLUME_LEVEL, net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.SOUND_VOLUME_LEVEL_DEFAULT_VALUE);
113 if (!items.containsKey(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.RAW))
115 editor.putBoolean(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.RAW, true);
117 if (!items.containsKey(IPreferencePropertyAccessor.BLE_POWER_ON))
119 editor.putBoolean(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.BLE_POWER_ON, false);
121 if (!items.containsKey(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.AUTO_CONNECT_TO_CAMERA))
123 editor.putBoolean(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.AUTO_CONNECT_TO_CAMERA, true);
125 if (!items.containsKey(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW))
127 editor.putBoolean(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW, true);
129 if (!items.containsKey(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.SOUND_VOLUME_LEVEL))
131 editor.putString(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.SOUND_VOLUME_LEVEL, net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.SOUND_VOLUME_LEVEL_DEFAULT_VALUE);
133 if (!items.containsKey(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.MAGNIFYING_LIVE_VIEW_SCALE))
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);
137 if (!items.containsKey(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.DIGITAL_ZOOM_LEVEL))
139 editor.putString(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.DIGITAL_ZOOM_LEVEL, net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.DIGITAL_ZOOM_LEVEL_DEFAULT_VALUE);
141 if (!items.containsKey(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.POWER_ZOOM_LEVEL))
143 editor.putString(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.POWER_ZOOM_LEVEL, net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.POWER_ZOOM_LEVEL_DEFAULT_VALUE);
145 if (!items.containsKey(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.CONNECTION_METHOD))
147 editor.putString(net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.CONNECTION_METHOD, net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.CONNECTION_METHOD_DEFAULT_VALUE);
157 public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
159 Log.v(TAG, "onCreatePreferences()");
161 //super.onCreate(savedInstanceState);
162 addPreferencesFromResource(R.xml.preferences);
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)");
172 ListPreference liveViewQuality = (ListPreference) findPreference(IPreferencePropertyAccessor.LIVE_VIEW_QUALITY);
173 liveViewQuality.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
175 public boolean onPreferenceChange(Preference preference, Object newValue) {
176 String key = (String) newValue;
177 preference.setSummary(newValue + " " + sizeTable.get(key));
181 liveViewQuality.setSummary(liveViewQuality.getValue() + " " + sizeTable.get(liveViewQuality.getValue()));
183 ListPreference liveViewScale = (ListPreference) findPreference(IPreferencePropertyAccessor.MAGNIFYING_LIVE_VIEW_SCALE);
184 liveViewScale.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
186 public boolean onPreferenceChange(Preference preference, Object newValue) {
187 preference.setSummary(newValue + " ");
191 liveViewScale.setSummary(liveViewScale.getValue() + " ");
193 ListPreference digitalZoom = (ListPreference) findPreference(IPreferencePropertyAccessor.DIGITAL_ZOOM_LEVEL);
194 digitalZoom.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
196 public boolean onPreferenceChange(Preference preference, Object newValue) {
197 preference.setSummary(newValue + " ");
201 digitalZoom.setSummary(digitalZoom.getValue() + " ");
203 ListPreference powerZoom = (ListPreference) findPreference(IPreferencePropertyAccessor.POWER_ZOOM_LEVEL);
204 powerZoom.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
206 public boolean onPreferenceChange(Preference preference, Object newValue) {
207 preference.setSummary(newValue + " ");
211 powerZoom.setSummary(powerZoom.getValue() + " ");
213 ListPreference connectionMethod = (ListPreference) findPreference(IPreferencePropertyAccessor.CONNECTION_METHOD);
214 connectionMethod.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
216 public boolean onPreferenceChange(Preference preference, Object newValue) {
217 preference.setSummary(newValue + " ");
221 connectionMethod.setSummary(connectionMethod.getValue() + " ");
223 findPreference("exit_application").setOnPreferenceClickListener(powerOffController);
224 findPreference("olympus_air_bt").setOnPreferenceClickListener(powerOnSelector);
225 findPreference("debug_info").setOnPreferenceClickListener(logCatViewer);
229 * ハードウェアのサマリ情報を取得し設定する
231 private void setHardwareSummary()
234 findPreference("lens_status").setSummary(hardwareStatusInterface.getLensMountStatus());
237 findPreference("media_status").setSummary(hardwareStatusInterface.getMediaMountStatus());
241 float minLength = hardwareStatusInterface.getMinimumFocalLength();
242 float maxLength = hardwareStatusInterface.getMaximumFocalLength();
243 float actualLength = hardwareStatusInterface.getActualFocalLength();
244 if (minLength == maxLength)
246 focalLength = String.format(Locale.ENGLISH, "%3.0fmm", actualLength);
250 focalLength = String.format(Locale.ENGLISH, "%3.0fmm - %3.0fmm (%3.0fmm)", minLength, maxLength, actualLength);
252 findPreference("focal_length").setSummary(focalLength);
257 Map<String, Object> hardwareInformation = hardwareStatusInterface.inquireHardwareInformation();
258 findPreference("camera_version").setSummary((String) hardwareInformation.get(OLYCamera.HARDWARE_INFORMATION_CAMERA_FIRMWARE_VERSION_KEY));
261 Log.v(TAG, "- - - - - - - - - -");
262 for (Map.Entry<String, Object> entry : hardwareInformation.entrySet())
264 String value = (String) entry.getValue();
265 Log.v(TAG, entry.getKey() + " : " + value);
267 Log.v(TAG, "- - - - - - - - - -");
271 findPreference("camera_version").setSummary("Unknown");
280 private void setCameraProperty(String name, String value)
284 String propertyValue = "<" + name + "/" + value + ">";
285 Log.v(TAG, "setCameraProperty() : " + propertyValue);
286 propertyInterface.setCameraPropertyValue(name, propertyValue);
299 public void onResume()
302 Log.v(TAG, "onResume() Start");
304 // 撮影モードかどうかを確認して、撮影モードではなかったら撮影モードに切り替える
305 if ((changeRunModeExecutor != null) && (!changeRunModeExecutor.isRecordingMode()))
307 // Runモードを切り替える。(でも切り替えると、設定がクリアされてしまう...。
308 changeRunModeExecutor.changeRunMode(true);
310 synchronizeCameraProperties(true);
311 Log.v(TAG, "onResume() End");
320 public void onPause()
323 Log.v(TAG, "onPause() Start");
325 // Preference変更のリスナを解除
326 preferences.unregisterOnSharedPreferenceChangeListener(this);
328 Log.v(TAG, "onPause() End");
332 * カメラプロパティとPreferenceとの同期処理を実行
334 private void synchronizeCameraProperties(boolean isPropertyLoad)
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);
344 // データ読み込み処理(別スレッドで実行)
347 new Thread(preferenceSynchronizer).start();
352 * Preferenceが更新された時に呼び出される処理
354 * @param sharedPreferences sharedPreferences
358 public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
360 Log.v(TAG, "onSharedPreferenceChanged() : " + key);
361 String propertyValue;
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);
374 case IPreferencePropertyAccessor.BLE_POWER_ON:
375 value = preferences.getBoolean(key, false);
376 Log.v(TAG, " " + key + " , " + value);
379 case IPreferencePropertyAccessor.AUTO_CONNECT_TO_CAMERA:
380 value = preferences.getBoolean(key, true);
381 Log.v(TAG, " " + key + " , " + value);
384 case IPreferencePropertyAccessor.CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW:
385 value = preferences.getBoolean(key, true);
386 Log.v(TAG, " " + key + " , " + value);
390 String strValue = preferences.getString(key, "");
391 setListPreference(key, key, strValue);
392 String propertyKey = convertKeyFromPreferenceToCameraPropertyKey(key);
393 if (propertyKey != null)
395 setCameraProperty(propertyKey, strValue);
403 * ListPreference の表示データを設定
405 * @param pref_key Preference(表示)のキー
406 * @param key Preference(データ)のキー
407 * @param defaultValue Preferenceのデフォルト値
409 private void setListPreference(String pref_key, String key, String defaultValue)
412 pref = (ListPreference) findPreference(pref_key);
413 String value = preferences.getString(key, defaultValue);
416 pref.setValue(value);
417 pref.setSummary(value);
422 * BooleanPreference の表示データを設定
424 * @param pref_key Preference(表示)のキー
425 * @param key Preference(データ)のキー
426 * @param defaultValue Preferenceのデフォルト値
428 private void setBooleanPreference(String pref_key, String key, boolean defaultValue)
430 CheckBoxPreference pref = (CheckBoxPreference) findPreference(pref_key);
433 boolean value = preferences.getBoolean(key, defaultValue);
434 pref.setChecked(value);
442 private String convertKeyFromPreferenceToCameraPropertyKey(String key)
444 String target = null;
451 case IPreferencePropertyAccessor.TAKE_MODE:
452 target = IOlyCameraProperty.TAKE_MODE;
455 case IPreferencePropertyAccessor.SOUND_VOLUME_LEVEL:
456 target = IOlyCameraProperty.SOUND_VOLUME_LEVEL;
470 public void synchronizedProperty()
472 FragmentActivity activity = getActivity();
473 if (activity == null)
477 busyDialog.dismiss();
486 activity.runOnUiThread(new Runnable() {
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);
498 findPreference(IPreferencePropertyAccessor.CAMERAKIT_VERSION).setSummary(OLYCamera.getVersion());
499 if (hardwareStatusInterface != null)
502 setHardwareSummary();
506 busyDialog.dismiss();
508 } catch (Exception e)