17f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li/*
27f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li * Copyright (C) 2010 The Android Open Source Project
37f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li *
47f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li * Licensed under the Apache License, Version 2.0 (the "License");
57f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li * you may not use this file except in compliance with the License.
67f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li * You may obtain a copy of the License at
77f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li *
87f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li *      http://www.apache.org/licenses/LICENSE-2.0
97f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li *
107f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li * Unless required by applicable law or agreed to in writing, software
117f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li * distributed under the License is distributed on an "AS IS" BASIS,
127f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li * See the License for the specific language governing permissions and
147f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li * limitations under the License.
157f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li */
167f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li
177f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Lipackage com.android.camera.ui;
187f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li
19a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wangimport com.android.camera.CameraSettings;
207f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Liimport com.android.camera.ListPreference;
217f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Liimport com.android.camera.PreferenceGroup;
220bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wangimport com.android.camera.R;
23a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wangimport com.android.camera.RecordLocationPreference;
247f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li
2502ec7c0880ded5863d73d6f173ef35ab5c888dcdWu-cheng Liimport android.content.Context;
2602ec7c0880ded5863d73d6f173ef35ab5c888dcdWu-cheng Liimport android.util.AttributeSet;
277f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Liimport android.view.View;
28a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wangimport android.view.LayoutInflater;
2902ec7c0880ded5863d73d6f173ef35ab5c888dcdWu-cheng Liimport android.view.ViewGroup;
300bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wangimport android.widget.AdapterView;
310bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wangimport android.widget.ListView;
32a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wangimport android.widget.ArrayAdapter;
330bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang
340bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wangimport java.util.ArrayList;
350bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wangimport java.util.List;
367f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li
377f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li/* A popup window that contains several camera settings. */
389b7bfbc8ac25f1df20b7ed0aa79bf1f36299e981Wu-cheng Lipublic class OtherSettingsPopup extends AbstractSettingPopup
39a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang        implements InLineSettingItem.Listener,
400bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang        AdapterView.OnItemClickListener {
4187695169a6b54b39258f236656b31991a3dbc2f8Wu-cheng Li    private static final String TAG = "OtherSettingsPopup";
420bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang
437f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li    private Listener mListener;
44a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang    private ArrayList<ListPreference> mListItem = new ArrayList<ListPreference>();
457f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li
467f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li    static public interface Listener {
47039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        public void onSettingChanged();
48003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        public void onRestorePreferencesClicked();
497f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li    }
507f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li
51a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang    private class OtherSettingsAdapter extends ArrayAdapter {
52a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang        LayoutInflater mInflater;
530bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang
54a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang        OtherSettingsAdapter() {
55757459bc8ded7e5708d8ad99ff38a3cb41904640Chung-yih Wang            super(OtherSettingsPopup.this.getContext(), 0, mListItem);
56757459bc8ded7e5708d8ad99ff38a3cb41904640Chung-yih Wang            mInflater = LayoutInflater.from(getContext());
57a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang        }
58a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang
59a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang        private int getSettingLayoutId(ListPreference pref) {
60a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang            // If the preference is null, it will be the only item , i.e.
61a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang            // 'Restore setting' in the popup window.
62a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang            if (pref == null) return R.layout.in_line_setting_restore;
63a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang
64a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang            // Currently, the RecordLocationPreference is the only setting
65a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang            // which applies the on/off switch.
66a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang            if (CameraSettings.KEY_RECORD_LOCATION.equals(pref.getKey())) {
67a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang                return R.layout.in_line_setting_switch;
68a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang            }
69a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang            return R.layout.in_line_setting_knob;
700bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang        }
710bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang
720bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang        @Override
730bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang        public View getView(int position, View convertView, ViewGroup parent) {
740bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang            if (convertView != null) return convertView;
750bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang
76a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang            ListPreference pref = mListItem.get(position);
77a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang
78a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang            int viewLayoutId = getSettingLayoutId(pref);
79a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang            InLineSettingItem view = (InLineSettingItem)
80a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang                    mInflater.inflate(viewLayoutId, parent, false);
81a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang
82a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang            view.initialize(pref); // no init for restore one
83a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang            view.setSettingChangedListener(OtherSettingsPopup.this);
840bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang            return view;
850bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang        }
860bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang    }
870bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang
88d50b09687918ae1c89e9c19175e217910b330c60Wu-cheng Li    public void setSettingChangedListener(Listener listener) {
897f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li        mListener = listener;
907f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li    }
917f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li
9202ec7c0880ded5863d73d6f173ef35ab5c888dcdWu-cheng Li    public OtherSettingsPopup(Context context, AttributeSet attrs) {
9302ec7c0880ded5863d73d6f173ef35ab5c888dcdWu-cheng Li        super(context, attrs);
947f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li    }
957f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li
96d50b09687918ae1c89e9c19175e217910b330c60Wu-cheng Li    public void initialize(PreferenceGroup group, String[] keys) {
970bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang        // Prepare the setting items.
98d50b09687918ae1c89e9c19175e217910b330c60Wu-cheng Li        for (int i = 0; i < keys.length; ++i) {
99d50b09687918ae1c89e9c19175e217910b330c60Wu-cheng Li            ListPreference pref = group.findPreference(keys[i]);
100a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang            if (pref != null) mListItem.add(pref);
1010bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang        }
1020bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang
1030bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang        // Prepare the restore setting line.
104a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang        mListItem.add(null);
105a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang
106a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang        ArrayAdapter mListItemAdapter = new OtherSettingsAdapter();
10792e9f2c3078c4625f9531443c75e51c3dfef8b48Chung-yih Wang        ((ListView) mSettingList).setAdapter(mListItemAdapter);
10892e9f2c3078c4625f9531443c75e51c3dfef8b48Chung-yih Wang        ((ListView) mSettingList).setOnItemClickListener(this);
10992e9f2c3078c4625f9531443c75e51c3dfef8b48Chung-yih Wang        ((ListView) mSettingList).setSelector(android.R.color.transparent);
1107f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li    }
1117f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li
112039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    @Override
11387695169a6b54b39258f236656b31991a3dbc2f8Wu-cheng Li    public void onSettingChanged() {
1147f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li        if (mListener != null) {
115039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            mListener.onSettingChanged();
1167f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li        }
1177f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li    }
118823d57389b616091827059ca6401f675e416a53bWu-cheng Li
119823d57389b616091827059ca6401f675e416a53bWu-cheng Li    // Scene mode can override other camera settings (ex: flash mode).
120d50b09687918ae1c89e9c19175e217910b330c60Wu-cheng Li    public void overrideSettings(final String ... keyvalues) {
12192e9f2c3078c4625f9531443c75e51c3dfef8b48Chung-yih Wang        int count = mSettingList.getChildCount();
122d50b09687918ae1c89e9c19175e217910b330c60Wu-cheng Li        for (int i = 0; i < keyvalues.length; i += 2) {
123d50b09687918ae1c89e9c19175e217910b330c60Wu-cheng Li            String key = keyvalues[i];
124d50b09687918ae1c89e9c19175e217910b330c60Wu-cheng Li            String value = keyvalues[i + 1];
125d50b09687918ae1c89e9c19175e217910b330c60Wu-cheng Li            for (int j = 0; j < count; j++) {
126a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang                ListPreference pref = (ListPreference) mListItem.get(j);
127d50b09687918ae1c89e9c19175e217910b330c60Wu-cheng Li                if (pref != null && key.equals(pref.getKey())) {
128a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang                    InLineSettingItem settingItem =
129a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang                            (InLineSettingItem) mSettingList.getChildAt(j);
130a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang                    settingItem.overrideSettings(value);
131d50b09687918ae1c89e9c19175e217910b330c60Wu-cheng Li                }
132823d57389b616091827059ca6401f675e416a53bWu-cheng Li            }
133823d57389b616091827059ca6401f675e416a53bWu-cheng Li        }
134823d57389b616091827059ca6401f675e416a53bWu-cheng Li    }
135003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li
136003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li    @Override
1370bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang    public void onItemClick(AdapterView<?> parent, View view, int position,
1380bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang            long id) {
1390bab538de42a296cf4fa2c7f13c251c11a6f7d3bChung-yih Wang        if ((position == mListItem.size() - 1) && (mListener != null)) {
140003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li            mListener.onRestorePreferencesClicked();
141003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li        }
142003dd5a52457c024a0f99a2bb222bfc6ad70bbe5Wu-cheng Li    }
143842b44f24ab621122183a149e20a852e5d8e0200Wu-cheng Li
144d50b09687918ae1c89e9c19175e217910b330c60Wu-cheng Li    @Override
145842b44f24ab621122183a149e20a852e5d8e0200Wu-cheng Li    public void reloadPreference() {
146842b44f24ab621122183a149e20a852e5d8e0200Wu-cheng Li        int count = mSettingList.getChildCount();
147842b44f24ab621122183a149e20a852e5d8e0200Wu-cheng Li        for (int i = 0; i < count; i++) {
148a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang            ListPreference pref = (ListPreference) mListItem.get(i);
149842b44f24ab621122183a149e20a852e5d8e0200Wu-cheng Li            if (pref != null) {
150a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang                InLineSettingItem settingItem =
151a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang                        (InLineSettingItem) mSettingList.getChildAt(i);
152a8b55a9628fa7c073d4f9c97c9a198275194f76aChung-yih Wang                settingItem.reloadPreference();
153842b44f24ab621122183a149e20a852e5d8e0200Wu-cheng Li            }
154842b44f24ab621122183a149e20a852e5d8e0200Wu-cheng Li        }
155842b44f24ab621122183a149e20a852e5d8e0200Wu-cheng Li    }
1567f0d458b7d2ed913879db247d16abcfdec0dc897Wu-cheng Li}
157