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