1ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley/*
2ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley * Copyright (C) 2013 The Android Open Source Project
3ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley *
4ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley * Licensed under the Apache License, Version 2.0 (the "License");
5ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley * you may not use this file except in compliance with the License.
6ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley * You may obtain a copy of the License at
7ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley *
8ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley *      http://www.apache.org/licenses/LICENSE-2.0
9ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley *
10ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley * Unless required by applicable law or agreed to in writing, software
11ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley * distributed under the License is distributed on an "AS IS" BASIS,
12ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley * See the License for the specific language governing permissions and
14ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley * limitations under the License.
15ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley */
16ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
17ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wileypackage com.android.timezonepicker;
18ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
19ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wileyimport android.content.Context;
20ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wileyimport android.content.SharedPreferences;
21ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wileyimport android.text.TextUtils;
22ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wileyimport android.util.Log;
23ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wileyimport android.view.LayoutInflater;
24ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wileyimport android.view.View;
25ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wileyimport android.view.ViewGroup;
26ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wileyimport android.widget.AdapterView;
27ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wileyimport android.widget.AdapterView.OnItemClickListener;
28ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wileyimport android.widget.BaseAdapter;
29ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wileyimport android.widget.TextView;
30ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
31ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wileyimport com.android.timezonepicker.TimeZoneFilterTypeAdapter.OnSetFilterListener;
32ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wileyimport com.android.timezonepicker.TimeZonePickerView.OnTimeZoneSetListener;
33ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
34ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wileyimport java.util.ArrayList;
35ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wileyimport java.util.Iterator;
36ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wileyimport java.util.LinkedHashSet;
37ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
38ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wileypublic class TimeZoneResultAdapter extends BaseAdapter implements OnItemClickListener,
39ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        OnSetFilterListener {
40ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    private static final String TAG = "TimeZoneResultAdapter";
41ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    private static final boolean DEBUG = false;
42ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    private static final int VIEW_TAG_TIME_ZONE = R.id.time_zone;
43ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    private static final int EMPTY_INDEX = -100;
44ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
45ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    /** SharedPref name and key for recent time zones */
46ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    private static final String SHARED_PREFS_NAME = "com.android.calendar_preferences";
47ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    private static final String KEY_RECENT_TIMEZONES = "preferences_recent_timezones";
48ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
49ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    private int mLastFilterType;
50ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    private String mLastFilterString;
51ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    private int mLastFilterTime;
52ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
53ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    private boolean mHasResults = false;
54ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
55ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    /**
56ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley     * The delimiter we use when serializing recent timezones to shared
57ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley     * preferences
58ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley     */
59ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    private static final String RECENT_TIMEZONES_DELIMITER = ",";
60ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
61ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    /** The maximum number of recent timezones to save */
62ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    private static final int MAX_RECENT_TIMEZONES = 3;
63ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
64ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    static class ViewHolder {
65ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        TextView timeZone;
66ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        TextView timeOffset;
67ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        TextView location;
68ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
69ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        static void setupViewHolder(View v) {
70ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            ViewHolder vh = new ViewHolder();
71ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            vh.timeZone = (TextView) v.findViewById(R.id.time_zone);
72ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            vh.timeOffset = (TextView) v.findViewById(R.id.time_offset);
73ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            vh.location = (TextView) v.findViewById(R.id.location);
74ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            v.setTag(vh);
75ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        }
76ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    }
77ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
78ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    private Context mContext;
79ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    private LayoutInflater mInflater;
80ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
81ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    private OnTimeZoneSetListener mTimeZoneSetListener;
82ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    private TimeZoneData mTimeZoneData;
83ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
84ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    private int[] mFilteredTimeZoneIndices;
85ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    private int mFilteredTimeZoneLength = 0;
86ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
87ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    public TimeZoneResultAdapter(Context context, TimeZoneData tzd,
88ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            com.android.timezonepicker.TimeZonePickerView.OnTimeZoneSetListener l) {
89ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        super();
90ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
91ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        mContext = context;
92ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        mTimeZoneData = tzd;
93ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        mTimeZoneSetListener = l;
94ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
95ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
96ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
97ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        mFilteredTimeZoneIndices = new int[mTimeZoneData.size()];
98ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
99ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        onSetFilter(TimeZoneFilterTypeAdapter.FILTER_TYPE_NONE, null, 0);
100ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    }
101ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
102ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    public boolean hasResults() {
103ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        return mHasResults;
104ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    }
105ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
106ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    public int getLastFilterType() {
107ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        return mLastFilterType;
108ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    }
109ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
110ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    public String getLastFilterString() {
111ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        return mLastFilterString;
112ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    }
113ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
114ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    public int getLastFilterTime() {
115ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        return mLastFilterTime;
116ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    }
117ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
118ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    // Implements OnSetFilterListener
119ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    @Override
120ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    public void onSetFilter(int filterType, String str, int time) {
121ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        if (DEBUG) {
122ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            Log.d(TAG, "onSetFilter: " + filterType + " [" + str + "] " + time);
123ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        }
124ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
125ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        mLastFilterType = filterType;
126ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        mLastFilterString = str;
127ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        mLastFilterTime = time;
128ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
129ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        mFilteredTimeZoneLength = 0;
130ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        int idx = 0;
131ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
132ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        switch (filterType) {
133ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            case TimeZoneFilterTypeAdapter.FILTER_TYPE_EMPTY:
134ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                mFilteredTimeZoneIndices[mFilteredTimeZoneLength++] = EMPTY_INDEX;
135ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                break;
136ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            case TimeZoneFilterTypeAdapter.FILTER_TYPE_NONE:
137ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                // Show the default/current value first
138ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                int defaultTzIndex = mTimeZoneData.getDefaultTimeZoneIndex();
139ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                if (defaultTzIndex != -1) {
140ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                    mFilteredTimeZoneIndices[mFilteredTimeZoneLength++] = defaultTzIndex;
141ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                }
142ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
143ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                // Show the recent selections
144ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                SharedPreferences prefs = mContext.getSharedPreferences(SHARED_PREFS_NAME,
145ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                        Context.MODE_PRIVATE);
146ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                String recentsString = prefs.getString(KEY_RECENT_TIMEZONES, null);
147ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                if (!TextUtils.isEmpty(recentsString)) {
148ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                    String[] recents = recentsString.split(RECENT_TIMEZONES_DELIMITER);
149ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                    for (int i = recents.length - 1; i >= 0; i--) {
150ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                        if (!TextUtils.isEmpty(recents[i])
151ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                                && !recents[i].equals(mTimeZoneData.mDefaultTimeZoneId)) {
152ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                            int index = mTimeZoneData.findIndexByTimeZoneIdSlow(recents[i]);
153ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                            if (index != -1) {
154ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                                mFilteredTimeZoneIndices[mFilteredTimeZoneLength++] = index;
155ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                            }
156ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                        }
157ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                    }
158ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                }
159ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
160ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                break;
161ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            case TimeZoneFilterTypeAdapter.FILTER_TYPE_GMT:
162ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                ArrayList<Integer> indices = mTimeZoneData.getTimeZonesByOffset(time);
163ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                if (indices != null) {
164ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                    for (Integer i : indices) {
165ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                        mFilteredTimeZoneIndices[mFilteredTimeZoneLength++] = i;
166ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                    }
167ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                }
168ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                break;
169ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            case TimeZoneFilterTypeAdapter.FILTER_TYPE_COUNTRY:
170ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                ArrayList<Integer> tzIds = mTimeZoneData.mTimeZonesByCountry.get(str);
171ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                if (tzIds != null) {
172ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                    for (Integer tzi : tzIds) {
173ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                        mFilteredTimeZoneIndices[mFilteredTimeZoneLength++] = tzi;
174ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                    }
175ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                }
176ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                break;
177ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            case TimeZoneFilterTypeAdapter.FILTER_TYPE_STATE:
178ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                // TODO Filter by state
179ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                break;
180ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            default:
181ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                throw new IllegalArgumentException();
182ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        }
183ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        mHasResults = mFilteredTimeZoneLength > 0;
184ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
185ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        notifyDataSetChanged();
186ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    }
187ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
188ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    /**
189ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley     * Saves the given timezone ID as a recent timezone under shared
190ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley     * preferences. If there are already the maximum number of recent timezones
191ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley     * saved, it will remove the oldest and append this one.
192ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley     *
193ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley     * @param id the ID of the timezone to save
194ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley     * @see {@link #MAX_RECENT_TIMEZONES}
195ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley     */
196ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    public void saveRecentTimezone(String id) {
197ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        SharedPreferences prefs = mContext.getSharedPreferences(SHARED_PREFS_NAME,
198ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                Context.MODE_PRIVATE);
199ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        String recentsString = prefs.getString(KEY_RECENT_TIMEZONES, null);
200ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        if (recentsString == null) {
201ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            recentsString = id;
202ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        } else {
203ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            // De-dup
204ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            LinkedHashSet<String> recents = new LinkedHashSet<String>();
205ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            for(String tzId : recentsString.split(RECENT_TIMEZONES_DELIMITER)) {
206ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                if (!recents.contains(tzId) && !id.equals(tzId)) {
207ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                    recents.add(tzId);
208ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                }
209ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            }
210ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
211ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            Iterator<String> it = recents.iterator();
212ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            while (recents.size() >= MAX_RECENT_TIMEZONES) {
213ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                if (!it.hasNext()) {
214ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                    break;
215ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                }
216ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                it.next();
217ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                it.remove();
218ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            }
219ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            recents.add(id);
220ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
221ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            StringBuilder builder = new StringBuilder();
222ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            boolean first = true;
223ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            for (String recent : recents) {
224ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                if (first) {
225ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                    first = false;
226ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                } else {
227ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                    builder.append(RECENT_TIMEZONES_DELIMITER);
228ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                }
229ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley                builder.append(recent);
230ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            }
231ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            recentsString = builder.toString();
232ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        }
233ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
234ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        prefs.edit().putString(KEY_RECENT_TIMEZONES, recentsString).apply();
235ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    }
236ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
237ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    @Override
238ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    public int getCount() {
239ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        return mFilteredTimeZoneLength;
240ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    }
241ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
242ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    @Override
243ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    public Object getItem(int position) {
244ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        if (position < 0 || position >= mFilteredTimeZoneLength) {
245ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            return null;
246ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        }
247ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
248ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        return mTimeZoneData.get(mFilteredTimeZoneIndices[position]);
249ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    }
250ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
251ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    @Override
252ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    public boolean areAllItemsEnabled() {
253ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        return false;
254ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    }
255ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
256ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    @Override
257ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    public boolean isEnabled(int position) {
258ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        return mFilteredTimeZoneIndices[position] >= 0;
259ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    }
260ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
261ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    @Override
262ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    public long getItemId(int position) {
263ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        return mFilteredTimeZoneIndices[position];
264ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    }
265ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
266ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    @Override
267ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    public View getView(int position, View convertView, ViewGroup parent) {
268ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        View v = convertView;
269ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
270ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        if (mFilteredTimeZoneIndices[position] == EMPTY_INDEX) {
271ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            v = mInflater.inflate(R.layout.empty_time_zone_item, null);
272ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            return v;
273ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        }
274ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
275ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        // We'll need to re-inflate the view if it was null, or if it was used as an empty item.
276ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        if (v == null || v.findViewById(R.id.empty_item) != null) {
277ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            v = mInflater.inflate(R.layout.time_zone_item, null);
278ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            ViewHolder.setupViewHolder(v);
279ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        }
280ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
281ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        ViewHolder vh = (ViewHolder) v.getTag();
282ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
283ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        TimeZoneInfo tzi = mTimeZoneData.get(mFilteredTimeZoneIndices[position]);
284ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        v.setTag(VIEW_TAG_TIME_ZONE, tzi);
285ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
286ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        vh.timeZone.setText(tzi.mDisplayName);
287ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
288ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        vh.timeOffset.setText(tzi.getGmtDisplayName(mContext));
289ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
290ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        String location = tzi.mCountry;
291ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        if (location == null) {
292ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            vh.location.setVisibility(View.INVISIBLE);
293ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        } else {
294ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            vh.location.setText(location);
295ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            vh.location.setVisibility(View.VISIBLE);
296ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        }
297ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
298ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        return v;
299ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    }
300ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
301ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    @Override
302ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    public boolean hasStableIds() {
303ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        return true;
304ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    }
305ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley
306ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    // Implements OnItemClickListener
307ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    @Override
308ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
309ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        if (mTimeZoneSetListener != null) {
310ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            TimeZoneInfo tzi = (TimeZoneInfo) v.getTag(VIEW_TAG_TIME_ZONE);
311ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            if (tzi != null) {
312ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley              mTimeZoneSetListener.onTimeZoneSet(tzi);
313ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley              saveRecentTimezone(tzi.mTzId);
314ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley            }
315ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley        }
316ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley    }
317ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley}
318ad1367edfa4bc735c46fa8919753cbd05575c4efChristopher Wiley