diff --git a/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/MviViewModel.kt b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/MviViewModel.kt index 71ef368..d3df82c 100644 --- a/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/MviViewModel.kt +++ b/mvi-arch/src/main/java/ru/touchin/roboswag/mvi_arch/core/MviViewModel.kt @@ -39,7 +39,7 @@ abstract class MviViewModel NetworkType.MOBILE_2G + TelephonyManager.NETWORK_TYPE_UMTS, + TelephonyManager.NETWORK_TYPE_EVDO_0, + TelephonyManager.NETWORK_TYPE_EVDO_A, + TelephonyManager.NETWORK_TYPE_HSDPA, + TelephonyManager.NETWORK_TYPE_HSUPA, + TelephonyManager.NETWORK_TYPE_HSPA, + TelephonyManager.NETWORK_TYPE_EVDO_B, + TelephonyManager.NETWORK_TYPE_EHRPD, + TelephonyManager.NETWORK_TYPE_HSPAP -> NetworkType.MOBILE_3G + TelephonyManager.NETWORK_TYPE_LTE, + 19 -> NetworkType.MOBILE_LTE + TelephonyManager.NETWORK_TYPE_UNKNOWN -> NetworkType.UNKNOWN + else -> NetworkType.UNKNOWN + } + + /** + * Available network types. + */ + enum class NetworkType(val networkName: String) { + /** + * Mobile 2G network. + */ + MOBILE_2G("2g"), + + /** + * Mobile 3G network. + */ + MOBILE_3G("3g"), + + /** + * Mobile LTE network. + */ + MOBILE_LTE("lte"), + + /** + * Wi-Fi network. + */ + WI_FI("Wi-Fi"), + + /** + * Unknown network type. + */ + UNKNOWN("unknown"), + + /** + * No network. + */ + NONE("none"); + + /** + * @return Network type readable name. + */ + + } +} diff --git a/utils/src/main/java/ru/touchin/templates/DeviceUtilsExtensions.kt b/utils/src/main/java/ru/touchin/templates/DeviceUtilsExtensions.kt new file mode 100644 index 0000000..ef213a9 --- /dev/null +++ b/utils/src/main/java/ru/touchin/templates/DeviceUtilsExtensions.kt @@ -0,0 +1,46 @@ +package ru.touchin.templates + +import android.Manifest +import android.annotation.SuppressLint +import android.content.Context +import android.content.pm.PackageManager +import android.hardware.biometrics.BiometricManager +import android.net.ConnectivityManager +import android.os.Build +import android.os.Process +import androidx.annotation.RequiresApi +import androidx.annotation.RequiresPermission +import androidx.core.hardware.fingerprint.FingerprintManagerCompat +import ru.touchin.templates.DeviceUtils.NetworkType +import ru.touchin.templates.DeviceUtils.getMobileNetworkType + +fun Context.isNetworkConnected(): Boolean = getNetworkType() != NetworkType.NONE + +fun Context.getNetworkType(): NetworkType { + if (checkPermission(Manifest.permission.ACCESS_NETWORK_STATE, Process.myPid(), Process.myUid()) + != PackageManager.PERMISSION_GRANTED) { + return NetworkType.UNKNOWN + } + val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager? + ?: return NetworkType.UNKNOWN + @SuppressLint("MissingPermission") val info = cm.activeNetworkInfo + return if (info == null || !info.isConnected) { + NetworkType.NONE + } else when (info.type) { + ConnectivityManager.TYPE_WIFI -> NetworkType.WI_FI + ConnectivityManager.TYPE_MOBILE -> getMobileNetworkType(info) + else -> NetworkType.UNKNOWN + } +} + +@RequiresApi(Build.VERSION_CODES.M) +@Suppress("InlinedApi") +@RequiresPermission(anyOf = [Manifest.permission.USE_FINGERPRINT, Manifest.permission.USE_BIOMETRIC]) +fun Context.canAuthenticateWithBiometrics(): Boolean = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + val fingerprintManagerCompat = FingerprintManagerCompat.from(this) + fingerprintManagerCompat.hasEnrolledFingerprints() && fingerprintManagerCompat.isHardwareDetected +} else { + getSystemService(BiometricManager::class.java)?.let { biometricManager -> + biometricManager.canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS + } ?: false +}