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