@@ -2,7 +2,9 @@ package me.ycdev.android.lib.common.net
22
33import android.content.Context
44import android.net.ConnectivityManager
5- import android.net.NetworkInfo
5+ import android.net.Network
6+ import android.net.NetworkCapabilities
7+ import android.os.Build
68import android.telephony.TelephonyManager
79import android.text.TextUtils
810import androidx.annotation.IntDef
@@ -26,6 +28,7 @@ object NetworkUtils {
2628 const val NETWORK_TYPE_2G = 10
2729 const val NETWORK_TYPE_3G = 11
2830 const val NETWORK_TYPE_4G = 12
31+ const val NETWORK_TYPE_5G = 13
2932 const val NETWORK_TYPE_COMPANION_PROXY = 20
3033
3134 @Retention(AnnotationRetention .SOURCE )
@@ -36,40 +39,48 @@ object NetworkUtils {
3639 NETWORK_TYPE_2G ,
3740 NETWORK_TYPE_3G ,
3841 NETWORK_TYPE_4G ,
42+ NETWORK_TYPE_5G ,
3943 NETWORK_TYPE_COMPANION_PROXY
4044 )
4145 annotation class NetworkType
4246
43- @Suppress(" DEPRECATION" )
4447 @RequiresPermission(android.Manifest .permission.ACCESS_NETWORK_STATE )
4548 fun dumpActiveNetworkInfo (cxt : Context ): String {
46- val info = getActiveNetworkInfo(cxt) ? : return " No active network"
47-
48- val sb = StringBuilder ()
49- sb.append(" type=" ).append(info.type)
50- .append(" , subType=" ).append(info.subtype)
51- .append(" , infoDump=" ).append(info)
52- return sb.toString()
49+ val capabilities = getActiveNetworkCapabilities(cxt) ? : return " No active network"
50+ return capabilities.toString()
5351 }
5452
5553 @RequiresPermission(android.Manifest .permission.ACCESS_NETWORK_STATE )
56- fun getActiveNetworkInfo (cxt : Context ): NetworkInfo ? {
57- val cm = cxt.getSystemService(
58- Context .CONNECTIVITY_SERVICE
59- ) as ConnectivityManager ?
54+ fun getActiveNetwork (cxt : Context ): Network ? {
55+ val cm = cxt.getSystemService(ConnectivityManager ::class .java)
6056 if (cm == null ) {
6157 LibLogger .w(TAG , " failed to get connectivity service" )
6258 return null
6359 }
6460
65- var netInfo: NetworkInfo ? = null
6661 try {
67- netInfo = cm.activeNetworkInfo
62+ return cm.activeNetwork
6863 } catch (e: Exception ) {
69- LibLogger .w(TAG , " failed to get active network info" , e)
64+ LibLogger .w(TAG , " failed to get active network" , e)
65+ }
66+ return null
67+ }
68+
69+ @RequiresPermission(android.Manifest .permission.ACCESS_NETWORK_STATE )
70+ fun getActiveNetworkCapabilities (cxt : Context ): NetworkCapabilities ? {
71+ val cm = cxt.getSystemService(ConnectivityManager ::class .java)
72+ if (cm == null ) {
73+ LibLogger .w(TAG , " failed to get connectivity service" )
74+ return null
7075 }
7176
72- return netInfo
77+ try {
78+ val network = cm.activeNetwork ? : return null
79+ return cm.getNetworkCapabilities(network)
80+ } catch (e: Exception ) {
81+ LibLogger .w(TAG , " failed to get active network" , e)
82+ }
83+ return null
7384 }
7485
7586 /* *
@@ -79,24 +90,20 @@ object NetworkUtils {
7990 @RequiresPermission(android.Manifest .permission.ACCESS_NETWORK_STATE )
8091 @NetworkType
8192 fun getNetworkType (cxt : Context ): Int {
82- val netInfo = getActiveNetworkInfo(cxt) ? : return NETWORK_TYPE_NONE
83-
84- @Suppress(" DEPRECATION" )
85- return getNetworkType(netInfo.type, netInfo.subtype)
93+ val capabilities = getActiveNetworkCapabilities(cxt) ? : return NETWORK_TYPE_NONE
94+ return getNetworkType(capabilities)
8695 }
8796
88- @Suppress(" DEPRECATION" , " UNUSED_PARAMETER" )
8997 @NetworkType
9098 @VisibleForTesting
91- internal fun getNetworkType (type : Int , subType : Int ): Int {
92- if (type == ConnectivityManager .TYPE_WIFI ||
93- type == ConnectivityManager .TYPE_WIMAX ||
94- type == ConnectivityManager .TYPE_ETHERNET
99+ internal fun getNetworkType (capabilities : NetworkCapabilities ): Int {
100+ if (capabilities.hasTransport(NetworkCapabilities .TRANSPORT_WIFI ) ||
101+ capabilities.hasTransport(NetworkCapabilities .TRANSPORT_ETHERNET )
95102 ) {
96103 return NETWORK_TYPE_WIFI
97- } else if (type == ConnectivityManager . TYPE_MOBILE || type == ConnectivityManager . TYPE_MOBILE_MMS ) {
104+ } else if (capabilities.hasTransport( NetworkCapabilities . TRANSPORT_CELLULAR ) ) {
98105 return NETWORK_TYPE_MOBILE
99- } else if (type == WEAR_OS_COMPANION_PROXY ) {
106+ } else if (capabilities.hasTransport( NetworkCapabilities . TRANSPORT_BLUETOOTH ) ) {
100107 // Wear OS
101108 return NETWORK_TYPE_COMPANION_PROXY
102109 }
@@ -105,49 +112,66 @@ object NetworkUtils {
105112
106113 /* *
107114 * @return One of values [NETWORK_TYPE_2G], [NETWORK_TYPE_3G],
108- * [NETWORK_TYPE_4G] or [NETWORK_TYPE_NONE]
115+ * [NETWORK_TYPE_4G], [NETWORK_TYPE_5G] or [NETWORK_TYPE_NONE]
109116 */
110117 @NetworkType
111118 @RequiresPermission(android.Manifest .permission.READ_PHONE_STATE )
112119 fun getMobileNetworkType (cxt : Context ): Int {
113- // Code from android-5.1.1_r4:
114- // frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
115- // in NetworkControllerImpl#mapIconSets()
116- val tm = cxt.getSystemService(Context .TELEPHONY_SERVICE ) as TelephonyManager ?
120+ // #1 Code from android-5.1.1_r4:
121+ // frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
122+ // in NetworkControllerImpl#mapIconSets()
123+ // #2 Code from master (Android R):
124+ // frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
125+ // in MobileSignalController#mapIconSets()
126+ val tm = cxt.getSystemService(TelephonyManager ::class .java)
117127 if (tm == null ) {
118128 LibLogger .w(TAG , " failed to get telephony service" )
119129 return NETWORK_TYPE_NONE
120130 }
121131
122132 val tmType: Int
123133 try {
124- tmType = tm.networkType
134+ @Suppress(" DEPRECATION" )
135+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .N ) {
136+ tmType = tm.dataNetworkType
137+ } else {
138+ tmType = tm.networkType
139+ }
125140 } catch (e: Exception ) {
126141 LibLogger .w(TAG , " failed to get telephony network type" , e)
127142 return NETWORK_TYPE_NONE
128143 }
129144
130- when (tmType) {
131- TelephonyManager .NETWORK_TYPE_UNKNOWN -> return NETWORK_TYPE_NONE
132-
133- TelephonyManager .NETWORK_TYPE_LTE -> return NETWORK_TYPE_4G
134-
135- TelephonyManager .NETWORK_TYPE_EVDO_0 , TelephonyManager .NETWORK_TYPE_EVDO_A , TelephonyManager .NETWORK_TYPE_EVDO_B , TelephonyManager .NETWORK_TYPE_EHRPD , TelephonyManager .NETWORK_TYPE_UMTS ->
136- // case TelephonyManager.NETWORK_TYPE_TD_SCDMA:
137- return NETWORK_TYPE_3G
138-
139- TelephonyManager .NETWORK_TYPE_HSDPA , TelephonyManager .NETWORK_TYPE_HSUPA , TelephonyManager .NETWORK_TYPE_HSPA , TelephonyManager .NETWORK_TYPE_HSPAP -> return NETWORK_TYPE_3G // H
140-
141- TelephonyManager .NETWORK_TYPE_GPRS , TelephonyManager .NETWORK_TYPE_EDGE , TelephonyManager .NETWORK_TYPE_CDMA , TelephonyManager .NETWORK_TYPE_1xRTT ->
142- // case TelephonyManager.NETWORK_TYPE_GSM:
143- return NETWORK_TYPE_2G
145+ return when (tmType) {
146+ TelephonyManager .NETWORK_TYPE_UNKNOWN -> NETWORK_TYPE_NONE
147+ TelephonyManager .NETWORK_TYPE_LTE -> NETWORK_TYPE_4G
148+ TelephonyManager .NETWORK_TYPE_NR -> NETWORK_TYPE_5G
149+
150+ TelephonyManager .NETWORK_TYPE_EVDO_0 ,
151+ TelephonyManager .NETWORK_TYPE_EVDO_A ,
152+ TelephonyManager .NETWORK_TYPE_EVDO_B ,
153+ TelephonyManager .NETWORK_TYPE_EHRPD ,
154+ TelephonyManager .NETWORK_TYPE_TD_SCDMA ,
155+ TelephonyManager .NETWORK_TYPE_UMTS -> NETWORK_TYPE_3G
156+
157+ TelephonyManager .NETWORK_TYPE_HSDPA ,
158+ TelephonyManager .NETWORK_TYPE_HSUPA ,
159+ TelephonyManager .NETWORK_TYPE_HSPA ,
160+ TelephonyManager .NETWORK_TYPE_HSPAP -> NETWORK_TYPE_3G // H
161+
162+ TelephonyManager .NETWORK_TYPE_GPRS ,
163+ TelephonyManager .NETWORK_TYPE_EDGE ,
164+ TelephonyManager .NETWORK_TYPE_CDMA ,
165+ TelephonyManager .NETWORK_TYPE_GSM ,
166+ TelephonyManager .NETWORK_TYPE_1xRTT -> NETWORK_TYPE_2G
167+
168+ else -> NETWORK_TYPE_2G
144169 }
145- return NETWORK_TYPE_2G
146170 }
147171
148172 /* *
149173 * @return One of values [NETWORK_TYPE_WIFI], [NETWORK_TYPE_2G],
150- * [NETWORK_TYPE_3G], [NETWORK_TYPE_4G] or [NETWORK_TYPE_NONE]
174+ * [NETWORK_TYPE_3G], [NETWORK_TYPE_4G], [NETWORK_TYPE_5G] or [NETWORK_TYPE_NONE]
151175 */
152176 @RequiresPermission(
153177 allOf = [
@@ -169,8 +193,8 @@ object NetworkUtils {
169193 */
170194 @RequiresPermission(android.Manifest .permission.ACCESS_NETWORK_STATE )
171195 fun isNetworkAvailable (cxt : Context ): Boolean {
172- val network = getActiveNetworkInfo (cxt)
173- return network != null && network.isConnected
196+ val capabilities = getActiveNetworkCapabilities (cxt) ? : return false
197+ return capabilities.hasCapability( NetworkCapabilities . NET_CAPABILITY_INTERNET )
174198 }
175199
176200 /* *
0 commit comments