| /* |
| * Copyright (C) 2016 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 com.android.dialer.common; |
| |
| import android.content.Context; |
| import android.content.pm.PackageManager; |
| import android.net.ConnectivityManager; |
| import android.net.NetworkInfo; |
| import android.net.wifi.WifiInfo; |
| import android.net.wifi.WifiManager; |
| import android.support.annotation.Nullable; |
| import android.support.annotation.RequiresPermission; |
| import android.support.annotation.StringDef; |
| import android.telephony.TelephonyManager; |
| import android.text.TextUtils; |
| import java.lang.annotation.Retention; |
| import java.lang.annotation.RetentionPolicy; |
| import java.util.Objects; |
| |
| /** Utility class for dealing with network */ |
| public class NetworkUtil { |
| |
| /* Returns the current network type. */ |
| @RequiresPermission("android.permission.ACCESS_NETWORK_STATE") |
| @NetworkType |
| public static String getCurrentNetworkType(@Nullable Context context) { |
| if (context == null) { |
| return NetworkType.NONE; |
| } |
| ConnectivityManager connectivityManager = |
| (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); |
| return getNetworkType(connectivityManager.getActiveNetworkInfo()); |
| } |
| |
| /* Returns the current network info. */ |
| @Nullable |
| @RequiresPermission("android.permission.ACCESS_NETWORK_STATE") |
| public static NetworkInfo getCurrentNetworkInfo(@Nullable Context context) { |
| if (context == null) { |
| return null; |
| } |
| ConnectivityManager connectivityManager = |
| (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); |
| return connectivityManager.getActiveNetworkInfo(); |
| } |
| |
| /** |
| * Returns the current network type as a string. For mobile network types the subtype name of the |
| * network is appended. |
| */ |
| @RequiresPermission("android.permission.ACCESS_NETWORK_STATE") |
| public static String getCurrentNetworkTypeName(@Nullable Context context) { |
| if (context == null) { |
| return NetworkType.NONE; |
| } |
| ConnectivityManager connectivityManager = |
| (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); |
| NetworkInfo netInfo = connectivityManager.getActiveNetworkInfo(); |
| @NetworkType String networkType = getNetworkType(netInfo); |
| if (isNetworkTypeMobile(networkType)) { |
| return networkType + " (" + netInfo.getSubtypeName() + ")"; |
| } |
| return networkType; |
| } |
| |
| @NetworkType |
| public static String getNetworkType(@Nullable NetworkInfo netInfo) { |
| if (netInfo == null || !netInfo.isConnected()) { |
| return NetworkType.NONE; |
| } |
| switch (netInfo.getType()) { |
| case ConnectivityManager.TYPE_WIFI: |
| return NetworkType.WIFI; |
| case ConnectivityManager.TYPE_MOBILE: |
| return getMobileNetworkType(netInfo.getSubtype()); |
| default: |
| return NetworkType.UNKNOWN; |
| } |
| } |
| |
| public static boolean isNetworkTypeMobile(@NetworkType String networkType) { |
| return Objects.equals(networkType, NetworkType.MOBILE_2G) |
| || Objects.equals(networkType, NetworkType.MOBILE_3G) |
| || Objects.equals(networkType, NetworkType.MOBILE_4G); |
| } |
| |
| @RequiresPermission("android.permission.ACCESS_NETWORK_STATE") |
| public static String getCurrentNetworkName(Context context) { |
| @NetworkType String networkType = getCurrentNetworkType(context); |
| switch (networkType) { |
| case NetworkType.WIFI: |
| return getWifiNetworkName(context); |
| case NetworkType.MOBILE_2G: |
| case NetworkType.MOBILE_3G: |
| case NetworkType.MOBILE_4G: |
| case NetworkType.MOBILE_UNKNOWN: |
| return getMobileNetworkName(context); |
| default: |
| return ""; |
| } |
| } |
| |
| private static String getWifiNetworkName(Context context) { |
| WifiManager wifiMgr = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); |
| String name = null; |
| if (context.checkSelfPermission("android.permission.ACCESS_WIFI_STATE") |
| == PackageManager.PERMISSION_GRANTED) { |
| //noinspection MissingPermission |
| WifiInfo wifiInfo = wifiMgr.getConnectionInfo(); |
| if (wifiInfo == null) { |
| return ""; |
| } |
| name = wifiInfo.getSSID(); |
| } |
| return TextUtils.isEmpty(name) |
| ? context.getString(R.string.network_name_wifi) |
| : name.replaceAll("\"", ""); |
| } |
| |
| private static String getMobileNetworkName(Context context) { |
| TelephonyManager telephonyMgr = |
| (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); |
| String name = telephonyMgr.getNetworkOperatorName(); |
| return TextUtils.isEmpty(name) |
| ? context.getString(R.string.network_name_mobile) |
| : name.replaceAll("\"", ""); |
| } |
| |
| @NetworkType |
| private static String getMobileNetworkType(int networkSubtype) { |
| switch (networkSubtype) { |
| case TelephonyManager.NETWORK_TYPE_1xRTT: |
| case TelephonyManager.NETWORK_TYPE_CDMA: |
| case TelephonyManager.NETWORK_TYPE_EDGE: |
| case TelephonyManager.NETWORK_TYPE_GPRS: |
| case TelephonyManager.NETWORK_TYPE_IDEN: |
| return NetworkType.MOBILE_2G; |
| case TelephonyManager.NETWORK_TYPE_EHRPD: |
| case TelephonyManager.NETWORK_TYPE_EVDO_0: |
| case TelephonyManager.NETWORK_TYPE_EVDO_A: |
| case TelephonyManager.NETWORK_TYPE_EVDO_B: |
| case TelephonyManager.NETWORK_TYPE_HSDPA: |
| case TelephonyManager.NETWORK_TYPE_HSPA: |
| case TelephonyManager.NETWORK_TYPE_HSPAP: |
| case TelephonyManager.NETWORK_TYPE_HSUPA: |
| case TelephonyManager.NETWORK_TYPE_UMTS: |
| return NetworkType.MOBILE_3G; |
| case TelephonyManager.NETWORK_TYPE_LTE: |
| return NetworkType.MOBILE_4G; |
| default: |
| return NetworkType.MOBILE_UNKNOWN; |
| } |
| } |
| |
| /** Network types. */ |
| @Retention(RetentionPolicy.SOURCE) |
| @StringDef( |
| value = { |
| NetworkType.NONE, |
| NetworkType.WIFI, |
| NetworkType.MOBILE_2G, |
| NetworkType.MOBILE_3G, |
| NetworkType.MOBILE_4G, |
| NetworkType.MOBILE_UNKNOWN, |
| NetworkType.UNKNOWN |
| } |
| ) |
| public @interface NetworkType { |
| |
| String NONE = "NONE"; |
| String WIFI = "WIFI"; |
| String MOBILE_2G = "MOBILE_2G"; |
| String MOBILE_3G = "MOBILE_3G"; |
| String MOBILE_4G = "MOBILE_4G"; |
| String MOBILE_UNKNOWN = "MOBILE_UNKNOWN"; |
| String UNKNOWN = "UNKNOWN"; |
| } |
| } |