1f04692066fc7087560248b003c49e0377c056edfDoris Liu/*
2f04692066fc7087560248b003c49e0377c056edfDoris Liu * Copyright (C) 2010 The Android Open Source Project
3f04692066fc7087560248b003c49e0377c056edfDoris Liu *
4f04692066fc7087560248b003c49e0377c056edfDoris Liu * Licensed under the Apache License, Version 2.0 (the "License");
5f04692066fc7087560248b003c49e0377c056edfDoris Liu * you may not use this file except in compliance with the License.
6f04692066fc7087560248b003c49e0377c056edfDoris Liu * You may obtain a copy of the License at
7f04692066fc7087560248b003c49e0377c056edfDoris Liu *
8f04692066fc7087560248b003c49e0377c056edfDoris Liu *      http://www.apache.org/licenses/LICENSE-2.0
9f04692066fc7087560248b003c49e0377c056edfDoris Liu *
10f04692066fc7087560248b003c49e0377c056edfDoris Liu * Unless required by applicable law or agreed to in writing, software
11f04692066fc7087560248b003c49e0377c056edfDoris Liu * distributed under the License is distributed on an "AS IS" BASIS,
12f04692066fc7087560248b003c49e0377c056edfDoris Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f04692066fc7087560248b003c49e0377c056edfDoris Liu * See the License for the specific language governing permissions and
14f04692066fc7087560248b003c49e0377c056edfDoris Liu * limitations under the License.
15f04692066fc7087560248b003c49e0377c056edfDoris Liu */
16f04692066fc7087560248b003c49e0377c056edfDoris Liu
17f04692066fc7087560248b003c49e0377c056edfDoris Liupackage com.android.camera.ui;
18f04692066fc7087560248b003c49e0377c056edfDoris Liu
19f04692066fc7087560248b003c49e0377c056edfDoris Liuimport android.content.Context;
20f04692066fc7087560248b003c49e0377c056edfDoris Liuimport android.util.AttributeSet;
21ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liuimport android.util.Log;
22f04692066fc7087560248b003c49e0377c056edfDoris Liuimport android.view.LayoutInflater;
23f04692066fc7087560248b003c49e0377c056edfDoris Liuimport android.view.View;
24f04692066fc7087560248b003c49e0377c056edfDoris Liuimport android.view.ViewGroup;
25f04692066fc7087560248b003c49e0377c056edfDoris Liuimport android.widget.AdapterView;
26f04692066fc7087560248b003c49e0377c056edfDoris Liuimport android.widget.ArrayAdapter;
27f04692066fc7087560248b003c49e0377c056edfDoris Liuimport android.widget.ListView;
28f04692066fc7087560248b003c49e0377c056edfDoris Liu
29f04692066fc7087560248b003c49e0377c056edfDoris Liuimport com.android.camera.ListPreference;
30f04692066fc7087560248b003c49e0377c056edfDoris Liuimport com.android.camera.PreferenceGroup;
31f04692066fc7087560248b003c49e0377c056edfDoris Liuimport com.android.camera.R;
32f04692066fc7087560248b003c49e0377c056edfDoris Liu
33f04692066fc7087560248b003c49e0377c056edfDoris Liuimport java.util.ArrayList;
34f04692066fc7087560248b003c49e0377c056edfDoris Liu
35f04692066fc7087560248b003c49e0377c056edfDoris Liu/* A popup window that contains several camera settings. */
36f04692066fc7087560248b003c49e0377c056edfDoris Liupublic class MoreSettingPopup extends AbstractSettingPopup
37f04692066fc7087560248b003c49e0377c056edfDoris Liu        implements InLineSettingItem.Listener,
38f04692066fc7087560248b003c49e0377c056edfDoris Liu        AdapterView.OnItemClickListener {
39f04692066fc7087560248b003c49e0377c056edfDoris Liu    @SuppressWarnings("unused")
40f04692066fc7087560248b003c49e0377c056edfDoris Liu    private static final String TAG = "MoreSettingPopup";
41f04692066fc7087560248b003c49e0377c056edfDoris Liu
42f04692066fc7087560248b003c49e0377c056edfDoris Liu    private Listener mListener;
43f04692066fc7087560248b003c49e0377c056edfDoris Liu    private ArrayList<ListPreference> mListItem = new ArrayList<ListPreference>();
44f04692066fc7087560248b003c49e0377c056edfDoris Liu
45ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu    // Keep track of which setting items are disabled
46ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu    // e.g. White balance will be disabled when scene mode is set to non-auto
47ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu    private boolean[] mEnabled;
48ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu
49f04692066fc7087560248b003c49e0377c056edfDoris Liu    static public interface Listener {
50f04692066fc7087560248b003c49e0377c056edfDoris Liu        public void onSettingChanged(ListPreference pref);
51f04692066fc7087560248b003c49e0377c056edfDoris Liu        public void onPreferenceClicked(ListPreference pref);
52f04692066fc7087560248b003c49e0377c056edfDoris Liu    }
53f04692066fc7087560248b003c49e0377c056edfDoris Liu
54f04692066fc7087560248b003c49e0377c056edfDoris Liu    private class MoreSettingAdapter extends ArrayAdapter<ListPreference> {
55f04692066fc7087560248b003c49e0377c056edfDoris Liu        LayoutInflater mInflater;
56f04692066fc7087560248b003c49e0377c056edfDoris Liu        String mOnString;
57f04692066fc7087560248b003c49e0377c056edfDoris Liu        String mOffString;
58f04692066fc7087560248b003c49e0377c056edfDoris Liu        MoreSettingAdapter() {
59f04692066fc7087560248b003c49e0377c056edfDoris Liu            super(MoreSettingPopup.this.getContext(), 0, mListItem);
60f04692066fc7087560248b003c49e0377c056edfDoris Liu            Context context = getContext();
61f04692066fc7087560248b003c49e0377c056edfDoris Liu            mInflater = LayoutInflater.from(context);
62f04692066fc7087560248b003c49e0377c056edfDoris Liu            mOnString = context.getString(R.string.setting_on);
63f04692066fc7087560248b003c49e0377c056edfDoris Liu            mOffString = context.getString(R.string.setting_off);
64f04692066fc7087560248b003c49e0377c056edfDoris Liu        }
65f04692066fc7087560248b003c49e0377c056edfDoris Liu
66f04692066fc7087560248b003c49e0377c056edfDoris Liu        private int getSettingLayoutId(ListPreference pref) {
67f04692066fc7087560248b003c49e0377c056edfDoris Liu
68f04692066fc7087560248b003c49e0377c056edfDoris Liu            if (isOnOffPreference(pref)) {
6930ab66d7f035d57c76e6fa1d1c7faf820c21b9b7Doris Liu                return R.layout.in_line_setting_check_box;
70f04692066fc7087560248b003c49e0377c056edfDoris Liu            }
71f04692066fc7087560248b003c49e0377c056edfDoris Liu            return R.layout.in_line_setting_menu;
72f04692066fc7087560248b003c49e0377c056edfDoris Liu        }
73f04692066fc7087560248b003c49e0377c056edfDoris Liu
74f04692066fc7087560248b003c49e0377c056edfDoris Liu        private boolean isOnOffPreference(ListPreference pref) {
75f04692066fc7087560248b003c49e0377c056edfDoris Liu            CharSequence[] entries = pref.getEntries();
76f04692066fc7087560248b003c49e0377c056edfDoris Liu            if (entries.length != 2) return false;
77f04692066fc7087560248b003c49e0377c056edfDoris Liu            String str1 = entries[0].toString();
78f04692066fc7087560248b003c49e0377c056edfDoris Liu            String str2 = entries[1].toString();
79f04692066fc7087560248b003c49e0377c056edfDoris Liu            return ((str1.equals(mOnString) && str2.equals(mOffString)) ||
80f04692066fc7087560248b003c49e0377c056edfDoris Liu                    (str1.equals(mOffString) && str2.equals(mOnString)));
81f04692066fc7087560248b003c49e0377c056edfDoris Liu        }
82f04692066fc7087560248b003c49e0377c056edfDoris Liu
83f04692066fc7087560248b003c49e0377c056edfDoris Liu        @Override
84f04692066fc7087560248b003c49e0377c056edfDoris Liu        public View getView(int position, View convertView, ViewGroup parent) {
85f04692066fc7087560248b003c49e0377c056edfDoris Liu            if (convertView != null) return convertView;
86f04692066fc7087560248b003c49e0377c056edfDoris Liu
87f04692066fc7087560248b003c49e0377c056edfDoris Liu            ListPreference pref = mListItem.get(position);
88f04692066fc7087560248b003c49e0377c056edfDoris Liu
89f04692066fc7087560248b003c49e0377c056edfDoris Liu            int viewLayoutId = getSettingLayoutId(pref);
90f04692066fc7087560248b003c49e0377c056edfDoris Liu            InLineSettingItem view = (InLineSettingItem)
91f04692066fc7087560248b003c49e0377c056edfDoris Liu                    mInflater.inflate(viewLayoutId, parent, false);
92f04692066fc7087560248b003c49e0377c056edfDoris Liu
93f04692066fc7087560248b003c49e0377c056edfDoris Liu            view.initialize(pref); // no init for restore one
94f04692066fc7087560248b003c49e0377c056edfDoris Liu            view.setSettingChangedListener(MoreSettingPopup.this);
95ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu            if (position >= 0 && position < mEnabled.length) {
96ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu                view.setEnabled(mEnabled[position]);
97ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu            } else {
98ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu                Log.w(TAG, "Invalid input: enabled list length, " + mEnabled.length
99ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu                        + " position " + position);
100ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu            }
101f04692066fc7087560248b003c49e0377c056edfDoris Liu            return view;
102f04692066fc7087560248b003c49e0377c056edfDoris Liu        }
103ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu
104ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu        @Override
105ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu        public boolean isEnabled(int position) {
106ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu            if (position >= 0 && position < mEnabled.length) {
107ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu                return mEnabled[position];
108ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu            }
109ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu            return true;
110ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu        }
111f04692066fc7087560248b003c49e0377c056edfDoris Liu    }
112f04692066fc7087560248b003c49e0377c056edfDoris Liu
113f04692066fc7087560248b003c49e0377c056edfDoris Liu    public void setSettingChangedListener(Listener listener) {
114f04692066fc7087560248b003c49e0377c056edfDoris Liu        mListener = listener;
115f04692066fc7087560248b003c49e0377c056edfDoris Liu    }
116f04692066fc7087560248b003c49e0377c056edfDoris Liu
117f04692066fc7087560248b003c49e0377c056edfDoris Liu    public MoreSettingPopup(Context context, AttributeSet attrs) {
118f04692066fc7087560248b003c49e0377c056edfDoris Liu        super(context, attrs);
119f04692066fc7087560248b003c49e0377c056edfDoris Liu    }
120f04692066fc7087560248b003c49e0377c056edfDoris Liu
121f04692066fc7087560248b003c49e0377c056edfDoris Liu    public void initialize(PreferenceGroup group, String[] keys) {
122f04692066fc7087560248b003c49e0377c056edfDoris Liu        // Prepare the setting items.
123f04692066fc7087560248b003c49e0377c056edfDoris Liu        for (int i = 0; i < keys.length; ++i) {
124f04692066fc7087560248b003c49e0377c056edfDoris Liu            ListPreference pref = group.findPreference(keys[i]);
125f04692066fc7087560248b003c49e0377c056edfDoris Liu            if (pref != null) mListItem.add(pref);
126f04692066fc7087560248b003c49e0377c056edfDoris Liu        }
127f04692066fc7087560248b003c49e0377c056edfDoris Liu
128f04692066fc7087560248b003c49e0377c056edfDoris Liu        ArrayAdapter<ListPreference> mListItemAdapter = new MoreSettingAdapter();
129f04692066fc7087560248b003c49e0377c056edfDoris Liu        ((ListView) mSettingList).setAdapter(mListItemAdapter);
130f04692066fc7087560248b003c49e0377c056edfDoris Liu        ((ListView) mSettingList).setOnItemClickListener(this);
131f04692066fc7087560248b003c49e0377c056edfDoris Liu        ((ListView) mSettingList).setSelector(android.R.color.transparent);
132ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu        // Initialize mEnabled
133ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu        mEnabled = new boolean[mListItem.size()];
134ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu        for (int i = 0; i < mEnabled.length; i++) {
135ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu            mEnabled[i] = true;
136ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu        }
137f04692066fc7087560248b003c49e0377c056edfDoris Liu    }
138f04692066fc7087560248b003c49e0377c056edfDoris Liu
13902fdcaef920cd764cc7c0ab937367475835e9c9bDoris Liu    // When preferences are disabled, we will display them grayed out. Users
14002fdcaef920cd764cc7c0ab937367475835e9c9bDoris Liu    // will not be able to change the disabled preferences, but they can still see
14102fdcaef920cd764cc7c0ab937367475835e9c9bDoris Liu    // the current value of the preferences
14202fdcaef920cd764cc7c0ab937367475835e9c9bDoris Liu    public void setPreferenceEnabled(String key, boolean enable) {
14302fdcaef920cd764cc7c0ab937367475835e9c9bDoris Liu        int count = mEnabled == null ? 0 : mEnabled.length;
14402fdcaef920cd764cc7c0ab937367475835e9c9bDoris Liu        for (int j = 0; j < count; j++) {
14502fdcaef920cd764cc7c0ab937367475835e9c9bDoris Liu            ListPreference pref = mListItem.get(j);
14602fdcaef920cd764cc7c0ab937367475835e9c9bDoris Liu            if (pref != null && key.equals(pref.getKey())) {
14702fdcaef920cd764cc7c0ab937367475835e9c9bDoris Liu                mEnabled[j] = enable;
14802fdcaef920cd764cc7c0ab937367475835e9c9bDoris Liu                break;
14902fdcaef920cd764cc7c0ab937367475835e9c9bDoris Liu            }
15002fdcaef920cd764cc7c0ab937367475835e9c9bDoris Liu        }
15102fdcaef920cd764cc7c0ab937367475835e9c9bDoris Liu    }
15202fdcaef920cd764cc7c0ab937367475835e9c9bDoris Liu
153f04692066fc7087560248b003c49e0377c056edfDoris Liu    public void onSettingChanged(ListPreference pref) {
154f04692066fc7087560248b003c49e0377c056edfDoris Liu        if (mListener != null) {
155f04692066fc7087560248b003c49e0377c056edfDoris Liu            mListener.onSettingChanged(pref);
156f04692066fc7087560248b003c49e0377c056edfDoris Liu        }
157f04692066fc7087560248b003c49e0377c056edfDoris Liu    }
158f04692066fc7087560248b003c49e0377c056edfDoris Liu
159f04692066fc7087560248b003c49e0377c056edfDoris Liu    // Scene mode can override other camera settings (ex: flash mode).
160f04692066fc7087560248b003c49e0377c056edfDoris Liu    public void overrideSettings(final String ... keyvalues) {
161ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu        int count = mEnabled == null ? 0 : mEnabled.length;
162f04692066fc7087560248b003c49e0377c056edfDoris Liu        for (int i = 0; i < keyvalues.length; i += 2) {
163f04692066fc7087560248b003c49e0377c056edfDoris Liu            String key = keyvalues[i];
164f04692066fc7087560248b003c49e0377c056edfDoris Liu            String value = keyvalues[i + 1];
165f04692066fc7087560248b003c49e0377c056edfDoris Liu            for (int j = 0; j < count; j++) {
166f04692066fc7087560248b003c49e0377c056edfDoris Liu                ListPreference pref = mListItem.get(j);
167f04692066fc7087560248b003c49e0377c056edfDoris Liu                if (pref != null && key.equals(pref.getKey())) {
168ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu                    // Change preference
169ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu                    if (value != null) pref.setValue(value);
170ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu                    // If the preference is overridden, disable the preference
171ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu                    boolean enable = value == null;
172ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu                    mEnabled[j] = enable;
173ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu                    if (mSettingList.getChildCount() > j) {
174ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu                        mSettingList.getChildAt(j).setEnabled(enable);
175ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu                    }
176f04692066fc7087560248b003c49e0377c056edfDoris Liu                }
177f04692066fc7087560248b003c49e0377c056edfDoris Liu            }
178f04692066fc7087560248b003c49e0377c056edfDoris Liu        }
179ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu        reloadPreference();
180f04692066fc7087560248b003c49e0377c056edfDoris Liu    }
181f04692066fc7087560248b003c49e0377c056edfDoris Liu
182f04692066fc7087560248b003c49e0377c056edfDoris Liu    @Override
183f04692066fc7087560248b003c49e0377c056edfDoris Liu    public void onItemClick(AdapterView<?> parent, View view, int position,
184f04692066fc7087560248b003c49e0377c056edfDoris Liu            long id) {
185f04692066fc7087560248b003c49e0377c056edfDoris Liu        if (mListener != null) {
18657abb9e7d8c88de1431b1af75b2871bee3e09e42Doris Liu            ListPreference pref = mListItem.get(position);
18757abb9e7d8c88de1431b1af75b2871bee3e09e42Doris Liu            mListener.onPreferenceClicked(pref);
188f04692066fc7087560248b003c49e0377c056edfDoris Liu        }
189f04692066fc7087560248b003c49e0377c056edfDoris Liu    }
190f04692066fc7087560248b003c49e0377c056edfDoris Liu
191f04692066fc7087560248b003c49e0377c056edfDoris Liu    @Override
192f04692066fc7087560248b003c49e0377c056edfDoris Liu    public void reloadPreference() {
193f04692066fc7087560248b003c49e0377c056edfDoris Liu        int count = mSettingList.getChildCount();
194f04692066fc7087560248b003c49e0377c056edfDoris Liu        for (int i = 0; i < count; i++) {
195f04692066fc7087560248b003c49e0377c056edfDoris Liu            ListPreference pref = mListItem.get(i);
196f04692066fc7087560248b003c49e0377c056edfDoris Liu            if (pref != null) {
197f04692066fc7087560248b003c49e0377c056edfDoris Liu                InLineSettingItem settingItem =
198f04692066fc7087560248b003c49e0377c056edfDoris Liu                        (InLineSettingItem) mSettingList.getChildAt(i);
199f04692066fc7087560248b003c49e0377c056edfDoris Liu                settingItem.reloadPreference();
200f04692066fc7087560248b003c49e0377c056edfDoris Liu            }
201f04692066fc7087560248b003c49e0377c056edfDoris Liu        }
202f04692066fc7087560248b003c49e0377c056edfDoris Liu    }
203f04692066fc7087560248b003c49e0377c056edfDoris Liu}
204