Merge "Remove time_zones_by_country.xml file"
am: 3436fd4833
Change-Id: I75cf86290b0dcc5aa99b9d0ebacbc5aa07269aab
This commit is contained in:
@@ -16,25 +16,17 @@
|
||||
|
||||
package android.util;
|
||||
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.XmlResourceParser;
|
||||
import android.os.SystemClock;
|
||||
import android.text.format.DateUtils;
|
||||
|
||||
import com.android.internal.util.XmlUtils;
|
||||
|
||||
import org.xmlpull.v1.XmlPullParser;
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import java.util.List;
|
||||
import libcore.util.TimeZoneFinder;
|
||||
import libcore.util.ZoneInfoDB;
|
||||
|
||||
/**
|
||||
@@ -45,14 +37,9 @@ public class TimeUtils {
|
||||
private static final boolean DBG = false;
|
||||
private static final String TAG = "TimeUtils";
|
||||
|
||||
/** Cached results of getTineZones */
|
||||
private static final Object sLastLockObj = new Object();
|
||||
private static ArrayList<TimeZone> sLastZones = null;
|
||||
private static String sLastCountry = null;
|
||||
|
||||
/** Cached results of getTimeZonesWithUniqueOffsets */
|
||||
private static final Object sLastUniqueLockObj = new Object();
|
||||
private static ArrayList<TimeZone> sLastUniqueZoneOffsets = null;
|
||||
private static List<String> sLastUniqueZoneOffsets = null;
|
||||
private static String sLastUniqueCountry = null;
|
||||
|
||||
/** {@hide} */
|
||||
@@ -63,50 +50,39 @@ public class TimeUtils {
|
||||
* and DST value at the specified moment in the specified country.
|
||||
* Returns null if no suitable zone could be found.
|
||||
*/
|
||||
public static TimeZone getTimeZone(int offset, boolean dst, long when, String country) {
|
||||
TimeZone best = null;
|
||||
final Date d = new Date(when);
|
||||
public static java.util.TimeZone getTimeZone(
|
||||
int offset, boolean dst, long when, String country) {
|
||||
|
||||
TimeZone current = TimeZone.getDefault();
|
||||
String currentName = current.getID();
|
||||
int currentOffset = current.getOffset(when);
|
||||
boolean currentDst = current.inDaylightTime(d);
|
||||
|
||||
for (TimeZone tz : getTimeZones(country)) {
|
||||
// If the current time zone is from the right country
|
||||
// and meets the other known properties, keep it
|
||||
// instead of changing to another one.
|
||||
|
||||
if (tz.getID().equals(currentName)) {
|
||||
if (currentOffset == offset && currentDst == dst) {
|
||||
return current;
|
||||
}
|
||||
}
|
||||
|
||||
// Otherwise, take the first zone from the right
|
||||
// country that has the correct current offset and DST.
|
||||
// (Keep iterating instead of returning in case we
|
||||
// haven't encountered the current time zone yet.)
|
||||
|
||||
if (best == null) {
|
||||
if (tz.getOffset(when) == offset &&
|
||||
tz.inDaylightTime(d) == dst) {
|
||||
best = tz;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return best;
|
||||
android.icu.util.TimeZone icuTimeZone = getIcuTimeZone(offset, dst, when, country);
|
||||
// We must expose a java.util.TimeZone here for API compatibility because this is a public
|
||||
// API method.
|
||||
return icuTimeZone != null ? java.util.TimeZone.getTimeZone(icuTimeZone.getID()) : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return list of unique time zones for the country. Do not modify
|
||||
* Tries to return a frozen ICU time zone that would have had the specified offset
|
||||
* and DST value at the specified moment in the specified country.
|
||||
* Returns null if no suitable zone could be found.
|
||||
*/
|
||||
private static android.icu.util.TimeZone getIcuTimeZone(
|
||||
int offset, boolean dst, long when, String country) {
|
||||
if (country == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
android.icu.util.TimeZone bias = android.icu.util.TimeZone.getDefault();
|
||||
return TimeZoneFinder.getInstance()
|
||||
.lookupTimeZoneByCountryAndOffset(country, offset, dst, when, bias);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an immutable list of unique time zone IDs for the country.
|
||||
*
|
||||
* @param country to find
|
||||
* @return list of unique time zones, maybe empty but never null. Do not modify.
|
||||
* @return unmodifiable list of unique time zones, maybe empty but never null.
|
||||
* @hide
|
||||
*/
|
||||
public static ArrayList<TimeZone> getTimeZonesWithUniqueOffsets(String country) {
|
||||
public static List<String> getTimeZoneIdsWithUniqueOffsets(String country) {
|
||||
synchronized(sLastUniqueLockObj) {
|
||||
if ((country != null) && country.equals(sLastUniqueCountry)) {
|
||||
if (DBG) {
|
||||
@@ -117,9 +93,9 @@ public class TimeUtils {
|
||||
}
|
||||
}
|
||||
|
||||
Collection<TimeZone> zones = getTimeZones(country);
|
||||
ArrayList<TimeZone> uniqueTimeZones = new ArrayList<TimeZone>();
|
||||
for (TimeZone zone : zones) {
|
||||
Collection<android.icu.util.TimeZone> zones = getIcuTimeZones(country);
|
||||
ArrayList<android.icu.util.TimeZone> uniqueTimeZones = new ArrayList<>();
|
||||
for (android.icu.util.TimeZone zone : zones) {
|
||||
// See if we already have this offset,
|
||||
// Using slow but space efficient and these are small.
|
||||
boolean found = false;
|
||||
@@ -129,7 +105,7 @@ public class TimeUtils {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (found == false) {
|
||||
if (!found) {
|
||||
if (DBG) {
|
||||
Log.d(TAG, "getTimeZonesWithUniqueOffsets: add unique offset=" +
|
||||
zone.getRawOffset() + " zone.getID=" + zone.getID());
|
||||
@@ -140,81 +116,43 @@ public class TimeUtils {
|
||||
|
||||
synchronized(sLastUniqueLockObj) {
|
||||
// Cache the last result
|
||||
sLastUniqueZoneOffsets = uniqueTimeZones;
|
||||
sLastUniqueZoneOffsets = extractZoneIds(uniqueTimeZones);
|
||||
sLastUniqueCountry = country;
|
||||
|
||||
return sLastUniqueZoneOffsets;
|
||||
}
|
||||
}
|
||||
|
||||
private static List<String> extractZoneIds(List<android.icu.util.TimeZone> timeZones) {
|
||||
List<String> ids = new ArrayList<>(timeZones.size());
|
||||
for (android.icu.util.TimeZone timeZone : timeZones) {
|
||||
ids.add(timeZone.getID());
|
||||
}
|
||||
return Collections.unmodifiableList(ids);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the time zones for the country, which is the code
|
||||
* attribute of the timezone element in time_zones_by_country.xml. Do not modify.
|
||||
* Returns an immutable list of frozen ICU time zones for the country.
|
||||
*
|
||||
* @param country is a two character country code.
|
||||
* @return TimeZone list, maybe empty but never null. Do not modify.
|
||||
* @param countryIso is a two character country code.
|
||||
* @return TimeZone list, maybe empty but never null.
|
||||
* @hide
|
||||
*/
|
||||
public static ArrayList<TimeZone> getTimeZones(String country) {
|
||||
synchronized (sLastLockObj) {
|
||||
if ((country != null) && country.equals(sLastCountry)) {
|
||||
if (DBG) Log.d(TAG, "getTimeZones(" + country + "): return cached version");
|
||||
return sLastZones;
|
||||
private static List<android.icu.util.TimeZone> getIcuTimeZones(String countryIso) {
|
||||
if (countryIso == null) {
|
||||
if (DBG) Log.d(TAG, "getIcuTimeZones(null): return empty list");
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<android.icu.util.TimeZone> timeZones =
|
||||
TimeZoneFinder.getInstance().lookupTimeZonesByCountry(countryIso);
|
||||
if (timeZones == null) {
|
||||
if (DBG) {
|
||||
Log.d(TAG, "getIcuTimeZones(" + countryIso
|
||||
+ "): returned null, converting to empty list");
|
||||
}
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
ArrayList<TimeZone> tzs = new ArrayList<TimeZone>();
|
||||
|
||||
if (country == null) {
|
||||
if (DBG) Log.d(TAG, "getTimeZones(null): return empty list");
|
||||
return tzs;
|
||||
}
|
||||
|
||||
Resources r = Resources.getSystem();
|
||||
XmlResourceParser parser = r.getXml(com.android.internal.R.xml.time_zones_by_country);
|
||||
|
||||
try {
|
||||
XmlUtils.beginDocument(parser, "timezones");
|
||||
|
||||
while (true) {
|
||||
XmlUtils.nextElement(parser);
|
||||
|
||||
String element = parser.getName();
|
||||
if (element == null || !(element.equals("timezone"))) {
|
||||
break;
|
||||
}
|
||||
|
||||
String code = parser.getAttributeValue(null, "code");
|
||||
|
||||
if (country.equals(code)) {
|
||||
if (parser.next() == XmlPullParser.TEXT) {
|
||||
String zoneIdString = parser.getText();
|
||||
TimeZone tz = TimeZone.getTimeZone(zoneIdString);
|
||||
if (tz.getID().startsWith("GMT") == false) {
|
||||
// tz.getID doesn't start not "GMT" so its valid
|
||||
tzs.add(tz);
|
||||
if (DBG) {
|
||||
Log.d(TAG, "getTimeZone('" + country + "'): found tz.getID=="
|
||||
+ ((tz != null) ? tz.getID() : "<no tz>"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (XmlPullParserException e) {
|
||||
Log.e(TAG, "Got xml parser exception getTimeZone('" + country + "'): e=", e);
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, "Got IO exception getTimeZone('" + country + "'): e=", e);
|
||||
} finally {
|
||||
parser.close();
|
||||
}
|
||||
|
||||
synchronized(sLastLockObj) {
|
||||
// Cache the last result;
|
||||
sLastZones = tzs;
|
||||
sLastCountry = country;
|
||||
return sLastZones;
|
||||
}
|
||||
return timeZones;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1433,7 +1433,6 @@
|
||||
<java-symbol type="xml" name="password_kbd_symbols" />
|
||||
<java-symbol type="xml" name="password_kbd_symbols_shift" />
|
||||
<java-symbol type="xml" name="power_profile" />
|
||||
<java-symbol type="xml" name="time_zones_by_country" />
|
||||
<java-symbol type="xml" name="sms_short_codes" />
|
||||
<java-symbol type="xml" name="audio_assets" />
|
||||
<java-symbol type="xml" name="global_keys" />
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user