PieController.java revision 2d3af28f91481d7f3887cb0bb9c5d06375baf787
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.graphics.Color;
20import android.util.Log;
21import android.view.Gravity;
22import android.view.View;
23import android.view.View.OnClickListener;
24import android.view.ViewGroup.LayoutParams;
25import android.widget.ImageView;
26import android.widget.ImageView.ScaleType;
27import android.widget.TextView;
28
29import com.android.camera.CameraPreference.OnPreferenceChangedListener;
30import com.android.camera.ui.PieItem;
31import com.android.camera.ui.PieRenderer;
32
33import java.util.ArrayList;
34import java.util.HashMap;
35import java.util.List;
36import java.util.Map;
37
38public class PieController {
39
40    private static String TAG = "CAM_piecontrol";
41
42    protected static final int MODE_PHOTO = 0;
43    protected static final int MODE_VIDEO = 1;
44
45    protected CameraActivity mActivity;
46    protected PreferenceGroup mPreferenceGroup;
47    protected OnPreferenceChangedListener mListener;
48    protected PieRenderer mRenderer;
49    private List<IconListPreference> mPreferences;
50    private Map<IconListPreference, PieItem> mPreferenceMap;
51    private Map<IconListPreference, String> mOverrides;
52    private int mItemSize;
53
54    public void setListener(OnPreferenceChangedListener listener) {
55        mListener = listener;
56    }
57
58    public PieController(CameraActivity activity, PieRenderer pie) {
59        mActivity = activity;
60        mRenderer = pie;
61        mPreferences = new ArrayList<IconListPreference>();
62        mPreferenceMap = new HashMap<IconListPreference, PieItem>();
63        mOverrides = new HashMap<IconListPreference, String>();
64        mItemSize = activity.getResources().getDimensionPixelSize(R.dimen.pie_view_size);
65    }
66
67    public void initialize(PreferenceGroup group) {
68        mRenderer.clearItems();
69        setPreferenceGroup(group);
70    }
71
72    public void onSettingChanged() {
73        if (mListener != null) {
74            mListener.onSharedPreferenceChanged();
75        }
76    }
77
78    protected void setCameraId(int cameraId) {
79        ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID);
80        pref.setValue("" + cameraId);
81    }
82
83    protected PieItem makeItem(int resId) {
84        ImageView view = new ImageView(mActivity);
85        view.setImageResource(resId);
86        view.setMinimumWidth(mItemSize);
87        view.setMinimumHeight(mItemSize);
88        view.setScaleType(ScaleType.CENTER);
89        LayoutParams lp = new LayoutParams(mItemSize, mItemSize);
90        view.setLayoutParams(lp);
91        return new PieItem(view, 0);
92    }
93
94    protected PieItem makeItem(CharSequence value) {
95        TextView view = new TextView(mActivity);
96        view.setText(value);
97        view.setMinimumWidth(mItemSize);
98        view.setMinimumHeight(mItemSize);
99        view.setGravity(Gravity.CENTER);
100        view.setTextColor(Color.WHITE);
101        LayoutParams lp = new LayoutParams(mItemSize, mItemSize);
102        view.setLayoutParams(lp);
103        return new PieItem(view, 0);
104    }
105
106    public void addItem(String prefKey, float center, float sweep) {
107        final IconListPreference pref =
108                (IconListPreference) mPreferenceGroup.findPreference(prefKey);
109        if (pref == null) return;
110        int[] iconIds = pref.getLargeIconIds();
111        int resid = -1;
112        if (iconIds != null) {
113            // Each entry has a corresponding icon.
114            int index = pref.findIndexOfValue(pref.getValue());
115            resid = iconIds[index];
116        } else {
117            // The preference only has a single icon to represent it.
118            resid = pref.getSingleIcon();
119        }
120        PieItem item = makeItem(resid);
121        // use center and sweep to determine layout
122        item.setFixedSlice(center, sweep);
123        mRenderer.addItem(item);
124        mPreferences.add(pref);
125        mPreferenceMap.put(pref, item);
126        int nOfEntries = pref.getEntries().length;
127        if (nOfEntries > 1) {
128            for (int i = 0; i < nOfEntries; i++) {
129                PieItem inner = null;
130                if (iconIds != null) {
131                    inner = makeItem(iconIds[i]);
132                } else {
133                    inner = makeItem(pref.getEntries()[i]);
134                }
135                item.addItem(inner);
136                final int index = i;
137                inner.getView().setOnClickListener(new OnClickListener() {
138                    @Override
139                    public void onClick(View v) {
140                        pref.setValueIndex(index);
141                        reloadPreference(pref);
142                        onSettingChanged();
143                    }
144                });
145            }
146        }
147    }
148
149    public void setPreferenceGroup(PreferenceGroup group) {
150        mPreferenceGroup = group;
151        // Preset the current mode from the title of preference group.
152        String title = group.getTitle();
153        if (title.equals(mActivity.getString(
154                R.string.pref_camcorder_settings_category))) {
155//            mCurrentMode = MODE_VIDEO;
156        }
157    }
158
159    public void reloadPreferences() {
160        mPreferenceGroup.reloadValue();
161        for (IconListPreference pref : mPreferenceMap.keySet()) {
162            reloadPreference(pref);
163        }
164    }
165
166    private void reloadPreference(IconListPreference pref) {
167        PieItem item = mPreferenceMap.get(pref);
168        String overrideValue = mOverrides.get(pref);
169        int[] iconIds = pref.getLargeIconIds();
170        if (iconIds != null) {
171            // Each entry has a corresponding icon.
172            int index;
173            if (overrideValue == null) {
174                index = pref.findIndexOfValue(pref.getValue());
175            } else {
176                index = pref.findIndexOfValue(overrideValue);
177                if (index == -1) {
178                    // Avoid the crash if camera driver has bugs.
179                    Log.e(TAG, "Fail to find override value=" + overrideValue);
180                    pref.print();
181                    return;
182                }
183            }
184            ((ImageView) item.getView()).setImageResource(iconIds[index]);
185        } else {
186            // The preference only has a single icon to represent it.
187            ((ImageView) item.getView()).setImageResource(pref.getSingleIcon());
188        }
189    }
190
191    // Scene mode may override other camera settings (ex: flash mode).
192    public void overrideSettings(final String ... keyvalues) {
193        if (keyvalues.length % 2 != 0) {
194            throw new IllegalArgumentException();
195        }
196        for (IconListPreference pref : mPreferenceMap.keySet()) {
197            override(pref, keyvalues);
198        }
199    }
200
201    private void override(IconListPreference pref, final String ... keyvalues) {
202        mOverrides.remove(pref);
203        for (int i = 0; i < keyvalues.length; i += 2) {
204            String key = keyvalues[i];
205            String value = keyvalues[i + 1];
206            if (key.equals(pref.getKey())) {
207                mOverrides.put(pref, value);
208                PieItem item = mPreferenceMap.get(pref);
209                item.setEnabled(value == null);
210                break;
211            }
212        }
213        reloadPreference(pref);
214    }
215}
216