TimeZoneResultAdapter.java revision 1db8933b4e7e0190f59344c86e92d56607658089
1b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan/*
2b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan * Copyright (C) 2013 The Android Open Source Project
3b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan *
4b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan * Licensed under the Apache License, Version 2.0 (the "License");
5b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan * you may not use this file except in compliance with the License.
6b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan * You may obtain a copy of the License at
7b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan *
8b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan *      http://www.apache.org/licenses/LICENSE-2.0
9b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan *
10b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan * Unless required by applicable law or agreed to in writing, software
11b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan * distributed under the License is distributed on an "AS IS" BASIS,
12b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan * See the License for the specific language governing permissions and
14b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan * limitations under the License.
15b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan */
16b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
17b1b7080deea42aa533c3757b585cf765c6b76732Michael Chanpackage com.android.timezonepicker;
18b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
19b1b7080deea42aa533c3757b585cf765c6b76732Michael Chanimport android.content.Context;
20b1b7080deea42aa533c3757b585cf765c6b76732Michael Chanimport android.content.SharedPreferences;
21b1b7080deea42aa533c3757b585cf765c6b76732Michael Chanimport android.text.TextUtils;
22b1b7080deea42aa533c3757b585cf765c6b76732Michael Chanimport android.util.Log;
23b1b7080deea42aa533c3757b585cf765c6b76732Michael Chanimport android.view.LayoutInflater;
24b1b7080deea42aa533c3757b585cf765c6b76732Michael Chanimport android.view.View;
25b1b7080deea42aa533c3757b585cf765c6b76732Michael Chanimport android.view.ViewGroup;
26b064db0d1a7ffcedddd691b35d57e2cdb0268883Michael Chanimport android.widget.AdapterView;
27b064db0d1a7ffcedddd691b35d57e2cdb0268883Michael Chanimport android.widget.AdapterView.OnItemClickListener;
28b1b7080deea42aa533c3757b585cf765c6b76732Michael Chanimport android.widget.BaseAdapter;
29b1b7080deea42aa533c3757b585cf765c6b76732Michael Chanimport android.widget.TextView;
30b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
31b1b7080deea42aa533c3757b585cf765c6b76732Michael Chanimport com.android.timezonepicker.TimeZoneFilterTypeAdapter.OnSetFilterListener;
32b1b7080deea42aa533c3757b585cf765c6b76732Michael Chanimport com.android.timezonepicker.TimeZonePickerView.OnTimeZoneSetListener;
33b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
34b1b7080deea42aa533c3757b585cf765c6b76732Michael Chanimport java.util.ArrayList;
351db8933b4e7e0190f59344c86e92d56607658089Michael Chanimport java.util.Iterator;
36143a7e20a46dbd66bec4e4d7e8e0dcb693d343d3Michael Chanimport java.util.LinkedHashSet;
37b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
38b064db0d1a7ffcedddd691b35d57e2cdb0268883Michael Chanpublic class TimeZoneResultAdapter extends BaseAdapter implements OnItemClickListener,
39b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        OnSetFilterListener {
40b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    private static final String TAG = "TimeZoneResultAdapter";
41b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    private static final int VIEW_TAG_TIME_ZONE = R.id.time_zone;
42b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
43b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    /** SharedPref name and key for recent time zones */
44b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    private static final String SHARED_PREFS_NAME = "com.android.calendar_preferences";
45b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    private static final String KEY_RECENT_TIMEZONES = "preferences_recent_timezones";
46b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
47b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    /**
48b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan     * The delimiter we use when serializing recent timezones to shared
49b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan     * preferences
50b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan     */
51b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    private static final String RECENT_TIMEZONES_DELIMITER = ",";
52b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
53b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    /** The maximum number of recent timezones to save */
54b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    private static final int MAX_RECENT_TIMEZONES = 3;
55b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
56b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    static class ViewHolder {
57b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        TextView timeZone;
58b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        TextView timeOffset;
59b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        TextView location;
60b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
61b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        static void setupViewHolder(View v) {
62b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            ViewHolder vh = new ViewHolder();
63b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            vh.timeZone = (TextView) v.findViewById(R.id.time_zone);
64b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            vh.timeOffset = (TextView) v.findViewById(R.id.time_offset);
65b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            vh.location = (TextView) v.findViewById(R.id.location);
66b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            v.setTag(vh);
67b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        }
68b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    }
69b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
70b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    private Context mContext;
71b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    private LayoutInflater mInflater;
72b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
73b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    private OnTimeZoneSetListener mTimeZoneSetListener;
74b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    private TimeZoneData mTimeZoneData;
75b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
76b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    private int[] mFilteredTimeZoneIndices;
77b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    private int mFilteredTimeZoneLength = 0;
78b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
79b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    public TimeZoneResultAdapter(Context context, TimeZoneData tzd,
80b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            com.android.timezonepicker.TimeZonePickerView.OnTimeZoneSetListener l) {
81b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        super();
82b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
83b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        mContext = context;
84b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        mTimeZoneData = tzd;
85b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        mTimeZoneSetListener = l;
86b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
87b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
88b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
89b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        mFilteredTimeZoneIndices = new int[mTimeZoneData.size()];
90b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
91b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        onSetFilter(TimeZoneFilterTypeAdapter.FILTER_TYPE_NONE, null, 0);
92b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    }
93b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
94b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    // Implements OnSetFilterListener
95b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    @Override
96b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    public void onSetFilter(int filterType, String str, int time) {
97b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        Log.d(TAG, "onSetFilter: " + filterType + " [" + str + "] " + time);
98b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
99b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        mFilteredTimeZoneLength = 0;
100b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        int idx = 0;
101b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
102b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        switch (filterType) {
103b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            case TimeZoneFilterTypeAdapter.FILTER_TYPE_EMPTY:
104b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                break;
105b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            case TimeZoneFilterTypeAdapter.FILTER_TYPE_NONE:
106b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                // Show the default/current value first
107b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                int defaultTzIndex = mTimeZoneData.getDefaultTimeZoneIndex();
108b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                if (defaultTzIndex != -1) {
109b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                    mFilteredTimeZoneIndices[mFilteredTimeZoneLength++] = defaultTzIndex;
110b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                }
111b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
112b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                // Show the recent selections
113b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                SharedPreferences prefs = mContext.getSharedPreferences(SHARED_PREFS_NAME,
114b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                        Context.MODE_PRIVATE);
115b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                String recentsString = prefs.getString(KEY_RECENT_TIMEZONES, null);
116b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                if (!TextUtils.isEmpty(recentsString)) {
117b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                    String[] recents = recentsString.split(RECENT_TIMEZONES_DELIMITER);
118b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                    for (int i = recents.length - 1; i >= 0; i--) {
119b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                        if (!TextUtils.isEmpty(recents[i])
120b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                                && !recents[i].equals(mTimeZoneData.mDefaultTimeZoneId)) {
121b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                            int index = mTimeZoneData.findIndexByTimeZoneIdSlow(recents[i]);
122b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                            if (index != -1) {
123b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                                mFilteredTimeZoneIndices[mFilteredTimeZoneLength++] = index;
124b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                            }
125b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                        }
126b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                    }
127b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                }
128b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
129b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                break;
130b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            case TimeZoneFilterTypeAdapter.FILTER_TYPE_GMT:
131b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                ArrayList<Integer> indices = mTimeZoneData.getTimeZonesByOffset(time);
132b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                if (indices != null) {
133b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                    for (Integer i : indices) {
134b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                        mFilteredTimeZoneIndices[mFilteredTimeZoneLength++] = i;
135b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                    }
136b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                }
137b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                break;
138b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            case TimeZoneFilterTypeAdapter.FILTER_TYPE_TIME:
1390717b65fee21de6a321e42c9f3852f8b622c3215Michael Chan                // TODO make this faster
1400717b65fee21de6a321e42c9f3852f8b622c3215Michael Chan                long now = System.currentTimeMillis();
141b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                for (TimeZoneInfo tzi : mTimeZoneData.mTimeZones) {
1420717b65fee21de6a321e42c9f3852f8b622c3215Michael Chan                    int localHr = tzi.getLocalHr(now);
1430717b65fee21de6a321e42c9f3852f8b622c3215Michael Chan                    boolean match = localHr == time;
1440717b65fee21de6a321e42c9f3852f8b622c3215Michael Chan                    if (!match && !TimeZoneData.is24HourFormat) {
1450717b65fee21de6a321e42c9f3852f8b622c3215Michael Chan                        // PM + noon cases
146215ec1009ae3b52ed491fde7b2aa0a13dd4387beMichael Chan                        if ((time + 12 == localHr) || (time == 12 && localHr == 0)) {
1470717b65fee21de6a321e42c9f3852f8b622c3215Michael Chan                            match = true;
1480717b65fee21de6a321e42c9f3852f8b622c3215Michael Chan                        }
1490717b65fee21de6a321e42c9f3852f8b622c3215Michael Chan                    }
1500717b65fee21de6a321e42c9f3852f8b622c3215Michael Chan                    if (match) {
151b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                        mFilteredTimeZoneIndices[mFilteredTimeZoneLength++] = idx;
152b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                    }
153b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                    idx++;
154b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                }
155b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                break;
156b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            case TimeZoneFilterTypeAdapter.FILTER_TYPE_COUNTRY:
157b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                ArrayList<Integer> tzIds = mTimeZoneData.mTimeZonesByCountry.get(str);
158b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                if (tzIds != null) {
159b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                    for (Integer tzi : tzIds) {
160b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                        mFilteredTimeZoneIndices[mFilteredTimeZoneLength++] = tzi;
161b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                    }
162b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                }
163b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                break;
164b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            case TimeZoneFilterTypeAdapter.FILTER_TYPE_STATE:
165b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                // TODO Filter by state
166b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                break;
167b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            default:
168b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                throw new IllegalArgumentException();
169b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        }
170b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        notifyDataSetChanged();
171b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    }
172b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
173b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    /**
174b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan     * Saves the given timezone ID as a recent timezone under shared
175b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan     * preferences. If there are already the maximum number of recent timezones
176b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan     * saved, it will remove the oldest and append this one.
177b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan     *
178b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan     * @param id the ID of the timezone to save
179b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan     * @see {@link #MAX_RECENT_TIMEZONES}
180b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan     */
181b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    public void saveRecentTimezone(String id) {
182b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        SharedPreferences prefs = mContext.getSharedPreferences(SHARED_PREFS_NAME,
183b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                Context.MODE_PRIVATE);
184b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        String recentsString = prefs.getString(KEY_RECENT_TIMEZONES, null);
185b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        if (recentsString == null) {
186b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            recentsString = id;
187b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        } else {
188143a7e20a46dbd66bec4e4d7e8e0dcb693d343d3Michael Chan            // De-dup
189143a7e20a46dbd66bec4e4d7e8e0dcb693d343d3Michael Chan            LinkedHashSet<String> recents = new LinkedHashSet<String>();
190143a7e20a46dbd66bec4e4d7e8e0dcb693d343d3Michael Chan            for(String tzId : recentsString.split(RECENT_TIMEZONES_DELIMITER)) {
191143a7e20a46dbd66bec4e4d7e8e0dcb693d343d3Michael Chan                if (!recents.contains(tzId) && !id.equals(tzId)) {
192143a7e20a46dbd66bec4e4d7e8e0dcb693d343d3Michael Chan                    recents.add(tzId);
193b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                }
194b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            }
195b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
1961db8933b4e7e0190f59344c86e92d56607658089Michael Chan            Iterator<String> it = recents.iterator();
197b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            while (recents.size() >= MAX_RECENT_TIMEZONES) {
1981db8933b4e7e0190f59344c86e92d56607658089Michael Chan                if (!it.hasNext()) {
1991db8933b4e7e0190f59344c86e92d56607658089Michael Chan                    break;
2001db8933b4e7e0190f59344c86e92d56607658089Michael Chan                }
2011db8933b4e7e0190f59344c86e92d56607658089Michael Chan                it.next();
2021db8933b4e7e0190f59344c86e92d56607658089Michael Chan                it.remove();
203b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            }
204b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            recents.add(id);
205b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
206b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            StringBuilder builder = new StringBuilder();
207b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            boolean first = true;
208b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            for (String recent : recents) {
209b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                if (first) {
210b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                    first = false;
211b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                } else {
212b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                    builder.append(RECENT_TIMEZONES_DELIMITER);
213b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                }
214b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan                builder.append(recent);
215b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            }
216b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            recentsString = builder.toString();
217b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        }
218b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
219b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        prefs.edit().putString(KEY_RECENT_TIMEZONES, recentsString).apply();
220b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    }
221b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
222b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    @Override
223b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    public int getCount() {
224b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        return mFilteredTimeZoneLength;
225b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    }
226b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
227b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    @Override
228215ec1009ae3b52ed491fde7b2aa0a13dd4387beMichael Chan    public Object getItem(int position) {
229b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        if (position < 0 || position >= mFilteredTimeZoneLength) {
230b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            return null;
231b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        }
232b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
233b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        return mTimeZoneData.get(mFilteredTimeZoneIndices[position]);
234b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    }
235b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
236b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    @Override
237b064db0d1a7ffcedddd691b35d57e2cdb0268883Michael Chan    public boolean areAllItemsEnabled() {
238b064db0d1a7ffcedddd691b35d57e2cdb0268883Michael Chan        return false;
239b064db0d1a7ffcedddd691b35d57e2cdb0268883Michael Chan    }
240b064db0d1a7ffcedddd691b35d57e2cdb0268883Michael Chan
241b064db0d1a7ffcedddd691b35d57e2cdb0268883Michael Chan    @Override
242215ec1009ae3b52ed491fde7b2aa0a13dd4387beMichael Chan    public boolean isEnabled(int position) {
243215ec1009ae3b52ed491fde7b2aa0a13dd4387beMichael Chan        return mFilteredTimeZoneIndices[position] >= 0;
244215ec1009ae3b52ed491fde7b2aa0a13dd4387beMichael Chan    }
245215ec1009ae3b52ed491fde7b2aa0a13dd4387beMichael Chan
246215ec1009ae3b52ed491fde7b2aa0a13dd4387beMichael Chan    @Override
247b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    public long getItemId(int position) {
248b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        return mFilteredTimeZoneIndices[position];
249b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    }
250b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
251b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    @Override
252b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    public View getView(int position, View convertView, ViewGroup parent) {
253b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        View v = convertView;
254b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
255b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        if (v == null) {
256b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            v = mInflater.inflate(R.layout.time_zone_item, null);
257b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            ViewHolder.setupViewHolder(v);
258b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        }
259b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
260b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        ViewHolder vh = (ViewHolder) v.getTag();
261b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
262143a7e20a46dbd66bec4e4d7e8e0dcb693d343d3Michael Chan        TimeZoneInfo tzi = mTimeZoneData.get(mFilteredTimeZoneIndices[position]);
263143a7e20a46dbd66bec4e4d7e8e0dcb693d343d3Michael Chan        v.setTag(VIEW_TAG_TIME_ZONE, tzi);
264215ec1009ae3b52ed491fde7b2aa0a13dd4387beMichael Chan
265143a7e20a46dbd66bec4e4d7e8e0dcb693d343d3Michael Chan        vh.timeZone.setText(tzi.mDisplayName);
266215ec1009ae3b52ed491fde7b2aa0a13dd4387beMichael Chan
267143a7e20a46dbd66bec4e4d7e8e0dcb693d343d3Michael Chan        vh.timeOffset.setText(tzi.getGmtDisplayName(mContext));
268b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
269143a7e20a46dbd66bec4e4d7e8e0dcb693d343d3Michael Chan        String location = tzi.mCountry;
270143a7e20a46dbd66bec4e4d7e8e0dcb693d343d3Michael Chan        if (location == null) {
271143a7e20a46dbd66bec4e4d7e8e0dcb693d343d3Michael Chan            vh.location.setVisibility(View.INVISIBLE);
272b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        } else {
273143a7e20a46dbd66bec4e4d7e8e0dcb693d343d3Michael Chan            vh.location.setText(location);
274143a7e20a46dbd66bec4e4d7e8e0dcb693d343d3Michael Chan            vh.location.setVisibility(View.VISIBLE);
275b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        }
276b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
277b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        return v;
278b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    }
279b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
280b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    @Override
281b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    public boolean hasStableIds() {
282b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        return true;
283b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    }
284b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan
285b064db0d1a7ffcedddd691b35d57e2cdb0268883Michael Chan    // Implements OnItemClickListener
286b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    @Override
287b064db0d1a7ffcedddd691b35d57e2cdb0268883Michael Chan    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
288b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        if (mTimeZoneSetListener != null) {
289b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            TimeZoneInfo tzi = (TimeZoneInfo) v.getTag(VIEW_TAG_TIME_ZONE);
290b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            mTimeZoneSetListener.onTimeZoneSet(tzi);
291b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan            saveRecentTimezone(tzi.mTzId);
292b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan        }
293b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan    }
294b1b7080deea42aa533c3757b585cf765c6b76732Michael Chan}
295