1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/* 2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License. 6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at 7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and 14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License. 15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings; 18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1939b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.annotation.NonNull; 200f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawaimport android.app.Activity; 210f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawaimport android.app.AlarmManager; 220f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawaimport android.app.ListFragment; 230f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawaimport android.content.Context; 24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 2597d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkeyimport android.view.LayoutInflater; 260f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawaimport android.view.Menu; 270f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawaimport android.view.MenuInflater; 280f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawaimport android.view.MenuItem; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 3097d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkeyimport android.view.ViewGroup; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView; 320f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawaimport android.widget.SimpleAdapter; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 34550015e47656dad997973c89a30cffe56db9cdbdTony Mantlerimport com.android.settingslib.datetime.ZoneGetter; 350f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 360f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawaimport java.util.Collections; 370f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawaimport java.util.Comparator; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.HashMap; 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List; 40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Map; 410f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawaimport java.util.TimeZone; 420f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 430f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa/** 440f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa * The class displaying a list of time zones that match a filter string 450f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa * such as "Africa", "Europe", etc. Choosing an item from the list will set 46f1582bc3f58ac440c11c54b844287915594b433fElliott Hughes * the time zone. Pressing Back without choosing from the list will not 470f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa * result in a change in the time zone setting. 480f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa */ 490f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawapublic class ZonePicker extends ListFragment { 500f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa private static final String TAG = "ZonePicker"; 510f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 52550015e47656dad997973c89a30cffe56db9cdbdTony Mantler public interface ZoneSelectionListener { 530f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa // You can add any argument if you really need it... 54550015e47656dad997973c89a30cffe56db9cdbdTony Mantler void onZoneSelected(TimeZone tz); 550f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa } 560f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 570f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa private static final int MENU_TIMEZONE = Menu.FIRST+1; 580f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa private static final int MENU_ALPHABETICAL = Menu.FIRST; 590f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 600f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa private boolean mSortedByTimezone; 610f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 620f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa private SimpleAdapter mTimezoneSortedAdapter; 630f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa private SimpleAdapter mAlphabeticalAdapter; 640f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 650f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa private ZoneSelectionListener mListener; 660f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 672571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa /** 682571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa * Constructs an adapter with TimeZone list. Sorted by TimeZone in default. 692571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa * 702571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa * @param sortedByName use Name for sorting the list. 712571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa */ 722571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa public static SimpleAdapter constructTimezoneAdapter(Context context, 732571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa boolean sortedByName) { 740688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa return constructTimezoneAdapter(context, sortedByName, 754166ec39ecd8a2066f4426e1b359a0b1f95af05eJeff Sharkey R.layout.date_time_setup_custom_list_item_2); 760688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa } 770688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa 780688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa /** 790688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa * Constructs an adapter with TimeZone list. Sorted by TimeZone in default. 800688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa * 810688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa * @param sortedByName use Name for sorting the list. 820688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa */ 830688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa public static SimpleAdapter constructTimezoneAdapter(Context context, 840688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa boolean sortedByName, int layoutId) { 85550015e47656dad997973c89a30cffe56db9cdbdTony Mantler final String[] from = new String[] {ZoneGetter.KEY_DISPLAYNAME, ZoneGetter.KEY_GMT}; 860f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa final int[] to = new int[] {android.R.id.text1, android.R.id.text2}; 87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 88550015e47656dad997973c89a30cffe56db9cdbdTony Mantler final String sortKey = (sortedByName ? ZoneGetter.KEY_DISPLAYNAME : ZoneGetter.KEY_OFFSET); 892571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa final MyComparator comparator = new MyComparator(sortKey); 90b9864427471ac206d08836a12a8b2f230c883d9eNeil Fuller final List<Map<String, Object>> sortedList = ZoneGetter.getZonesList(context); 912571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa Collections.sort(sortedList, comparator); 922571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa final SimpleAdapter adapter = new SimpleAdapter(context, 932571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa sortedList, 940688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa layoutId, 950f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa from, 960f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa to); 970f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 982571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa return adapter; 992571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa } 1002571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa 1012571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa /** 1022571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa * Searches {@link TimeZone} from the given {@link SimpleAdapter} object, and returns 1032571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa * the index for the TimeZone. 1042571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa * 1052571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa * @param adapter SimpleAdapter constructed by 1062571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa * {@link #constructTimezoneAdapter(Context, boolean)}. 1072571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa * @param tz TimeZone to be searched. 1082571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa * @return Index for the given TimeZone. -1 when there's no corresponding list item. 1092571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa * returned. 1102571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa */ 1112571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa public static int getTimeZoneIndex(SimpleAdapter adapter, TimeZone tz) { 1122571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa final String defaultId = tz.getID(); 1132571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa final int listSize = adapter.getCount(); 1142571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa for (int i = 0; i < listSize; i++) { 1152571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa // Using HashMap<String, Object> induces unnecessary warning. 1162571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa final HashMap<?,?> map = (HashMap<?,?>)adapter.getItem(i); 117550015e47656dad997973c89a30cffe56db9cdbdTony Mantler final String id = (String)map.get(ZoneGetter.KEY_ID); 1182571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa if (defaultId.equals(id)) { 1192571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa // If current timezone is in this list, move focus to it 1202571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa return i; 1212571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa } 1222571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa } 1232571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa return -1; 1242571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa } 1252571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa 1262571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa /** 1272571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa * @param item one of items in adapters. The adapter should be constructed by 1282571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa * {@link #constructTimezoneAdapter(Context, boolean)}. 1292571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa * @return TimeZone object corresponding to the item. 1302571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa */ 1312571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa public static TimeZone obtainTimeZoneFromItem(Object item) { 132550015e47656dad997973c89a30cffe56db9cdbdTony Mantler return TimeZone.getTimeZone((String)((Map<?, ?>)item).get(ZoneGetter.KEY_ID)); 1332571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa } 1342571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa 1352571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa @Override 136f1582bc3f58ac440c11c54b844287915594b433fElliott Hughes public void onActivityCreated(Bundle savedInstanceState) { 137f1582bc3f58ac440c11c54b844287915594b433fElliott Hughes super.onActivityCreated(savedInstanceState); 1382571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa 1392571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa final Activity activity = getActivity(); 1402571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa mTimezoneSortedAdapter = constructTimezoneAdapter(activity, false); 1412571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa mAlphabeticalAdapter = constructTimezoneAdapter(activity, true); 1420f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 1430f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa // Sets the adapter 1440f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa setSorting(true); 1451e9d497e2b0a3d00e83372d536b79c9ec0646b9dDaisuke Miyakawa setHasOptionsMenu(true); 1460f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa } 147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 149550015e47656dad997973c89a30cffe56db9cdbdTony Mantler public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, 15097d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey Bundle savedInstanceState) { 15197d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey final View view = super.onCreateView(inflater, container, savedInstanceState); 15297d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey final ListView list = (ListView) view.findViewById(android.R.id.list); 15397d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey Utils.forcePrepareCustomPreferencesList(container, view, list, false); 15497d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey return view; 15597d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey } 15697d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey 15797d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey @Override 1580f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 1590f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa menu.add(0, MENU_ALPHABETICAL, 0, R.string.zone_list_menu_sort_alphabetically) 1600f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa .setIcon(android.R.drawable.ic_menu_sort_alphabetically); 1610f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa menu.add(0, MENU_TIMEZONE, 0, R.string.zone_list_menu_sort_by_timezone) 1620f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa .setIcon(R.drawable.ic_menu_3d_globe); 1630f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa super.onCreateOptionsMenu(menu, inflater); 164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1650f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 1660f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa @Override 1670f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa public void onPrepareOptionsMenu(Menu menu) { 1680f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa if (mSortedByTimezone) { 1690f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa menu.findItem(MENU_TIMEZONE).setVisible(false); 1700f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa menu.findItem(MENU_ALPHABETICAL).setVisible(true); 1710f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa } else { 1720f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa menu.findItem(MENU_TIMEZONE).setVisible(true); 1730f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa menu.findItem(MENU_ALPHABETICAL).setVisible(false); 1740f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa } 175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 1780f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa public boolean onOptionsItemSelected(MenuItem item) { 1790f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa switch (item.getItemId()) { 1800f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 1810f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa case MENU_TIMEZONE: 1820f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa setSorting(true); 1830f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa return true; 1840f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 1850f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa case MENU_ALPHABETICAL: 1860f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa setSorting(false); 1870f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa return true; 1880f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 1890f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa default: 1900f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa return false; 1910f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa } 1920f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa } 1930f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 1940f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa public void setZoneSelectionListener(ZoneSelectionListener listener) { 1950f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa mListener = listener; 1960f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa } 1970f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 1982571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa private void setSorting(boolean sortByTimezone) { 1992571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa final SimpleAdapter adapter = 2002571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa sortByTimezone ? mTimezoneSortedAdapter : mAlphabeticalAdapter; 2012571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa setListAdapter(adapter); 2022571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa mSortedByTimezone = sortByTimezone; 2032571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa final int defaultIndex = getTimeZoneIndex(adapter, TimeZone.getDefault()); 2042571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa if (defaultIndex >= 0) { 2052571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa setSelection(defaultIndex); 2062571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa } 2070f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa } 2080f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 2102571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa public void onListItemClick(ListView listView, View v, int position, long id) { 2118287658863ffa8885c34abfc07e020e5275619f6Amith Yamasani // Ignore extra clicks 2128287658863ffa8885c34abfc07e020e5275619f6Amith Yamasani if (!isResumed()) return; 2132571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa final Map<?, ?> map = (Map<?, ?>)listView.getItemAtPosition(position); 214550015e47656dad997973c89a30cffe56db9cdbdTony Mantler final String tzId = (String) map.get(ZoneGetter.KEY_ID); 2152571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa 2160f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa // Update the system timezone value 2170f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa final Activity activity = getActivity(); 2182571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa final AlarmManager alarm = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE); 21971cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa alarm.setTimeZone(tzId); 22071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa final TimeZone tz = TimeZone.getTimeZone(tzId); 2210f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa if (mListener != null) { 22271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa mListener.onZoneSelected(tz); 22371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa } else { 22471cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa getActivity().onBackPressed(); 2250f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa } 2260f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa } 2270f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 228b9864427471ac206d08836a12a8b2f230c883d9eNeil Fuller private static class MyComparator implements Comparator<Map<?, ?>> { 2290f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa private String mSortingKey; 2300f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 2310f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa public MyComparator(String sortingKey) { 2320f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa mSortingKey = sortingKey; 2330f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa } 2340f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 2350f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa public void setSortingKey(String sortingKey) { 2360f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa mSortingKey = sortingKey; 237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 2380f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 239b9864427471ac206d08836a12a8b2f230c883d9eNeil Fuller public int compare(Map<?, ?> map1, Map<?, ?> map2) { 2400f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa Object value1 = map1.get(mSortingKey); 2410f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa Object value2 = map2.get(mSortingKey); 2420f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 2430f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa /* 2440f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa * This should never happen, but just in-case, put non-comparable 2450f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa * items at the end. 2460f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa */ 2470f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa if (!isComparable(value1)) { 2480f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa return isComparable(value2) ? 1 : 0; 2490f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa } else if (!isComparable(value2)) { 2500f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa return -1; 2510f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa } 2520f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 2530f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa return ((Comparable) value1).compareTo(value2); 2540f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa } 2550f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 2560f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa private boolean isComparable(Object value) { 257f1582bc3f58ac440c11c54b844287915594b433fElliott Hughes return (value != null) && (value instanceof Comparable); 2580f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa } 2590f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa } 260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 261