Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aef5b609 authored by Peter Qiu's avatar Peter Qiu
Browse files

hotspot2: update PasspointConfiguration APIs

Based on the API guideline, use of public variables are discouraged.
So update PasspointConfiguration and its associated classes to use
private variables with public accessor methods.

While there, cleanup unit tests to reduce code duplications.

Bug: 34627062
Test: frameworks/base/wifi/tests/runtests.sh
Change-Id: I6ea45bbcf03aec01c187425a66094fad6098d75d
parent c74d60a6
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -175,7 +175,7 @@ public final class ConfigBuilder {
        }

        // Credential is needed for storing the certificates and private client key.
        if (config.credential == null) {
        if (config.getCredential() == null) {
            throw new IOException("Passpoint profile missing credential");
        }

@@ -183,7 +183,7 @@ public final class ConfigBuilder {
        byte[] caCertData = mimeParts.get(TYPE_CA_CERT);
        if (caCertData != null) {
            try {
                config.credential.caCertificate = parseCACert(caCertData);
                config.getCredential().setCaCertificate(parseCACert(caCertData));
            } catch (CertificateException e) {
                throw new IOException("Failed to parse CA Certificate");
            }
@@ -194,9 +194,9 @@ public final class ConfigBuilder {
        if (pkcs12Data != null) {
            try {
                Pair<PrivateKey, List<X509Certificate>> clientKey = parsePkcs12(pkcs12Data);
                config.credential.clientPrivateKey = clientKey.first;
                config.credential.clientCertificateChain =
                        clientKey.second.toArray(new X509Certificate[clientKey.second.size()]);
                config.getCredential().setClientPrivateKey(clientKey.first);
                config.getCredential().setClientCertificateChain(
                        clientKey.second.toArray(new X509Certificate[clientKey.second.size()]));
            } catch(GeneralSecurityException | IOException e) {
                throw new IOException("Failed to parse PCKS12 string");
            }
+174 −84
Original line number Diff line number Diff line
@@ -58,21 +58,58 @@ public final class PasspointConfiguration implements Parcelable {
     */
    private static final int NULL_VALUE = -1;

    public HomeSP homeSp = null;
    public Credential credential = null;
    public Policy policy = null;
    /**
     * Configurations under HomeSP subtree.
     */
    private HomeSP mHomeSp = null;
    public void setHomeSp(HomeSP homeSp) { mHomeSp = homeSp; }
    public HomeSP getHomeSp() { return mHomeSp; }

    /**
     * Configurations under Credential subtree.
     */
    private Credential mCredential = null;
    public void setCredential(Credential credential) {
        mCredential = credential;
    }
    public Credential getCredential() {
        return mCredential;
    }

    /**
     * Configurations under Policy subtree.
     */
    private Policy mPolicy = null;
    public void setPolicy(Policy policy) {
        mPolicy = policy;
    }
    public Policy getPolicy() {
        return mPolicy;
    }

    /**
     * Meta data for performing subscription update.
     */
    public UpdateParameter subscriptionUpdate = null;
    private UpdateParameter mSubscriptionUpdate = null;
    public void setSubscriptionUpdate(UpdateParameter subscriptionUpdate) {
        mSubscriptionUpdate = subscriptionUpdate;
    }
    public UpdateParameter getSubscriptionUpdate() {
        return mSubscriptionUpdate;
    }

    /**
     * List of HTTPS URL for retrieving trust root certificate and the corresponding SHA-256
     * fingerprint of the certificate.  The certificates are used for verifying AAA server's
     * identity during EAP authentication.
     */
    public Map<String, byte[]> trustRootCertList = null;
    private Map<String, byte[]> mTrustRootCertList = null;
    public void setTrustRootCertList(Map<String, byte[]> trustRootCertList) {
        mTrustRootCertList = trustRootCertList;
    }
    public Map<String, byte[]> getTrustRootCertList() {
        return mTrustRootCertList;
    }

    /**
     * Set by the subscription server, updated every time the configuration is updated by
@@ -80,14 +117,26 @@ public final class PasspointConfiguration implements Parcelable {
     *
     * Use Integer.MIN_VALUE to indicate unset value.
     */
    public int updateIdentifier = Integer.MIN_VALUE;
    private int mUpdateIdentifier = Integer.MIN_VALUE;
    public void setUpdateIdentifier(int updateIdentifier) {
        mUpdateIdentifier = updateIdentifier;
    }
    public int getUpdateIdentififer() {
        return mUpdateIdentifier;
    }

    /**
     * The priority of the credential.
     *
     * Use Integer.MIN_VALUE to indicate unset value.
     */
    public int credentialPriority = Integer.MIN_VALUE;
    private int mCredentialPriority = Integer.MIN_VALUE;
    public void setCredentialPriority(int credentialPriority) {
        mCredentialPriority = credentialPriority;
    }
    public int getCredentialPriority() {
        return mCredentialPriority;
    }

    /**
     * The time this subscription is created. It is in the format of number
@@ -95,7 +144,13 @@ public final class PasspointConfiguration implements Parcelable {
     *
     * Use Long.MIN_VALUE to indicate unset value.
     */
    public long subscriptionCreationTimeInMs = Long.MIN_VALUE;
    private long mSubscriptionCreationTimeInMs = Long.MIN_VALUE;
    public void setSubscriptionCreationTimeInMs(long subscriptionCreationTimeInMs) {
        mSubscriptionCreationTimeInMs = subscriptionCreationTimeInMs;
    }
    public long getSubscriptionCreationTimeInMs() {
        return mSubscriptionCreationTimeInMs;
    }

    /**
     * The time this subscription will expire. It is in the format of number
@@ -103,20 +158,38 @@ public final class PasspointConfiguration implements Parcelable {
     *
     * Use Long.MIN_VALUE to indicate unset value.
     */
    public long subscriptionExpirationTimeInMs = Long.MIN_VALUE;
    private long mSubscriptionExpirationTimeInMs = Long.MIN_VALUE;
    public void setSubscriptionExpirationTimeInMs(long subscriptionExpirationTimeInMs) {
        mSubscriptionExpirationTimeInMs = subscriptionExpirationTimeInMs;
    }
    public long getSubscriptionExpirationTimeInMs() {
        return mSubscriptionExpirationTimeInMs;
    }

    /**
     * The type of the subscription.  This is defined by the provider and the value is provider
     * specific.
     */
    public String subscriptionType = null;
    private String mSubscriptionType = null;
    public void setSubscriptionType(String subscriptionType) {
        mSubscriptionType = subscriptionType;
    }
    public String getSubscriptionType() {
        return mSubscriptionType;
    }

    /**
     * The time period for usage statistics accumulation. A value of zero means that usage
     * statistics are not accumulated on a periodic basis (e.g., a one-time limit for
     * “pay as you go” - PAYG service). A non-zero value specifies the usage interval in minutes.
     */
    public long usageLimitUsageTimePeriodInMinutes = Long.MIN_VALUE;
    private long mUsageLimitUsageTimePeriodInMinutes = Long.MIN_VALUE;
    public void setUsageLimitUsageTimePeriodInMinutes(long usageLimitUsageTimePeriodInMinutes) {
        mUsageLimitUsageTimePeriodInMinutes = usageLimitUsageTimePeriodInMinutes;
    }
    public long getUsageLimitUsageTimePeriodInMinutes() {
        return mUsageLimitUsageTimePeriodInMinutes;
    }

    /**
     * The time at which usage statistic accumulation  begins.  It is in the format of number
@@ -124,7 +197,13 @@ public final class PasspointConfiguration implements Parcelable {
     *
     * Use Long.MIN_VALUE to indicate unset value.
     */
    public long usageLimitStartTimeInMs = Long.MIN_VALUE;
    private long mUsageLimitStartTimeInMs = Long.MIN_VALUE;
    public void setUsageLimitStartTimeInMs(long usageLimitStartTimeInMs) {
        mUsageLimitStartTimeInMs = usageLimitStartTimeInMs;
    }
    public long getUsageLimitStartTimeInMs() {
        return mUsageLimitStartTimeInMs;
    }

    /**
     * The cumulative data limit in megabytes for the {@link #usageLimitUsageTimePeriodInMinutes}.
@@ -132,14 +211,25 @@ public final class PasspointConfiguration implements Parcelable {
     *
     * Use Long.MIN_VALUE to indicate unset value.
     */
    public long usageLimitDataLimit = Long.MIN_VALUE;
    private long mUsageLimitDataLimit = Long.MIN_VALUE;
    public void setUsageLimitDataLimit(long usageLimitDataLimit) {
        mUsageLimitDataLimit = usageLimitDataLimit;
    }
    public long getUsageLimitDataLimit() {
        return mUsageLimitDataLimit;
    }

    /**
     * The cumulative time limit in minutes for the {@link #usageLimitUsageTimePeriodInMinutes}.
     * A value of zero indicate unlimited time usage.
     */
    public long usageLimitTimeLimitInMinutes = Long.MIN_VALUE;

    private long mUsageLimitTimeLimitInMinutes = Long.MIN_VALUE;
    public void setUsageLimitTimeLimitInMinutes(long usageLimitTimeLimitInMinutes) {
        mUsageLimitTimeLimitInMinutes = usageLimitTimeLimitInMinutes;
    }
    public long getUsageLimitTimeLimitInMinutes() {
        return mUsageLimitTimeLimitInMinutes;
    }

    /**
     * Constructor for creating PasspointConfiguration with default values.
@@ -156,30 +246,30 @@ public final class PasspointConfiguration implements Parcelable {
            return;
        }

        if (source.homeSp != null) {
            homeSp = new HomeSP(source.homeSp);
        if (source.mHomeSp != null) {
            mHomeSp = new HomeSP(source.mHomeSp);
        }
        if (source.credential != null) {
            credential = new Credential(source.credential);
        if (source.mCredential != null) {
            mCredential = new Credential(source.mCredential);
        }
        if (source.policy != null) {
            policy = new Policy(source.policy);
        if (source.mPolicy != null) {
            mPolicy = new Policy(source.mPolicy);
        }
        if (source.trustRootCertList != null) {
            trustRootCertList = Collections.unmodifiableMap(source.trustRootCertList);
        if (source.mTrustRootCertList != null) {
            mTrustRootCertList = Collections.unmodifiableMap(source.mTrustRootCertList);
        }
        if (source.subscriptionUpdate != null) {
            subscriptionUpdate = new UpdateParameter(source.subscriptionUpdate);
        if (source.mSubscriptionUpdate != null) {
            mSubscriptionUpdate = new UpdateParameter(source.mSubscriptionUpdate);
        }
        updateIdentifier = source.updateIdentifier;
        credentialPriority = source.credentialPriority;
        subscriptionCreationTimeInMs = source.subscriptionCreationTimeInMs;
        subscriptionExpirationTimeInMs = source.subscriptionExpirationTimeInMs;
        subscriptionType = source.subscriptionType;
        usageLimitDataLimit = source.usageLimitDataLimit;
        usageLimitStartTimeInMs = source.usageLimitStartTimeInMs;
        usageLimitTimeLimitInMinutes = source.usageLimitTimeLimitInMinutes;
        usageLimitUsageTimePeriodInMinutes = source.usageLimitUsageTimePeriodInMinutes;
        mUpdateIdentifier = source.mUpdateIdentifier;
        mCredentialPriority = source.mCredentialPriority;
        mSubscriptionCreationTimeInMs = source.mSubscriptionCreationTimeInMs;
        mSubscriptionExpirationTimeInMs = source.mSubscriptionExpirationTimeInMs;
        mSubscriptionType = source.mSubscriptionType;
        mUsageLimitDataLimit = source.mUsageLimitDataLimit;
        mUsageLimitStartTimeInMs = source.mUsageLimitStartTimeInMs;
        mUsageLimitTimeLimitInMinutes = source.mUsageLimitTimeLimitInMinutes;
        mUsageLimitUsageTimePeriodInMinutes = source.mUsageLimitUsageTimePeriodInMinutes;
    }

    @Override
@@ -189,20 +279,20 @@ public final class PasspointConfiguration implements Parcelable {

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeParcelable(homeSp, flags);
        dest.writeParcelable(credential, flags);
        dest.writeParcelable(policy, flags);
        dest.writeParcelable(subscriptionUpdate, flags);
        writeTrustRootCerts(dest, trustRootCertList);
        dest.writeInt(updateIdentifier);
        dest.writeInt(credentialPriority);
        dest.writeLong(subscriptionCreationTimeInMs);
        dest.writeLong(subscriptionExpirationTimeInMs);
        dest.writeString(subscriptionType);
        dest.writeLong(usageLimitUsageTimePeriodInMinutes);
        dest.writeLong(usageLimitStartTimeInMs);
        dest.writeLong(usageLimitDataLimit);
        dest.writeLong(usageLimitTimeLimitInMinutes);
        dest.writeParcelable(mHomeSp, flags);
        dest.writeParcelable(mCredential, flags);
        dest.writeParcelable(mPolicy, flags);
        dest.writeParcelable(mSubscriptionUpdate, flags);
        writeTrustRootCerts(dest, mTrustRootCertList);
        dest.writeInt(mUpdateIdentifier);
        dest.writeInt(mCredentialPriority);
        dest.writeLong(mSubscriptionCreationTimeInMs);
        dest.writeLong(mSubscriptionExpirationTimeInMs);
        dest.writeString(mSubscriptionType);
        dest.writeLong(mUsageLimitUsageTimePeriodInMinutes);
        dest.writeLong(mUsageLimitStartTimeInMs);
        dest.writeLong(mUsageLimitDataLimit);
        dest.writeLong(mUsageLimitTimeLimitInMinutes);
    }

    @Override
@@ -214,22 +304,22 @@ public final class PasspointConfiguration implements Parcelable {
            return false;
        }
        PasspointConfiguration that = (PasspointConfiguration) thatObject;
        return (homeSp == null ? that.homeSp == null : homeSp.equals(that.homeSp))
                && (credential == null ? that.credential == null
                        : credential.equals(that.credential))
                && (policy == null ? that.policy == null : policy.equals(that.policy))
                && (subscriptionUpdate == null ? that.subscriptionUpdate == null
                        : subscriptionUpdate.equals(that.subscriptionUpdate))
                && isTrustRootCertListEquals(trustRootCertList, that.trustRootCertList)
                && updateIdentifier == that.updateIdentifier
                && credentialPriority == that.credentialPriority
                && subscriptionCreationTimeInMs == that.subscriptionCreationTimeInMs
                && subscriptionExpirationTimeInMs == that.subscriptionExpirationTimeInMs
                && TextUtils.equals(subscriptionType, that.subscriptionType)
                && usageLimitUsageTimePeriodInMinutes == that.usageLimitUsageTimePeriodInMinutes
                && usageLimitStartTimeInMs == that.usageLimitStartTimeInMs
                && usageLimitDataLimit == that.usageLimitDataLimit
                && usageLimitTimeLimitInMinutes == that .usageLimitTimeLimitInMinutes;
        return (mHomeSp == null ? that.mHomeSp == null : mHomeSp.equals(that.mHomeSp))
                && (mCredential == null ? that.mCredential == null
                        : mCredential.equals(that.mCredential))
                && (mPolicy == null ? that.mPolicy == null : mPolicy.equals(that.mPolicy))
                && (mSubscriptionUpdate == null ? that.mSubscriptionUpdate == null
                        : mSubscriptionUpdate.equals(that.mSubscriptionUpdate))
                && isTrustRootCertListEquals(mTrustRootCertList, that.mTrustRootCertList)
                && mUpdateIdentifier == that.mUpdateIdentifier
                && mCredentialPriority == that.mCredentialPriority
                && mSubscriptionCreationTimeInMs == that.mSubscriptionCreationTimeInMs
                && mSubscriptionExpirationTimeInMs == that.mSubscriptionExpirationTimeInMs
                && TextUtils.equals(mSubscriptionType, that.mSubscriptionType)
                && mUsageLimitUsageTimePeriodInMinutes == that.mUsageLimitUsageTimePeriodInMinutes
                && mUsageLimitStartTimeInMs == that.mUsageLimitStartTimeInMs
                && mUsageLimitDataLimit == that.mUsageLimitDataLimit
                && mUsageLimitTimeLimitInMinutes == that.mUsageLimitTimeLimitInMinutes;
    }

    /**
@@ -238,20 +328,20 @@ public final class PasspointConfiguration implements Parcelable {
     * @return true on success or false on failure
     */
    public boolean validate() {
        if (homeSp == null || !homeSp.validate()) {
        if (mHomeSp == null || !mHomeSp.validate()) {
            return false;
        }
        if (credential == null || !credential.validate()) {
        if (mCredential == null || !mCredential.validate()) {
            return false;
        }
        if (policy != null && !policy.validate()) {
        if (mPolicy != null && !mPolicy.validate()) {
            return false;
        }
        if (subscriptionUpdate != null && !subscriptionUpdate.validate()) {
        if (mSubscriptionUpdate != null && !mSubscriptionUpdate.validate()) {
            return false;
        }
        if (trustRootCertList != null) {
            for (Map.Entry<String, byte[]> entry : trustRootCertList.entrySet()) {
        if (mTrustRootCertList != null) {
            for (Map.Entry<String, byte[]> entry : mTrustRootCertList.entrySet()) {
                String url = entry.getKey();
                byte[] certFingerprint = entry.getValue();
                if (TextUtils.isEmpty(url)) {
@@ -283,20 +373,20 @@ public final class PasspointConfiguration implements Parcelable {
            @Override
            public PasspointConfiguration createFromParcel(Parcel in) {
                PasspointConfiguration config = new PasspointConfiguration();
                config.homeSp = in.readParcelable(null);
                config.credential = in.readParcelable(null);
                config.policy = in.readParcelable(null);
                config.subscriptionUpdate = in.readParcelable(null);
                config.trustRootCertList = readTrustRootCerts(in);
                config.updateIdentifier = in.readInt();
                config.credentialPriority = in.readInt();
                config.subscriptionCreationTimeInMs = in.readLong();
                config.subscriptionExpirationTimeInMs = in.readLong();
                config.subscriptionType = in.readString();
                config.usageLimitUsageTimePeriodInMinutes = in.readLong();
                config.usageLimitStartTimeInMs = in.readLong();
                config.usageLimitDataLimit = in.readLong();
                config.usageLimitTimeLimitInMinutes = in.readLong();
                config.setHomeSp(in.readParcelable(null));
                config.setCredential(in.readParcelable(null));
                config.setPolicy(in.readParcelable(null));
                config.setSubscriptionUpdate(in.readParcelable(null));
                config.setTrustRootCertList(readTrustRootCerts(in));
                config.setUpdateIdentifier(in.readInt());
                config.setCredentialPriority(in.readInt());
                config.setSubscriptionCreationTimeInMs(in.readLong());
                config.setSubscriptionExpirationTimeInMs(in.readLong());
                config.setSubscriptionType(in.readString());
                config.setUsageLimitUsageTimePeriodInMinutes(in.readLong());
                config.setUsageLimitStartTimeInMs(in.readLong());
                config.setUsageLimitDataLimit(in.readLong());
                config.setUsageLimitTimeLimitInMinutes(in.readLong());
                return config;
            }

+65 −65

File changed.

Preview size limit exceeded, changes collapsed.

+286 −160

File changed.

Preview size limit exceeded, changes collapsed.

+102 −54
Original line number Diff line number Diff line
@@ -52,17 +52,35 @@ public final class HomeSP implements Parcelable {
    /**
     * FQDN (Fully Qualified Domain Name) of this home service provider.
     */
    public String fqdn = null;
    private String mFqdn = null;
    public void setFqdn(String fqdn) {
        mFqdn = fqdn;
    }
    public String getFqdn() {
        return mFqdn;
    }

    /**
     * Friendly name of this home service provider.
     */
    public String friendlyName = null;
    private String mFriendlyName = null;
    public void setFriendlyName(String friendlyName) {
        mFriendlyName = friendlyName;
    }
    public String getFriendlyName() {
        return mFriendlyName;
    }

    /**
     * Icon URL of this home service provider.
     */
    public String iconUrl = null;
    private String mIconUrl = null;
    public void setIconUrl(String iconUrl) {
        mIconUrl = iconUrl;
    }
    public String getIconUrl() {
        return mIconUrl;
    }

    /**
     * <SSID, HESSID> duple of the networks that are consider home networks.
@@ -71,7 +89,13 @@ public final class HomeSP implements Parcelable {
     * all nodes in the PSS MO are encoded using UTF-8 unless stated otherwise.  Thus, the SSID
     * string is assumed to be encoded using UTF-8.
     */
    public Map<String, Long> homeNetworkIds = null;
    private Map<String, Long> mHomeNetworkIds = null;
    public void setHomeNetworkIds(Map<String, Long> homeNetworkIds) {
        mHomeNetworkIds = homeNetworkIds;
    }
    public Map<String, Long> getHomeNetworkIds() {
        return mHomeNetworkIds;
    }

    /**
     * Used for determining if this provider is a member of a given Hotspot provider.
@@ -83,7 +107,13 @@ public final class HomeSP implements Parcelable {
     * Refer to HomeSP/HomeOIList subtree in PerProviderSubscription (PPS) Management Object
     * (MO) tree for more detail.
     */
    public long[] matchAllOIs = null;
    private long[] mMatchAllOIs = null;
    public void setMatchAllOIs(long[] matchAllOIs) {
        mMatchAllOIs = matchAllOIs;
    }
    public long[] getMatchAllOIs() {
        return mMatchAllOIs;
    }

    /**
     * Used for determining if this provider is a member of a given Hotspot provider.
@@ -92,13 +122,19 @@ public final class HomeSP implements Parcelable {
     * of that Hotspot provider (e.g. successful authentication with such Hotspot
     * is possible).
     *
     * {@link #matchAllOIs} will have precedence over this one, meaning this list will
     * only be used for matching if {@link #matchAllOIs} is null or empty.
     * {@link #mMatchAllOIs} will have precedence over this one, meaning this list will
     * only be used for matching if {@link #mMatchAllOIs} is null or empty.
     *
     * Refer to HomeSP/HomeOIList subtree in PerProviderSubscription (PPS) Management Object
     * (MO) tree for more detail.
     */
    public long[] matchAnyOIs = null;
    private long[] mMatchAnyOIs = null;
    public void setMatchAnyOIs(long[] matchAnyOIs) {
        mMatchAnyOIs = matchAnyOIs;
    }
    public long[] getMatchAnysOIs() {
        return mMatchAnyOIs;
    }

    /**
     * List of FQDN (Fully Qualified Domain Name) of partner providers.
@@ -106,13 +142,25 @@ public final class HomeSP implements Parcelable {
     * This relationship is most likely achieved via a commercial agreement or
     * operator merges between the providers.
     */
    public String[] otherHomePartners = null;
    private String[] mOtherHomePartners = null;
    public void setOtherHomePartners(String[] otherHomePartners) {
        mOtherHomePartners = otherHomePartners;
    }
    public String[] getOtherHomePartners() {
        return mOtherHomePartners;
    }

    /**
     * List of Organization Identifiers (OIs) identifying a roaming consortium of
     * which this provider is a member.
     */
    public long[] roamingConsortiumOIs = null;
    private long[] mRoamingConsortiumOIs = null;
    public void setRoamingConsortiumOIs(long[] roamingConsortiumOIs) {
        mRoamingConsortiumOIs = roamingConsortiumOIs;
    }
    public long[] getRoamingConsortiumOIs() {
        return mRoamingConsortiumOIs;
    }

    /**
     * Constructor for creating HomeSP with default values.
@@ -128,25 +176,25 @@ public final class HomeSP implements Parcelable {
        if (source == null) {
            return;
        }
        fqdn = source.fqdn;
        friendlyName = source.friendlyName;
        iconUrl = source.iconUrl;
        if (source.homeNetworkIds != null) {
            homeNetworkIds = Collections.unmodifiableMap(source.homeNetworkIds);
        mFqdn = source.mFqdn;
        mFriendlyName = source.mFriendlyName;
        mIconUrl = source.mIconUrl;
        if (source.mHomeNetworkIds != null) {
            mHomeNetworkIds = Collections.unmodifiableMap(source.mHomeNetworkIds);
        }
        if (source.matchAllOIs != null) {
            matchAllOIs = Arrays.copyOf(source.matchAllOIs, source.matchAllOIs.length);
        if (source.mMatchAllOIs != null) {
            mMatchAllOIs = Arrays.copyOf(source.mMatchAllOIs, source.mMatchAllOIs.length);
        }
        if (source.matchAnyOIs != null) {
            matchAnyOIs = Arrays.copyOf(source.matchAnyOIs, source.matchAnyOIs.length);
        if (source.mMatchAnyOIs != null) {
            mMatchAnyOIs = Arrays.copyOf(source.mMatchAnyOIs, source.mMatchAnyOIs.length);
        }
        if (source.otherHomePartners != null) {
            otherHomePartners = Arrays.copyOf(source.otherHomePartners,
                    source.otherHomePartners.length);
        if (source.mOtherHomePartners != null) {
            mOtherHomePartners = Arrays.copyOf(source.mOtherHomePartners,
                    source.mOtherHomePartners.length);
        }
        if (source.roamingConsortiumOIs != null) {
            roamingConsortiumOIs = Arrays.copyOf(source.roamingConsortiumOIs,
                    source.roamingConsortiumOIs.length);
        if (source.mRoamingConsortiumOIs != null) {
            mRoamingConsortiumOIs = Arrays.copyOf(source.mRoamingConsortiumOIs,
                    source.mRoamingConsortiumOIs.length);
        }
    }

@@ -157,14 +205,14 @@ public final class HomeSP implements Parcelable {

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(fqdn);
        dest.writeString(friendlyName);
        dest.writeString(iconUrl);
        writeHomeNetworkIds(dest, homeNetworkIds);
        dest.writeLongArray(matchAllOIs);
        dest.writeLongArray(matchAnyOIs);
        dest.writeStringArray(otherHomePartners);
        dest.writeLongArray(roamingConsortiumOIs);
        dest.writeString(mFqdn);
        dest.writeString(mFriendlyName);
        dest.writeString(mIconUrl);
        writeHomeNetworkIds(dest, mHomeNetworkIds);
        dest.writeLongArray(mMatchAllOIs);
        dest.writeLongArray(mMatchAnyOIs);
        dest.writeStringArray(mOtherHomePartners);
        dest.writeLongArray(mRoamingConsortiumOIs);
    }

    @Override
@@ -177,15 +225,15 @@ public final class HomeSP implements Parcelable {
        }
        HomeSP that = (HomeSP) thatObject;

        return TextUtils.equals(fqdn, that.fqdn)
                && TextUtils.equals(friendlyName, that.friendlyName)
                && TextUtils.equals(iconUrl, that.iconUrl)
                && (homeNetworkIds == null ? that.homeNetworkIds == null
                        : homeNetworkIds.equals(that.homeNetworkIds))
                && Arrays.equals(matchAllOIs, that.matchAllOIs)
                && Arrays.equals(matchAnyOIs, that.matchAnyOIs)
                && Arrays.equals(otherHomePartners, that.otherHomePartners)
                && Arrays.equals(roamingConsortiumOIs, that.roamingConsortiumOIs);
        return TextUtils.equals(mFqdn, that.mFqdn)
                && TextUtils.equals(mFriendlyName, that.mFriendlyName)
                && TextUtils.equals(mIconUrl, that.mIconUrl)
                && (mHomeNetworkIds == null ? that.mHomeNetworkIds == null
                        : mHomeNetworkIds.equals(that.mHomeNetworkIds))
                && Arrays.equals(mMatchAllOIs, that.mMatchAllOIs)
                && Arrays.equals(mMatchAnyOIs, that.mMatchAnyOIs)
                && Arrays.equals(mOtherHomePartners, that.mOtherHomePartners)
                && Arrays.equals(mRoamingConsortiumOIs, that.mRoamingConsortiumOIs);
    }

    /**
@@ -194,17 +242,17 @@ public final class HomeSP implements Parcelable {
     * @return true on success or false on failure
     */
    public boolean validate() {
        if (TextUtils.isEmpty(fqdn)) {
        if (TextUtils.isEmpty(mFqdn)) {
            Log.d(TAG, "Missing FQDN");
            return false;
        }
        if (TextUtils.isEmpty(friendlyName)) {
        if (TextUtils.isEmpty(mFriendlyName)) {
            Log.d(TAG, "Missing friendly name");
            return false;
        }
        // Verify SSIDs specified in the NetworkID
        if (homeNetworkIds != null) {
            for (Map.Entry<String, Long> entry : homeNetworkIds.entrySet()) {
        if (mHomeNetworkIds != null) {
            for (Map.Entry<String, Long> entry : mHomeNetworkIds.entrySet()) {
                if (entry.getKey() == null ||
                        entry.getKey().getBytes(StandardCharsets.UTF_8).length > MAX_SSID_BYTES) {
                    Log.d(TAG, "Invalid SSID in HomeNetworkIDs");
@@ -220,14 +268,14 @@ public final class HomeSP implements Parcelable {
            @Override
            public HomeSP createFromParcel(Parcel in) {
                HomeSP homeSp = new HomeSP();
                homeSp.fqdn = in.readString();
                homeSp.friendlyName = in.readString();
                homeSp.iconUrl = in.readString();
                homeSp.homeNetworkIds = readHomeNetworkIds(in);
                homeSp.matchAllOIs = in.createLongArray();
                homeSp.matchAnyOIs = in.createLongArray();
                homeSp.otherHomePartners = in.createStringArray();
                homeSp.roamingConsortiumOIs = in.createLongArray();
                homeSp.setFqdn(in.readString());
                homeSp.setFriendlyName(in.readString());
                homeSp.setIconUrl(in.readString());
                homeSp.setHomeNetworkIds(readHomeNetworkIds(in));
                homeSp.setMatchAllOIs(in.createLongArray());
                homeSp.setMatchAnyOIs(in.createLongArray());
                homeSp.setOtherHomePartners(in.createStringArray());
                homeSp.setRoamingConsortiumOIs(in.createLongArray());
                return homeSp;
            }

Loading