IndicatorButton.java revision db3556078a75be0bd4a08195d90f060724034e88
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
19f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Liimport com.android.camera.IconListPreference;
20039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Liimport com.android.camera.R;
21f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li
22f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Liimport android.content.Context;
23d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Liimport android.util.Log;
24039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Liimport android.view.LayoutInflater;
25039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Liimport android.view.ViewGroup;
26f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li
27039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li// An indicator button that represents one camera setting. Ex: flash. Pressing it opens a popup
28039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li// window.
29039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Lipublic class IndicatorButton extends AbstractIndicatorButton implements BasicSettingPopup.Listener {
30d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li    private final String TAG = "IndicatorButton";
31f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li    private IconListPreference mPreference;
32823d57389b616091827059ca6401f675e416a53bWu-cheng Li    // Scene mode can override the original preference value.
33823d57389b616091827059ca6401f675e416a53bWu-cheng Li    private String mOverrideValue;
34039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    private Listener mListener;
35039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
36039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    static public interface Listener {
37039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        public void onSettingChanged();
38039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    }
39039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
40039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    public void setSettingChangedListener(Listener listener) {
41039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        mListener = listener;
42039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    }
43f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li
44f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li    public IndicatorButton(Context context, IconListPreference pref) {
45f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li        super(context);
46f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li        mPreference = pref;
47f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li        reloadPreference();
48f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li    }
49f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li
504cc009b812557bc312af556e3ed64cae2367d69eChung-yih Wang    @Override
51f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li    public void reloadPreference() {
52e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li        int[] iconIds = mPreference.getLargeIconIds();
53e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li        if (iconIds != null) {
54e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li            // Each entry has a corresponding icon.
55823d57389b616091827059ca6401f675e416a53bWu-cheng Li            int index;
56823d57389b616091827059ca6401f675e416a53bWu-cheng Li            if (mOverrideValue == null) {
57823d57389b616091827059ca6401f675e416a53bWu-cheng Li                index = mPreference.findIndexOfValue(mPreference.getValue());
58823d57389b616091827059ca6401f675e416a53bWu-cheng Li            } else {
59823d57389b616091827059ca6401f675e416a53bWu-cheng Li                index = mPreference.findIndexOfValue(mOverrideValue);
60d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li                if (index == -1) {
61d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li                    // Avoid the crash if camera driver has bugs.
62d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li                    Log.e(TAG, "Fail to find override value=" + mOverrideValue);
63d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li                    mPreference.print();
64d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li                    return;
65d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li                }
66823d57389b616091827059ca6401f675e416a53bWu-cheng Li            }
67d09139b23bc06f8e0ecb90dd4048ab9ee374c253Hung-ying Tyan            setImageResource(iconIds[index]);
68e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li        } else {
69e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li            // The preference only has a single icon to represent it.
70d09139b23bc06f8e0ecb90dd4048ab9ee374c253Hung-ying Tyan            setImageResource(mPreference.getSingleIcon());
71e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li        }
724cc009b812557bc312af556e3ed64cae2367d69eChung-yih Wang        super.reloadPreference();
73f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li    }
74823d57389b616091827059ca6401f675e416a53bWu-cheng Li
75823d57389b616091827059ca6401f675e416a53bWu-cheng Li    public String getKey() {
76823d57389b616091827059ca6401f675e416a53bWu-cheng Li        return mPreference.getKey();
77823d57389b616091827059ca6401f675e416a53bWu-cheng Li    }
78823d57389b616091827059ca6401f675e416a53bWu-cheng Li
79039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    @Override
80823d57389b616091827059ca6401f675e416a53bWu-cheng Li    public boolean isOverridden() {
81823d57389b616091827059ca6401f675e416a53bWu-cheng Li        return mOverrideValue != null;
82823d57389b616091827059ca6401f675e416a53bWu-cheng Li    }
83823d57389b616091827059ca6401f675e416a53bWu-cheng Li
84039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    @Override
85039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    public void overrideSettings(final String ... keyvalues) {
86039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        mOverrideValue = null;
87039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        for (int i = 0; i < keyvalues.length; i += 2) {
88039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            String key = keyvalues[i];
89039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            String value = keyvalues[i + 1];
90039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            if (key.equals(getKey())) {
91039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li                mOverrideValue = value;
92039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li                setEnabled(value == null);
93039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li                break;
94039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            }
95039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        }
96823d57389b616091827059ca6401f675e416a53bWu-cheng Li        reloadPreference();
97823d57389b616091827059ca6401f675e416a53bWu-cheng Li    }
98039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
99039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    @Override
100039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    protected void initializePopup() {
101039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
102039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li                Context.LAYOUT_INFLATER_SERVICE);
103db3556078a75be0bd4a08195d90f060724034e88Chung-yih Wang        ViewGroup root = (ViewGroup) getRootView().findViewById(R.id.frame_layout);
104039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
105039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        BasicSettingPopup popup = (BasicSettingPopup) inflater.inflate(
106039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li                R.layout.basic_setting_popup, root, false);
107039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        popup.setSettingChangedListener(this);
108039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        popup.initialize(mPreference);
109039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        root.addView(popup);
110039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        mPopup = popup;
111039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    }
112039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
1130341c03529f04351534a15d06facb096aab7a95fWu-cheng Li    @Override
114039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    public void onSettingChanged() {
115039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        reloadPreference();
1160341c03529f04351534a15d06facb096aab7a95fWu-cheng Li        // Dismiss later so the activated state can be updated before dismiss.
1170341c03529f04351534a15d06facb096aab7a95fWu-cheng Li        dismissPopupDelayed();
118039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        if (mListener != null) {
119039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            mListener.onSettingChanged();
120039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        }
121039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    }
122f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li}
123