Merge "Allow alternative time zone ID to be set device's zone."
This commit is contained in:
@@ -71,14 +71,14 @@ public class RegionSearchPicker extends BaseTimeZonePicker {
|
||||
final FilteredCountryTimeZones countryTimeZones = mTimeZoneData.lookupCountryTimeZones(
|
||||
regionId);
|
||||
final Activity activity = getActivity();
|
||||
if (countryTimeZones == null || countryTimeZones.getTimeZoneIds().isEmpty()) {
|
||||
if (countryTimeZones == null || countryTimeZones.getPreferredTimeZoneIds().isEmpty()) {
|
||||
Log.e(TAG, "Region has no time zones: " + regionId);
|
||||
activity.setResult(Activity.RESULT_CANCELED);
|
||||
activity.finish();
|
||||
return;
|
||||
}
|
||||
|
||||
List<String> timeZoneIds = countryTimeZones.getTimeZoneIds();
|
||||
List<String> timeZoneIds = countryTimeZones.getPreferredTimeZoneIds();
|
||||
// Choose the time zone associated the region if there is only one time zone in that region
|
||||
if (timeZoneIds.size() == 1) {
|
||||
final Intent resultData = new Intent()
|
||||
|
@@ -103,7 +103,7 @@ public class RegionZonePicker extends BaseTimeZoneInfoPicker {
|
||||
// It could be a timely operations if there are many time zones. A region in time zone data
|
||||
// contains a maximum of 29 time zones currently. It may change in the future, but it's
|
||||
// unlikely to be changed drastically.
|
||||
return getRegionTimeZoneInfo(filteredCountryTimeZones.getTimeZoneIds());
|
||||
return getRegionTimeZoneInfo(filteredCountryTimeZones.getPreferredTimeZoneIds());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -214,10 +214,11 @@ public class TimeZoneSettings extends DashboardFragment {
|
||||
mTimeZoneData.lookupCountryTimeZones(regionId);
|
||||
|
||||
use(RegionZonePreferenceController.class).setTimeZoneInfo(tzInfo);
|
||||
// Only clickable when the region has more than 1 time zones or no time zone is selected.
|
||||
|
||||
// Only clickable when the region has more than 1 time zones or no time zone is selected.
|
||||
use(RegionZonePreferenceController.class).setClickable(tzInfo == null ||
|
||||
(countryTimeZones != null && countryTimeZones.getTimeZoneIds().size() > 1));
|
||||
(countryTimeZones != null
|
||||
&& countryTimeZones.getPreferredTimeZoneIds().size() > 1));
|
||||
use(TimeZoneInfoPreferenceController.class).setTimeZoneInfo(tzInfo);
|
||||
|
||||
updatePreferenceStates();
|
||||
@@ -244,7 +245,8 @@ public class TimeZoneSettings extends DashboardFragment {
|
||||
|
||||
FilteredCountryTimeZones countryTimeZones =
|
||||
timeZoneData.lookupCountryTimeZones(regionId);
|
||||
if (countryTimeZones == null || !countryTimeZones.getTimeZoneIds().contains(tzId)) {
|
||||
if (countryTimeZones == null
|
||||
|| !countryTimeZones.getPreferredTimeZoneIds().contains(tzId)) {
|
||||
Log.e(TAG, "Unknown time zone id is selected: " + tzId);
|
||||
return;
|
||||
}
|
||||
|
@@ -16,11 +16,15 @@
|
||||
|
||||
package com.android.settings.datetime.timezone.model;
|
||||
|
||||
import android.util.ArraySet;
|
||||
|
||||
import com.android.i18n.timezone.CountryTimeZones;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Wrap {@class CountryTimeZones} to filter time zone that are shown in the picker.
|
||||
@@ -39,31 +43,46 @@ public class FilteredCountryTimeZones {
|
||||
* a timestamp known to be in the recent past is used. This should be updated occasionally but
|
||||
* it doesn't have to be very often.
|
||||
*/
|
||||
private static final long MIN_USE_DATE_OF_TIMEZONE = 1546300800000L; // 1/1/2019 00:00 UTC
|
||||
private static final Instant MIN_USE_DATE_OF_TIMEZONE =
|
||||
Instant.ofEpochMilli(1546300800000L); // 1/1/2019 00:00 UTC
|
||||
|
||||
private final CountryTimeZones mCountryTimeZones;
|
||||
private final List<String> mTimeZoneIds;
|
||||
private final List<String> mPreferredTimeZoneIds;
|
||||
private final Set<String> mAlternativeTimeZoneIds;
|
||||
|
||||
public FilteredCountryTimeZones(CountryTimeZones countryTimeZones) {
|
||||
mCountryTimeZones = countryTimeZones;
|
||||
List<String> timeZoneIds = countryTimeZones.getTimeZoneMappings().stream()
|
||||
.filter(timeZoneMapping ->
|
||||
timeZoneMapping.isShownInPicker()
|
||||
&& (timeZoneMapping.getNotUsedAfter() == null
|
||||
|| timeZoneMapping.getNotUsedAfter() >= MIN_USE_DATE_OF_TIMEZONE))
|
||||
.map(timeZoneMapping -> timeZoneMapping.getTimeZoneId())
|
||||
.collect(Collectors.toList());
|
||||
mTimeZoneIds = Collections.unmodifiableList(timeZoneIds);
|
||||
List<String> timeZoneIds = new ArrayList<>();
|
||||
Set<String> alternativeTimeZoneIds = new ArraySet<>();
|
||||
for (CountryTimeZones.TimeZoneMapping timeZoneMapping :
|
||||
countryTimeZones.getTimeZoneMappings()) {
|
||||
if (timeZoneMapping.isShownInPickerAt(MIN_USE_DATE_OF_TIMEZONE)) {
|
||||
String timeZoneId = timeZoneMapping.getTimeZoneId();
|
||||
timeZoneIds.add(timeZoneId);
|
||||
alternativeTimeZoneIds.addAll(timeZoneMapping.getAlternativeIds());
|
||||
}
|
||||
}
|
||||
mPreferredTimeZoneIds = Collections.unmodifiableList(timeZoneIds);
|
||||
mAlternativeTimeZoneIds = Collections.unmodifiableSet(alternativeTimeZoneIds);
|
||||
}
|
||||
|
||||
public List<String> getTimeZoneIds() {
|
||||
return mTimeZoneIds;
|
||||
public List<String> getPreferredTimeZoneIds() {
|
||||
return mPreferredTimeZoneIds;
|
||||
}
|
||||
|
||||
public CountryTimeZones getCountryTimeZones() {
|
||||
return mCountryTimeZones;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether {@code timeZoneId} is currently used in the country or is an alternative
|
||||
* name of a currently used time zone.
|
||||
*/
|
||||
public boolean matches(String timeZoneId) {
|
||||
return mPreferredTimeZoneIds.contains(timeZoneId)
|
||||
|| mAlternativeTimeZoneIds.contains(timeZoneId);
|
||||
}
|
||||
|
||||
public String getRegionId() {
|
||||
return TimeZoneData.normalizeRegionId(mCountryTimeZones.getCountryIso());
|
||||
}
|
||||
|
@@ -71,7 +71,7 @@ public class TimeZoneData {
|
||||
Set<String> regionIds = new ArraySet<>();
|
||||
for (CountryTimeZones countryTimeZone : countryTimeZones) {
|
||||
FilteredCountryTimeZones filteredZones = new FilteredCountryTimeZones(countryTimeZone);
|
||||
if (filteredZones.getTimeZoneIds().contains(tzId)) {
|
||||
if (filteredZones.matches(tzId)) {
|
||||
regionIds.add(filteredZones.getRegionId());
|
||||
}
|
||||
}
|
||||
|
@@ -92,4 +92,23 @@ public class TimeZoneDataTest {
|
||||
.containsExactly("US", "GB");
|
||||
assertThat(timeZoneData.lookupCountryCodesForZoneId("Unknown/Secret_City2")).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void lookupCountryCodesForNonCanonicalZoneId_returnsCurrentZone() {
|
||||
TimeZoneData timeZoneData = new TimeZoneData(mCountryZonesFinder);
|
||||
|
||||
CountryTimeZones greenland = mock(CountryTimeZones.class);
|
||||
when(greenland.getCountryIso()).thenReturn("gl");
|
||||
when(greenland.getTimeZoneMappings()).thenReturn(Arrays.asList(
|
||||
TimeZoneMapping.createForTests(
|
||||
"America/Nuuk",
|
||||
true /* showInPicker */,
|
||||
null /* notUsedAfter */,
|
||||
Arrays.asList("America/Godthab"))));
|
||||
when(mCountryZonesFinder.lookupCountryTimeZonesForZoneId("America/Godthab"))
|
||||
.thenReturn(Arrays.asList(greenland));
|
||||
|
||||
assertThat(timeZoneData.lookupCountryCodesForZoneId("America/Godthab"))
|
||||
.containsExactly("GL");
|
||||
}
|
||||
}
|
||||
|
@@ -43,7 +43,7 @@ public class TimeZoneDataTest {
|
||||
FilteredCountryTimeZones countryTimeZones =
|
||||
mTimeZoneData.lookupCountryTimeZones(regionId);
|
||||
assertThat(countryTimeZones).isNotNull();
|
||||
assertThat(countryTimeZones.getTimeZoneIds().size()).isGreaterThan(0);
|
||||
assertThat(countryTimeZones.getPreferredTimeZoneIds().size()).isGreaterThan(0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,11 +54,8 @@ public class TimeZoneDataTest {
|
||||
1) because we specifically exclude it with the picker attribute, and
|
||||
2) because it's the same as Moscow after Oct 2014.
|
||||
*/
|
||||
assertThat(mTimeZoneData.lookupCountryCodesForZoneId("Europe/Simferopol").isEmpty())
|
||||
.isTrue();
|
||||
assertThat(mTimeZoneData.lookupCountryCodesForZoneId("Europe/London").isEmpty())
|
||||
.isFalse();
|
||||
assertThat(mTimeZoneData.lookupCountryCodesForZoneId("America/Los_Angeles").isEmpty())
|
||||
.isFalse();
|
||||
assertThat(mTimeZoneData.lookupCountryCodesForZoneId("Europe/Simferopol")).isEmpty();
|
||||
assertThat(mTimeZoneData.lookupCountryCodesForZoneId("Europe/London")).isNotEmpty();
|
||||
assertThat(mTimeZoneData.lookupCountryCodesForZoneId("America/Los_Angeles")).isNotEmpty();
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user