• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.camera;
18 
19 import android.content.Context;
20 import android.hardware.Camera.Parameters;
21 import android.view.LayoutInflater;
22 
23 import com.android.camera.ui.AbstractSettingPopup;
24 import com.android.camera.ui.ListPrefSettingPopup;
25 import com.android.camera.ui.MoreSettingPopup;
26 import com.android.camera.ui.PieItem;
27 import com.android.camera.ui.PieItem.OnClickListener;
28 import com.android.camera.ui.PieRenderer;
29 import com.android.camera.ui.TimerSettingPopup;
30 
31 public class PhotoController extends PieController
32         implements MoreSettingPopup.Listener,
33         TimerSettingPopup.Listener,
34         ListPrefSettingPopup.Listener {
35     private static String TAG = "CAM_photocontrol";
36     private static float FLOAT_PI_DIVIDED_BY_TWO = (float) Math.PI / 2;
37     private final String mSettingOff;
38 
39     private PhotoModule mModule;
40     private String[] mOtherKeys;
41     // First level popup
42     private MoreSettingPopup mPopup;
43     // Second level popup
44     private AbstractSettingPopup mSecondPopup;
45 
PhotoController(CameraActivity activity, PhotoModule module, PieRenderer pie)46     public PhotoController(CameraActivity activity, PhotoModule module, PieRenderer pie) {
47         super(activity, pie);
48         mModule = module;
49         mSettingOff = activity.getString(R.string.setting_off_value);
50     }
51 
initialize(PreferenceGroup group)52     public void initialize(PreferenceGroup group) {
53         super.initialize(group);
54         mPopup = null;
55         mSecondPopup = null;
56         float sweep = FLOAT_PI_DIVIDED_BY_TWO / 2;
57         addItem(CameraSettings.KEY_FLASH_MODE, FLOAT_PI_DIVIDED_BY_TWO - sweep, sweep);
58         addItem(CameraSettings.KEY_EXPOSURE, 3 * FLOAT_PI_DIVIDED_BY_TWO - sweep, sweep);
59         addItem(CameraSettings.KEY_WHITE_BALANCE, 3 * FLOAT_PI_DIVIDED_BY_TWO + sweep, sweep);
60         if (group.findPreference(CameraSettings.KEY_CAMERA_ID) != null) {
61             PieItem item = makeItem(R.drawable.ic_switch_photo_facing_holo_light);
62             item.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO + sweep, sweep);
63             item.setOnClickListener(new OnClickListener() {
64                 @Override
65                 public void onClick(PieItem item) {
66                     // Find the index of next camera.
67                     ListPreference camPref = mPreferenceGroup
68                             .findPreference(CameraSettings.KEY_CAMERA_ID);
69                     if (camPref != null) {
70                         int index = camPref.findIndexOfValue(camPref.getValue());
71                         CharSequence[] values = camPref.getEntryValues();
72                         index = (index + 1) % values.length;
73                         int newCameraId = Integer
74                                 .parseInt((String) values[index]);
75                         mListener.onCameraPickerClicked(newCameraId);
76                     }
77                 }
78             });
79             mRenderer.addItem(item);
80         }
81         if (group.findPreference(CameraSettings.KEY_CAMERA_HDR) != null) {
82             PieItem hdr = makeItem(R.drawable.ic_hdr);
83             hdr.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO, sweep);
84             hdr.setOnClickListener(new OnClickListener() {
85                 @Override
86                 public void onClick(PieItem item) {
87                     // Find the index of next camera.
88                     ListPreference pref = mPreferenceGroup
89                             .findPreference(CameraSettings.KEY_CAMERA_HDR);
90                     if (pref != null) {
91                         // toggle hdr value
92                         int index = (pref.findIndexOfValue(pref.getValue()) + 1) % 2;
93                         pref.setValueIndex(index);
94                         onSettingChanged(pref);
95                     }
96                 }
97             });
98             mRenderer.addItem(hdr);
99         }
100         mOtherKeys = new String[] {
101                 CameraSettings.KEY_SCENE_MODE,
102                 CameraSettings.KEY_RECORD_LOCATION,
103                 CameraSettings.KEY_PICTURE_SIZE,
104                 CameraSettings.KEY_FOCUS_MODE,
105                 CameraSettings.KEY_TIMER,
106                 CameraSettings.KEY_TIMER_SOUND_EFFECTS,
107                 };
108         PieItem item = makeItem(R.drawable.ic_settings_holo_light);
109         item.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO * 3, sweep);
110         item.setOnClickListener(new OnClickListener() {
111             @Override
112             public void onClick(PieItem item) {
113                 if (mPopup == null) {
114                     initializePopup();
115                 }
116                 mModule.showPopup(mPopup);
117             }
118         });
119         mRenderer.addItem(item);
120     }
121 
setCameraId(int cameraId)122     protected void setCameraId(int cameraId) {
123         ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID);
124         pref.setValue("" + cameraId);
125     }
126 
127     @Override
reloadPreferences()128     public void reloadPreferences() {
129         super.reloadPreferences();
130         if (mPopup != null) {
131             mPopup.reloadPreference();
132         }
133     }
134 
135     @Override
136     // Hit when an item in the second-level popup gets selected
onListPrefChanged(ListPreference pref)137     public void onListPrefChanged(ListPreference pref) {
138         if (mPopup != null && mSecondPopup != null) {
139                 mModule.dismissPopup(true);
140                 mPopup.reloadPreference();
141         }
142         onSettingChanged(pref);
143     }
144 
145     @Override
overrideSettings(final String ... keyvalues)146     public void overrideSettings(final String ... keyvalues) {
147         super.overrideSettings(keyvalues);
148         if (mPopup == null) initializePopup();
149         mPopup.overrideSettings(keyvalues);
150     }
151 
initializePopup()152     protected void initializePopup() {
153         LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(
154                 Context.LAYOUT_INFLATER_SERVICE);
155 
156         MoreSettingPopup popup = (MoreSettingPopup) inflater.inflate(
157                 R.layout.more_setting_popup, null, false);
158         popup.setSettingChangedListener(this);
159         popup.initialize(mPreferenceGroup, mOtherKeys);
160         if (mActivity.isSecureCamera()) {
161             // Prevent location preference from getting changed in secure camera mode
162             popup.setPreferenceEnabled(CameraSettings.KEY_RECORD_LOCATION, false);
163         }
164         mPopup = popup;
165     }
166 
popupDismissed(boolean topPopupOnly)167     public void popupDismissed(boolean topPopupOnly) {
168         // if the 2nd level popup gets dismissed
169         if (mSecondPopup != null) {
170             mSecondPopup = null;
171             if (topPopupOnly) mModule.showPopup(mPopup);
172         }
173     }
174 
175     // Return true if the preference has the specified key but not the value.
notSame(ListPreference pref, String key, String value)176     private static boolean notSame(ListPreference pref, String key, String value) {
177         return (key.equals(pref.getKey()) && !value.equals(pref.getValue()));
178     }
179 
setPreference(String key, String value)180     private void setPreference(String key, String value) {
181         ListPreference pref = mPreferenceGroup.findPreference(key);
182         if (pref != null && !value.equals(pref.getValue())) {
183             pref.setValue(value);
184             reloadPreferences();
185         }
186     }
187 
188     @Override
onSettingChanged(ListPreference pref)189     public void onSettingChanged(ListPreference pref) {
190         // Reset the scene mode if HDR is set to on. Reset HDR if scene mode is
191         // set to non-auto.
192         if (notSame(pref, CameraSettings.KEY_CAMERA_HDR, mSettingOff)) {
193             setPreference(CameraSettings.KEY_SCENE_MODE, Parameters.SCENE_MODE_AUTO);
194         } else if (notSame(pref, CameraSettings.KEY_SCENE_MODE, Parameters.SCENE_MODE_AUTO)) {
195             setPreference(CameraSettings.KEY_CAMERA_HDR, mSettingOff);
196         }
197         super.onSettingChanged(pref);
198     }
199 
200     @Override
201     // Hit when an item in the first-level popup gets selected, then bring up
202     // the second-level popup
onPreferenceClicked(ListPreference pref)203     public void onPreferenceClicked(ListPreference pref) {
204         if (mSecondPopup != null) return;
205 
206         LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(
207                 Context.LAYOUT_INFLATER_SERVICE);
208         if (CameraSettings.KEY_TIMER.equals(pref.getKey())) {
209             TimerSettingPopup timerPopup = (TimerSettingPopup) inflater.inflate(
210                     R.layout.timer_setting_popup, null, false);
211             timerPopup.initialize(pref);
212             timerPopup.setSettingChangedListener(this);
213             mModule.dismissPopup(true);
214             mSecondPopup = timerPopup;
215         } else {
216             ListPrefSettingPopup basic = (ListPrefSettingPopup) inflater.inflate(
217                     R.layout.list_pref_setting_popup, null, false);
218             basic.initialize(pref);
219             basic.setSettingChangedListener(this);
220             mModule.dismissPopup(true);
221             mSecondPopup = basic;
222         }
223         mModule.showPopup(mSecondPopup);
224     }
225 }
226