PhotoController.java revision 3ed120d2204c73ab20d6093f112367de60129eb3
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
17package com.android.camera;
18
19import android.content.Context;
20import android.hardware.Camera.Parameters;
21import android.view.LayoutInflater;
22
23import com.android.camera.ui.AbstractSettingPopup;
24import com.android.camera.ui.ListPrefSettingPopup;
25import com.android.camera.ui.MoreSettingPopup;
26import com.android.camera.ui.PieItem;
27import com.android.camera.ui.PieItem.OnClickListener;
28import com.android.camera.ui.PieRenderer;
29
30public class PhotoController extends PieController
31        implements MoreSettingPopup.Listener,
32        ListPrefSettingPopup.Listener {
33    private static String TAG = "CAM_photocontrol";
34    private static float FLOAT_PI_DIVIDED_BY_TWO = (float) Math.PI / 2;
35    private final String mSettingOff;
36
37    private PhotoModule mModule;
38    private String[] mOtherKeys;
39    // First level popup
40    private MoreSettingPopup mPopup;
41    // Second level popup
42    private AbstractSettingPopup mSecondPopup;
43
44    public PhotoController(CameraActivity activity, PhotoModule module, PieRenderer pie) {
45        super(activity, pie);
46        mModule = module;
47        mSettingOff = activity.getString(R.string.setting_off_value);
48    }
49
50    public void initialize(PreferenceGroup group) {
51        super.initialize(group);
52        mPopup = null;
53        mSecondPopup = null;
54        float sweep = FLOAT_PI_DIVIDED_BY_TWO / 2;
55        addItem(CameraSettings.KEY_FLASH_MODE, FLOAT_PI_DIVIDED_BY_TWO - sweep, sweep);
56        addItem(CameraSettings.KEY_EXPOSURE, 3 * FLOAT_PI_DIVIDED_BY_TWO - sweep, sweep);
57        addItem(CameraSettings.KEY_WHITE_BALANCE, 3 * FLOAT_PI_DIVIDED_BY_TWO + sweep, sweep);
58        PieItem item = makeItem(R.drawable.ic_switch_photo_facing_holo_light);
59        item.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO + sweep,  sweep);
60        item.setOnClickListener(new OnClickListener() {
61
62            @Override
63            public void onClick(PieItem item) {
64                // Find the index of next camera.
65                ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID);
66                if (pref != null) {
67                    int index = pref.findIndexOfValue(pref.getValue());
68                    CharSequence[] values = pref.getEntryValues();
69                    index = (index + 1) % values.length;
70                    int newCameraId = Integer.parseInt((String) values[index]);
71                    mListener.onCameraPickerClicked(newCameraId);
72                }
73            }
74        });
75        mRenderer.addItem(item);
76        if (group.findPreference(CameraSettings.KEY_CAMERA_HDR) != null) {
77            PieItem hdr = makeItem(R.drawable.ic_hdr);
78            hdr.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO, sweep);
79            hdr.setOnClickListener(new OnClickListener() {
80                @Override
81                public void onClick(PieItem item) {
82                    // Find the index of next camera.
83                    ListPreference pref = mPreferenceGroup
84                            .findPreference(CameraSettings.KEY_CAMERA_HDR);
85                    if (pref != null) {
86                        // toggle hdr value
87                        int index = (pref.findIndexOfValue(pref.getValue()) + 1) % 2;
88                        pref.setValueIndex(index);
89                        onSettingChanged(pref);
90                    }
91                }
92            });
93            mRenderer.addItem(hdr);
94        }
95        mOtherKeys = new String[] {
96                CameraSettings.KEY_SCENE_MODE,
97                CameraSettings.KEY_RECORD_LOCATION,
98                CameraSettings.KEY_PICTURE_SIZE,
99                CameraSettings.KEY_FOCUS_MODE};
100        item = makeItem(R.drawable.ic_settings_holo_light);
101        item.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO * 3, sweep);
102        item.setOnClickListener(new OnClickListener() {
103            @Override
104            public void onClick(PieItem item) {
105                if (mPopup == null) {
106                    initializePopup();
107                }
108                mModule.showPopup(mPopup);
109            }
110        });
111        mRenderer.addItem(item);
112    }
113
114    protected void setCameraId(int cameraId) {
115        ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID);
116        pref.setValue("" + cameraId);
117    }
118
119    @Override
120    public void reloadPreferences() {
121        super.reloadPreferences();
122        if (mPopup != null) {
123            mPopup.reloadPreference();
124        }
125    }
126
127    @Override
128    // Hit when an item in the second-level popup gets selected
129    public void onListPrefChanged(ListPreference pref) {
130        if (mPopup != null && mSecondPopup != null) {
131                mModule.dismissPopup(true);
132                mPopup.reloadPreference();
133        }
134        onSettingChanged(pref);
135    }
136
137    @Override
138    public void overrideSettings(final String ... keyvalues) {
139        super.overrideSettings(keyvalues);
140        if (mPopup == null) initializePopup();
141        mPopup.overrideSettings(keyvalues);
142    }
143
144    protected void initializePopup() {
145        LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(
146                Context.LAYOUT_INFLATER_SERVICE);
147
148        MoreSettingPopup popup = (MoreSettingPopup) inflater.inflate(
149                R.layout.more_setting_popup, null, false);
150        popup.setSettingChangedListener(this);
151        popup.initialize(mPreferenceGroup, mOtherKeys);
152        mPopup = popup;
153    }
154
155    public void popupDismissed(boolean topPopupOnly) {
156        // if the 2nd level popup gets dismissed
157        if (mSecondPopup != null) {
158            mSecondPopup = null;
159            if (topPopupOnly) mModule.showPopup(mPopup);
160        }
161    }
162
163    // Return true if the preference has the specified key but not the value.
164    private static boolean notSame(ListPreference pref, String key, String value) {
165        return (key.equals(pref.getKey()) && !value.equals(pref.getValue()));
166    }
167
168    private void setPreference(String key, String value) {
169        ListPreference pref = mPreferenceGroup.findPreference(key);
170        if (pref != null && !value.equals(pref.getValue())) {
171            pref.setValue(value);
172            reloadPreferences();
173        }
174    }
175
176    @Override
177    public void onSettingChanged(ListPreference pref) {
178        // Reset the scene mode if HDR is set to on. Reset HDR if scene mode is
179        // set to non-auto.
180        if (notSame(pref, CameraSettings.KEY_CAMERA_HDR, mSettingOff)) {
181            setPreference(CameraSettings.KEY_SCENE_MODE, Parameters.SCENE_MODE_AUTO);
182        } else if (notSame(pref, CameraSettings.KEY_SCENE_MODE, Parameters.SCENE_MODE_AUTO)) {
183            setPreference(CameraSettings.KEY_CAMERA_HDR, mSettingOff);
184        }
185        super.onSettingChanged(pref);
186    }
187
188    @Override
189    // Hit when an item in the first-level popup gets selected, then bring up
190    // the second-level popup
191    public void onPreferenceClicked(ListPreference pref) {
192        if (mSecondPopup != null) return;
193
194        LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(
195                Context.LAYOUT_INFLATER_SERVICE);
196        ListPrefSettingPopup basic = (ListPrefSettingPopup) inflater.inflate(
197                R.layout.list_pref_setting_popup, null, false);
198        basic.initialize(pref);
199        basic.setSettingChangedListener(this);
200        mModule.dismissPopup(true);
201        mSecondPopup = basic;
202        mModule.showPopup(mSecondPopup);
203    }
204}
205