| /* |
| * Copyright (C) 2011 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package android.net; |
| |
| import static android.net.ConnectivityManager.isNetworkTypeMobile; |
| |
| import android.content.Context; |
| import android.telephony.TelephonyManager; |
| |
| import com.android.internal.util.Objects; |
| |
| /** |
| * Network definition that includes strong identity. Analogous to combining |
| * {@link NetworkInfo} and an IMSI. |
| * |
| * @hide |
| */ |
| public class NetworkIdentity { |
| final int mType; |
| final int mSubType; |
| final String mSubscriberId; |
| final boolean mRoaming; |
| |
| public NetworkIdentity(int type, int subType, String subscriberId, boolean roaming) { |
| this.mType = type; |
| this.mSubType = subType; |
| this.mSubscriberId = subscriberId; |
| this.mRoaming = roaming; |
| } |
| |
| @Override |
| public int hashCode() { |
| return Objects.hashCode(mType, mSubType, mSubscriberId); |
| } |
| |
| @Override |
| public boolean equals(Object obj) { |
| if (obj instanceof NetworkIdentity) { |
| final NetworkIdentity ident = (NetworkIdentity) obj; |
| return mType == ident.mType && mSubType == ident.mSubType |
| && Objects.equal(mSubscriberId, ident.mSubscriberId) |
| && mRoaming == ident.mRoaming; |
| } |
| return false; |
| } |
| |
| @Override |
| public String toString() { |
| final String typeName = ConnectivityManager.getNetworkTypeName(mType); |
| final String subTypeName; |
| if (ConnectivityManager.isNetworkTypeMobile(mType)) { |
| subTypeName = TelephonyManager.getNetworkTypeName(mSubType); |
| } else { |
| subTypeName = Integer.toString(mSubType); |
| } |
| |
| final String scrubSubscriberId = mSubscriberId != null ? "valid" : "null"; |
| final String roaming = mRoaming ? ", ROAMING" : ""; |
| return "[type=" + typeName + ", subType=" + subTypeName + ", subscriberId=" |
| + scrubSubscriberId + roaming + "]"; |
| } |
| |
| public int getType() { |
| return mType; |
| } |
| |
| public int getSubType() { |
| return mSubType; |
| } |
| |
| public String getSubscriberId() { |
| return mSubscriberId; |
| } |
| |
| public boolean getRoaming() { |
| return mRoaming; |
| } |
| |
| /** |
| * Build a {@link NetworkIdentity} from the given {@link NetworkState}, |
| * assuming that any mobile networks are using the current IMSI. |
| */ |
| public static NetworkIdentity buildNetworkIdentity(Context context, NetworkState state) { |
| final int type = state.networkInfo.getType(); |
| final int subType = state.networkInfo.getSubtype(); |
| |
| // TODO: consider moving subscriberId over to LinkCapabilities, so it |
| // comes from an authoritative source. |
| |
| final String subscriberId; |
| final boolean roaming; |
| if (isNetworkTypeMobile(type)) { |
| final TelephonyManager telephony = (TelephonyManager) context.getSystemService( |
| Context.TELEPHONY_SERVICE); |
| roaming = telephony.isNetworkRoaming(); |
| if (state.subscriberId != null) { |
| subscriberId = state.subscriberId; |
| } else { |
| subscriberId = telephony.getSubscriberId(); |
| } |
| } else { |
| subscriberId = null; |
| roaming = false; |
| } |
| return new NetworkIdentity(type, subType, subscriberId, roaming); |
| } |
| |
| } |