/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.camera.ui; import com.android.camera.CameraSettings; import com.android.camera.ListPreference; import com.android.camera.PreferenceGroup; import com.android.camera.R; import com.android.camera.RecordLocationPreference; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.view.LayoutInflater; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ListView; import android.widget.ArrayAdapter; import java.util.ArrayList; import java.util.List; /* A popup window that contains several camera settings. */ public class OtherSettingsPopup extends AbstractSettingPopup implements InLineSettingItem.Listener, AdapterView.OnItemClickListener { private static final String TAG = "OtherSettingsPopup"; private Listener mListener; private ArrayList<ListPreference> mListItem = new ArrayList<ListPreference>(); static public interface Listener { public void onSettingChanged(); public void onRestorePreferencesClicked(); } private class OtherSettingsAdapter extends ArrayAdapter { LayoutInflater mInflater; OtherSettingsAdapter() { super(OtherSettingsPopup.this.getContext(), 0, mListItem); mInflater = LayoutInflater.from(getContext()); } private int getSettingLayoutId(ListPreference pref) { // If the preference is null, it will be the only item , i.e. // 'Restore setting' in the popup window. if (pref == null) return R.layout.in_line_setting_restore; // Currently, the RecordLocationPreference is the only setting // which applies the on/off switch. if (CameraSettings.KEY_RECORD_LOCATION.equals(pref.getKey())) { return R.layout.in_line_setting_switch; } return R.layout.in_line_setting_knob; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView != null) return convertView; ListPreference pref = mListItem.get(position); int viewLayoutId = getSettingLayoutId(pref); InLineSettingItem view = (InLineSettingItem) mInflater.inflate(viewLayoutId, parent, false); view.initialize(pref); // no init for restore one view.setSettingChangedListener(OtherSettingsPopup.this); return view; } } public void setSettingChangedListener(Listener listener) { mListener = listener; } public OtherSettingsPopup(Context context, AttributeSet attrs) { super(context, attrs); } public void initialize(PreferenceGroup group, String[] keys) { // Prepare the setting items. for (int i = 0; i < keys.length; ++i) { ListPreference pref = group.findPreference(keys[i]); if (pref != null) mListItem.add(pref); } // Prepare the restore setting line. mListItem.add(null); ArrayAdapter mListItemAdapter = new OtherSettingsAdapter(); ((ListView) mSettingList).setAdapter(mListItemAdapter); ((ListView) mSettingList).setOnItemClickListener(this); ((ListView) mSettingList).setSelector(android.R.color.transparent); } @Override public void onSettingChanged() { if (mListener != null) { mListener.onSettingChanged(); } } // Scene mode can override other camera settings (ex: flash mode). public void overrideSettings(final String ... keyvalues) { int count = mSettingList.getChildCount(); for (int i = 0; i < keyvalues.length; i += 2) { String key = keyvalues[i]; String value = keyvalues[i + 1]; for (int j = 0; j < count; j++) { ListPreference pref = (ListPreference) mListItem.get(j); if (pref != null && key.equals(pref.getKey())) { InLineSettingItem settingItem = (InLineSettingItem) mSettingList.getChildAt(j); settingItem.overrideSettings(value); } } } } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if ((position == mListItem.size() - 1) && (mListener != null)) { mListener.onRestorePreferencesClicked(); } } @Override public void reloadPreference() { int count = mSettingList.getChildCount(); for (int i = 0; i < count; i++) { ListPreference pref = (ListPreference) mListItem.get(i); if (pref != null) { InLineSettingItem settingItem = (InLineSettingItem) mSettingList.getChildAt(i); settingItem.reloadPreference(); } } } }