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