NetworkIdentity.java revision d4dd7716fb825f29a609c5c4cb31204eea78183a
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 191b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport static android.net.ConnectivityManager.isNetworkTypeMobile; 201b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 211b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport android.content.Context; 2202e21d6a5b5117d494777a36783909854854f751Jeff Sharkeyimport android.os.Build; 231b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport android.telephony.TelephonyManager; 241b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 251b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport com.android.internal.util.Objects; 261b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 271b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey/** 281b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * Network definition that includes strong identity. Analogous to combining 291b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * {@link NetworkInfo} and an IMSI. 301b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * 311b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * @hide 321b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey */ 331b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeypublic class NetworkIdentity { 34d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey /** 35d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey * When enabled, combine all {@link #mSubType} together under 36d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey * {@link #SUBTYPE_COMBINED}. 37d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey */ 38d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey public static final boolean COMBINE_SUBTYPE_ENABLED = true; 39d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey 40d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey public static final int SUBTYPE_COMBINED = -1; 41d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey 421b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey final int mType; 431b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey final int mSubType; 441b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey final String mSubscriberId; 455dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey final boolean mRoaming; 461b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 475dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey public NetworkIdentity(int type, int subType, String subscriberId, boolean roaming) { 481b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey this.mType = type; 49d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey this.mSubType = COMBINE_SUBTYPE_ENABLED ? SUBTYPE_COMBINED : subType; 501b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey this.mSubscriberId = subscriberId; 515dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey this.mRoaming = roaming; 521b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 531b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 541b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey @Override 551b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public int hashCode() { 56f9a3a8d42b43adeadf41c8896f010d381f15f505Jeff Sharkey return Objects.hashCode(mType, mSubType, mSubscriberId, mRoaming); 571b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 581b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 591b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey @Override 601b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public boolean equals(Object obj) { 611b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey if (obj instanceof NetworkIdentity) { 621b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey final NetworkIdentity ident = (NetworkIdentity) obj; 63d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey return mType == ident.mType && mSubType == ident.mSubType && mRoaming == ident.mRoaming 64d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey && Objects.equal(mSubscriberId, ident.mSubscriberId); 651b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 661b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey return false; 671b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 681b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 691b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey @Override 701b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public String toString() { 711b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey final String typeName = ConnectivityManager.getNetworkTypeName(mType); 721b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey final String subTypeName; 73d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey if (COMBINE_SUBTYPE_ENABLED) { 74d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey subTypeName = "COMBINED"; 75d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey } else if (ConnectivityManager.isNetworkTypeMobile(mType)) { 761b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey subTypeName = TelephonyManager.getNetworkTypeName(mSubType); 771b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } else { 781b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey subTypeName = Integer.toString(mSubType); 791b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 801b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 8102e21d6a5b5117d494777a36783909854854f751Jeff Sharkey final String scrubSubscriberId = scrubSubscriberId(mSubscriberId); 825dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey final String roaming = mRoaming ? ", ROAMING" : ""; 831b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey return "[type=" + typeName + ", subType=" + subTypeName + ", subscriberId=" 845dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey + scrubSubscriberId + roaming + "]"; 851b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 861b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 871b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public int getType() { 881b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey return mType; 891b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 901b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 911b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public int getSubType() { 921b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey return mSubType; 931b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 941b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 951b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public String getSubscriberId() { 961b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey return mSubscriberId; 971b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 981b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 995dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey public boolean getRoaming() { 1005dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey return mRoaming; 1015dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey } 1025dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey 1031b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey /** 10402e21d6a5b5117d494777a36783909854854f751Jeff Sharkey * Scrub given IMSI on production builds. 10502e21d6a5b5117d494777a36783909854854f751Jeff Sharkey */ 10602e21d6a5b5117d494777a36783909854854f751Jeff Sharkey public static String scrubSubscriberId(String subscriberId) { 10702e21d6a5b5117d494777a36783909854854f751Jeff Sharkey if ("eng".equals(Build.TYPE)) { 10802e21d6a5b5117d494777a36783909854854f751Jeff Sharkey return subscriberId; 10902e21d6a5b5117d494777a36783909854854f751Jeff Sharkey } else { 11002e21d6a5b5117d494777a36783909854854f751Jeff Sharkey return subscriberId != null ? "valid" : "null"; 11102e21d6a5b5117d494777a36783909854854f751Jeff Sharkey } 11202e21d6a5b5117d494777a36783909854854f751Jeff Sharkey } 11302e21d6a5b5117d494777a36783909854854f751Jeff Sharkey 11402e21d6a5b5117d494777a36783909854854f751Jeff Sharkey /** 1151b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * Build a {@link NetworkIdentity} from the given {@link NetworkState}, 1161b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * assuming that any mobile networks are using the current IMSI. 1171b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey */ 1181b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public static NetworkIdentity buildNetworkIdentity(Context context, NetworkState state) { 1191b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey final int type = state.networkInfo.getType(); 1201b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey final int subType = state.networkInfo.getSubtype(); 1211b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 1221b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey // TODO: consider moving subscriberId over to LinkCapabilities, so it 1231b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey // comes from an authoritative source. 1241b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 1251b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey final String subscriberId; 1265dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey final boolean roaming; 1271b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey if (isNetworkTypeMobile(type)) { 1285dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey final TelephonyManager telephony = (TelephonyManager) context.getSystemService( 1295dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey Context.TELEPHONY_SERVICE); 1305dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey roaming = telephony.isNetworkRoaming(); 131b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey if (state.subscriberId != null) { 132b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey subscriberId = state.subscriberId; 133b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey } else { 134b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey subscriberId = telephony.getSubscriberId(); 135b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey } 1361b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } else { 1371b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey subscriberId = null; 1385dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey roaming = false; 1391b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 1405dc0c26cffbbc62ff84f9f4c8a451e68e2c05d2dJeff Sharkey return new NetworkIdentity(type, subType, subscriberId, roaming); 1411b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 1421b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey} 143