193 lines
6.6 KiB
Java
193 lines
6.6 KiB
Java
/*
|
|
* 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";
|
|
}
|
|
}
|