1f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li/*
2f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * Copyright (C) 2010 The Android Open Source Project
3f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li *
4f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * Licensed under the Apache License, Version 2.0 (the "License");
5f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * you may not use this file except in compliance with the License.
6f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * You may obtain a copy of the License at
7f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li *
8f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li *      http://www.apache.org/licenses/LICENSE-2.0
9f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li *
10f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * Unless required by applicable law or agreed to in writing, software
11f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * distributed under the License is distributed on an "AS IS" BASIS,
12f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * See the License for the specific language governing permissions and
14f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * limitations under the License.
15f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li */
16f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li
17f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Lipackage com.android.camera.ui;
18f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li
19c0c662c5acaa5b76e1cb90a7868d16e471e2bd93Wu-cheng Liimport com.android.camera.CameraSettings;
20f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Liimport com.android.camera.IconListPreference;
21039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Liimport com.android.camera.R;
22f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li
23f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Liimport android.content.Context;
24d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Liimport android.util.Log;
25039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Liimport android.view.LayoutInflater;
26039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Liimport android.view.ViewGroup;
27f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li
28039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li// An indicator button that represents one camera setting. Ex: flash. Pressing it opens a popup
29039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li// window.
304b9791ff6763d310c750892b774119ad750c512aChih-yu Huangpublic class IndicatorButton extends AbstractIndicatorButton
314b9791ff6763d310c750892b774119ad750c512aChih-yu Huang        implements BasicSettingPopup.Listener, EffectSettingPopup.Listener{
32d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li    private final String TAG = "IndicatorButton";
33f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li    private IconListPreference mPreference;
34823d57389b616091827059ca6401f675e416a53bWu-cheng Li    // Scene mode can override the original preference value.
35823d57389b616091827059ca6401f675e416a53bWu-cheng Li    private String mOverrideValue;
36039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    private Listener mListener;
37039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
38039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    static public interface Listener {
39039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        public void onSettingChanged();
40039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    }
41039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
42039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    public void setSettingChangedListener(Listener listener) {
43039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        mListener = listener;
44039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    }
45f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li
46f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li    public IndicatorButton(Context context, IconListPreference pref) {
47f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li        super(context);
48f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li        mPreference = pref;
49f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li        reloadPreference();
50f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li    }
51f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li
524cc009b812557bc312af556e3ed64cae2367d69eChung-yih Wang    @Override
53f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li    public void reloadPreference() {
54e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li        int[] iconIds = mPreference.getLargeIconIds();
55e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li        if (iconIds != null) {
56e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li            // Each entry has a corresponding icon.
57823d57389b616091827059ca6401f675e416a53bWu-cheng Li            int index;
58823d57389b616091827059ca6401f675e416a53bWu-cheng Li            if (mOverrideValue == null) {
59823d57389b616091827059ca6401f675e416a53bWu-cheng Li                index = mPreference.findIndexOfValue(mPreference.getValue());
60823d57389b616091827059ca6401f675e416a53bWu-cheng Li            } else {
61823d57389b616091827059ca6401f675e416a53bWu-cheng Li                index = mPreference.findIndexOfValue(mOverrideValue);
62d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li                if (index == -1) {
63d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li                    // Avoid the crash if camera driver has bugs.
64d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li                    Log.e(TAG, "Fail to find override value=" + mOverrideValue);
65d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li                    mPreference.print();
66d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li                    return;
67d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li                }
68823d57389b616091827059ca6401f675e416a53bWu-cheng Li            }
69d09139b23bc06f8e0ecb90dd4048ab9ee374c253Hung-ying Tyan            setImageResource(iconIds[index]);
70e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li        } else {
71e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li            // The preference only has a single icon to represent it.
72d09139b23bc06f8e0ecb90dd4048ab9ee374c253Hung-ying Tyan            setImageResource(mPreference.getSingleIcon());
73e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li        }
744cc009b812557bc312af556e3ed64cae2367d69eChung-yih Wang        super.reloadPreference();
75f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li    }
76823d57389b616091827059ca6401f675e416a53bWu-cheng Li
77823d57389b616091827059ca6401f675e416a53bWu-cheng Li    public String getKey() {
78823d57389b616091827059ca6401f675e416a53bWu-cheng Li        return mPreference.getKey();
79823d57389b616091827059ca6401f675e416a53bWu-cheng Li    }
80823d57389b616091827059ca6401f675e416a53bWu-cheng Li
81039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    @Override
82823d57389b616091827059ca6401f675e416a53bWu-cheng Li    public boolean isOverridden() {
83823d57389b616091827059ca6401f675e416a53bWu-cheng Li        return mOverrideValue != null;
84823d57389b616091827059ca6401f675e416a53bWu-cheng Li    }
85823d57389b616091827059ca6401f675e416a53bWu-cheng Li
86039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    @Override
87039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    public void overrideSettings(final String ... keyvalues) {
88039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        mOverrideValue = null;
89039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        for (int i = 0; i < keyvalues.length; i += 2) {
90039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            String key = keyvalues[i];
91039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            String value = keyvalues[i + 1];
92039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            if (key.equals(getKey())) {
93039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li                mOverrideValue = value;
94039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li                setEnabled(value == null);
95039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li                break;
96039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            }
97039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        }
98823d57389b616091827059ca6401f675e416a53bWu-cheng Li        reloadPreference();
99823d57389b616091827059ca6401f675e416a53bWu-cheng Li    }
100039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
101039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    @Override
102039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    protected void initializePopup() {
103757459bc8ded7e5708d8ad99ff38a3cb41904640Chung-yih Wang        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(
104039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li                Context.LAYOUT_INFLATER_SERVICE);
105db3556078a75be0bd4a08195d90f060724034e88Chung-yih Wang        ViewGroup root = (ViewGroup) getRootView().findViewById(R.id.frame_layout);
106039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
1071e99673af90451eaffeb100735f38e6ce0f18456Wu-cheng Li        AbstractSettingPopup popup;
108c0c662c5acaa5b76e1cb90a7868d16e471e2bd93Wu-cheng Li        if (CameraSettings.KEY_VIDEO_EFFECT.equals(getKey())) {
1091e99673af90451eaffeb100735f38e6ce0f18456Wu-cheng Li            EffectSettingPopup effect = (EffectSettingPopup) inflater.inflate(
110c0c662c5acaa5b76e1cb90a7868d16e471e2bd93Wu-cheng Li                    R.layout.effect_setting_popup, root, false);
1111e99673af90451eaffeb100735f38e6ce0f18456Wu-cheng Li            effect.initialize(mPreference);
1121e99673af90451eaffeb100735f38e6ce0f18456Wu-cheng Li            effect.setSettingChangedListener(this);
1131e99673af90451eaffeb100735f38e6ce0f18456Wu-cheng Li            mPopup = effect;
114c0c662c5acaa5b76e1cb90a7868d16e471e2bd93Wu-cheng Li        } else {
1151e99673af90451eaffeb100735f38e6ce0f18456Wu-cheng Li            BasicSettingPopup basic = (BasicSettingPopup) inflater.inflate(
116c0c662c5acaa5b76e1cb90a7868d16e471e2bd93Wu-cheng Li                    R.layout.basic_setting_popup, root, false);
1171e99673af90451eaffeb100735f38e6ce0f18456Wu-cheng Li            basic.initialize(mPreference);
1181e99673af90451eaffeb100735f38e6ce0f18456Wu-cheng Li            basic.setSettingChangedListener(this);
1191e99673af90451eaffeb100735f38e6ce0f18456Wu-cheng Li            mPopup = basic;
120c0c662c5acaa5b76e1cb90a7868d16e471e2bd93Wu-cheng Li        }
1211e99673af90451eaffeb100735f38e6ce0f18456Wu-cheng Li        root.addView(mPopup);
122039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    }
123039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
1240341c03529f04351534a15d06facb096aab7a95fWu-cheng Li    @Override
125039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    public void onSettingChanged() {
126039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        reloadPreference();
1270341c03529f04351534a15d06facb096aab7a95fWu-cheng Li        // Dismiss later so the activated state can be updated before dismiss.
1280341c03529f04351534a15d06facb096aab7a95fWu-cheng Li        dismissPopupDelayed();
129039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        if (mListener != null) {
130039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            mListener.onSettingChanged();
131039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        }
132039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    }
133f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li}
134