1e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu/** 2e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * Copyright (c) 2016, The Android Open Source Project 3e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * 4e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * Licensed under the Apache License, Version 2.0 (the "License"); 5e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * you may not use this file except in compliance with the License. 6e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * You may obtain a copy of the License at 7e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * 8e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * http://www.apache.org/licenses/LICENSE-2.0 9e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * 10e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * Unless required by applicable law or agreed to in writing, software 11e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * distributed under the License is distributed on an "AS IS" BASIS, 12e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * See the License for the specific language governing permissions and 14e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * limitations under the License. 15e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu */ 16e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu 17e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiupackage android.net.wifi.hotspot2.pps; 18e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu 19e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiuimport android.os.Parcelable; 20e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiuimport android.os.Parcel; 21e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiuimport android.text.TextUtils; 22a25d717de870895be52e81b585a8484fff0c6109Peter Qiuimport android.util.Log; 23e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu 24e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiuimport java.nio.charset.StandardCharsets; 25e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiuimport java.util.Arrays; 26e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiuimport java.util.Collections; 27e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiuimport java.util.HashMap; 28e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiuimport java.util.Map; 29ddafc73496e3bab135ac7249bfb3cf4d871e5cf2Peter Qiuimport java.util.Objects; 30e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu 31e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu/** 32e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * Class representing HomeSP subtree in PerProviderSubscription (PPS) 33e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * Management Object (MO) tree. 34e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * 35e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * For more info, refer to Hotspot 2.0 PPS MO defined in section 9.1 of the Hotspot 2.0 36e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * Release 2 Technical Specification. 37e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu */ 38da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiupublic final class HomeSp implements Parcelable { 39da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu private static final String TAG = "HomeSp"; 40a25d717de870895be52e81b585a8484fff0c6109Peter Qiu 41e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu /** 42e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * Maximum number of bytes allowed for a SSID. 43e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu */ 44e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu private static final int MAX_SSID_BYTES = 32; 45e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu 46e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu /** 47e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * Integer value used for indicating null value in the Parcel. 48e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu */ 49e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu private static final int NULL_VALUE = -1; 50e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu 51e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu /** 52e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * FQDN (Fully Qualified Domain Name) of this home service provider. 53e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu */ 54aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu private String mFqdn = null; 55e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu /** 56e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * Set the FQDN (Fully Qualified Domain Name) associated with this home service provider. 57e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * 58e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * @param fqdn The FQDN to set to 59e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu */ 60aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu public void setFqdn(String fqdn) { 61aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu mFqdn = fqdn; 62aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu } 63e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu /** 64e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * Get the FQDN (Fully Qualified Domain Name) associated with this home service provider. 65e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * 66e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * @return the FQDN associated with this home service provider 67e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu */ 68aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu public String getFqdn() { 69aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu return mFqdn; 70aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu } 71e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu 72e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu /** 73e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * Friendly name of this home service provider. 74e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu */ 75aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu private String mFriendlyName = null; 76e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu /** 77e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * Set the friendly name associated with this home service provider. 78e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * 79e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * @param friendlyName The friendly name to set to 80e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu */ 81aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu public void setFriendlyName(String friendlyName) { 82aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu mFriendlyName = friendlyName; 83aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu } 84e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu /** 85e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * Get the friendly name associated with this home service provider. 86e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * 87e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * @return the friendly name associated with this home service provider 88e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu */ 89aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu public String getFriendlyName() { 90aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu return mFriendlyName; 91aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu } 92e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu 93e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu /** 94e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * Icon URL of this home service provider. 95e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu */ 96aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu private String mIconUrl = null; 97a9f9889218ac972706830440990a59cbee685976Peter Qiu /** 98a9f9889218ac972706830440990a59cbee685976Peter Qiu * @hide 99a9f9889218ac972706830440990a59cbee685976Peter Qiu */ 100aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu public void setIconUrl(String iconUrl) { 101aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu mIconUrl = iconUrl; 102aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu } 103a9f9889218ac972706830440990a59cbee685976Peter Qiu /** 104a9f9889218ac972706830440990a59cbee685976Peter Qiu * @hide 105a9f9889218ac972706830440990a59cbee685976Peter Qiu */ 106aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu public String getIconUrl() { 107aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu return mIconUrl; 108aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu } 109e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu 110e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu /** 111e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * <SSID, HESSID> duple of the networks that are consider home networks. 112e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * 113e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * According to the Section 9.1.2 of the Hotspot 2.0 Release 2 Technical Specification, 114e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * all nodes in the PSS MO are encoded using UTF-8 unless stated otherwise. Thus, the SSID 115e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * string is assumed to be encoded using UTF-8. 116e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu */ 117aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu private Map<String, Long> mHomeNetworkIds = null; 118a9f9889218ac972706830440990a59cbee685976Peter Qiu /** 119a9f9889218ac972706830440990a59cbee685976Peter Qiu * @hide 120a9f9889218ac972706830440990a59cbee685976Peter Qiu */ 121aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu public void setHomeNetworkIds(Map<String, Long> homeNetworkIds) { 122aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu mHomeNetworkIds = homeNetworkIds; 123aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu } 124a9f9889218ac972706830440990a59cbee685976Peter Qiu /** 125a9f9889218ac972706830440990a59cbee685976Peter Qiu * @hide 126a9f9889218ac972706830440990a59cbee685976Peter Qiu */ 127aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu public Map<String, Long> getHomeNetworkIds() { 128aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu return mHomeNetworkIds; 129aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu } 130e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu 131e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu /** 132e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * Used for determining if this provider is a member of a given Hotspot provider. 133e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * Every Organization Identifiers (OIs) in this list are required to match an OI in the 134e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * the Roaming Consortium advertised by a Hotspot, in order to consider this provider 135e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * as a member of that Hotspot provider (e.g. successful authentication with such Hotspot 136e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * is possible). 137e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * 138e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * Refer to HomeSP/HomeOIList subtree in PerProviderSubscription (PPS) Management Object 139e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * (MO) tree for more detail. 140e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu */ 141da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu private long[] mMatchAllOis = null; 142a9f9889218ac972706830440990a59cbee685976Peter Qiu /** 143a9f9889218ac972706830440990a59cbee685976Peter Qiu * @hide 144a9f9889218ac972706830440990a59cbee685976Peter Qiu */ 145da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu public void setMatchAllOis(long[] matchAllOis) { 146da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu mMatchAllOis = matchAllOis; 147aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu } 148a9f9889218ac972706830440990a59cbee685976Peter Qiu /** 149a9f9889218ac972706830440990a59cbee685976Peter Qiu * @hide 150a9f9889218ac972706830440990a59cbee685976Peter Qiu */ 151da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu public long[] getMatchAllOis() { 152da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu return mMatchAllOis; 153aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu } 154e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu 155e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu /** 156e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * Used for determining if this provider is a member of a given Hotspot provider. 157e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * Matching of any Organization Identifiers (OIs) in this list with an OI in the 158e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * Roaming Consortium advertised by a Hotspot, will consider this provider as a member 159e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * of that Hotspot provider (e.g. successful authentication with such Hotspot 160e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * is possible). 161e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * 162aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu * {@link #mMatchAllOIs} will have precedence over this one, meaning this list will 163aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu * only be used for matching if {@link #mMatchAllOIs} is null or empty. 164e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * 165e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * Refer to HomeSP/HomeOIList subtree in PerProviderSubscription (PPS) Management Object 166e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * (MO) tree for more detail. 167e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu */ 168da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu private long[] mMatchAnyOis = null; 169a9f9889218ac972706830440990a59cbee685976Peter Qiu /** 170a9f9889218ac972706830440990a59cbee685976Peter Qiu * @hide 171a9f9889218ac972706830440990a59cbee685976Peter Qiu */ 172da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu public void setMatchAnyOis(long[] matchAnyOis) { 173da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu mMatchAnyOis = matchAnyOis; 174aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu } 175a9f9889218ac972706830440990a59cbee685976Peter Qiu /** 176a9f9889218ac972706830440990a59cbee685976Peter Qiu * @hide 177a9f9889218ac972706830440990a59cbee685976Peter Qiu */ 178701a4b55c92817c84a77df84234946dbaac71dbaPeter Qiu public long[] getMatchAnyOis() { 179da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu return mMatchAnyOis; 180aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu } 181e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu 182e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu /** 183e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * List of FQDN (Fully Qualified Domain Name) of partner providers. 184e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * These providers should also be regarded as home Hotspot operators. 185e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * This relationship is most likely achieved via a commercial agreement or 186e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * operator merges between the providers. 187e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu */ 188aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu private String[] mOtherHomePartners = null; 189a9f9889218ac972706830440990a59cbee685976Peter Qiu /** 190a9f9889218ac972706830440990a59cbee685976Peter Qiu * @hide 191a9f9889218ac972706830440990a59cbee685976Peter Qiu */ 192aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu public void setOtherHomePartners(String[] otherHomePartners) { 193aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu mOtherHomePartners = otherHomePartners; 194aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu } 195a9f9889218ac972706830440990a59cbee685976Peter Qiu /** 196a9f9889218ac972706830440990a59cbee685976Peter Qiu * @hide 197a9f9889218ac972706830440990a59cbee685976Peter Qiu */ 198aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu public String[] getOtherHomePartners() { 199aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu return mOtherHomePartners; 200aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu } 201e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu 202e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu /** 203e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * List of Organization Identifiers (OIs) identifying a roaming consortium of 204e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu * which this provider is a member. 205e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu */ 206da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu private long[] mRoamingConsortiumOis = null; 207e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu /** 208e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * Set the Organization Identifiers (OIs) identifying a roaming consortium of which this 209e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * provider is a member. 210e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * 211e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * @param roamingConsortiumOis Array of roaming consortium OIs 212e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu */ 213da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu public void setRoamingConsortiumOis(long[] roamingConsortiumOis) { 214da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu mRoamingConsortiumOis = roamingConsortiumOis; 215aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu } 216e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu /** 217e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * Get the Organization Identifiers (OIs) identifying a roaming consortium of which this 218e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * provider is a member. 219e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * 220e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * @return array of roaming consortium OIs 221e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu */ 222da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu public long[] getRoamingConsortiumOis() { 223da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu return mRoamingConsortiumOis; 224aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu } 225e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu 226a32e50986ef767f50e68083a8ee345bab3ce1ccaPeter Qiu /** 227da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu * Constructor for creating HomeSp with default values. 228a32e50986ef767f50e68083a8ee345bab3ce1ccaPeter Qiu */ 229da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu public HomeSp() {} 230a32e50986ef767f50e68083a8ee345bab3ce1ccaPeter Qiu 231a32e50986ef767f50e68083a8ee345bab3ce1ccaPeter Qiu /** 232a32e50986ef767f50e68083a8ee345bab3ce1ccaPeter Qiu * Copy constructor. 233a32e50986ef767f50e68083a8ee345bab3ce1ccaPeter Qiu * 234a32e50986ef767f50e68083a8ee345bab3ce1ccaPeter Qiu * @param source The source to copy from 235a32e50986ef767f50e68083a8ee345bab3ce1ccaPeter Qiu */ 236da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu public HomeSp(HomeSp source) { 237e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu if (source == null) { 238e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu return; 239e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu } 240aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu mFqdn = source.mFqdn; 241aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu mFriendlyName = source.mFriendlyName; 242aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu mIconUrl = source.mIconUrl; 243aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu if (source.mHomeNetworkIds != null) { 244aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu mHomeNetworkIds = Collections.unmodifiableMap(source.mHomeNetworkIds); 245e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu } 246da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu if (source.mMatchAllOis != null) { 247da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu mMatchAllOis = Arrays.copyOf(source.mMatchAllOis, source.mMatchAllOis.length); 248e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu } 249da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu if (source.mMatchAnyOis != null) { 250da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu mMatchAnyOis = Arrays.copyOf(source.mMatchAnyOis, source.mMatchAnyOis.length); 251e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu } 252aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu if (source.mOtherHomePartners != null) { 253aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu mOtherHomePartners = Arrays.copyOf(source.mOtherHomePartners, 254aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu source.mOtherHomePartners.length); 255e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu } 256da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu if (source.mRoamingConsortiumOis != null) { 257da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu mRoamingConsortiumOis = Arrays.copyOf(source.mRoamingConsortiumOis, 258da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu source.mRoamingConsortiumOis.length); 259a32e50986ef767f50e68083a8ee345bab3ce1ccaPeter Qiu } 260a32e50986ef767f50e68083a8ee345bab3ce1ccaPeter Qiu } 261a32e50986ef767f50e68083a8ee345bab3ce1ccaPeter Qiu 262e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu @Override 263e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu public int describeContents() { 264e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu return 0; 265e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu } 266e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu 267e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu @Override 268e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu public void writeToParcel(Parcel dest, int flags) { 269aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu dest.writeString(mFqdn); 270aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu dest.writeString(mFriendlyName); 271aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu dest.writeString(mIconUrl); 272aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu writeHomeNetworkIds(dest, mHomeNetworkIds); 273da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu dest.writeLongArray(mMatchAllOis); 274da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu dest.writeLongArray(mMatchAnyOis); 275aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu dest.writeStringArray(mOtherHomePartners); 276da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu dest.writeLongArray(mRoamingConsortiumOis); 277e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu } 278e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu 279e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu @Override 280e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu public boolean equals(Object thatObject) { 281e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu if (this == thatObject) { 282e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu return true; 283e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu } 284da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu if (!(thatObject instanceof HomeSp)) { 285e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu return false; 286e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu } 287da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu HomeSp that = (HomeSp) thatObject; 288e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu 289aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu return TextUtils.equals(mFqdn, that.mFqdn) 290aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu && TextUtils.equals(mFriendlyName, that.mFriendlyName) 291aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu && TextUtils.equals(mIconUrl, that.mIconUrl) 292aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu && (mHomeNetworkIds == null ? that.mHomeNetworkIds == null 293aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu : mHomeNetworkIds.equals(that.mHomeNetworkIds)) 294da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu && Arrays.equals(mMatchAllOis, that.mMatchAllOis) 295da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu && Arrays.equals(mMatchAnyOis, that.mMatchAnyOis) 296aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu && Arrays.equals(mOtherHomePartners, that.mOtherHomePartners) 297da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu && Arrays.equals(mRoamingConsortiumOis, that.mRoamingConsortiumOis); 298e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu } 299e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu 300ddafc73496e3bab135ac7249bfb3cf4d871e5cf2Peter Qiu @Override 301ddafc73496e3bab135ac7249bfb3cf4d871e5cf2Peter Qiu public int hashCode() { 302da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu return Objects.hash(mFqdn, mFriendlyName, mIconUrl, mHomeNetworkIds, mMatchAllOis, 303da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu mMatchAnyOis, mOtherHomePartners, mRoamingConsortiumOis); 304ddafc73496e3bab135ac7249bfb3cf4d871e5cf2Peter Qiu } 305ddafc73496e3bab135ac7249bfb3cf4d871e5cf2Peter Qiu 30689537734e19fac6947ee14a1b912c5c135042837Peter Qiu @Override 30789537734e19fac6947ee14a1b912c5c135042837Peter Qiu public String toString() { 30889537734e19fac6947ee14a1b912c5c135042837Peter Qiu StringBuilder builder = new StringBuilder(); 30989537734e19fac6947ee14a1b912c5c135042837Peter Qiu builder.append("FQDN: ").append(mFqdn).append("\n"); 31089537734e19fac6947ee14a1b912c5c135042837Peter Qiu builder.append("FriendlyName: ").append(mFriendlyName).append("\n"); 31189537734e19fac6947ee14a1b912c5c135042837Peter Qiu builder.append("IconURL: ").append(mIconUrl).append("\n"); 31289537734e19fac6947ee14a1b912c5c135042837Peter Qiu builder.append("HomeNetworkIDs: ").append(mHomeNetworkIds).append("\n"); 31389537734e19fac6947ee14a1b912c5c135042837Peter Qiu builder.append("MatchAllOIs: ").append(mMatchAllOis).append("\n"); 31489537734e19fac6947ee14a1b912c5c135042837Peter Qiu builder.append("MatchAnyOIs: ").append(mMatchAnyOis).append("\n"); 31589537734e19fac6947ee14a1b912c5c135042837Peter Qiu builder.append("OtherHomePartners: ").append(mOtherHomePartners).append("\n"); 31689537734e19fac6947ee14a1b912c5c135042837Peter Qiu builder.append("RoamingConsortiumOIs: ").append(mRoamingConsortiumOis).append("\n"); 31789537734e19fac6947ee14a1b912c5c135042837Peter Qiu return builder.toString(); 31889537734e19fac6947ee14a1b912c5c135042837Peter Qiu } 31989537734e19fac6947ee14a1b912c5c135042837Peter Qiu 320a25d717de870895be52e81b585a8484fff0c6109Peter Qiu /** 321da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu * Validate HomeSp data. 322a25d717de870895be52e81b585a8484fff0c6109Peter Qiu * 323a25d717de870895be52e81b585a8484fff0c6109Peter Qiu * @return true on success or false on failure 324b5ca6f36b54023f6336740cf3bff79c08ecb6609Peter Qiu * @hide 325a25d717de870895be52e81b585a8484fff0c6109Peter Qiu */ 326a25d717de870895be52e81b585a8484fff0c6109Peter Qiu public boolean validate() { 327aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu if (TextUtils.isEmpty(mFqdn)) { 328a25d717de870895be52e81b585a8484fff0c6109Peter Qiu Log.d(TAG, "Missing FQDN"); 329a25d717de870895be52e81b585a8484fff0c6109Peter Qiu return false; 330a25d717de870895be52e81b585a8484fff0c6109Peter Qiu } 331aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu if (TextUtils.isEmpty(mFriendlyName)) { 332a25d717de870895be52e81b585a8484fff0c6109Peter Qiu Log.d(TAG, "Missing friendly name"); 333a25d717de870895be52e81b585a8484fff0c6109Peter Qiu return false; 334a25d717de870895be52e81b585a8484fff0c6109Peter Qiu } 335e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu // Verify SSIDs specified in the NetworkID 336aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu if (mHomeNetworkIds != null) { 337aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu for (Map.Entry<String, Long> entry : mHomeNetworkIds.entrySet()) { 338e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu if (entry.getKey() == null || 339e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu entry.getKey().getBytes(StandardCharsets.UTF_8).length > MAX_SSID_BYTES) { 340e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu Log.d(TAG, "Invalid SSID in HomeNetworkIDs"); 341e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu return false; 342e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu } 343e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu } 344e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu } 345a25d717de870895be52e81b585a8484fff0c6109Peter Qiu return true; 346a25d717de870895be52e81b585a8484fff0c6109Peter Qiu } 347a25d717de870895be52e81b585a8484fff0c6109Peter Qiu 348da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu public static final Creator<HomeSp> CREATOR = 349da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu new Creator<HomeSp>() { 350e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu @Override 351da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu public HomeSp createFromParcel(Parcel in) { 352da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu HomeSp homeSp = new HomeSp(); 353aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu homeSp.setFqdn(in.readString()); 354aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu homeSp.setFriendlyName(in.readString()); 355aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu homeSp.setIconUrl(in.readString()); 356aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu homeSp.setHomeNetworkIds(readHomeNetworkIds(in)); 357da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu homeSp.setMatchAllOis(in.createLongArray()); 358da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu homeSp.setMatchAnyOis(in.createLongArray()); 359aef5b6095f58028d51e7007e7daebeac4bb2af72Peter Qiu homeSp.setOtherHomePartners(in.createStringArray()); 360da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu homeSp.setRoamingConsortiumOis(in.createLongArray()); 361e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu return homeSp; 362e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu } 363e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu 364e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu @Override 365da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu public HomeSp[] newArray(int size) { 366da8a67e8a606ebd49a724a18d3581b62121b532cPeter Qiu return new HomeSp[size]; 367e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu } 368e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu 369e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu /** 370e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * Helper function for reading a Home Network IDs map from a Parcel. 371e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * 372e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * @param in The Parcel to read from 373e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * @return Map of home network IDs 374e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu */ 375e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu private Map<String, Long> readHomeNetworkIds(Parcel in) { 376e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu int size = in.readInt(); 377e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu if (size == NULL_VALUE) { 378e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu return null; 379e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu } 380e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu Map<String, Long> networkIds = new HashMap<>(size); 381e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu for (int i = 0; i < size; i++) { 382e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu String key = in.readString(); 383e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu Long value = null; 384e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu long readValue = in.readLong(); 385e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu if (readValue != NULL_VALUE) { 386e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu value = Long.valueOf(readValue); 387e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu } 388e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu networkIds.put(key, value); 389e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu } 390e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu return networkIds; 391e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu } 392e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu }; 393e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu 394e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu /** 395e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * Helper function for writing Home Network IDs map to a Parcel. 396e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * 397e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * @param dest The Parcel to write to 398e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu * @param networkIds The map of home network IDs 399e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu */ 400e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu private static void writeHomeNetworkIds(Parcel dest, Map<String, Long> networkIds) { 401e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu if (networkIds == null) { 402e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu dest.writeInt(NULL_VALUE); 403e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu return; 404e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu } 405e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu dest.writeInt(networkIds.size()); 406e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu for (Map.Entry<String, Long> entry : networkIds.entrySet()) { 407e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu dest.writeString(entry.getKey()); 408e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu if (entry.getValue() == null) { 409e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu dest.writeLong(NULL_VALUE); 410e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu } else { 411e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu dest.writeLong(entry.getValue()); 412e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu } 413e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu } 414e6e7baa600518800a68a5fc0ba49915406765d06Peter Qiu } 415e557c35d95a8d05c58a592d4c34db69a1dd2c1a7Peter Qiu} 416