From eadbb83ff5303a4921a75c28a2bfb4b501f198a3 Mon Sep 17 00:00:00 2001 From: Jiakai Zhang Date: Mon, 26 Jun 2023 14:43:07 +0000 Subject: [PATCH] Revert "Cleanups for DataCallResponse" This reverts commit 3fa6b77086474ec98e7e941afc37b0382d1b857d. Reason for revert: Potential culprit of b/288615494 Change-Id: I0a833fcaecea88627d1158fbcc7f1ada6fc1aa64 --- .../telephony/data/DataCallResponse.java | 197 ++++++++++-------- 1 file changed, 108 insertions(+), 89 deletions(-) diff --git a/telephony/java/android/telephony/data/DataCallResponse.java b/telephony/java/android/telephony/data/DataCallResponse.java index e69040efd864b..b5c1d7d9e5f4d 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.Retention; 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 @@ public final class DataCallResponse implements Parcelable { @Nullable List dnsAddresses, @Nullable List gatewayAddresses, @Nullable List 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 addresses, - @NonNull List dnsAddresses, @NonNull List gatewayAddresses, - @NonNull List pcscfAddresses, int mtu, int mtuV4, int mtuV6, - @HandoverFailureMode int handoverFailureMode, int pduSessionId, - @Nullable Qos defaultQos, @NonNull List qosBearerSessions, - @Nullable NetworkSliceInfo sliceInfo, - @NonNull List 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 addresses, + @Nullable List dnsAddresses, @Nullable List gatewayAddresses, + @Nullable List pcscfAddresses, int mtu, int mtuV4, int mtuV6, + @HandoverFailureMode int handoverFailureMode, int pduSessionId, + @Nullable Qos defaultQos, @Nullable List qosBearerSessions, + @Nullable NetworkSliceInfo sliceInfo, + @Nullable List 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 @@ public final class DataCallResponse implements Parcelable { 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 @@ public final class DataCallResponse implements Parcelable { * @return A list of addresses of this data connection. */ @NonNull - public List getAddresses() { - return Collections.unmodifiableList(mAddresses); - } + public List 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 getDnsAddresses() { - return Collections.unmodifiableList(mDnsAddresses); - } + public List 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 getGatewayAddresses() { - return Collections.unmodifiableList(mGatewayAddresses); - } + public List getGatewayAddresses() { return mGatewayAddresses; } /** * @return A list of Proxy Call State Control Function address via PCO (Protocol Configuration * Option) for IMS client. */ @NonNull - public List getPcscfAddresses() { - return Collections.unmodifiableList(mPcscfAddresses); - } + public List getPcscfAddresses() { return mPcscfAddresses; } /** * @return MTU (maximum transmission unit) in bytes received from network. Zero or negative @@ -414,7 +404,7 @@ public final class DataCallResponse implements Parcelable { */ @NonNull public List getQosBearerSessions() { - return Collections.unmodifiableList(mQosBearerSessions); + return mQosBearerSessions; } /** @@ -430,7 +420,7 @@ public final class DataCallResponse implements Parcelable { */ @NonNull public List getTrafficDescriptors() { - return Collections.unmodifiableList(mTrafficDescriptors); + return mTrafficDescriptors; } @NonNull @@ -471,6 +461,18 @@ public final class DataCallResponse implements Parcelable { 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 @@ public final class DataCallResponse implements Parcelable { && 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 @@ public final class DataCallResponse implements Parcelable { private @ProtocolType int mProtocolType; - private String mInterfaceName = ""; + private String mInterfaceName; - private List mAddresses = Collections.emptyList(); + private List mAddresses; - private List mDnsAddresses = Collections.emptyList(); + private List mDnsAddresses; - private List mGatewayAddresses = Collections.emptyList(); + private List mGatewayAddresses; - private List mPcscfAddresses = Collections.emptyList(); + private List mPcscfAddresses; private int mMtu; @@ -612,11 +636,11 @@ public final class DataCallResponse implements Parcelable { private int mPduSessionId = PDU_SESSION_ID_NOT_SET; - private @Nullable Qos mDefaultQos; + private Qos mDefaultQos; private List mQosBearerSessions = new ArrayList<>(); - private @Nullable NetworkSliceInfo mSliceInfo; + private NetworkSliceInfo mSliceInfo; private List mTrafficDescriptors = new ArrayList<>(); @@ -702,7 +726,6 @@ public final class DataCallResponse implements Parcelable { * @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 @@ public final class DataCallResponse implements Parcelable { * @return The same instance of the builder. */ public @NonNull Builder setAddresses(@NonNull List addresses) { - Objects.requireNonNull(addresses); mAddresses = addresses; return this; } @@ -726,7 +748,6 @@ public final class DataCallResponse implements Parcelable { * @return The same instance of the builder. */ public @NonNull Builder setDnsAddresses(@NonNull List dnsAddresses) { - Objects.requireNonNull(dnsAddresses); mDnsAddresses = dnsAddresses; return this; } @@ -738,7 +759,6 @@ public final class DataCallResponse implements Parcelable { * @return The same instance of the builder. */ public @NonNull Builder setGatewayAddresses(@NonNull List gatewayAddresses) { - Objects.requireNonNull(gatewayAddresses); mGatewayAddresses = gatewayAddresses; return this; } @@ -751,7 +771,6 @@ public final class DataCallResponse implements Parcelable { * @return The same instance of the builder. */ public @NonNull Builder setPcscfAddresses(@NonNull List pcscfAddresses) { - Objects.requireNonNull(pcscfAddresses); mPcscfAddresses = pcscfAddresses; return this; }