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