18872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb/* 28872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Copyright (C) 2010 The Android Open Source Project 38872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 48872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License"); 58872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * you may not use this file except in compliance with the License. 68872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * You may obtain a copy of the License at 78872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 88872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * http://www.apache.org/licenses/LICENSE-2.0 98872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * 108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * Unless required by applicable law or agreed to in writing, software 118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS, 128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * See the License for the specific language governing permissions and 148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb * limitations under the License. 158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb */ 168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbpackage com.android.camera.ui; 188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 198e963a5a6016d246184ed65906f9d103e92b17e2Sascha Haeberlingimport java.util.ArrayList; 208e963a5a6016d246184ed65906f9d103e92b17e2Sascha Haeberling 218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.content.Context; 228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.util.AttributeSet; 238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.util.Log; 248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.LayoutInflater; 258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.View; 268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.view.ViewGroup; 278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.widget.AdapterView; 288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.widget.ArrayAdapter; 298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport android.widget.ListView; 308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.ListPreference; 328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbimport com.android.camera.PreferenceGroup; 338e963a5a6016d246184ed65906f9d103e92b17e2Sascha Haeberlingimport com.android.camera2.R; 348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb/* A popup window that contains several camera settings. */ 368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolbpublic class MoreSettingPopup extends AbstractSettingPopup 378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb implements InLineSettingItem.Listener, 388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb AdapterView.OnItemClickListener { 398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @SuppressWarnings("unused") 408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private static final String TAG = "MoreSettingPopup"; 418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private Listener mListener; 438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private ArrayList<ListPreference> mListItem = new ArrayList<ListPreference>(); 448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Keep track of which setting items are disabled 468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // e.g. White balance will be disabled when scene mode is set to non-auto 478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private boolean[] mEnabled; 488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb static public interface Listener { 508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onSettingChanged(ListPreference pref); 518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onPreferenceClicked(ListPreference pref); 528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private class MoreSettingAdapter extends ArrayAdapter<ListPreference> { 558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb LayoutInflater mInflater; 568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb String mOnString; 578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb String mOffString; 588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb MoreSettingAdapter() { 598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb super(MoreSettingPopup.this.getContext(), 0, mListItem); 608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb Context context = getContext(); 618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mInflater = LayoutInflater.from(context); 628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mOnString = context.getString(R.string.setting_on); 638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mOffString = context.getString(R.string.setting_off); 648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private int getSettingLayoutId(ListPreference pref) { 678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (isOnOffPreference(pref)) { 698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return R.layout.in_line_setting_check_box; 708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return R.layout.in_line_setting_menu; 728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb private boolean isOnOffPreference(ListPreference pref) { 758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb CharSequence[] entries = pref.getEntries(); 768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (entries.length != 2) return false; 778872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb String str1 = entries[0].toString(); 788872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb String str2 = entries[1].toString(); 798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return ((str1.equals(mOnString) && str2.equals(mOffString)) || 808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb (str1.equals(mOffString) && str2.equals(mOnString))); 818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 838872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 848872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public View getView(int position, View convertView, ViewGroup parent) { 858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (convertView != null) return convertView; 868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ListPreference pref = mListItem.get(position); 888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 898872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb int viewLayoutId = getSettingLayoutId(pref); 908872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb InLineSettingItem view = (InLineSettingItem) 918872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mInflater.inflate(viewLayoutId, parent, false); 928872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb view.initialize(pref); // no init for restore one 948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb view.setSettingChangedListener(MoreSettingPopup.this); 958872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (position >= 0 && position < mEnabled.length) { 968872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb view.setEnabled(mEnabled[position]); 978872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } else { 988872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb Log.w(TAG, "Invalid input: enabled list length, " + mEnabled.length 998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb + " position " + position); 1008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1018872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return view; 1028872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1048872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 1058872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public boolean isEnabled(int position) { 1068872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (position >= 0 && position < mEnabled.length) { 1078872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return mEnabled[position]; 1088872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1098872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb return true; 1108872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1118872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1128872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1138872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void setSettingChangedListener(Listener listener) { 1148872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mListener = listener; 1158872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1168872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1178872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public MoreSettingPopup(Context context, AttributeSet attrs) { 1188872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb super(context, attrs); 1198872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1208872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1218872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void initialize(PreferenceGroup group, String[] keys) { 1228872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Prepare the setting items. 1238872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb for (int i = 0; i < keys.length; ++i) { 1248872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ListPreference pref = group.findPreference(keys[i]); 1258872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (pref != null) mListItem.add(pref); 1268872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1278872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1288872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ArrayAdapter<ListPreference> mListItemAdapter = new MoreSettingAdapter(); 1298872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ((ListView) mSettingList).setAdapter(mListItemAdapter); 1308872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ((ListView) mSettingList).setOnItemClickListener(this); 1318872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ((ListView) mSettingList).setSelector(android.R.color.transparent); 1328872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Initialize mEnabled 1338872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mEnabled = new boolean[mListItem.size()]; 1348872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb for (int i = 0; i < mEnabled.length; i++) { 1358872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mEnabled[i] = true; 1368872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1378872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1388872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1398872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // When preferences are disabled, we will display them grayed out. Users 1408872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // will not be able to change the disabled preferences, but they can still see 1418872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // the current value of the preferences 1428872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void setPreferenceEnabled(String key, boolean enable) { 1438872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb int count = mEnabled == null ? 0 : mEnabled.length; 1448872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb for (int j = 0; j < count; j++) { 1458872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ListPreference pref = mListItem.get(j); 1468872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (pref != null && key.equals(pref.getKey())) { 1478872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mEnabled[j] = enable; 1488872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb break; 1498872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1508872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1518872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1528872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1538872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onSettingChanged(ListPreference pref) { 1548872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mListener != null) { 1558872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mListener.onSettingChanged(pref); 1568872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1578872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1588872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1598872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Scene mode can override other camera settings (ex: flash mode). 1608872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void overrideSettings(final String ... keyvalues) { 1618872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb int count = mEnabled == null ? 0 : mEnabled.length; 1628872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb for (int i = 0; i < keyvalues.length; i += 2) { 1638872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb String key = keyvalues[i]; 1648872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb String value = keyvalues[i + 1]; 1658872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb for (int j = 0; j < count; j++) { 1668872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ListPreference pref = mListItem.get(j); 1678872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (pref != null && key.equals(pref.getKey())) { 1688872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // Change preference 1698872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (value != null) pref.setValue(value); 1708872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb // If the preference is overridden, disable the preference 1718872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb boolean enable = value == null; 1728872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mEnabled[j] = enable; 1738872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mSettingList.getChildCount() > j) { 1748872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mSettingList.getChildAt(j).setEnabled(enable); 1758872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1768872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1778872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1788872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1798872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb reloadPreference(); 1808872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1818872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1828872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 1838872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void onItemClick(AdapterView<?> parent, View view, int position, 1848872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb long id) { 1858872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (mListener != null) { 1868872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ListPreference pref = mListItem.get(position); 1878872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb mListener.onPreferenceClicked(pref); 1888872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1898872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 1908872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb 1918872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb @Override 1928872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb public void reloadPreference() { 1938872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb int count = mSettingList.getChildCount(); 1948872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb for (int i = 0; i < count; i++) { 1958872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb ListPreference pref = mListItem.get(i); 1968872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb if (pref != null) { 1978872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb InLineSettingItem settingItem = 1988872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb (InLineSettingItem) mSettingList.getChildAt(i); 1998872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb settingItem.reloadPreference(); 2008872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2018872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2028872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb } 2038872c23e739de38d74f04a8c852ebb5199c905f6Michael Kolb} 204