diff options
-rw-r--r-- | AndroidManifest.xml | 2 | ||||
-rw-r--r-- | res/values/strings.xml | 11 | ||||
-rw-r--r-- | res/xml/date_time_prefs.xml | 6 | ||||
-rw-r--r-- | src/com/android/settings/DateTimeSettings.java | 12 | ||||
-rw-r--r-- | src/com/android/settings/DateTimeSettingsActivity.java | 4 | ||||
-rw-r--r-- | src/com/android/settings/DateTimeSettingsSetupWizard.java | 5 | ||||
-rw-r--r-- | src/com/android/settings/ZoneList.java | 273 | ||||
-rw-r--r-- | src/com/android/settings/ZonePicker.java | 272 |
8 files changed, 261 insertions, 324 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 8cb1ec3..41dd0f8 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -560,8 +560,6 @@ android:label="@string/lockpattern_change_lock_pattern_label"> </activity> - <activity android:name="ZoneList" android:label="@string/choose_timezone" /> - <activity android:name=".deviceinfo.Status" android:label="@string/device_status_activity_title" android:process="com.android.phone"> <intent-filter> diff --git a/res/values/strings.xml b/res/values/strings.xml index 2cb2182..798bb36 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -492,7 +492,7 @@ <!-- mobile network settings screen, setting option summary text --> <string name="sum_carrier_select">Select a network operator</string> - <!-- Date and time settings --> + <!-- Date and time settings --><skip /> <!-- Main Settings screen setting option name to go into the date and time settings--> <string name="date_and_time_settings_title">Date & time</string> <!-- Main Settings screen setting option summary text for the item to go into the date and time settings. --> @@ -2685,4 +2685,13 @@ found in the list of installed applications.</string> <!-- The message show above available networks when connection is established. Used in Wifi Setup For Setup Wizard with XL screen. --> <string name="wifi_setup_status_connected">Connected</string> + + <!-- Do not translate. Just a temprary stub. --> + <string name="time_zone_manual_select_enabler" translatable="false">Experimental text</string> + <!-- Do not translate. Just a temprary stub. --> + <string name="date_time_manual_select_enabler" translatable="false">Experimental text</string> + <!-- Do not translate. Just a temprary stub. --> + <string name="date_time_setup_skip" translatable="false">Skip</string> + <!-- Do not translate. Just a temprary stub. --> + <string name="date_time_setup_next" translatable="false">Next</string> </resources> diff --git a/res/xml/date_time_prefs.xml b/res/xml/date_time_prefs.xml index 5e696de..08c5d5c 100644 --- a/res/xml/date_time_prefs.xml +++ b/res/xml/date_time_prefs.xml @@ -25,8 +25,10 @@ android:title="@string/date_time_set_date" android:summary="03/10/2008" /> - <PreferenceScreen android:key="timezone" - android:title="@string/date_time_set_timezone" + <PreferenceScreen + android:fragment="com.android.settings.ZonePicker" + android:key="timezone" + android:title="@string/date_time_set_timezone" android:summary="GMT-8:00" /> <Preference android:key="time" diff --git a/src/com/android/settings/DateTimeSettings.java b/src/com/android/settings/DateTimeSettings.java index 0a929ba..61cc613 100644 --- a/src/com/android/settings/DateTimeSettings.java +++ b/src/com/android/settings/DateTimeSettings.java @@ -41,8 +41,7 @@ import java.util.Calendar; import java.util.Date; import java.util.TimeZone; -public class DateTimeSettings - extends SettingsPreferenceFragment +public class DateTimeSettings extends SettingsPreferenceFragment implements OnSharedPreferenceChangeListener, TimePickerDialog.OnTimeSetListener , DatePickerDialog.OnDateSetListener { @@ -152,6 +151,7 @@ public class DateTimeSettings mDateFormat.setSummary(shortDateFormat.format(dummyDate)); } + @Override public void onDateSet(DatePicker view, int year, int month, int day) { Calendar c = Calendar.getInstance(); @@ -166,6 +166,7 @@ public class DateTimeSettings updateTimeAndDateDisplay(); } + @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { Calendar c = Calendar.getInstance(); @@ -183,6 +184,7 @@ public class DateTimeSettings // SystemClock time. } + @Override public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { if (key.equals(KEY_DATE_FORMAT)) { String format = preferences.getString(key, @@ -274,12 +276,8 @@ public class DateTimeSettings set24Hour(((CheckBoxPreference)mTime24Pref).isChecked()); updateTimeAndDateDisplay(); timeUpdated(); - } else if (preference == mTimeZone) { - Intent intent = new Intent(); - intent.setClass(getActivity(), ZoneList.class); - startActivityForResult(intent, 0); } - return false; + return super.onPreferenceTreeClick(preferenceScreen, preference); } @Override diff --git a/src/com/android/settings/DateTimeSettingsActivity.java b/src/com/android/settings/DateTimeSettingsActivity.java index 3f426b9..2bad53d 100644 --- a/src/com/android/settings/DateTimeSettingsActivity.java +++ b/src/com/android/settings/DateTimeSettingsActivity.java @@ -274,10 +274,6 @@ public class DateTimeSettingsActivity set24Hour(((CheckBoxPreference)mTime24Pref).isChecked()); updateTimeAndDateDisplay(); timeUpdated(); - } else if (preference == mTimeZone) { - Intent intent = new Intent(); - intent.setClass(this, ZoneList.class); - startActivityForResult(intent, 0); } return false; } diff --git a/src/com/android/settings/DateTimeSettingsSetupWizard.java b/src/com/android/settings/DateTimeSettingsSetupWizard.java index 262a536..b10624c 100644 --- a/src/com/android/settings/DateTimeSettingsSetupWizard.java +++ b/src/com/android/settings/DateTimeSettingsSetupWizard.java @@ -21,9 +21,10 @@ import android.view.View; import android.view.Window; import android.view.View.OnClickListener; -public class DateTimeSettingsSetupWizard extends DateTimeSettingsActivity implements OnClickListener { +public class DateTimeSettingsSetupWizard extends DateTimeSettingsActivity + implements OnClickListener { private View mNextButton; - + @Override protected void onCreate(Bundle icicle) { requestWindowFeature(Window.FEATURE_NO_TITLE); diff --git a/src/com/android/settings/ZoneList.java b/src/com/android/settings/ZoneList.java deleted file mode 100644 index aaaf989..0000000 --- a/src/com/android/settings/ZoneList.java +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settings; - -import android.app.AlarmManager; -import android.app.ListActivity; -import android.content.Context; -import android.content.res.XmlResourceParser; -import android.os.Bundle; -import android.text.TextUtils; -import android.util.Log; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.widget.ListAdapter; -import android.widget.ListView; -import android.widget.SimpleAdapter; - -import org.xmlpull.v1.XmlPullParserException; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.TimeZone; - -/** - * This activity displays a list of time zones that match a filter string - * such as "Africa", "Europe", etc. Choosing an item from the list will set - * the time zone. Pressing Back without choosing from the list will not - * result in a change in the time zone setting. - */ -public class ZoneList extends ListActivity { - - private static final String TAG = "ZoneList"; - private static final String KEY_ID = "id"; - private static final String KEY_DISPLAYNAME = "name"; - private static final String KEY_GMT = "gmt"; - private static final String KEY_OFFSET = "offset"; - private static final String XMLTAG_TIMEZONE = "timezone"; - - private static final int HOURS_1 = 60 * 60000; - private static final int HOURS_24 = 24 * HOURS_1; - private static final int HOURS_HALF = HOURS_1 / 2; - - private static final int MENU_TIMEZONE = Menu.FIRST+1; - private static final int MENU_ALPHABETICAL = Menu.FIRST; - - // Initial focus position - private int mDefault; - - private boolean mSortedByTimezone; - - private SimpleAdapter mTimezoneSortedAdapter; - private SimpleAdapter mAlphabeticalAdapter; - - @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); - - String[] from = new String[] {KEY_DISPLAYNAME, KEY_GMT}; - int[] to = new int[] {android.R.id.text1, android.R.id.text2}; - - MyComparator comparator = new MyComparator(KEY_OFFSET); - - List<HashMap> timezoneSortedList = getZones(); - Collections.sort(timezoneSortedList, comparator); - mTimezoneSortedAdapter = new SimpleAdapter(this, - (List) timezoneSortedList, - android.R.layout.simple_list_item_2, - from, - to); - - List<HashMap> alphabeticalList = new ArrayList<HashMap>(timezoneSortedList); - comparator.setSortingKey(KEY_DISPLAYNAME); - Collections.sort(alphabeticalList, comparator); - mAlphabeticalAdapter = new SimpleAdapter(this, - (List) alphabeticalList, - android.R.layout.simple_list_item_2, - from, - to); - - // Sets the adapter - setSorting(true); - - // If current timezone is in this list, move focus to it - setSelection(mDefault); - - // Assume user may press Back - setResult(RESULT_CANCELED); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - menu.add(0, MENU_ALPHABETICAL, 0, R.string.zone_list_menu_sort_alphabetically) - .setIcon(android.R.drawable.ic_menu_sort_alphabetically); - menu.add(0, MENU_TIMEZONE, 0, R.string.zone_list_menu_sort_by_timezone) - .setIcon(R.drawable.ic_menu_3d_globe); - - return true; - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - - if (mSortedByTimezone) { - menu.findItem(MENU_TIMEZONE).setVisible(false); - menu.findItem(MENU_ALPHABETICAL).setVisible(true); - } else { - menu.findItem(MENU_TIMEZONE).setVisible(true); - menu.findItem(MENU_ALPHABETICAL).setVisible(false); - } - - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - - case MENU_TIMEZONE: - setSorting(true); - return true; - - case MENU_ALPHABETICAL: - setSorting(false); - return true; - - default: - return false; - } - } - - private void setSorting(boolean timezone) { - setListAdapter(timezone ? mTimezoneSortedAdapter : mAlphabeticalAdapter); - mSortedByTimezone = timezone; - } - - private List<HashMap> getZones() { - List<HashMap> myData = new ArrayList<HashMap>(); - long date = Calendar.getInstance().getTimeInMillis(); - try { - XmlResourceParser xrp = getResources().getXml(R.xml.timezones); - while (xrp.next() != XmlResourceParser.START_TAG) - continue; - xrp.next(); - while (xrp.getEventType() != XmlResourceParser.END_TAG) { - while (xrp.getEventType() != XmlResourceParser.START_TAG) { - if (xrp.getEventType() == XmlResourceParser.END_DOCUMENT) { - return myData; - } - xrp.next(); - } - if (xrp.getName().equals(XMLTAG_TIMEZONE)) { - String id = xrp.getAttributeValue(0); - String displayName = xrp.nextText(); - addItem(myData, id, displayName, date); - } - while (xrp.getEventType() != XmlResourceParser.END_TAG) { - xrp.next(); - } - xrp.next(); - } - xrp.close(); - } catch (XmlPullParserException xppe) { - Log.e(TAG, "Ill-formatted timezones.xml file"); - } catch (java.io.IOException ioe) { - Log.e(TAG, "Unable to read timezones.xml file"); - } - - return myData; - } - - protected void addItem(List<HashMap> myData, String id, String displayName, - long date) { - HashMap map = new HashMap(); - map.put(KEY_ID, id); - map.put(KEY_DISPLAYNAME, displayName); - TimeZone tz = TimeZone.getTimeZone(id); - int offset = tz.getOffset(date); - int p = Math.abs(offset); - StringBuilder name = new StringBuilder(); - name.append("GMT"); - - if (offset < 0) { - name.append('-'); - } else { - name.append('+'); - } - - name.append(p / (HOURS_1)); - name.append(':'); - - int min = p / 60000; - min %= 60; - - if (min < 10) { - name.append('0'); - } - name.append(min); - - map.put(KEY_GMT, name.toString()); - map.put(KEY_OFFSET, offset); - - if (id.equals(TimeZone.getDefault().getID())) { - mDefault = myData.size(); - } - - myData.add(map); - } - - @Override - protected void onListItemClick(ListView l, View v, int position, long id) { - Map map = (Map) l.getItemAtPosition(position); - // Update the system timezone value - AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE); - alarm.setTimeZone((String) map.get(KEY_ID)); - setResult(RESULT_OK); - finish(); - } - - private static class MyComparator implements Comparator<HashMap> { - private String mSortingKey; - - public MyComparator(String sortingKey) { - mSortingKey = sortingKey; - } - - public void setSortingKey(String sortingKey) { - mSortingKey = sortingKey; - } - - public int compare(HashMap map1, HashMap map2) { - Object value1 = map1.get(mSortingKey); - Object value2 = map2.get(mSortingKey); - - /* - * This should never happen, but just in-case, put non-comparable - * items at the end. - */ - if (!isComparable(value1)) { - return isComparable(value2) ? 1 : 0; - } else if (!isComparable(value2)) { - return -1; - } - - return ((Comparable) value1).compareTo(value2); - } - - private boolean isComparable(Object value) { - return (value != null) && (value instanceof Comparable); - } - } - -} diff --git a/src/com/android/settings/ZonePicker.java b/src/com/android/settings/ZonePicker.java index def5036..c877bd7 100644 --- a/src/com/android/settings/ZonePicker.java +++ b/src/com/android/settings/ZonePicker.java @@ -16,55 +16,261 @@ package com.android.settings; -import android.app.ListActivity; -import android.content.Intent; +import android.app.Activity; +import android.app.AlarmManager; +import android.app.ListFragment; +import android.content.Context; +import android.content.res.XmlResourceParser; import android.os.Bundle; +import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; -import android.widget.ArrayAdapter; import android.widget.ListView; +import android.widget.SimpleAdapter; +import org.xmlpull.v1.XmlPullParserException; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.TimeZone; + +/** + * The class displaying a list of time zones that match a filter string + * such as "Africa", "Europe", etc. Choosing an item from the list will set + * the time zone. Pressing Back without choosing from the list will not + * result in a change in the time zone setting. + */ +public class ZonePicker extends ListFragment { + private static final String TAG = "ZonePicker"; + + public static interface ZoneSelectionListener { + // You can add any argument if you really need it... + public void onZoneSelected(); + } + + private static final String KEY_ID = "id"; + private static final String KEY_DISPLAYNAME = "name"; + private static final String KEY_GMT = "gmt"; + private static final String KEY_OFFSET = "offset"; + private static final String XMLTAG_TIMEZONE = "timezone"; + + private static final int HOURS_1 = 60 * 60000; + + private static final int MENU_TIMEZONE = Menu.FIRST+1; + private static final int MENU_ALPHABETICAL = Menu.FIRST; + + // Initial focus position + private int mDefault; + + private boolean mSortedByTimezone; + + private SimpleAdapter mTimezoneSortedAdapter; + private SimpleAdapter mAlphabeticalAdapter; + + private ZoneSelectionListener mListener; + + @Override + public void onActivityCreated(Bundle savedInstanseState) { + super.onActivityCreated(savedInstanseState); + + final String[] from = new String[] {KEY_DISPLAYNAME, KEY_GMT}; + final int[] to = new int[] {android.R.id.text1, android.R.id.text2}; -public class ZonePicker extends ListActivity { + MyComparator comparator = new MyComparator(KEY_OFFSET); + + Activity activity = getActivity(); + List<HashMap> timezoneSortedList = getZones(); + Collections.sort(timezoneSortedList, comparator); + mTimezoneSortedAdapter = new SimpleAdapter(activity, + (List) timezoneSortedList, + android.R.layout.simple_list_item_2, + from, + to); + + List<HashMap> alphabeticalList = new ArrayList<HashMap>(timezoneSortedList); + comparator.setSortingKey(KEY_DISPLAYNAME); + Collections.sort(alphabeticalList, comparator); + mAlphabeticalAdapter = new SimpleAdapter(getActivity(), + (List) alphabeticalList, + android.R.layout.simple_list_item_2, + from, + to); + + // Sets the adapter + setSorting(true); + + // If current timezone is in this list, move focus to it + setSelection(mDefault); + } - private ArrayAdapter<CharSequence> mFilterAdapter; - @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); - mFilterAdapter = ArrayAdapter.createFromResource(this, - R.array.timezone_filters, android.R.layout.simple_list_item_1); - setListAdapter(mFilterAdapter); + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + menu.add(0, MENU_ALPHABETICAL, 0, R.string.zone_list_menu_sort_alphabetically) + .setIcon(android.R.drawable.ic_menu_sort_alphabetically); + menu.add(0, MENU_TIMEZONE, 0, R.string.zone_list_menu_sort_by_timezone) + .setIcon(R.drawable.ic_menu_3d_globe); + super.onCreateOptionsMenu(menu, inflater); } - - protected void addItem(List<Map> data, String name, String zone) { - HashMap temp = new HashMap(); - temp.put("title", name); - temp.put("zone", zone); - data.add(temp); + + @Override + public void onPrepareOptionsMenu(Menu menu) { + if (mSortedByTimezone) { + menu.findItem(MENU_TIMEZONE).setVisible(false); + menu.findItem(MENU_ALPHABETICAL).setVisible(true); + } else { + menu.findItem(MENU_TIMEZONE).setVisible(true); + menu.findItem(MENU_ALPHABETICAL).setVisible(false); + } } @Override - protected void onListItemClick(ListView l, View v, int position, long id) { - String filter = (String) mFilterAdapter.getItem(position); - // If All is chosen, reset the filter - if (filter.equals("All")) { - filter = null; + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + + case MENU_TIMEZONE: + setSorting(true); + return true; + + case MENU_ALPHABETICAL: + setSorting(false); + return true; + + default: + return false; + } + } + + public void setZoneSelectionListener(ZoneSelectionListener listener) { + mListener = listener; + } + + private void setSorting(boolean timezone) { + setListAdapter(timezone ? mTimezoneSortedAdapter : mAlphabeticalAdapter); + mSortedByTimezone = timezone; + } + + private List<HashMap> getZones() { + List<HashMap> myData = new ArrayList<HashMap>(); + long date = Calendar.getInstance().getTimeInMillis(); + try { + XmlResourceParser xrp = getActivity().getResources().getXml(R.xml.timezones); + while (xrp.next() != XmlResourceParser.START_TAG) + continue; + xrp.next(); + while (xrp.getEventType() != XmlResourceParser.END_TAG) { + while (xrp.getEventType() != XmlResourceParser.START_TAG) { + if (xrp.getEventType() == XmlResourceParser.END_DOCUMENT) { + return myData; + } + xrp.next(); + } + if (xrp.getName().equals(XMLTAG_TIMEZONE)) { + String id = xrp.getAttributeValue(0); + String displayName = xrp.nextText(); + addItem(myData, id, displayName, date); + } + while (xrp.getEventType() != XmlResourceParser.END_TAG) { + xrp.next(); + } + xrp.next(); + } + xrp.close(); + } catch (XmlPullParserException xppe) { + Log.e(TAG, "Ill-formatted timezones.xml file"); + } catch (java.io.IOException ioe) { + Log.e(TAG, "Unable to read timezones.xml file"); + } + + return myData; + } + + protected void addItem(List<HashMap> myData, String id, String displayName, + long date) { + HashMap map = new HashMap(); + map.put(KEY_ID, id); + map.put(KEY_DISPLAYNAME, displayName); + TimeZone tz = TimeZone.getTimeZone(id); + int offset = tz.getOffset(date); + int p = Math.abs(offset); + StringBuilder name = new StringBuilder(); + name.append("GMT"); + + if (offset < 0) { + name.append('-'); + } else { + name.append('+'); + } + + name.append(p / (HOURS_1)); + name.append(':'); + + int min = p / 60000; + min %= 60; + + if (min < 10) { + name.append('0'); + } + name.append(min); + + map.put(KEY_GMT, name.toString()); + map.put(KEY_OFFSET, offset); + + if (id.equals(TimeZone.getDefault().getID())) { + mDefault = myData.size(); } - Intent zoneList = new Intent(); - zoneList.setClass(this, ZoneList.class); - zoneList.putExtra("filter", filter); - - startActivityForResult(zoneList, 0); + + myData.add(map); } - + @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - // If subactivity has resulted in a timezone selection, close this act. - if (resultCode == RESULT_OK) { - finish(); + public void onListItemClick(ListView l, View v, int position, long id) { + Map map = (Map) l.getItemAtPosition(position); + // Update the system timezone value + final Activity activity = getActivity(); + AlarmManager alarm = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE); + alarm.setTimeZone((String) map.get(KEY_ID)); + if (mListener != null) { + mListener.onZoneSelected(); + } + } + + private static class MyComparator implements Comparator<HashMap> { + private String mSortingKey; + + public MyComparator(String sortingKey) { + mSortingKey = sortingKey; + } + + public void setSortingKey(String sortingKey) { + mSortingKey = sortingKey; } - } + + public int compare(HashMap map1, HashMap map2) { + Object value1 = map1.get(mSortingKey); + Object value2 = map2.get(mSortingKey); + + /* + * This should never happen, but just in-case, put non-comparable + * items at the end. + */ + if (!isComparable(value1)) { + return isComparable(value2) ? 1 : 0; + } else if (!isComparable(value2)) { + return -1; + } + + return ((Comparable) value1).compareTo(value2); + } + + private boolean isComparable(Object value) { + return (value != null) && (value instanceof Comparable); + } + } } |