blob: 47d84243e27fe7a3c954b6d7783bced7d2ba18ec [file] [log] [blame]
/*
* 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";
}
}