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;
21f04692066fc7087560248b003c49e0377c056edfDoris Liuimport android.util.Log;
22f04692066fc7087560248b003c49e0377c056edfDoris Liuimport android.view.View;
23f04692066fc7087560248b003c49e0377c056edfDoris Liuimport android.widget.ListView;
24f04692066fc7087560248b003c49e0377c056edfDoris Liuimport android.widget.AdapterView;
25f04692066fc7087560248b003c49e0377c056edfDoris Liuimport android.widget.ImageView;
26f04692066fc7087560248b003c49e0377c056edfDoris Liuimport android.widget.SimpleAdapter;
27f04692066fc7087560248b003c49e0377c056edfDoris Liu
28f04692066fc7087560248b003c49e0377c056edfDoris Liuimport com.android.camera.IconListPreference;
29f04692066fc7087560248b003c49e0377c056edfDoris Liuimport com.android.camera.ListPreference;
30f04692066fc7087560248b003c49e0377c056edfDoris Liuimport com.android.camera.R;
31f04692066fc7087560248b003c49e0377c056edfDoris Liu
32f04692066fc7087560248b003c49e0377c056edfDoris Liuimport java.util.ArrayList;
33f04692066fc7087560248b003c49e0377c056edfDoris Liuimport java.util.HashMap;
34f04692066fc7087560248b003c49e0377c056edfDoris Liuimport java.util.List;
35f04692066fc7087560248b003c49e0377c056edfDoris Liuimport java.util.Map;
36f04692066fc7087560248b003c49e0377c056edfDoris Liu
37f04692066fc7087560248b003c49e0377c056edfDoris Liu// A popup window that shows one camera setting. The title is the name of the
38f04692066fc7087560248b003c49e0377c056edfDoris Liu// setting (ex: white-balance). The entries are the supported values (ex:
39f04692066fc7087560248b003c49e0377c056edfDoris Liu// daylight, incandescent, etc). If initialized with an IconListPreference,
40f04692066fc7087560248b003c49e0377c056edfDoris Liu// the entries will contain both text and icons. Otherwise, entries will be
41f04692066fc7087560248b003c49e0377c056edfDoris Liu// shown in text.
42f04692066fc7087560248b003c49e0377c056edfDoris Liupublic class ListPrefSettingPopup extends AbstractSettingPopup implements
43f04692066fc7087560248b003c49e0377c056edfDoris Liu        AdapterView.OnItemClickListener {
44f04692066fc7087560248b003c49e0377c056edfDoris Liu    private static final String TAG = "ListPrefSettingPopup";
45f04692066fc7087560248b003c49e0377c056edfDoris Liu    private ListPreference mPreference;
46f04692066fc7087560248b003c49e0377c056edfDoris Liu    private Listener mListener;
47f04692066fc7087560248b003c49e0377c056edfDoris Liu
48f04692066fc7087560248b003c49e0377c056edfDoris Liu    static public interface Listener {
49f04692066fc7087560248b003c49e0377c056edfDoris Liu        public void onListPrefChanged(ListPreference pref);
50f04692066fc7087560248b003c49e0377c056edfDoris Liu    }
51f04692066fc7087560248b003c49e0377c056edfDoris Liu
52f04692066fc7087560248b003c49e0377c056edfDoris Liu    public ListPrefSettingPopup(Context context, AttributeSet attrs) {
53f04692066fc7087560248b003c49e0377c056edfDoris Liu        super(context, attrs);
54f04692066fc7087560248b003c49e0377c056edfDoris Liu    }
55f04692066fc7087560248b003c49e0377c056edfDoris Liu
56f04692066fc7087560248b003c49e0377c056edfDoris Liu    private class ListPrefSettingAdapter extends SimpleAdapter {
57f04692066fc7087560248b003c49e0377c056edfDoris Liu        ListPrefSettingAdapter(Context context, List<? extends Map<String, ?>> data,
58f04692066fc7087560248b003c49e0377c056edfDoris Liu                int resource, String[] from, int[] to) {
59f04692066fc7087560248b003c49e0377c056edfDoris Liu            super(context, data, resource, from, to);
60f04692066fc7087560248b003c49e0377c056edfDoris Liu        }
61f04692066fc7087560248b003c49e0377c056edfDoris Liu
62f04692066fc7087560248b003c49e0377c056edfDoris Liu        @Override
63f04692066fc7087560248b003c49e0377c056edfDoris Liu        public void setViewImage(ImageView v, String value) {
64f04692066fc7087560248b003c49e0377c056edfDoris Liu            if ("".equals(value)) {
65f04692066fc7087560248b003c49e0377c056edfDoris Liu                // Some settings have no icons. Ex: exposure compensation.
66f04692066fc7087560248b003c49e0377c056edfDoris Liu                v.setVisibility(View.GONE);
67f04692066fc7087560248b003c49e0377c056edfDoris Liu            } else {
68f04692066fc7087560248b003c49e0377c056edfDoris Liu                super.setViewImage(v, value);
69f04692066fc7087560248b003c49e0377c056edfDoris Liu            }
70f04692066fc7087560248b003c49e0377c056edfDoris Liu        }
71f04692066fc7087560248b003c49e0377c056edfDoris Liu    }
72f04692066fc7087560248b003c49e0377c056edfDoris Liu
73f04692066fc7087560248b003c49e0377c056edfDoris Liu    public void initialize(ListPreference preference) {
74f04692066fc7087560248b003c49e0377c056edfDoris Liu        mPreference = preference;
75f04692066fc7087560248b003c49e0377c056edfDoris Liu        Context context = getContext();
76f04692066fc7087560248b003c49e0377c056edfDoris Liu        CharSequence[] entries = mPreference.getEntries();
77f04692066fc7087560248b003c49e0377c056edfDoris Liu        int[] iconIds = null;
78f04692066fc7087560248b003c49e0377c056edfDoris Liu        if (preference instanceof IconListPreference) {
79f04692066fc7087560248b003c49e0377c056edfDoris Liu            iconIds = ((IconListPreference) mPreference).getImageIds();
80f04692066fc7087560248b003c49e0377c056edfDoris Liu            if (iconIds == null) {
81f04692066fc7087560248b003c49e0377c056edfDoris Liu                iconIds = ((IconListPreference) mPreference).getLargeIconIds();
82f04692066fc7087560248b003c49e0377c056edfDoris Liu            }
83f04692066fc7087560248b003c49e0377c056edfDoris Liu        }
84f04692066fc7087560248b003c49e0377c056edfDoris Liu        // Set title.
85f04692066fc7087560248b003c49e0377c056edfDoris Liu        mTitle.setText(mPreference.getTitle());
86f04692066fc7087560248b003c49e0377c056edfDoris Liu
87f04692066fc7087560248b003c49e0377c056edfDoris Liu        // Prepare the ListView.
88f04692066fc7087560248b003c49e0377c056edfDoris Liu        ArrayList<HashMap<String, Object>> listItem =
89f04692066fc7087560248b003c49e0377c056edfDoris Liu                new ArrayList<HashMap<String, Object>>();
90f04692066fc7087560248b003c49e0377c056edfDoris Liu        for(int i = 0; i < entries.length; ++i) {
91f04692066fc7087560248b003c49e0377c056edfDoris Liu            HashMap<String, Object> map = new HashMap<String, Object>();
92f04692066fc7087560248b003c49e0377c056edfDoris Liu            map.put("text", entries[i].toString());
93f04692066fc7087560248b003c49e0377c056edfDoris Liu            if (iconIds != null) map.put("image", iconIds[i]);
94f04692066fc7087560248b003c49e0377c056edfDoris Liu            listItem.add(map);
95f04692066fc7087560248b003c49e0377c056edfDoris Liu        }
96f04692066fc7087560248b003c49e0377c056edfDoris Liu        SimpleAdapter listItemAdapter = new ListPrefSettingAdapter(context, listItem,
97f04692066fc7087560248b003c49e0377c056edfDoris Liu                R.layout.setting_item,
98f04692066fc7087560248b003c49e0377c056edfDoris Liu                new String[] {"text", "image"},
99f04692066fc7087560248b003c49e0377c056edfDoris Liu                new int[] {R.id.text, R.id.image});
100f04692066fc7087560248b003c49e0377c056edfDoris Liu        ((ListView) mSettingList).setAdapter(listItemAdapter);
101f04692066fc7087560248b003c49e0377c056edfDoris Liu        ((ListView) mSettingList).setOnItemClickListener(this);
102f04692066fc7087560248b003c49e0377c056edfDoris Liu        reloadPreference();
103f04692066fc7087560248b003c49e0377c056edfDoris Liu    }
104f04692066fc7087560248b003c49e0377c056edfDoris Liu
105f04692066fc7087560248b003c49e0377c056edfDoris Liu    // The value of the preference may have changed. Update the UI.
106f04692066fc7087560248b003c49e0377c056edfDoris Liu    @Override
107f04692066fc7087560248b003c49e0377c056edfDoris Liu    public void reloadPreference() {
108f04692066fc7087560248b003c49e0377c056edfDoris Liu        int index = mPreference.findIndexOfValue(mPreference.getValue());
109f04692066fc7087560248b003c49e0377c056edfDoris Liu        if (index != -1) {
110f04692066fc7087560248b003c49e0377c056edfDoris Liu            ((ListView) mSettingList).setItemChecked(index, true);
111f04692066fc7087560248b003c49e0377c056edfDoris Liu        } else {
112f04692066fc7087560248b003c49e0377c056edfDoris Liu            Log.e(TAG, "Invalid preference value.");
113f04692066fc7087560248b003c49e0377c056edfDoris Liu            mPreference.print();
114f04692066fc7087560248b003c49e0377c056edfDoris Liu        }
115f04692066fc7087560248b003c49e0377c056edfDoris Liu    }
116f04692066fc7087560248b003c49e0377c056edfDoris Liu
117f04692066fc7087560248b003c49e0377c056edfDoris Liu    public void setSettingChangedListener(Listener listener) {
118f04692066fc7087560248b003c49e0377c056edfDoris Liu        mListener = listener;
119f04692066fc7087560248b003c49e0377c056edfDoris Liu    }
120f04692066fc7087560248b003c49e0377c056edfDoris Liu
121f04692066fc7087560248b003c49e0377c056edfDoris Liu    @Override
122f04692066fc7087560248b003c49e0377c056edfDoris Liu    public void onItemClick(AdapterView<?> parent, View view,
123f04692066fc7087560248b003c49e0377c056edfDoris Liu            int index, long id) {
124f04692066fc7087560248b003c49e0377c056edfDoris Liu        mPreference.setValueIndex(index);
125f04692066fc7087560248b003c49e0377c056edfDoris Liu        if (mListener != null) mListener.onListPrefChanged(mPreference);
126f04692066fc7087560248b003c49e0377c056edfDoris Liu    }
127f04692066fc7087560248b003c49e0377c056edfDoris Liu}
128