Loading src/com/android/settings/datetime/ZonePicker.java +14 −2 Original line number Original line Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.app.AlarmManager; import android.app.ListFragment; import android.app.ListFragment; import android.content.Context; import android.content.Context; import android.os.Bundle; import android.os.Bundle; import android.support.annotation.VisibleForTesting; import android.view.LayoutInflater; import android.view.LayoutInflater; import android.view.Menu; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuInflater; Loading @@ -38,6 +39,7 @@ import com.android.settings.core.instrumentation.Instrumentable; import com.android.settings.core.instrumentation.VisibilityLoggerMixin; import com.android.settings.core.instrumentation.VisibilityLoggerMixin; import com.android.settingslib.datetime.ZoneGetter; import com.android.settingslib.datetime.ZoneGetter; import java.text.Collator; import java.util.Collections; import java.util.Collections; import java.util.Comparator; import java.util.Comparator; import java.util.HashMap; import java.util.HashMap; Loading Loading @@ -257,15 +259,21 @@ public class ZonePicker extends ListFragment implements Instrumentable { mVisibilityLoggerMixin.onPause(); mVisibilityLoggerMixin.onPause(); } } private static class MyComparator implements Comparator<Map<?, ?>> { @VisibleForTesting static class MyComparator implements Comparator<Map<?, ?>> { private final Collator mCollator; private String mSortingKey; private String mSortingKey; private boolean mSortedByName; public MyComparator(String sortingKey) { public MyComparator(String sortingKey) { mCollator = Collator.getInstance(); mSortingKey = sortingKey; mSortingKey = sortingKey; mSortedByName = ZoneGetter.KEY_DISPLAY_LABEL.equals(sortingKey); } } public void setSortingKey(String sortingKey) { public void setSortingKey(String sortingKey) { mSortingKey = sortingKey; mSortingKey = sortingKey; mSortedByName = ZoneGetter.KEY_DISPLAY_LABEL.equals(sortingKey); } } public int compare(Map<?, ?> map1, Map<?, ?> map2) { public int compare(Map<?, ?> map1, Map<?, ?> map2) { Loading @@ -282,8 +290,12 @@ public class ZonePicker extends ListFragment implements Instrumentable { return -1; return -1; } } if (mSortedByName) { return mCollator.compare(value1, value2); } else { return ((Comparable) value1).compareTo(value2); return ((Comparable) value1).compareTo(value2); } } } private boolean isComparable(Object value) { private boolean isComparable(Object value) { return (value != null) && (value instanceof Comparable); return (value != null) && (value instanceof Comparable); Loading tests/robotests/src/com/android/settings/datetime/ZonePickerComparatorTest.java 0 → 100644 +123 −0 Original line number Original line Diff line number Diff line package com.android.settings.datetime; import com.android.settings.datetime.ZonePicker; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settingslib.datetime.ZoneGetter; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.annotation.Config; import java.util.Arrays; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TimeZone; import static com.google.common.truth.Truth.assertThat; @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class ZonePickerComparatorTest { // Strings in Chinese are sorted by alphabet order of their Pinyin. // "伦敦" -> "lundun"; "纽约" -> "niuyue"; "悉尼" -> "xini" // "开罗" -> "kailuo"; "雅典" -> "yadian"; "上海" -> "shanghai" private static final String[] TEST_CHINESE_NAME = new String[]{"伦敦", "纽约", "悉尼", "开罗", "雅典", "上海"}; private static final String[] ORDERED_CHINESE_NAME = new String[]{"开罗", "伦敦", "纽约", "上海", "悉尼", "雅典"}; private static final String[] TEST_ENGLISH_NAME = new String[]{"London", "New York", "Sydney", "Cairo", "Athens", "Shanghai"}; private static final String[] ORDERED_ENGLISH_NAME = new String[]{"Athens", "Cairo", "London", "New York", "Shanghai", "Sydney"}; private static final Locale INIT_LOCALE = Locale.getDefault(); private Map<String, List> mTestDataMap; private List<Map<String, Object>> mTestList; @Before public void setUp() { mTestDataMap = new HashMap<>(); mTestDataMap.put("zh_CN", Arrays.asList(TEST_CHINESE_NAME)); mTestDataMap.put("en_US", Arrays.asList(TEST_ENGLISH_NAME)); } @After public void tearDown() { Locale.setDefault(INIT_LOCALE); } @Test public void testComparator_sortChineseString() { String sortKey = ZoneGetter.KEY_DISPLAY_LABEL; mTestList = getMockZonesList("zh_CN"); Locale.setDefault(new Locale("zh")); final ZonePicker.MyComparator comparator = new ZonePicker.MyComparator(sortKey); assertThat(comparator).isNotNull(); Collections.sort(mTestList, comparator); for (int i = 0; i < mTestList.size(); i++) { assertThat(mTestList.get(i).get(sortKey).toString()) .isEqualTo(ORDERED_CHINESE_NAME[i]); } } @Test public void testComparator_sortEnglishString() { String sortKey = ZoneGetter.KEY_DISPLAY_LABEL; mTestList = getMockZonesList("en_US"); Locale.setDefault(new Locale("en")); final ZonePicker.MyComparator comparator = new ZonePicker.MyComparator(sortKey); assertThat(comparator).isNotNull(); Collections.sort(mTestList, comparator); for (int i = 0; i < mTestList.size(); i++) { assertThat(mTestList.get(i).get(sortKey).toString()) .isEqualTo(ORDERED_ENGLISH_NAME[i]); } } @Test public void testComparator_sortInteger() { String sortKey = ZoneGetter.KEY_OFFSET; // TestList of any locale can be selected to test integer sorting. mTestList = getMockZonesList("en_US"); final ZonePicker.MyComparator comparator = new ZonePicker.MyComparator(sortKey); assertThat(comparator).isNotNull(); Collections.sort(mTestList, comparator); for (int i = 0; i < mTestList.size(); i++) { assertThat(mTestList.get(i).get(sortKey)).isEqualTo(i); } } private List<Map<String, Object>> getMockZonesList(String locale) { List<Map<String, Object>> zones = new ArrayList<>(); List<String> testData = mTestDataMap.get(locale); TimeZone tz = TimeZone.getDefault(); int testSize = testData.size(); for (int i = 0; i < testSize; i++) { zones.add(createMockDisplayEntry(tz, "GMT+08:00", testData.get(i), testSize - i - 1)); } return zones; } private Map<String, Object> createMockDisplayEntry( TimeZone tz, CharSequence gmtOffsetText, CharSequence displayName, int offsetMillis) { Map<String, Object> map = new HashMap<>(); map.put(ZoneGetter.KEY_ID, tz.getID()); map.put(ZoneGetter.KEY_DISPLAYNAME, displayName.toString()); map.put(ZoneGetter.KEY_DISPLAY_LABEL, displayName); map.put(ZoneGetter.KEY_GMT, gmtOffsetText.toString()); map.put(ZoneGetter.KEY_OFFSET_LABEL, gmtOffsetText); map.put(ZoneGetter.KEY_OFFSET, offsetMillis); return map; } } Loading
src/com/android/settings/datetime/ZonePicker.java +14 −2 Original line number Original line Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.app.AlarmManager; import android.app.ListFragment; import android.app.ListFragment; import android.content.Context; import android.content.Context; import android.os.Bundle; import android.os.Bundle; import android.support.annotation.VisibleForTesting; import android.view.LayoutInflater; import android.view.LayoutInflater; import android.view.Menu; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuInflater; Loading @@ -38,6 +39,7 @@ import com.android.settings.core.instrumentation.Instrumentable; import com.android.settings.core.instrumentation.VisibilityLoggerMixin; import com.android.settings.core.instrumentation.VisibilityLoggerMixin; import com.android.settingslib.datetime.ZoneGetter; import com.android.settingslib.datetime.ZoneGetter; import java.text.Collator; import java.util.Collections; import java.util.Collections; import java.util.Comparator; import java.util.Comparator; import java.util.HashMap; import java.util.HashMap; Loading Loading @@ -257,15 +259,21 @@ public class ZonePicker extends ListFragment implements Instrumentable { mVisibilityLoggerMixin.onPause(); mVisibilityLoggerMixin.onPause(); } } private static class MyComparator implements Comparator<Map<?, ?>> { @VisibleForTesting static class MyComparator implements Comparator<Map<?, ?>> { private final Collator mCollator; private String mSortingKey; private String mSortingKey; private boolean mSortedByName; public MyComparator(String sortingKey) { public MyComparator(String sortingKey) { mCollator = Collator.getInstance(); mSortingKey = sortingKey; mSortingKey = sortingKey; mSortedByName = ZoneGetter.KEY_DISPLAY_LABEL.equals(sortingKey); } } public void setSortingKey(String sortingKey) { public void setSortingKey(String sortingKey) { mSortingKey = sortingKey; mSortingKey = sortingKey; mSortedByName = ZoneGetter.KEY_DISPLAY_LABEL.equals(sortingKey); } } public int compare(Map<?, ?> map1, Map<?, ?> map2) { public int compare(Map<?, ?> map1, Map<?, ?> map2) { Loading @@ -282,8 +290,12 @@ public class ZonePicker extends ListFragment implements Instrumentable { return -1; return -1; } } if (mSortedByName) { return mCollator.compare(value1, value2); } else { return ((Comparable) value1).compareTo(value2); return ((Comparable) value1).compareTo(value2); } } } private boolean isComparable(Object value) { private boolean isComparable(Object value) { return (value != null) && (value instanceof Comparable); return (value != null) && (value instanceof Comparable); Loading
tests/robotests/src/com/android/settings/datetime/ZonePickerComparatorTest.java 0 → 100644 +123 −0 Original line number Original line Diff line number Diff line package com.android.settings.datetime; import com.android.settings.datetime.ZonePicker; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settingslib.datetime.ZoneGetter; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.annotation.Config; import java.util.Arrays; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TimeZone; import static com.google.common.truth.Truth.assertThat; @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class ZonePickerComparatorTest { // Strings in Chinese are sorted by alphabet order of their Pinyin. // "伦敦" -> "lundun"; "纽约" -> "niuyue"; "悉尼" -> "xini" // "开罗" -> "kailuo"; "雅典" -> "yadian"; "上海" -> "shanghai" private static final String[] TEST_CHINESE_NAME = new String[]{"伦敦", "纽约", "悉尼", "开罗", "雅典", "上海"}; private static final String[] ORDERED_CHINESE_NAME = new String[]{"开罗", "伦敦", "纽约", "上海", "悉尼", "雅典"}; private static final String[] TEST_ENGLISH_NAME = new String[]{"London", "New York", "Sydney", "Cairo", "Athens", "Shanghai"}; private static final String[] ORDERED_ENGLISH_NAME = new String[]{"Athens", "Cairo", "London", "New York", "Shanghai", "Sydney"}; private static final Locale INIT_LOCALE = Locale.getDefault(); private Map<String, List> mTestDataMap; private List<Map<String, Object>> mTestList; @Before public void setUp() { mTestDataMap = new HashMap<>(); mTestDataMap.put("zh_CN", Arrays.asList(TEST_CHINESE_NAME)); mTestDataMap.put("en_US", Arrays.asList(TEST_ENGLISH_NAME)); } @After public void tearDown() { Locale.setDefault(INIT_LOCALE); } @Test public void testComparator_sortChineseString() { String sortKey = ZoneGetter.KEY_DISPLAY_LABEL; mTestList = getMockZonesList("zh_CN"); Locale.setDefault(new Locale("zh")); final ZonePicker.MyComparator comparator = new ZonePicker.MyComparator(sortKey); assertThat(comparator).isNotNull(); Collections.sort(mTestList, comparator); for (int i = 0; i < mTestList.size(); i++) { assertThat(mTestList.get(i).get(sortKey).toString()) .isEqualTo(ORDERED_CHINESE_NAME[i]); } } @Test public void testComparator_sortEnglishString() { String sortKey = ZoneGetter.KEY_DISPLAY_LABEL; mTestList = getMockZonesList("en_US"); Locale.setDefault(new Locale("en")); final ZonePicker.MyComparator comparator = new ZonePicker.MyComparator(sortKey); assertThat(comparator).isNotNull(); Collections.sort(mTestList, comparator); for (int i = 0; i < mTestList.size(); i++) { assertThat(mTestList.get(i).get(sortKey).toString()) .isEqualTo(ORDERED_ENGLISH_NAME[i]); } } @Test public void testComparator_sortInteger() { String sortKey = ZoneGetter.KEY_OFFSET; // TestList of any locale can be selected to test integer sorting. mTestList = getMockZonesList("en_US"); final ZonePicker.MyComparator comparator = new ZonePicker.MyComparator(sortKey); assertThat(comparator).isNotNull(); Collections.sort(mTestList, comparator); for (int i = 0; i < mTestList.size(); i++) { assertThat(mTestList.get(i).get(sortKey)).isEqualTo(i); } } private List<Map<String, Object>> getMockZonesList(String locale) { List<Map<String, Object>> zones = new ArrayList<>(); List<String> testData = mTestDataMap.get(locale); TimeZone tz = TimeZone.getDefault(); int testSize = testData.size(); for (int i = 0; i < testSize; i++) { zones.add(createMockDisplayEntry(tz, "GMT+08:00", testData.get(i), testSize - i - 1)); } return zones; } private Map<String, Object> createMockDisplayEntry( TimeZone tz, CharSequence gmtOffsetText, CharSequence displayName, int offsetMillis) { Map<String, Object> map = new HashMap<>(); map.put(ZoneGetter.KEY_ID, tz.getID()); map.put(ZoneGetter.KEY_DISPLAYNAME, displayName.toString()); map.put(ZoneGetter.KEY_DISPLAY_LABEL, displayName); map.put(ZoneGetter.KEY_GMT, gmtOffsetText.toString()); map.put(ZoneGetter.KEY_OFFSET_LABEL, gmtOffsetText); map.put(ZoneGetter.KEY_OFFSET, offsetMillis); return map; } }