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