11d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvistpackage com.android.server.wifi.hotspot2.pps; 21d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 31d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvistimport com.android.server.wifi.hotspot2.Utils; 41d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvistimport com.android.server.wifi.hotspot2.omadm.OMAException; 51d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvistimport com.android.server.wifi.hotspot2.omadm.OMANode; 62e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager; 71d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 81d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvistimport java.util.ArrayList; 91d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvistimport java.util.HashMap; 101d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvistimport java.util.List; 111d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvistimport java.util.Map; 121d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 132e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_Country; 142e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_DLBandwidth; 152e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_FQDN_Match; 162e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_IPProtocol; 172e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_MaximumBSSLoadValue; 182e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_MinBackhaulThreshold; 192e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_NetworkType; 202e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_PolicyUpdate; 212e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_PortNumber; 222e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_PreferredRoamingPartnerList; 232e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_Priority; 242e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_RequiredProtoPortTuple; 252e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_SPExclusionList; 262e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_SSID; 272e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_ULBandwidth; 281d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 291d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvistpublic class Policy { 301d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final List<PreferredRoamingPartner> mPreferredRoamingPartners; 311d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final List<MinBackhaul> mMinBackhaulThresholds; 321d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final UpdateInfo mPolicyUpdate; 331d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final List<String> mSPExclusionList; 341d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final Map<Integer, List<Integer>> mRequiredProtos; 351d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final int mMaxBSSLoad; 361d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 371d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist public Policy(OMANode node) throws OMAException { 381d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 391d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist OMANode rpNode = node.getChild(TAG_PreferredRoamingPartnerList); 401d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist if (rpNode == null) { 411d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mPreferredRoamingPartners = null; 421d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 431d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist else { 441d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mPreferredRoamingPartners = new ArrayList<>(rpNode.getChildren().size()); 451d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist for (OMANode instance : rpNode.getChildren()) { 461d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist if (instance.isLeaf()) { 471d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist throw new OMAException("Not expecting leaf node in " + 481d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist TAG_PreferredRoamingPartnerList); 491d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 501d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mPreferredRoamingPartners.add(new PreferredRoamingPartner(instance)); 511d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 521d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 531d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 541d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist OMANode bhtNode = node.getChild(TAG_MinBackhaulThreshold); 551d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist if (bhtNode == null) { 561d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mMinBackhaulThresholds = null; 571d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 581d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist else { 591d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mMinBackhaulThresholds = new ArrayList<>(bhtNode.getChildren().size()); 601d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist for (OMANode instance : bhtNode.getChildren()) { 611d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist if (instance.isLeaf()) { 621d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist throw new OMAException("Not expecting leaf node in " + 631d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist TAG_MinBackhaulThreshold); 641d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 651d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mMinBackhaulThresholds.add(new MinBackhaul(instance)); 661d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 671d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 681d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 691d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mPolicyUpdate = new UpdateInfo(node.getChild(TAG_PolicyUpdate)); 701d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 711d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist OMANode sxNode = node.getChild(TAG_SPExclusionList); 721d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist if (sxNode == null) { 731d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mSPExclusionList = null; 741d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 751d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist else { 761d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mSPExclusionList = new ArrayList<>(sxNode.getChildren().size()); 771d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist for (OMANode instance : sxNode.getChildren()) { 781d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist if (instance.isLeaf()) { 791d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist throw new OMAException("Not expecting leaf node in " + TAG_SPExclusionList); 801d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 812e814680f4dd27a5f825afab189843582235cedcJan Nordqvist mSPExclusionList 822e814680f4dd27a5f825afab189843582235cedcJan Nordqvist .add(PasspointManagementObjectManager.getString(instance, TAG_SSID)); 831d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 841d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 851d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 861d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist OMANode rptNode = node.getChild(TAG_RequiredProtoPortTuple); 871d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist if (rptNode == null) { 881d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mRequiredProtos = null; 891d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 901d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist else { 911d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mRequiredProtos = new HashMap<>(rptNode.getChildren().size()); 921d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist for (OMANode instance : rptNode.getChildren()) { 931d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist if (instance.isLeaf()) { 941d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist throw new OMAException("Not expecting leaf node in " + 951d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist TAG_RequiredProtoPortTuple); 961d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 972e814680f4dd27a5f825afab189843582235cedcJan Nordqvist int protocol = 982e814680f4dd27a5f825afab189843582235cedcJan Nordqvist (int) PasspointManagementObjectManager 992e814680f4dd27a5f825afab189843582235cedcJan Nordqvist .getLong(instance, TAG_IPProtocol, null); 1002e814680f4dd27a5f825afab189843582235cedcJan Nordqvist String[] portSegments = 1012e814680f4dd27a5f825afab189843582235cedcJan Nordqvist PasspointManagementObjectManager 1022e814680f4dd27a5f825afab189843582235cedcJan Nordqvist .getString(instance, TAG_PortNumber).split(","); 1031d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist List<Integer> ports = new ArrayList<>(portSegments.length); 1041d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist for (String portSegment : portSegments) { 1051d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist try { 1061d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ports.add(Integer.parseInt(portSegment)); 1071d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1081d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist catch (NumberFormatException nfe) { 1091d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist throw new OMAException("Port is not a number: " + portSegment); 1101d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1111d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1121d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mRequiredProtos.put(protocol, ports); 1131d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1141d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1151d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1162e814680f4dd27a5f825afab189843582235cedcJan Nordqvist mMaxBSSLoad = (int) PasspointManagementObjectManager.getLong(node, 1172e814680f4dd27a5f825afab189843582235cedcJan Nordqvist TAG_MaximumBSSLoadValue, Long.MAX_VALUE); 1181d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1191d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1201d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist public List<PreferredRoamingPartner> getPreferredRoamingPartners() { 1211d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist return mPreferredRoamingPartners; 1221d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1231d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1241d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist public List<MinBackhaul> getMinBackhaulThresholds() { 1251d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist return mMinBackhaulThresholds; 1261d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1271d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1281d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist public UpdateInfo getPolicyUpdate() { 1291d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist return mPolicyUpdate; 1301d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1311d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1321d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist public List<String> getSPExclusionList() { 1331d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist return mSPExclusionList; 1341d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1351d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1361d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist public Map<Integer, List<Integer>> getRequiredProtos() { 1371d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist return mRequiredProtos; 1381d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1391d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1401d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist public int getMaxBSSLoad() { 1411d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist return mMaxBSSLoad; 1421d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1431d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1441d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private static class PreferredRoamingPartner { 1451d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final List<String> mDomain; 1461d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final Boolean mIncludeSubDomains; 1471d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final int mPriority; 1481d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final String mCountry; 1491d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1501d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private PreferredRoamingPartner(OMANode node) 1511d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist throws OMAException { 1521d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1532e814680f4dd27a5f825afab189843582235cedcJan Nordqvist String[] segments = 1542e814680f4dd27a5f825afab189843582235cedcJan Nordqvist PasspointManagementObjectManager.getString(node, TAG_FQDN_Match).split(","); 1551d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist if (segments.length != 2) { 1561d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist throw new OMAException("Bad FQDN match string: " + TAG_FQDN_Match); 1571d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1581d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist mDomain = Utils.splitDomain(segments[0]); 1592e814680f4dd27a5f825afab189843582235cedcJan Nordqvist mIncludeSubDomains = 1602e814680f4dd27a5f825afab189843582235cedcJan Nordqvist PasspointManagementObjectManager.getSelection(TAG_FQDN_Match, segments[1]); 1612e814680f4dd27a5f825afab189843582235cedcJan Nordqvist mPriority = (int) PasspointManagementObjectManager.getLong(node, TAG_Priority, null); 1622e814680f4dd27a5f825afab189843582235cedcJan Nordqvist mCountry = PasspointManagementObjectManager.getString(node, TAG_Country); 1631d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1641d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1651d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist @Override 1661d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist public String toString() { 1671d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist return "PreferredRoamingPartner{" + 1681d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist "domain=" + mDomain + 1691d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", includeSubDomains=" + mIncludeSubDomains + 1701d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", priority=" + mPriority + 1711d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", country='" + mCountry + '\'' + 1721d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist '}'; 1731d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1741d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1751d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1761d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private static class MinBackhaul { 1771d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final Boolean mHome; 1781d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final long mDL; 1791d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private final long mUL; 1801d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1811d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist private MinBackhaul(OMANode node) throws OMAException { 1822e814680f4dd27a5f825afab189843582235cedcJan Nordqvist mHome = PasspointManagementObjectManager.getSelection(node, TAG_NetworkType); 1832e814680f4dd27a5f825afab189843582235cedcJan Nordqvist mDL = PasspointManagementObjectManager.getLong(node, TAG_DLBandwidth, Long.MAX_VALUE); 1842e814680f4dd27a5f825afab189843582235cedcJan Nordqvist mUL = PasspointManagementObjectManager.getLong(node, TAG_ULBandwidth, Long.MAX_VALUE); 1851d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1861d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1871d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist @Override 1881d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist public String toString() { 1891d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist return "MinBackhaul{" + 1901d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist "home=" + mHome + 1911d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", DL=" + mDL + 1921d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", UL=" + mUL + 1931d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist '}'; 1941d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1951d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 1961d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist 1971d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist @Override 1981d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist public String toString() { 1991d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist return "Policy{" + 2001d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist "preferredRoamingPartners=" + mPreferredRoamingPartners + 2011d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", minBackhaulThresholds=" + mMinBackhaulThresholds + 2021d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", policyUpdate=" + mPolicyUpdate + 2031d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", SPExclusionList=" + mSPExclusionList + 2041d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", requiredProtos=" + mRequiredProtos + 2051d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist ", maxBSSLoad=" + mMaxBSSLoad + 2061d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist '}'; 2071d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 2081d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist} 209