Merge "Add behavior to libcore.util.HexEncoding"
diff --git a/dalvik/src/main/java/dalvik/system/DexFile.java b/dalvik/src/main/java/dalvik/system/DexFile.java
index 2a81be1..486ee90 100644
--- a/dalvik/src/main/java/dalvik/system/DexFile.java
+++ b/dalvik/src/main/java/dalvik/system/DexFile.java
@@ -110,8 +110,9 @@
//System.out.println("DEX FILE cookie is " + mCookie + " fileName=" + fileName);
}
- DexFile(ByteBuffer[] bufs) throws IOException {
- mCookie = openInMemoryDexFiles(bufs);
+ DexFile(ByteBuffer[] bufs, ClassLoader loader, DexPathList.Element[] elements)
+ throws IOException {
+ mCookie = openInMemoryDexFiles(bufs, loader, elements);
mInternalCookie = mCookie;
mFileName = null;
}
@@ -370,7 +371,8 @@
elements);
}
- private static Object openInMemoryDexFiles(ByteBuffer[] bufs) throws IOException {
+ private static Object openInMemoryDexFiles(ByteBuffer[] bufs, ClassLoader loader,
+ DexPathList.Element[] elements) throws IOException {
// Preprocess the ByteBuffers for openInMemoryDexFilesNative. We extract
// the backing array (non-direct buffers only) and start/end positions
// so that the native method does not have to call Java methods anymore.
@@ -382,11 +384,11 @@
starts[i] = bufs[i].position();
ends[i] = bufs[i].limit();
}
- return openInMemoryDexFilesNative(bufs, arrays, starts, ends);
+ return openInMemoryDexFilesNative(bufs, arrays, starts, ends, loader, elements);
}
private static native Object openInMemoryDexFilesNative(ByteBuffer[] bufs, byte[][] arrays,
- int[] starts, int[] ends);
+ int[] starts, int[] ends, ClassLoader loader, DexPathList.Element[] elements);
/*
* Initiates background verification of this DexFile. This is a sepearate down-call
diff --git a/dalvik/src/main/java/dalvik/system/DexPathList.java b/dalvik/src/main/java/dalvik/system/DexPathList.java
index 227231a..c63bb13 100644
--- a/dalvik/src/main/java/dalvik/system/DexPathList.java
+++ b/dalvik/src/main/java/dalvik/system/DexPathList.java
@@ -266,10 +266,10 @@
try {
Element[] null_elements = null;
- DexFile dex = new DexFile(dexFiles);
+ DexFile dex = new DexFile(dexFiles, definingContext, null_elements);
// Capture class loader context from *before* `dexElements` is set (see comment below).
- String classLoaderContext = DexFile.getClassLoaderContext(definingContext,
- null_elements);
+ String classLoaderContext = dex.isBackedByOatFile()
+ ? null : DexFile.getClassLoaderContext(definingContext, null_elements);
dexElements = new Element[] { new Element(dex) };
// Spawn background thread to verify all classes and cache verification results.
// Must be called *after* `dexElements` has been initialized for ART to find
@@ -277,7 +277,13 @@
// the order of the array), but with class loader context from *before*
// `dexElements` was set because that is what it will be compared against next
// time the same bytecode is loaded.
- dex.verifyInBackground(definingContext, classLoaderContext);
+ // We only spawn the background thread if the bytecode is not backed by an oat
+ // file, i.e. this is the first time this bytecode is being loaded and/or
+ // verification results have not been cached yet. Skip spawning the thread on
+ // all subsequent loads of the same bytecode in the same class loader context.
+ if (classLoaderContext != null) {
+ dex.verifyInBackground(definingContext, classLoaderContext);
+ }
} catch (IOException suppressed) {
System.logE("Unable to load dex files", suppressed);
suppressedExceptions.add(suppressed);
@@ -340,7 +346,8 @@
int elementPos = 0;
for (ByteBuffer buf : dexFiles) {
try {
- DexFile dex = new DexFile(new ByteBuffer[] { buf });
+ DexFile dex = new DexFile(new ByteBuffer[] { buf }, /* classLoader */ null,
+ /* dexElements */ null);
elements[elementPos++] = new Element(dex);
} catch (IOException suppressed) {
System.logE("Unable to load dex file: " + buf, suppressed);
diff --git a/libart/src/main/java/dalvik/system/VMRuntime.java b/libart/src/main/java/dalvik/system/VMRuntime.java
index 0260e68..7d70680 100644
--- a/libart/src/main/java/dalvik/system/VMRuntime.java
+++ b/libart/src/main/java/dalvik/system/VMRuntime.java
@@ -696,4 +696,10 @@
*/
@libcore.api.CorePlatformApi
public static native void setProcessPackageName(String packageName);
+
+ /**
+ * Sets the full path to data directory of the app running in this process.
+ */
+ @libcore.api.CorePlatformApi
+ public static native void setProcessDataDirectory(String dataDir);
}
diff --git a/luni/src/main/java/libcore/net/android.mime.types b/luni/src/main/java/libcore/net/android.mime.types
index 8a090fc..dd3b21a 100644
--- a/luni/src/main/java/libcore/net/android.mime.types
+++ b/luni/src/main/java/libcore/net/android.mime.types
@@ -90,4 +90,5 @@
video/3gpp 3gpp!
video/mpeg mpeg!
video/quicktime mov!
+video/vnd.youtube.yt yt
video/x-matroska mkv!
diff --git a/luni/src/main/java/libcore/util/ZoneInfo.java b/luni/src/main/java/libcore/util/ZoneInfo.java
index 65df611..abd98b1 100644
--- a/luni/src/main/java/libcore/util/ZoneInfo.java
+++ b/luni/src/main/java/libcore/util/ZoneInfo.java
@@ -37,8 +37,9 @@
* Our concrete TimeZone implementation, backed by zoneinfo data.
*
* <p>This reads time zone information from a binary file stored on the platform. The binary file
- * is essentially a single file containing compacted versions of all the tzfile (see
- * {@code man 5 tzfile} for details of the source) and an index by long name, e.g. Europe/London.
+ * is essentially a single file containing compacted versions of all the tzfiles produced by the
+ * zone info compiler (zic) tool (see {@code man 5 tzfile} for details of the format and
+ * {@code man 8 zic}) and an index by long name, e.g. Europe/London.
*
* <p>The compacted form is created by {@code external/icu/tools/ZoneCompactor.java} and is used
* by both this and Bionic. {@link ZoneInfoDB} is responsible for mapping the binary file, and
@@ -307,6 +308,8 @@
// Use the latest non-daylight offset (if any) as the raw offset.
if (mTransitions.length == 0) {
+ // This case is no longer expected to occur in the data used on Android after changes
+ // made in zic version 2014c. It is kept as a fallback.
// If there are no transitions then use the first GMT offset.
mRawOffset = gmtOffsets[0];
} else {
diff --git a/luni/src/test/java/libcore/java/util/DateTest.java b/luni/src/test/java/libcore/java/util/DateTest.java
index df86a38..1fd8193 100644
--- a/luni/src/test/java/libcore/java/util/DateTest.java
+++ b/luni/src/test/java/libcore/java/util/DateTest.java
@@ -50,10 +50,19 @@
c.clear();
c.set(Calendar.YEAR, 21);
assertEquals("Wed Jan 01 00:00:00 PST 21", c.getTime().toString());
- assertEquals("1 Jan 21 08:00:00 GMT", c.getTime().toGMTString());
+ String actual21GmtString = c.getTime().toGMTString();
+ // zic <= 2014b data gives -08:00:00, later ones gives -07:52:58 instead. http://b/73719425
+ assertTrue("Actual: " + actual21GmtString,
+ "1 Jan 21 07:52:58 GMT".equals(actual21GmtString)
+ || "1 Jan 21 08:00:00 GMT".equals(actual21GmtString));
+
c.set(Calendar.YEAR, 321);
assertEquals("Sun Jan 01 00:00:00 PST 321", c.getTime().toString());
- assertEquals("1 Jan 321 08:00:00 GMT", c.getTime().toGMTString());
+ String actual321GmtString = c.getTime().toGMTString();
+ // zic <= 2014b data gives -08:00:00, later ones gives -07:52:58 instead. http://b/73719425
+ assertTrue("Actual: " + actual321GmtString,
+ "1 Jan 321 07:52:58 GMT".equals(actual321GmtString)
+ || "1 Jan 321 08:00:00 GMT".equals(actual321GmtString));
}
public void test_toGMTString_nonUs() throws Exception {
@@ -64,10 +73,19 @@
c.clear();
c.set(Calendar.YEAR, 21);
assertEquals("Wed Jan 01 00:00:00 PST 21", c.getTime().toString());
- assertEquals("1 Jan 21 08:00:00 GMT", c.getTime().toGMTString());
+ String actual21GmtString = c.getTime().toGMTString();
+ // zic <= 2014b data gives -08:00:00, later ones gives -07:52:58 instead. http://b/73719425
+ assertTrue("Actual: " + actual21GmtString,
+ "1 Jan 21 07:52:58 GMT".equals(actual21GmtString)
+ || "1 Jan 21 08:00:00 GMT".equals(actual21GmtString));
+
c.set(Calendar.YEAR, 321);
assertEquals("Sun Jan 01 00:00:00 PST 321", c.getTime().toString());
- assertEquals("1 Jan 321 08:00:00 GMT", c.getTime().toGMTString());
+ String actual321GmtString = c.getTime().toGMTString();
+ // zic <= 2014b data gives -08:00:00, later ones gives -07:52:58 instead. http://b/73719425
+ assertTrue("Actual: " + actual321GmtString,
+ "1 Jan 321 07:52:58 GMT".equals(actual321GmtString)
+ || "1 Jan 321 08:00:00 GMT".equals(actual321GmtString));
}
public void test_parse_timezones() {
diff --git a/luni/src/test/java/libcore/java/util/TimeZoneTest.java b/luni/src/test/java/libcore/java/util/TimeZoneTest.java
index 68b6a54..6297080 100644
--- a/luni/src/test/java/libcore/java/util/TimeZoneTest.java
+++ b/luni/src/test/java/libcore/java/util/TimeZoneTest.java
@@ -58,7 +58,30 @@
}
// http://code.google.com/p/android/issues/detail?id=14395
- public void testPreHistoricInDaylightTime() throws Exception {
+ public void testPreHistoricInDaylightTime() {
+ // A replacement for testPreHistoricInDaylightTime_old() using a zone that still lacks an
+ // explicit transition at Integer.MIN_VALUE with zic 2019a and 2019a data.
+ TimeZone tz = TimeZone.getTimeZone("CET");
+
+ long firstTransitionTimeMillis = -1693706400000L; // Apr 30, 1916 22:00:00 GMT
+ assertEquals(7200000L, tz.getOffset(firstTransitionTimeMillis));
+ assertTrue(tz.inDaylightTime(new Date(firstTransitionTimeMillis)));
+
+ long beforeFirstTransitionTimeMillis = firstTransitionTimeMillis - 1;
+ assertEquals(3600000L, tz.getOffset(beforeFirstTransitionTimeMillis));
+ assertFalse(tz.inDaylightTime(new Date(beforeFirstTransitionTimeMillis)));
+ }
+
+ // http://code.google.com/p/android/issues/detail?id=14395
+ public void testPreHistoricInDaylightTime_old() throws Exception {
+ // Originally this test was intended to assert what happens when the first transition for a
+ // time zone was a "to DST" transition. i.e. that the (implicit) offset / DST state before
+ // the first was treated as a non-DST state. Since zic version 2014c some zones have an
+ // explicit non-DST transition at time -2^31 seconds so it is no longer possible to test
+ // this with America/Los_Angeles.
+ // This regression test has been kept in case that changes again in future and to prove the
+ // behavior has remained consistent.
+
Locale.setDefault(Locale.US);
TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
TimeZone.setDefault(tz);
@@ -69,7 +92,7 @@
assertFalse(tz.inDaylightTime(date));
assertEquals("Fri Oct 31 08:00:00 PST 1902", date.toString());
assertEquals("31 Oct 1902 16:00:00 GMT", date.toGMTString());
- // Any time before we have transition data is considered non-daylight, even in summer.
+ // For zic versions <= 2014b, this would be before the first transition.
date = sdf.parse("1902-06-01T00:00:00.000+0800");
assertEquals(-28800000, tz.getOffset(date.getTime()));
assertFalse(tz.inDaylightTime(date));
@@ -84,17 +107,20 @@
public void testPreHistoricOffsets() throws Exception {
// Note: This test changed after P to account for previously incorrect handling of
// prehistoric offsets. http://b/118835133
- // "Africa/Bissau" has just a few transitions:
- // Date, Offset, IsDst
- // 1901-12-13 20:45:52,-3740,0 (Integer.MIN_VALUE, implicit with zic <= 2014b)
- // 1912-01-01 01:00:00,-3600,0
- // 1975-01-01 01:00:00,0,0
+ // "Africa/Bissau" has just a few known transitions:
+ // Transition time : Offset : DST / non-DST
+ // <Integer.MIN_VALUE secs>[1] : -01:02:20 : non-DST
+ // 1912-01-01 01:00:00 GMT : -01:00:00 : non-DST
+ // 1975-01-01 01:00:00 GMT : 00:00:00 : non-DST
+ //
+ // [1] This transition can be implicit or explicit depending on the version of zic used to
+ // generate the data. When implicit, the first non-DST type defn should be used.
TimeZone tz = TimeZone.getTimeZone("Africa/Bissau");
- // Before Integer.MIN_VALUE.
+ // Times before Integer.MIN_VALUE should assume we're using the first non-DST type.
assertNonDaylightOffset(-3740, parseIsoTime("1900-01-01T00:00:00.0+0000"), tz);
- // Times before 1912-01-01 01:00:00
+ // Time before 1912-01-01 01:00:00 but after Integer.MIN_VALUE.
assertNonDaylightOffset(-3740, parseIsoTime("1911-01-01T00:00:00.0+0000"), tz);
// Times after 1912-01-01 01:00:00 should use that transition.
@@ -104,19 +130,22 @@
assertNonDaylightOffset(0, parseIsoTime("1980-01-01T00:00:00.0+0000"), tz);
}
- private static void assertNonDaylightOffset(int expectedOffsetSeconds, long epochSeconds, TimeZone tz) {
- assertEquals(expectedOffsetSeconds, tz.getOffset(epochSeconds * 1000) / 1000);
- assertFalse(tz.inDaylightTime(new Date(epochSeconds * 1000)));
+ private static void assertNonDaylightOffset(
+ int expectedOffsetSeconds, long epochMillis, TimeZone tz) {
+ assertEquals(expectedOffsetSeconds, tz.getOffset(epochMillis) / 1000);
+ assertFalse(tz.inDaylightTime(new Date(epochMillis)));
}
+ /** Returns the millis elapsed since the beginning of the Unix epoch. */
private static long parseIsoTime(String isoTime) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
Date date = sdf.parse(isoTime);
- return date.getTime() / 1000;
+ return date.getTime();
}
- public void testZeroTransitionZones() throws Exception {
- // Zones with no transitions historical or future seem ideal for testing.
+ public void testMinimalTransitionZones() throws Exception {
+ // Zones with minimal transitions, historical or future, seem ideal for testing.
+ // UTC is also included, although it may be implemented differently from the others.
String[] ids = new String[] { "Africa/Bujumbura", "Indian/Cocos", "Pacific/Wake", "UTC" };
for (String id : ids) {
TimeZone tz = TimeZone.getTimeZone(id);
@@ -338,8 +367,7 @@
final long lowerTimeMillis = beforeInt32Seconds * 1000L;
final long upperTimeMillis = afterInt32Seconds * 1000L;
- // This timezone didn't have any daylight savings prior to 1917 and this
- // date is in 1900.
+ // This timezone didn't have any daylight savings prior to 1917 and this date is in 1900.
assertFalse(tz.inDaylightTime(new Date(lowerTimeMillis)));
// http://b/118835133:
@@ -347,7 +375,7 @@
// 07:00:00 GMT) the offset was -18000000.
// zic > 2014b produces data that suggests before Integer.MIN_VALUE seconds the offset was
// -17762000 and between Integer.MIN_VALUE and -1633280400 it was -18000000. Once Android
- // moves to zic > 2014b the -18000000 can be removed.
+ // moves to zic > 2014b the -18000000 can be removed. http://b/73719425
int actualOffset = tz.getOffset(lowerTimeMillis);
assertTrue(-18000000 == actualOffset || -17762000 == actualOffset);
diff --git a/luni/src/test/java/libcore/libcore/net/MimeUtilsTest.java b/luni/src/test/java/libcore/libcore/net/MimeUtilsTest.java
index cf1e233..26be32b 100644
--- a/luni/src/test/java/libcore/libcore/net/MimeUtilsTest.java
+++ b/luni/src/test/java/libcore/libcore/net/MimeUtilsTest.java
@@ -90,8 +90,13 @@
assertEquals("video/ogg", MimeUtils.guessMimeTypeFromExtension("ogv"));
}
- public void test_70851634() {
- assertEquals("application/vnd.youtube.yt", MimeUtils.guessMimeTypeFromExtension("yt"));
+ public void test_70851634_mimeTypeFromExtension() {
+ assertEquals("video/vnd.youtube.yt", MimeUtils.guessMimeTypeFromExtension("yt"));
+ }
+
+ public void test_70851634_extensionFromMimeType() {
+ assertEquals("yt", MimeUtils.guessExtensionFromMimeType("video/vnd.youtube.yt"));
+ assertEquals("yt", MimeUtils.guessExtensionFromMimeType("application/vnd.youtube.yt"));
}
public void test_112162449_audio() {
diff --git a/luni/src/test/java/libcore/libcore/util/ZoneInfoTest.java b/luni/src/test/java/libcore/libcore/util/ZoneInfoTest.java
index a151ee4..cddf41b 100644
--- a/luni/src/test/java/libcore/libcore/util/ZoneInfoTest.java
+++ b/luni/src/test/java/libcore/libcore/util/ZoneInfoTest.java
@@ -322,6 +322,7 @@
* <p>Newer versions of zic after 2014b introduce an explicit transition at the earliest
* representable time, which is Integer.MIN_VALUE for TZif version 1 files. Previously the type
* used was left implicit and readers were expected to use the first non-DST type in the file.
+ * This extra transition mostly went away again with zic 2018f.
*
* <p>Testing newer zic versions demonstrated that Android had been mishandling the lookup of
* offset for times before the first transition. The logic has been corrected. This test would
@@ -357,8 +358,8 @@
{ offsetToSeconds(type2Offset), 0 },
};
- // Creates a simulation of zic version <= 2014b where there is usually no explicit transition at
- // Integer.MIN_VALUE seconds in TZif version 1 data.
+ // Creates a simulation of zic version <= 2014b or zic version >= 2018f where there is often
+ // no explicit transition at Integer.MIN_VALUE seconds in TZif version 1 data.
{
int[][] transitions = {
{ timeToSeconds(firstRealTransitionTime), 2 /* type 2 */ },
@@ -374,8 +375,8 @@
assertOffsetAt(oldZoneInfo, type2Offset, afterFirstRealTransitionTimes);
}
- // Creates a simulation of zic version > 2014b where there is usually an explicit transition at
- // Integer.MIN_VALUE seconds for TZif version 1 data.
+ // Creates a simulation of zic version > 2014b and zic version < 2018f where there is usually an
+ // explicit transition at Integer.MIN_VALUE seconds for TZif version 1 data.
{
int[][] transitions = {
{ Integer.MIN_VALUE, 1 /* type 1 */ }, // The extra transition added by zic.
diff --git a/mmodules/core_platform_api/api/platform/current-api.txt b/mmodules/core_platform_api/api/platform/current-api.txt
index 44c1466..c0c2c74 100644
--- a/mmodules/core_platform_api/api/platform/current-api.txt
+++ b/mmodules/core_platform_api/api/platform/current-api.txt
@@ -748,6 +748,7 @@
method public void setHiddenApiExemptions(String[]);
method public static void setHiddenApiUsageLogger(dalvik.system.VMRuntime.HiddenApiUsageLogger);
method public static void setNonSdkApiUsageConsumer(java.util.function.Consumer<java.lang.String>);
+ method public static void setProcessDataDirectory(String);
method public static void setProcessPackageName(String);
method @dalvik.annotation.compat.UnsupportedAppUsage public float setTargetHeapUtilization(float);
method public void setTargetSdkVersion(int);
diff --git a/ojluni/src/main/java/java/lang/System.java b/ojluni/src/main/java/java/lang/System.java
index 8235bf7..d698446 100644
--- a/ojluni/src/main/java/java/lang/System.java
+++ b/ojluni/src/main/java/java/lang/System.java
@@ -509,13 +509,9 @@
* The byte[] specialized version of arraycopy().
* Note: This method is required for runtime ART compiler optimizations.
* Do not remove or change the signature.
- * Note: Unlike the others, this variant is public due to a dependency we
- * are working on removing. b/74103559
- *
- * @hide
*/
@SuppressWarnings("unused")
- public static void arraycopy(byte[] src, int srcPos, byte[] dst, int dstPos, int length) {
+ private static void arraycopy(byte[] src, int srcPos, byte[] dst, int dstPos, int length) {
if (src == null) {
throw new NullPointerException("src == null");
}
diff --git a/ojluni/src/main/java/java/net/Inet6AddressImpl.java b/ojluni/src/main/java/java/net/Inet6AddressImpl.java
index 6b22f8c..bb722f3 100644
--- a/ojluni/src/main/java/java/net/Inet6AddressImpl.java
+++ b/ojluni/src/main/java/java/net/Inet6AddressImpl.java
@@ -44,6 +44,7 @@
import static android.system.OsConstants.AI_ADDRCONFIG;
import static android.system.OsConstants.EACCES;
import static android.system.OsConstants.ECONNREFUSED;
+import static android.system.OsConstants.EPERM;
import static android.system.OsConstants.NI_NAMEREQD;
import static android.system.OsConstants.ICMP6_ECHO_REPLY;
import static android.system.OsConstants.ICMP_ECHOREPLY;
@@ -144,7 +145,8 @@
// SecurityException to aid in debugging this common mistake.
// http://code.google.com/p/android/issues/detail?id=15722
if (gaiException.getCause() instanceof ErrnoException) {
- if (((ErrnoException) gaiException.getCause()).errno == EACCES) {
+ int errno = ((ErrnoException) gaiException.getCause()).errno;
+ if (errno == EACCES || errno == EPERM) {
throw new SecurityException("Permission denied (missing INTERNET permission?)", gaiException);
}
}
diff --git a/ojluni/src/main/java/java/util/JapaneseImperialCalendar.java b/ojluni/src/main/java/java/util/JapaneseImperialCalendar.java
index c569981..67507bc 100644
--- a/ojluni/src/main/java/java/util/JapaneseImperialCalendar.java
+++ b/ojluni/src/main/java/java/util/JapaneseImperialCalendar.java
@@ -1574,14 +1574,17 @@
zoneOffsets = new int[2];
}
if (tzMask != (ZONE_OFFSET_MASK|DST_OFFSET_MASK)) {
- // Android-changed: Android doesn't have sun.util.calendar.ZoneInfo.
+ // BEGIN Android-changed: Android doesn't have sun.util.calendar.ZoneInfo.
// if (tz instanceof ZoneInfo) {
// zoneOffset = ((ZoneInfo)tz).getOffsets(time, zoneOffsets);
- // } else {
+ if (tz instanceof libcore.util.ZoneInfo) {
+ zoneOffset = ((libcore.util.ZoneInfo)tz).getOffsetsByUtcTime(time, zoneOffsets);
+ // END Android-changed: Android doesn't have sun.util.calendar.ZoneInfo.
+ } else {
zoneOffset = tz.getOffset(time);
zoneOffsets[0] = tz.getRawOffset();
zoneOffsets[1] = zoneOffset - zoneOffsets[0];
- // }
+ }
}
if (tzMask != 0) {
if (isFieldSet(tzMask, ZONE_OFFSET)) {
diff --git a/ojluni/src/main/java/javax/net/ssl/HttpsURLConnection.java b/ojluni/src/main/java/javax/net/ssl/HttpsURLConnection.java
index 143fa5e..b71d11a 100644
--- a/ojluni/src/main/java/javax/net/ssl/HttpsURLConnection.java
+++ b/ojluni/src/main/java/javax/net/ssl/HttpsURLConnection.java
@@ -188,7 +188,6 @@
*/
private static class NoPreloadHolder {
public static HostnameVerifier defaultHostnameVerifier;
- public static final Class<? extends HostnameVerifier> originalDefaultHostnameVerifierClass;
static {
try {
/**
@@ -200,7 +199,6 @@
defaultHostnameVerifier = (HostnameVerifier)
Class.forName("com.android.okhttp.internal.tls.OkHostnameVerifier")
.getField("INSTANCE").get(null);
- originalDefaultHostnameVerifierClass = defaultHostnameVerifier.getClass();
} catch (Exception e) {
throw new AssertionError("Failed to obtain okhttp HostnameVerifier", e);
}
@@ -210,7 +208,7 @@
/**
* The <code>hostnameVerifier</code> for this object.
*/
- protected HostnameVerifier hostnameVerifier;
+ protected HostnameVerifier hostnameVerifier = NoPreloadHolder.defaultHostnameVerifier;
// END Android-changed: Use holder class idiom for a lazily-created OkHttp hostname verifier.
// Android-changed: Modified the documentation to explain side effects / discourage method use.
@@ -329,15 +327,6 @@
* @see #setDefaultHostnameVerifier(HostnameVerifier)
*/
public HostnameVerifier getHostnameVerifier() {
- // Android-added: Use the default verifier if none is set.
- // Note that this also has the side effect of *setting* (if unset)
- // hostnameVerifier to be the default one. It's not clear why this
- // was done (commit abd00f0eaa46f71f98e75a631c268c812d1ec7c1) but
- // we're keeping this behavior for lack of a strong reason to do
- // otherwise.
- if (hostnameVerifier == null) {
- hostnameVerifier = NoPreloadHolder.defaultHostnameVerifier;
- }
return hostnameVerifier;
}
diff --git a/ojluni/src/main/java/sun/util/calendar/AbstractCalendar.java b/ojluni/src/main/java/sun/util/calendar/AbstractCalendar.java
index ead18de..28b10c8 100644
--- a/ojluni/src/main/java/sun/util/calendar/AbstractCalendar.java
+++ b/ojluni/src/main/java/sun/util/calendar/AbstractCalendar.java
@@ -126,12 +126,14 @@
// BEGIN Android-changed: Android doesn't have sun.util.calendar.ZoneInfo.
// if (zi instanceof ZoneInfo) {
// zoneOffset = ((ZoneInfo)zi).getOffsets(millis, offsets);
- // } else {
+ if (zi instanceof libcore.util.ZoneInfo) {
+ zoneOffset = ((libcore.util.ZoneInfo) zi).getOffsetsByUtcTime(millis, offsets);
+ // END Android-changed: Android doesn't have sun.util.calendar.ZoneInfo.
+ } else {
zoneOffset = zi.getOffset(millis);
offsets[0] = zi.getRawOffset();
offsets[1] = zoneOffset - offsets[0];
- // }
- // END Android-changed: Android doesn't have sun.util.calendar.ZoneInfo.
+ }
// We need to calculate the given millis and time zone
// offset separately for java.util.GregorianCalendar