11b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey/* 21b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * Copyright (C) 2011 The Android Open Source Project 31b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * 41b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 51b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * you may not use this file except in compliance with the License. 61b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * You may obtain a copy of the License at 71b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * 81b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 91b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * 101b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * Unless required by applicable law or agreed to in writing, software 111b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 121b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * See the License for the specific language governing permissions and 141b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * limitations under the License. 151b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey */ 161b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 171b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeypackage android.net; 181b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 198fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkeyimport static android.net.ConnectivityManager.TYPE_WIFI; 208fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkeyimport static android.net.ConnectivityManager.getNetworkTypeName; 211b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport static android.net.ConnectivityManager.isNetworkTypeMobile; 221b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 231b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport android.content.Context; 248fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkeyimport android.net.wifi.WifiInfo; 258fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkeyimport android.net.wifi.WifiManager; 2602e21d6a5b5117d494777a36783909854854f751Jeff Sharkeyimport android.os.Build; 271b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport android.telephony.TelephonyManager; 281b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 291b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport com.android.internal.util.Objects; 301b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 311b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey/** 321b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * Network definition that includes strong identity. Analogous to combining 331b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * {@link NetworkInfo} and an IMSI. 341b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * 351b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * @hide 361b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey */ 371b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeypublic class NetworkIdentity { 38d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey /** 39d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey * When enabled, combine all {@link #mSubType} together under 40d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey * {@link #SUBTYPE_COMBINED}. 41d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey */ 42d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey public static final boolean COMBINE_SUBTYPE_ENABLED = true; 43d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey 44d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey public static final int SUBTYPE_COMBINED = -1; 45d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey 461b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey final int mType; 471b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey final int mSubType; 481b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey final String mSubscriberId; 498fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey final String mNetworkId; 505dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey final boolean mRoaming; 511b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 528fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey public NetworkIdentity( 538fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey int type, int subType, String subscriberId, String networkId, boolean roaming) { 548fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey mType = type; 558fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey mSubType = COMBINE_SUBTYPE_ENABLED ? SUBTYPE_COMBINED : subType; 568fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey mSubscriberId = subscriberId; 578fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey mNetworkId = networkId; 588fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey mRoaming = roaming; 591b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 601b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 611b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey @Override 621b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public int hashCode() { 638fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey return Objects.hashCode(mType, mSubType, mSubscriberId, mNetworkId, mRoaming); 641b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 651b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 661b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey @Override 671b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public boolean equals(Object obj) { 681b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey if (obj instanceof NetworkIdentity) { 691b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey final NetworkIdentity ident = (NetworkIdentity) obj; 70d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey return mType == ident.mType && mSubType == ident.mSubType && mRoaming == ident.mRoaming 718fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey && Objects.equal(mSubscriberId, ident.mSubscriberId) 728fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey && Objects.equal(mNetworkId, ident.mNetworkId); 731b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 741b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey return false; 751b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 761b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 771b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey @Override 781b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public String toString() { 798fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey final StringBuilder builder = new StringBuilder("["); 808fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey builder.append("type=").append(getNetworkTypeName(mType)); 818fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey builder.append(", subType="); 82d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey if (COMBINE_SUBTYPE_ENABLED) { 838fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey builder.append("COMBINED"); 84d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey } else if (ConnectivityManager.isNetworkTypeMobile(mType)) { 858fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey builder.append(TelephonyManager.getNetworkTypeName(mSubType)); 861b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } else { 878fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey builder.append(mSubType); 881b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 898fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey if (mSubscriberId != null) { 908fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey builder.append(", subscriberId=").append(scrubSubscriberId(mSubscriberId)); 918fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey } 928fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey if (mNetworkId != null) { 938fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey builder.append(", networkId=").append(mNetworkId); 948fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey } 958fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey if (mRoaming) { 968fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey builder.append(", ROAMING"); 978fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey } 988fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey return builder.append("]").toString(); 991b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 1001b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 1011b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public int getType() { 1021b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey return mType; 1031b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 1041b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 1051b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public int getSubType() { 1061b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey return mSubType; 1071b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 1081b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 1091b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public String getSubscriberId() { 1101b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey return mSubscriberId; 1111b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 1121b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 1138fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey public String getNetworkId() { 1148fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey return mNetworkId; 1158fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey } 1168fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey 1175dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey public boolean getRoaming() { 1185dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey return mRoaming; 1195dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey } 1205dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey 1211b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey /** 12202e21d6a5b5117d494777a36783909854854f751Jeff Sharkey * Scrub given IMSI on production builds. 12302e21d6a5b5117d494777a36783909854854f751Jeff Sharkey */ 12402e21d6a5b5117d494777a36783909854854f751Jeff Sharkey public static String scrubSubscriberId(String subscriberId) { 12502e21d6a5b5117d494777a36783909854854f751Jeff Sharkey if ("eng".equals(Build.TYPE)) { 12602e21d6a5b5117d494777a36783909854854f751Jeff Sharkey return subscriberId; 1278fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey } else if (subscriberId != null) { 1288fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey // TODO: parse this as MCC+MNC instead of hard-coding 1298fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey return subscriberId.substring(0, Math.min(6, subscriberId.length())) + "..."; 13002e21d6a5b5117d494777a36783909854854f751Jeff Sharkey } else { 1318fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey return "null"; 13202e21d6a5b5117d494777a36783909854854f751Jeff Sharkey } 13302e21d6a5b5117d494777a36783909854854f751Jeff Sharkey } 13402e21d6a5b5117d494777a36783909854854f751Jeff Sharkey 13502e21d6a5b5117d494777a36783909854854f751Jeff Sharkey /** 1361b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * Build a {@link NetworkIdentity} from the given {@link NetworkState}, 1371b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * assuming that any mobile networks are using the current IMSI. 1381b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey */ 1391b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public static NetworkIdentity buildNetworkIdentity(Context context, NetworkState state) { 1401b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey final int type = state.networkInfo.getType(); 1411b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey final int subType = state.networkInfo.getSubtype(); 1421b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 1431b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey // TODO: consider moving subscriberId over to LinkCapabilities, so it 1441b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey // comes from an authoritative source. 1451b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 1468fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey String subscriberId = null; 1478fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey String networkId = null; 1488fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey boolean roaming = false; 1498fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey 1501b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey if (isNetworkTypeMobile(type)) { 1515dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey final TelephonyManager telephony = (TelephonyManager) context.getSystemService( 1525dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey Context.TELEPHONY_SERVICE); 1535dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey roaming = telephony.isNetworkRoaming(); 154b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey if (state.subscriberId != null) { 155b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey subscriberId = state.subscriberId; 156b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey } else { 157b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey subscriberId = telephony.getSubscriberId(); 158b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey } 1598fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey 1608fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey } else if (type == TYPE_WIFI) { 161e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey if (state.networkId != null) { 162e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey networkId = state.networkId; 163e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey } else { 164e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey final WifiManager wifi = (WifiManager) context.getSystemService( 165e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey Context.WIFI_SERVICE); 166e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey final WifiInfo info = wifi.getConnectionInfo(); 167e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey networkId = info != null ? info.getSSID() : null; 168e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey } 1691b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 1708fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey 1718fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey return new NetworkIdentity(type, subType, subscriberId, networkId, roaming); 1721b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 1731b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey} 174