Merge "Reduce memory usage by avoiding clones of ZoneInfoData objects"
diff --git a/android_icu4j/api/intra/current.txt b/android_icu4j/api/intra/current.txt
index e3c443a..a1e0810 100644
--- a/android_icu4j/api/intra/current.txt
+++ b/android_icu4j/api/intra/current.txt
@@ -102,7 +102,6 @@
 package com.android.i18n.timezone {
 
   public final class ZoneInfoData {
-    method public com.android.i18n.timezone.ZoneInfoData createCopy();
     method public com.android.i18n.timezone.ZoneInfoData createCopyWithRawOffset(int);
     method public static com.android.i18n.timezone.ZoneInfoData createFromSerializationFields(String, java.io.ObjectInputStream.GetField) throws java.io.IOException;
     method public static com.android.i18n.timezone.ZoneInfoData createZoneInfo(String, java.nio.ByteBuffer) throws java.io.IOException;
diff --git a/android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/ZoneInfoData.java b/android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/ZoneInfoData.java
index efc903d..57f341e 100644
--- a/android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/ZoneInfoData.java
+++ b/android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/ZoneInfoData.java
@@ -775,14 +775,6 @@
     }
 
     /**
-     * Create a deep copy of this object.
-     */
-    @libcore.api.IntraCoreApi
-    public ZoneInfoData createCopy() {
-        return new ZoneInfoData(this);
-    }
-
-    /**
      * Create a deep copy of this object with a new raw offset.
      */
     @libcore.api.IntraCoreApi
@@ -794,13 +786,11 @@
      * Returns the times (in seconds) at which the offsets changes for any reason, whether that is a
      * change in the offset from UTC or a change in the DST.
      *
-     * WARNING: This API is exposed only for app compat usage in {@link libcore.util.ZoneInfo}. The
-     * data is read-only. Do not write any data into the returned array, which is an internal
-     * data structure.
+     * WARNING: This API is exposed only for app compat usage in @link libcore.util.ZoneInfo}.
      */
     @libcore.api.IntraCoreApi
     public long[] getTransitions() {
-        return mTransitions;
+        return mTransitions == null ? null : mTransitions.clone();
     }
 
     /**
diff --git a/android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/ZoneInfoDb.java b/android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/ZoneInfoDb.java
index 9fbf0d3..f5fa160 100644
--- a/android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/ZoneInfoDb.java
+++ b/android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/ZoneInfoDb.java
@@ -382,8 +382,9 @@
   public ZoneInfoData makeZoneInfoData(String id) {
     checkNotClosed();
     ZoneInfoData zoneInfoData = cache.get(id);
-    // The object from the cache is cloned because TimeZone / ZoneInfo are mutable.
-    return zoneInfoData == null ? null : zoneInfoData.createCopy();
+    // The object from the cache is not cloned because ZoneInfoData is immutable.
+    // Note that zoneInfoData can be null here.
+    return zoneInfoData;
   }
 
   @libcore.api.CorePlatformApi
diff --git a/android_icu4j/testing/src/com/android/i18n/test/timezone/ZoneInfoDataTest.java b/android_icu4j/testing/src/com/android/i18n/test/timezone/ZoneInfoDataTest.java
index 7a7472a..29a5d28 100644
--- a/android_icu4j/testing/src/com/android/i18n/test/timezone/ZoneInfoDataTest.java
+++ b/android_icu4j/testing/src/com/android/i18n/test/timezone/ZoneInfoDataTest.java
@@ -632,24 +632,6 @@
     }
   }
 
-  public void testCreateCopy() throws Exception {
-    long[][] transitions = {
-            { 0, 0 },
-            { 5, 1 },
-            { 2000, 2 },
-    };
-    int[][] types = {
-            { 1800, 0 },
-            { 3600, 1 },
-            { 5400, 0 }
-    };
-    ZoneInfoData zoneInfoData = createZoneInfoData(transitions, types);
-    ZoneInfoData copy = zoneInfoData.createCopy();
-    assertNotSame(zoneInfoData, copy);
-    assertTrue("zoneInfoData does not have the same rule as its copy",
-            zoneInfoData.hasSameRules(copy));
-  }
-
   public void testCreateCopyWithRawOffset() throws Exception {
     long[][] transitions = {
             { 0, 0 },