OSDN Git Service

d01027a9df41bf576c4c442e11d98f1efc65f8c6
[gokigen/A01c.git] / wear / src / main / java / jp / sfjp / gokigen / a01c / olycamerawrapper / property / LoadSaveCameraProperties.java
1 package jp.sfjp.gokigen.a01c.olycamerawrapper.property;
2
3 import android.content.Context;
4 import android.content.SharedPreferences;
5 import android.preference.PreferenceManager;
6 import android.util.Log;
7
8 import java.text.DateFormat;
9 import java.util.Date;
10 //import java.util.HashMap;
11 import java.util.Map;
12 import java.util.Set;
13
14 import jp.co.olympus.camerakit.OLYCamera;
15 //import jp.co.olympus.camerakit.OLYCameraKitException;
16 import jp.sfjp.gokigen.a01c.olycamerawrapper.IOLYCameraObjectProvider;
17
18 /**
19  *   カメラプロパティを一括でバックアップしたり、リストアしたりするクラス
20  *
21  */
22 public class LoadSaveCameraProperties implements ILoadSaveCameraProperties
23 {
24     private final String TAG = toString();
25
26     private final Context parent;
27     private final OLYCamera camera;
28     private final IOlyCameraPropertyProvider propertyProvider;
29
30     public LoadSaveCameraProperties(Context context, IOlyCameraPropertyProvider propertyProvider, IOLYCameraObjectProvider provider)
31     {
32         this.camera = provider.getOLYCamera();
33         this.parent = context;
34         this.propertyProvider = propertyProvider;
35     }
36
37     /**
38      *   カメラの現在の設定を本体から読みだして記憶する
39      *
40      */
41     @Override
42     public void saveCameraSettings(String idHeader, String dataName)
43     {
44         // カメラから設定を一括で読みだして、Preferenceに記録する
45         if (propertyProvider.isConnected())
46         {
47             Map<String, String> values = null;
48             try
49             {
50                 values = propertyProvider.getCameraPropertyValues(camera.getCameraPropertyNames());
51             }
52             catch (Exception e)
53             {
54                 e.printStackTrace();
55             }
56             //Log.v(TAG, "CameraPropertyBackupRestore::storeCameraSettings() : " + idHeader);
57
58             if (values != null)
59             {
60                 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
61                 SharedPreferences.Editor editor = preferences.edit();
62                 for (String key : values.keySet())
63                 {
64                     editor.putString(idHeader + key, values.get(key));
65                     //Log.v(TAG, "storeCameraSettings(): " + idHeader + key + " , " + values.get(key));
66                 }
67                 DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
68                 editor.putString(idHeader + DATE_KEY, dateFormat.format(new Date()));
69                 editor.putString(idHeader + TITLE_KEY, dataName);
70                 //editor.commit();
71                 editor.apply();
72
73                 Log.v(TAG, "storeCameraSettings() COMMITED : " + idHeader + " [" + dataName + "]");
74             }
75         }
76     }
77
78     /**
79      *   Preferenceにあるカメラの設定をカメラに登録する
80      * (注: Read Onlyなパラメータを登録しようとするとエラーになるので注意)
81      */
82     @Override
83     public void loadCameraSettings(String idHeader)
84     {
85         Log.v(TAG, "loadCameraSettings() : START [" + idHeader + "]");
86         //loadCameraSettingsBatch(idHeader);
87         //loadCameraSettingsMiniBatch(idHeader, 5);
88         //loadCameraSettingsSequential(idHeader);
89         loadCameraSettingsOnlyDifferences(idHeader);
90     }
91
92 /*
93         ///**
94         // *   カメラのプロパティを1つづつ個別設定
95         // *
96         // *
97     private void loadCameraSettingsSequential(String idHeader)
98     {
99         int setCount = 0;
100         // Restores my settings.
101         SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
102         if (camera.isConnected())
103         {
104             String takeModeValue = preferences.getString(idHeader + TAKEMODE, null);
105             try
106             {
107                 // TAKEMODE だけは先行して設定する(設定できないカメラプロパティもあるので...)
108                 if (takeModeValue != null)
109                 {
110                     camera.setCameraPropertyValue(TAKEMODE, takeModeValue);
111                     Log.v(TAG, "loadCameraSettings() TAKEMODE : " + takeModeValue);
112                     setCount++;
113                 }
114             }
115             catch (Exception e)
116             {
117                 e.printStackTrace();
118                 Log.v(TAG, "loadCameraSettings() : loadCameraSettingsSequential() fail...");
119             }
120
121             Set<String> names = camera.getCameraPropertyNames();
122             for (String name : names)
123             {
124                 String value = preferences.getString(idHeader + name, null);
125                 if (value != null)
126                 {
127                     if (propertyProvider.canSetCameraProperty(name))
128                     {
129                         // Read Onlyのプロパティを除外して登録
130                         try
131                         {
132                             // カメラプロパティを個別登録(全パラメータを一括登録すると何か落ちている
133                             Log.v(TAG, "loadCameraSettingsSequential(): " + value);
134                             camera.setCameraPropertyValue(name, value);
135                             setCount++;
136                             //Thread.sleep(5);   // 処理落ちしている?かもしれないので必要なら止める
137                         }
138                         catch (Exception e)
139                         {
140                             e.printStackTrace();
141                         }
142                     }
143                 }
144             }
145             Log.v(TAG, "loadCameraSettingsSequential() : END [" + idHeader + "]" + " " + setCount);
146         }
147     }
148
149     //// プロパティの一括設定
150     private void loadCameraSettingsBatch(String idHeader)
151     {
152         // Restores my settings.
153         SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
154         if (camera.isConnected())
155         {
156             String takeModeValue = preferences.getString(idHeader + TAKEMODE, null);
157             try
158             {
159                 // TAKEMODE だけは先行して設定する(設定できないカメラプロパティもあるので...)
160                 if (takeModeValue != null)
161                 {
162                     camera.setCameraPropertyValue(TAKEMODE, takeModeValue);
163                     Log.v(TAG, "loadCameraSettings() TAKEMODE : " + takeModeValue);
164                 }
165             }
166             catch (Exception e)
167             {
168                 e.printStackTrace();
169                 Log.v(TAG, "loadCameraSettings() : setCameraPropertyValue() fail...");
170             }
171
172             Map<String, String> values = new HashMap<>();
173             Set<String> names = camera.getCameraPropertyNames();
174             for (String name : names)
175             {
176                 String value = preferences.getString(idHeader + name, null);
177                 if (value != null)
178                 {
179                     if (propertyProvider.canSetCameraProperty(name))
180                     {
181                         // Read Onlyのプロパティを除外して登録
182                         values.put(name, value);
183                         Log.v(TAG, "loadCameraSettings(): " + value);
184                     }
185                 }
186             }
187             if (values.size() > 0)
188             {
189                 try
190                 {
191                     camera.setCameraPropertyValues(values);
192                 }
193                 catch (OLYCameraKitException e)
194                 {
195                     Log.w(TAG, "To change the camera properties is failed: " + e.getMessage());
196                 }
197                 catch (Exception e)
198                 {
199                     e.printStackTrace();
200                 }
201             }
202             Log.v(TAG, "loadCameraSettingsBatch() : END [" + idHeader + "]" + " " + values.size());
203         }
204     }
205
206     //// プロパティの一括設定 (ミニバッチ)
207     private void loadCameraSettingsMiniBatch(String idHeader, int batchSize)
208     {
209         // Restores my settings.
210         SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
211         if (camera.isConnected())
212         {
213             String takeModeValue = preferences.getString(idHeader + TAKEMODE, null);
214             try
215             {
216                 // TAKEMODE だけは先行して設定する(設定できないカメラプロパティもあるので...)
217                 if (takeModeValue != null)
218                 {
219                     camera.setCameraPropertyValue(TAKEMODE, takeModeValue);
220                     Log.v(TAG, "loadCameraSettings() TAKEMODE : " + takeModeValue);
221                 }
222             }
223             catch (Exception e)
224             {
225                 e.printStackTrace();
226                 Log.v(TAG, "loadCameraSettings() : setCameraPropertyValue() fail...");
227             }
228
229             int currentSize = 0;
230             Map<String, String> values = new HashMap<>();
231             Set<String> names = camera.getCameraPropertyNames();
232             for (String name : names)
233             {
234                 String value = preferences.getString(idHeader + name, null);
235                 if (value != null)
236                 {
237                     if (propertyProvider.canSetCameraProperty(name))
238                     {
239                         // Read Onlyのプロパティを除外して登録
240                         values.put(name, value);
241                         currentSize++;
242                         Log.v(TAG, "loadCameraSettings(): " + value + " [" + (currentSize) + "]");
243                     }
244                 }
245                 if (currentSize >= batchSize)
246                 {
247                     // バッチサイズの最大数到達...設定する
248                     try
249                     {
250                         camera.setCameraPropertyValues(values);
251                         Log.v(TAG, "setCameraPropertyValues() : " + currentSize);
252                     }
253                     catch (OLYCameraKitException e)
254                     {
255                         Log.w(TAG, "camera.setCameraPropertyValues() failed: " + e.getMessage());
256                     }
257                     catch (Exception e)
258                     {
259                         e.printStackTrace();
260                     }
261                     currentSize = 0;
262                     values.clear();
263                 }
264             }
265             if (values.size() > 0)
266             {
267                 try
268                 {
269                     camera.setCameraPropertyValues(values);
270                 }
271                 catch (OLYCameraKitException e)
272                 {
273                     Log.w(TAG, "To change the camera properties is failed: " + e.getMessage());
274                 }
275                 catch (Exception e)
276                 {
277                     e.printStackTrace();
278                 }
279             }
280             Log.v(TAG, "loadCameraSettingsBatch() : END [" + idHeader + "]" + " " + values.size());
281         }
282     }
283 */
284     /**
285      *   カメラのプロパティを1つづつ個別設定(違っているものだけ設定する)
286      *
287      */
288     private boolean loadCameraSettingsOnlyDifferences(String idHeader)
289     {
290         boolean ret = false;
291         int setCount = 0;
292
293         // Restores my settings.
294         SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
295         if (camera.isConnected())
296         {
297
298             //  現在の設定値を全部とってくる
299             Map<String, String> propertyValues;
300             try
301             {
302                 propertyValues = propertyProvider.getCameraPropertyValues(propertyProvider.getCameraPropertyNames());
303             }
304             catch (Exception e)
305             {
306                 // 設定値が取得できなかった場合は、終了する。
307                 e.printStackTrace();
308                 return (false);
309             }
310             if (propertyValues == null)
311             {
312                 // プロパティの取得が失敗していたら、何もせずに折り返す
313                 return (false);
314             }
315
316             String takeModeValue = preferences.getString(idHeader + IOlyCameraProperty.TAKE_MODE, null);
317             try
318             {
319                 // TAKEMODE だけは先行して設定する(設定できないカメラプロパティもあるので...)
320                 if (takeModeValue != null)
321                 {
322                     propertyProvider.setCameraPropertyValue(IOlyCameraProperty.TAKE_MODE, takeModeValue);
323                     Log.v(TAG, "loadCameraSettingsOnlyDifferences() TAKEMODE : " + takeModeValue);
324                     setCount++;
325                 }
326             }
327             catch (Exception e)
328             {
329                 e.printStackTrace();
330                 Log.v(TAG, "loadCameraSettings() : loadCameraSettingsOnlyDifferences() fail...");
331             }
332
333             Set<String> names = propertyProvider.getCameraPropertyNames();
334             for (String name : names)
335             {
336                 String value = preferences.getString(idHeader + name, null);
337                 String currentValue = propertyValues.get(name);
338                 if ((value != null)&&(currentValue != null)&&(!value.equals(currentValue)))
339                 //if (value != null)
340                 {
341                     if (propertyProvider.canSetCameraProperty(name))
342                     {
343                         // Read Onlyのプロパティを除外して登録
344                         try
345                         {
346                             // カメラプロパティを個別登録(全パラメータを一括登録すると何か落ちている
347                             Log.v(TAG, "loadCameraSettingsOnlyDifferences(): SET : " + value);
348                             propertyProvider.setCameraPropertyValue(name, value);
349                             setCount++;
350                             //Thread.sleep(5);   // 処理落ちしている?かもしれないので必要なら止める
351                             ret = true;
352                         }
353                         catch (Exception e)
354                         {
355                             e.printStackTrace();
356                             ret = false;
357                         }
358                     }
359                 }
360             }
361             Log.v(TAG, "loadCameraSettingsOnlyDifferences() : END [" + idHeader + "]" + " " + setCount);
362         }
363         return (ret);
364     }
365
366 }