Revert "Cleanups for DataCallResponse"

This reverts commit 3fa6b77086474ec98e7e941afc37b0382d1b857d.

Reason for revert: Potential culprit of b/288615494

Change-Id: I0a833fcaecea88627d1158fbcc7f1ada6fc1aa64
diff --git a/telephony/java/android/telephony/data/DataCallResponse.java b/telephony/java/android/telephony/data/DataCallResponse.java
index e69040e..b5c1d7d9 100644
--- a/telephony/java/android/telephony/data/DataCallResponse.java
+++ b/telephony/java/android/telephony/data/DataCallResponse.java
@@ -36,10 +36,8 @@
 import java.lang.annotation.RetentionPolicy;
 import java.net.InetAddress;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
-import java.util.Set;
 
 /**
  * Description of the response of a setup data call connection request.
@@ -174,48 +172,63 @@
                             @Nullable List<InetAddress> dnsAddresses,
                             @Nullable List<InetAddress> gatewayAddresses,
                             @Nullable List<InetAddress> pcscfAddresses, int mtu) {
-        this(cause, suggestedRetryTime, id,
-                linkStatus, protocolType,
-                interfaceName == null ? "" : interfaceName,
-                addresses == null ? Collections.emptyList() : addresses,
-                dnsAddresses == null ? Collections.emptyList() : dnsAddresses,
-                gatewayAddresses == null ? Collections.emptyList() : gatewayAddresses,
-                pcscfAddresses == null ? Collections.emptyList() : pcscfAddresses,
-                mtu, mtu /* mtuV4 */, mtu /* mtuV6 */,
-                HANDOVER_FAILURE_MODE_LEGACY, PDU_SESSION_ID_NOT_SET,
-                null /* defaultQos */, Collections.emptyList() /* qosBearerSessions */,
-                null /* sliceInfo */,
-                Collections.emptyList() /* trafficDescriptors */);
-    }
-
-    private DataCallResponse(@DataFailureCause int cause, long suggestedRetryTime, int id,
-            @LinkStatus int linkStatus, @ProtocolType int protocolType,
-            @NonNull String interfaceName, @NonNull List<LinkAddress> addresses,
-            @NonNull List<InetAddress> dnsAddresses, @NonNull List<InetAddress> gatewayAddresses,
-            @NonNull List<InetAddress> pcscfAddresses, int mtu, int mtuV4, int mtuV6,
-            @HandoverFailureMode int handoverFailureMode, int pduSessionId,
-            @Nullable Qos defaultQos, @NonNull List<QosBearerSession> qosBearerSessions,
-            @Nullable NetworkSliceInfo sliceInfo,
-            @NonNull List<TrafficDescriptor> trafficDescriptors) {
         mCause = cause;
         mSuggestedRetryTime = suggestedRetryTime;
         mId = id;
         mLinkStatus = linkStatus;
         mProtocolType = protocolType;
-        mInterfaceName = interfaceName;
-        mAddresses = new ArrayList<>(addresses);
-        mDnsAddresses = new ArrayList<>(dnsAddresses);
-        mGatewayAddresses = new ArrayList<>(gatewayAddresses);
-        mPcscfAddresses = new ArrayList<>(pcscfAddresses);
+        mInterfaceName = (interfaceName == null) ? "" : interfaceName;
+        mAddresses = (addresses == null)
+                ? new ArrayList<>() : new ArrayList<>(addresses);
+        mDnsAddresses = (dnsAddresses == null)
+                ? new ArrayList<>() : new ArrayList<>(dnsAddresses);
+        mGatewayAddresses = (gatewayAddresses == null)
+                ? new ArrayList<>() : new ArrayList<>(gatewayAddresses);
+        mPcscfAddresses = (pcscfAddresses == null)
+                ? new ArrayList<>() : new ArrayList<>(pcscfAddresses);
+        mMtu = mMtuV4 = mMtuV6 = mtu;
+        mHandoverFailureMode = HANDOVER_FAILURE_MODE_LEGACY;
+        mPduSessionId = PDU_SESSION_ID_NOT_SET;
+        mDefaultQos = null;
+        mQosBearerSessions = new ArrayList<>();
+        mSliceInfo = null;
+        mTrafficDescriptors = new ArrayList<>();
+    }
+
+    private DataCallResponse(@DataFailureCause int cause, long suggestedRetryTime, int id,
+            @LinkStatus int linkStatus, @ProtocolType int protocolType,
+            @Nullable String interfaceName, @Nullable List<LinkAddress> addresses,
+            @Nullable List<InetAddress> dnsAddresses, @Nullable List<InetAddress> gatewayAddresses,
+            @Nullable List<InetAddress> pcscfAddresses, int mtu, int mtuV4, int mtuV6,
+            @HandoverFailureMode int handoverFailureMode, int pduSessionId,
+            @Nullable Qos defaultQos, @Nullable List<QosBearerSession> qosBearerSessions,
+            @Nullable NetworkSliceInfo sliceInfo,
+            @Nullable List<TrafficDescriptor> trafficDescriptors) {
+        mCause = cause;
+        mSuggestedRetryTime = suggestedRetryTime;
+        mId = id;
+        mLinkStatus = linkStatus;
+        mProtocolType = protocolType;
+        mInterfaceName = (interfaceName == null) ? "" : interfaceName;
+        mAddresses = (addresses == null)
+                ? new ArrayList<>() : new ArrayList<>(addresses);
+        mDnsAddresses = (dnsAddresses == null)
+                ? new ArrayList<>() : new ArrayList<>(dnsAddresses);
+        mGatewayAddresses = (gatewayAddresses == null)
+                ? new ArrayList<>() : new ArrayList<>(gatewayAddresses);
+        mPcscfAddresses = (pcscfAddresses == null)
+                ? new ArrayList<>() : new ArrayList<>(pcscfAddresses);
         mMtu = mtu;
         mMtuV4 = mtuV4;
         mMtuV6 = mtuV6;
         mHandoverFailureMode = handoverFailureMode;
         mPduSessionId = pduSessionId;
         mDefaultQos = defaultQos;
-        mQosBearerSessions = new ArrayList<>(qosBearerSessions);
+        mQosBearerSessions = (qosBearerSessions == null)
+                ? new ArrayList<>() : new ArrayList<>(qosBearerSessions);
         mSliceInfo = sliceInfo;
-        mTrafficDescriptors = new ArrayList<>(trafficDescriptors);
+        mTrafficDescriptors = (trafficDescriptors == null)
+                ? new ArrayList<>() : new ArrayList<>(trafficDescriptors);
     }
 
     /** @hide */
@@ -228,39 +241,24 @@
         mProtocolType = source.readInt();
         mInterfaceName = source.readString();
         mAddresses = new ArrayList<>();
-        source.readList(mAddresses,
-                LinkAddress.class.getClassLoader(),
-                android.net.LinkAddress.class);
+        source.readList(mAddresses, LinkAddress.class.getClassLoader(), android.net.LinkAddress.class);
         mDnsAddresses = new ArrayList<>();
-        source.readList(mDnsAddresses,
-                InetAddress.class.getClassLoader(),
-                java.net.InetAddress.class);
+        source.readList(mDnsAddresses, InetAddress.class.getClassLoader(), java.net.InetAddress.class);
         mGatewayAddresses = new ArrayList<>();
-        source.readList(mGatewayAddresses,
-                InetAddress.class.getClassLoader(),
-                java.net.InetAddress.class);
+        source.readList(mGatewayAddresses, InetAddress.class.getClassLoader(), java.net.InetAddress.class);
         mPcscfAddresses = new ArrayList<>();
-        source.readList(mPcscfAddresses,
-                InetAddress.class.getClassLoader(),
-                java.net.InetAddress.class);
+        source.readList(mPcscfAddresses, InetAddress.class.getClassLoader(), java.net.InetAddress.class);
         mMtu = source.readInt();
         mMtuV4 = source.readInt();
         mMtuV6 = source.readInt();
         mHandoverFailureMode = source.readInt();
         mPduSessionId = source.readInt();
-        mDefaultQos = source.readParcelable(Qos.class.getClassLoader(),
-                android.telephony.data.Qos.class);
+        mDefaultQos = source.readParcelable(Qos.class.getClassLoader(), android.telephony.data.Qos.class);
         mQosBearerSessions = new ArrayList<>();
-        source.readList(mQosBearerSessions,
-                QosBearerSession.class.getClassLoader(),
-                android.telephony.data.QosBearerSession.class);
-        mSliceInfo = source.readParcelable(
-                NetworkSliceInfo.class.getClassLoader(),
-                android.telephony.data.NetworkSliceInfo.class);
+        source.readList(mQosBearerSessions, QosBearerSession.class.getClassLoader(), android.telephony.data.QosBearerSession.class);
+        mSliceInfo = source.readParcelable(NetworkSliceInfo.class.getClassLoader(), android.telephony.data.NetworkSliceInfo.class);
         mTrafficDescriptors = new ArrayList<>();
-        source.readList(mTrafficDescriptors,
-                TrafficDescriptor.class.getClassLoader(),
-                android.telephony.data.TrafficDescriptor.class);
+        source.readList(mTrafficDescriptors, TrafficDescriptor.class.getClassLoader(), android.telephony.data.TrafficDescriptor.class);
     }
 
     /**
@@ -324,36 +322,28 @@
      * @return A list of addresses of this data connection.
      */
     @NonNull
-    public List<LinkAddress> getAddresses() {
-        return Collections.unmodifiableList(mAddresses);
-    }
+    public List<LinkAddress> getAddresses() { return mAddresses; }
 
     /**
      * @return A list of DNS server addresses, e.g., "192.0.1.3" or
      * "192.0.1.11 2001:db8::1". Empty list if no dns server addresses returned.
      */
     @NonNull
-    public List<InetAddress> getDnsAddresses() {
-        return Collections.unmodifiableList(mDnsAddresses);
-    }
+    public List<InetAddress> getDnsAddresses() { return mDnsAddresses; }
 
     /**
      * @return A list of default gateway addresses, e.g., "192.0.1.3" or
      * "192.0.1.11 2001:db8::1". Empty list if the addresses represent point to point connections.
      */
     @NonNull
-    public List<InetAddress> getGatewayAddresses() {
-        return Collections.unmodifiableList(mGatewayAddresses);
-    }
+    public List<InetAddress> getGatewayAddresses() { return mGatewayAddresses; }
 
     /**
      * @return A list of Proxy Call State Control Function address via PCO (Protocol Configuration
      * Option) for IMS client.
      */
     @NonNull
-    public List<InetAddress> getPcscfAddresses() {
-        return Collections.unmodifiableList(mPcscfAddresses);
-    }
+    public List<InetAddress> getPcscfAddresses() { return mPcscfAddresses; }
 
     /**
      * @return MTU (maximum transmission unit) in bytes received from network. Zero or negative
@@ -414,7 +404,7 @@
      */
     @NonNull
     public List<QosBearerSession> getQosBearerSessions() {
-        return Collections.unmodifiableList(mQosBearerSessions);
+        return mQosBearerSessions;
     }
 
     /**
@@ -430,7 +420,7 @@
      */
     @NonNull
     public List<TrafficDescriptor> getTrafficDescriptors() {
-        return Collections.unmodifiableList(mTrafficDescriptors);
+        return mTrafficDescriptors;
     }
 
     @NonNull
@@ -471,6 +461,18 @@
 
         DataCallResponse other = (DataCallResponse) o;
 
+        final boolean isQosBearerSessionsSame =
+                (mQosBearerSessions == null || other.mQosBearerSessions == null)
+                ? mQosBearerSessions == other.mQosBearerSessions
+                : (mQosBearerSessions.size() == other.mQosBearerSessions.size()
+                        && mQosBearerSessions.containsAll(other.mQosBearerSessions));
+
+        final boolean isTrafficDescriptorsSame =
+                (mTrafficDescriptors == null || other.mTrafficDescriptors == null)
+                ? mTrafficDescriptors == other.mTrafficDescriptors
+                : (mTrafficDescriptors.size() == other.mTrafficDescriptors.size()
+                        && mTrafficDescriptors.containsAll(other.mTrafficDescriptors));
+
         return mCause == other.mCause
                 && mSuggestedRetryTime == other.mSuggestedRetryTime
                 && mId == other.mId
@@ -491,20 +493,42 @@
                 && mHandoverFailureMode == other.mHandoverFailureMode
                 && mPduSessionId == other.mPduSessionId
                 && Objects.equals(mDefaultQos, other.mDefaultQos)
-                && mQosBearerSessions.size() == other.mQosBearerSessions.size() // non-null
-                && mQosBearerSessions.containsAll(other.mQosBearerSessions) // non-null
+                && isQosBearerSessionsSame
                 && Objects.equals(mSliceInfo, other.mSliceInfo)
-                && mTrafficDescriptors.size() == other.mTrafficDescriptors.size() // non-null
-                && mTrafficDescriptors.containsAll(other.mTrafficDescriptors); // non-null
+                && isTrafficDescriptorsSame;
     }
 
     @Override
     public int hashCode() {
+        // Generate order-independent hashes for lists
+        int addressesHash = mAddresses.stream()
+                .map(LinkAddress::hashCode)
+                .mapToInt(Integer::intValue)
+                .sum();
+        int dnsAddressesHash = mDnsAddresses.stream()
+                .map(InetAddress::hashCode)
+                .mapToInt(Integer::intValue)
+                .sum();
+        int gatewayAddressesHash = mGatewayAddresses.stream()
+                .map(InetAddress::hashCode)
+                .mapToInt(Integer::intValue)
+                .sum();
+        int pcscfAddressesHash = mPcscfAddresses.stream()
+                .map(InetAddress::hashCode)
+                .mapToInt(Integer::intValue)
+                .sum();
+        int qosBearerSessionsHash = mQosBearerSessions.stream()
+                .map(QosBearerSession::hashCode)
+                .mapToInt(Integer::intValue)
+                .sum();
+        int trafficDescriptorsHash = mTrafficDescriptors.stream()
+                .map(TrafficDescriptor::hashCode)
+                .mapToInt(Integer::intValue)
+                .sum();
         return Objects.hash(mCause, mSuggestedRetryTime, mId, mLinkStatus, mProtocolType,
-                mInterfaceName, Set.copyOf(mAddresses), Set.copyOf(mDnsAddresses),
-                Set.copyOf(mGatewayAddresses), Set.copyOf(mPcscfAddresses), mMtu, mMtuV4, mMtuV6,
-                mHandoverFailureMode, mPduSessionId, mDefaultQos, Set.copyOf(mQosBearerSessions),
-                mSliceInfo, Set.copyOf(mTrafficDescriptors));
+                mInterfaceName, addressesHash, dnsAddressesHash, gatewayAddressesHash,
+                pcscfAddressesHash, mMtu, mMtuV4, mMtuV6, mHandoverFailureMode, mPduSessionId,
+                mDefaultQos, qosBearerSessionsHash, mSliceInfo, trafficDescriptorsHash);
     }
 
     @Override
@@ -592,15 +616,15 @@
 
         private @ProtocolType int mProtocolType;
 
-        private String mInterfaceName = "";
+        private String mInterfaceName;
 
-        private List<LinkAddress> mAddresses = Collections.emptyList();
+        private List<LinkAddress> mAddresses;
 
-        private List<InetAddress> mDnsAddresses = Collections.emptyList();
+        private List<InetAddress> mDnsAddresses;
 
-        private List<InetAddress> mGatewayAddresses = Collections.emptyList();
+        private List<InetAddress> mGatewayAddresses;
 
-        private List<InetAddress> mPcscfAddresses = Collections.emptyList();
+        private List<InetAddress> mPcscfAddresses;
 
         private int mMtu;
 
@@ -612,11 +636,11 @@
 
         private int mPduSessionId = PDU_SESSION_ID_NOT_SET;
 
-        private @Nullable Qos mDefaultQos;
+        private Qos mDefaultQos;
 
         private List<QosBearerSession> mQosBearerSessions = new ArrayList<>();
 
-        private @Nullable NetworkSliceInfo mSliceInfo;
+        private NetworkSliceInfo mSliceInfo;
 
         private List<TrafficDescriptor> mTrafficDescriptors = new ArrayList<>();
 
@@ -702,7 +726,6 @@
          * @return The same instance of the builder.
          */
         public @NonNull Builder setInterfaceName(@NonNull String interfaceName) {
-            Objects.requireNonNull(interfaceName);
             mInterfaceName = interfaceName;
             return this;
         }
@@ -714,7 +737,6 @@
          * @return The same instance of the builder.
          */
         public @NonNull Builder setAddresses(@NonNull List<LinkAddress> addresses) {
-            Objects.requireNonNull(addresses);
             mAddresses = addresses;
             return this;
         }
@@ -726,7 +748,6 @@
          * @return The same instance of the builder.
          */
         public @NonNull Builder setDnsAddresses(@NonNull List<InetAddress> dnsAddresses) {
-            Objects.requireNonNull(dnsAddresses);
             mDnsAddresses = dnsAddresses;
             return this;
         }
@@ -738,7 +759,6 @@
          * @return The same instance of the builder.
          */
         public @NonNull Builder setGatewayAddresses(@NonNull List<InetAddress> gatewayAddresses) {
-            Objects.requireNonNull(gatewayAddresses);
             mGatewayAddresses = gatewayAddresses;
             return this;
         }
@@ -751,7 +771,6 @@
          * @return The same instance of the builder.
          */
         public @NonNull Builder setPcscfAddresses(@NonNull List<InetAddress> pcscfAddresses) {
-            Objects.requireNonNull(pcscfAddresses);
             mPcscfAddresses = pcscfAddresses;
             return this;
         }