OSDN Git Service

機能の実行部分をクラスとして独立。
[gokigen/A01c.git] / wear / src / main / java / jp / sfjp / gokigen / a01c / liveview / FeatureDispatcher.java
1 package jp.sfjp.gokigen.a01c.liveview;
2
3 import android.util.Log;
4 import android.view.MotionEvent;
5
6 import jp.sfjp.gokigen.a01c.IShowInformation;
7 import jp.sfjp.gokigen.a01c.R;
8 import jp.sfjp.gokigen.a01c.olycamerawrapper.IOlyCameraCoordinator;
9 import jp.sfjp.gokigen.a01c.olycamerawrapper.IOlyCameraProperty;
10 import jp.sfjp.gokigen.a01c.olycamerawrapper.IOlyCameraPropertyProvider;
11
12
13 /**
14  *   カメラ機能の実行
15  *
16  */
17 public class FeatureDispatcher implements ICameraFeatureDispatcher
18 {
19     private final String TAG = toString();
20     private final IShowInformation statusDrawer;
21     private final IOlyCameraCoordinator camera;
22     private final ILiveImageStatusNotify liveImageView;
23
24     public FeatureDispatcher(IShowInformation statusDrawer, IOlyCameraCoordinator camera, ILiveImageStatusNotify liveImageView)
25     {
26         this.statusDrawer = statusDrawer;
27         this.camera = camera;
28         this.liveImageView = liveImageView;
29     }
30
31     /**
32      *   指定した機能を実行する
33      *
34      * @param objectId     操作したオブジェクト
35      * @param featureNumber  操作する機能
36      */
37     @Override
38     public boolean dispatchAction(int objectId, int featureNumber)
39     {
40         if (featureNumber <= ICameraFeatureDispatcher.FEATURE_ACTION_NONE)
41         {
42             // 何もしない
43             return (false);
44         }
45
46         // 機能実行の割り当て...
47         int duration = IShowInformation.VIBRATE_PATTERN_SIMPLE_SHORT;
48         switch (featureNumber)
49         {
50             case ICameraFeatureDispatcher.FEATURE_SETTINGS:
51                 // 設定画面を開く
52                 showSettingsScreen();
53                 duration =IShowInformation.VIBRATE_PATTERN_NONE;
54                 break;
55             case ICameraFeatureDispatcher.FEATURE_TOGGLE_SHOW_GRID:
56                 // グリッド標示ON/OFF
57                 changeShowGrid(objectId);
58                 break;
59             case ICameraFeatureDispatcher.FEATURE_SHUTTER_SINGLESHOT:
60                 // シャッター
61                 pushShutterButton();
62                 //duration =IShowInformation.VIBRATE_PATTERN_NONE;
63                 break;
64             case ICameraFeatureDispatcher.FEATURE_CHANGE_TAKEMODE:
65                 // 撮影モードの変更
66                 changeTakeMode();
67                 break;
68             case ICameraFeatureDispatcher.FEATURE_CHAGE_AE_LOCK_MODE:
69                 // AE LOCKのON/OFF切り替え
70                 changeAeLockMode();
71                 break;
72             case ICameraFeatureDispatcher.FEATURE_EXPOSURE_BIAS_DOWN:
73                 // 露出補正を1段階下げる
74                 changeExposureBiasValueDown();
75                 break;
76             case ICameraFeatureDispatcher.FEATURE_EXPOSURE_BIAS_UP:
77                 // 露出補正を1段階上げる
78                 changeExposureBiasValueUp();
79                 break;
80             case ICameraFeatureDispatcher.FEATURE_APERTURE_DOWN:
81                 // 絞り値を1段階下げる
82                 changeApertureValueDown();
83                 break;
84             case ICameraFeatureDispatcher.FEATURE_APERTURE_UP:
85                 // 絞り値を1段階上げる
86                 changeApertureValueUp();
87                 break;
88             case ICameraFeatureDispatcher.FEATURE_SHUTTER_SPEED_DOWN:
89                 // シャッター速度を1段階下げる
90                 changeShutterSpeedDown();
91                 break;
92             case ICameraFeatureDispatcher.FEATURE_SHUTTER_SPEED_UP:
93                 // シャッター速度を1段階上げる
94                 changeShutterSpeedUp();
95                 break;
96             case ICameraFeatureDispatcher.FEATURE_COLORTONE_DOWN:
97                 // 仕上がり・ピクチャーモードを選択
98                 changeColorToneDown();
99                 break;
100             case ICameraFeatureDispatcher.FEATURE_COLORTONE_UP:
101                 // 仕上がり・ピクチャーモードを選択
102                 changeColorToneUp();
103                 break;
104             case ICameraFeatureDispatcher.FEATURE_ART_FILTER_DOWN:
105                 // アートフィルターを選択
106                 changeArtFilterDown();
107                 break;
108             case ICameraFeatureDispatcher.FEATURE_ART_FILTER_UP:
109                 // アートフィルターを選択
110                 changeArtFilterUp();
111                 break;
112             case ICameraFeatureDispatcher.FEATURE_TOGGLE_SHOW_LEVEL_GAUGE:
113                 // デジタル水準器の表示・非表示
114                 changeShowLevelGauge();
115                 break;
116             case ICameraFeatureDispatcher.FEATURE_CHANGE_TAKEMODE_REVERSE:
117                 // 撮影モードの変更(逆順)
118                 changeTakeModeReverse();
119                 break;
120         }
121
122         // コマンド実行完了後、ぶるぶるさせる
123         statusDrawer.vibrate(duration);
124         return (true);
125     }
126
127     @Override
128     public boolean dispatchAreaAction(MotionEvent event, int areaFeatureNumber)
129     {
130         boolean ret = false;
131         switch (areaFeatureNumber)
132         {
133             case ICameraFeatureDispatcher.FEATURE_AREA_ACTION_DRIVE_AUTOFOCUS:
134                 ret = camera.driveAutoFocus(event);
135                 break;
136
137             case ICameraFeatureDispatcher.FEATURE_AREA_ACTION_NOT_CONNECTED:
138                 /*
139                 try
140                 {
141                     // 実験... WIFIステート
142                     //Intent intent = new Intent(ACTION_ADD_NETWORK_SETTINGS);
143                     Intent intent = new Intent(ACTION_NETWORK_SETTINGS);
144                     context.startActivity(intent);
145                 }
146                 catch (Exception e)
147                 {
148                     e.printStackTrace();
149                 }
150                 */
151                 break;
152
153             case FEATURE_AREA_ACTION_NONE:
154             default:
155                 // 何もしない
156                 ret = false;
157                 break;
158         }
159         return (ret);
160     }
161
162
163     /**
164      *   撮影モードの取得
165      *
166      */
167     @Override
168     public String getTakeMode()
169     {
170         IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
171         return (propertyProxy.getCameraPropertyValueTitle(propertyProxy.getCameraPropertyValue(IOlyCameraProperty.TAKE_MODE)));
172     }
173
174
175     /**
176      *   撮影モードの変更指示
177      *   (P > A > S > M > ART > iAuto > ...)
178      */
179     private void changeTakeMode()
180     {
181         IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
182         String propetyValue = propertyProxy.getCameraPropertyValueTitle(propertyProxy.getCameraPropertyValue(IOlyCameraProperty.TAKE_MODE));
183         if (propetyValue == null)
184         {
185             // データ取得失敗
186             return;
187         }
188         String targetMode = "<" + IOlyCameraProperty.TAKE_MODE;  // 変更先モード
189         switch (propetyValue)
190         {
191             case "P":
192                 targetMode = targetMode + "/A>";
193                 break;
194
195             case "A":
196                 targetMode =  targetMode + "/S>";
197                 break;
198
199             case "S":
200                 targetMode =  targetMode + "/M>";
201                 break;
202
203             case "M":
204                 targetMode =  targetMode + "/ART>";
205                 break;
206
207             case "ART":
208                 targetMode =  targetMode + "/iAuto>";
209                 break;
210
211             case "iAuto":
212             case "movie":
213             default:
214                 targetMode =  targetMode + "/P>";
215                 break;
216         }
217         Log.v(TAG, "changeTakeMode() " + targetMode);
218         propertyProxy.setCameraPropertyValue(IOlyCameraProperty.TAKE_MODE, targetMode);
219         camera.unlockAutoFocus();
220
221         //  撮影モードの更新
222         //camera.updateTakeMode();
223     }
224
225
226     /**
227      *   撮影モードの変更指示
228      *   (iAuto < P < A < S < M < ART < iAuto < ...)
229      */
230     private void changeTakeModeReverse()
231     {
232         IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
233         String propetyValue = propertyProxy.getCameraPropertyValueTitle(propertyProxy.getCameraPropertyValue(IOlyCameraProperty.TAKE_MODE));
234         if (propetyValue == null)
235         {
236             // データ取得失敗
237             return;
238         }
239         String targetMode = "<" + IOlyCameraProperty.TAKE_MODE;  // 変更先モード
240         switch (propetyValue)
241         {
242             case "P":
243                 targetMode = targetMode + "/iAuto>";
244                 break;
245
246             case "A":
247                 targetMode =  targetMode + "/P>";
248                 break;
249
250             case "S":
251                 targetMode =  targetMode + "/A>";
252                 break;
253
254             case "M":
255                 targetMode =  targetMode + "/S>";
256                 break;
257
258             case "ART":
259                 targetMode =  targetMode + "/M>";
260                 break;
261
262             case "iAuto":
263             case "movie":
264             default:
265                 targetMode =  targetMode + "/ART>";
266                 break;
267         }
268         Log.v(TAG, "changeTakeMode() " + targetMode);
269         propertyProxy.setCameraPropertyValue(IOlyCameraProperty.TAKE_MODE, targetMode);
270         camera.unlockAutoFocus();
271
272         //  撮影モードの更新
273         //camera.updateTakeMode();
274     }
275
276
277     /**
278      *   シャッターボタンが押された!
279      *   (現在は、連続撮影モードやムービー撮影についてはまだ非対応)
280      */
281     private void pushShutterButton()
282     {
283         // カメラ側のシャッターを押す
284         camera.singleShot();
285     }
286
287     /**
288      *   グリッド表示の ON/OFFを切り替える
289      *
290      */
291     private void changeShowGrid(int objectId)
292     {
293         liveImageView.toggleShowGridFrame();
294         updateGridStatusButton(objectId);
295     }
296
297
298     /**
299      *  デジタル水準器の ON/OFFを切り替える
300      *
301      */
302     private void changeShowLevelGauge()
303     {
304         liveImageView.toggleShowLevelGauge();
305     }
306
307     /**
308      *   AE-Lock/Lock解除を行う
309      *
310      */
311     private void changeAeLockMode()
312     {
313         camera.toggleAutoExposure();
314     }
315
316     /**
317      *  グリッドフレームの表示・非表示ボタンを更新する
318      *
319      */
320     private void updateGridStatusButton(int buttonId)
321     {
322         int btnResId;
323         if (liveImageView.isShowGrid())
324         {
325             // グリッドがON状態、グリッドをOFFにするボタンを出す
326             btnResId = R.drawable.btn_ic_grid_off;
327         }
328         else
329         {
330             //  グリッドがOFF状態、グリッドをONにするボタンを出す
331             btnResId = R.drawable.btn_ic_grid_on;
332         }
333         statusDrawer.setButtonDrawable(buttonId, btnResId);
334     }
335
336     /**
337      *   露出補正を1段階下げる
338      */
339     private void changeExposureBiasValueDown()
340     {
341         IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
342         propertyProxy.updateCameraPropertyDown(IOlyCameraProperty.EXPOSURE_COMPENSATION);
343     }
344
345     /**
346      *   露出補正を1段階あげる
347      *
348      */
349     private void changeExposureBiasValueUp()
350     {
351         IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
352         propertyProxy.updateCameraPropertyUp(IOlyCameraProperty.EXPOSURE_COMPENSATION);
353     }
354
355     /**
356      *   絞り値を1段階下げる
357      */
358     private void changeApertureValueDown()
359     {
360         IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
361         propertyProxy.updateCameraPropertyDown(IOlyCameraProperty.APERTURE);
362     }
363
364     /**
365      *   絞り値を1段階あげる
366      *
367      */
368     private void changeApertureValueUp()
369     {
370         IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
371         propertyProxy.updateCameraPropertyUp(IOlyCameraProperty.APERTURE);
372     }
373
374     /**
375      *   シャッター速度を1段階下げる
376      */
377     private void changeShutterSpeedDown()
378     {
379         IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
380         propertyProxy.updateCameraPropertyDown(IOlyCameraProperty.SHUTTER_SPEED);
381     }
382
383     /**
384      *   シャッター速度を1段階あげる
385      *
386      */
387     private void changeShutterSpeedUp()
388     {
389         IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
390         propertyProxy.updateCameraPropertyUp(IOlyCameraProperty.SHUTTER_SPEED);
391     }
392
393
394     /**
395      *   仕上がり・ピクチャーモードを1段階下げる
396      */
397     private void changeColorToneDown()
398     {
399         IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
400         propertyProxy.updateCameraPropertyDown(IOlyCameraProperty.COLOR_TONE);
401     }
402
403     /**
404      *   仕上がり・ピクチャーモードを1段階あげる
405      *
406      */
407     private void changeColorToneUp()
408     {
409         IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
410         propertyProxy.updateCameraPropertyUp(IOlyCameraProperty.COLOR_TONE);
411     }
412
413     /**
414      *   アートフィルターを1段階さげる
415      *
416      */
417     private void changeArtFilterDown()
418     {
419         IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
420         propertyProxy.updateCameraPropertyDown(IOlyCameraProperty.ART_FILTER);
421     }
422
423     /**
424      *   アートフィルターを1段階あげる
425      *
426      */
427     private void changeArtFilterUp()
428     {
429         IOlyCameraPropertyProvider propertyProxy = camera.getCameraPropertyProvider();
430         propertyProxy.updateCameraPropertyUp(IOlyCameraProperty.ART_FILTER);
431     }
432
433
434     /**
435      *   設定画面を開く
436      *
437      */
438     private void showSettingsScreen()
439     {
440         // TBD...
441     }
442 }