11package com.appcontrolx.domain
22
3+ import android.Manifest
34import android.app.ActivityManager
45import android.app.usage.StorageStatsManager
56import android.content.Context
@@ -18,6 +19,7 @@ import android.os.SystemClock
1819import android.os.storage.StorageManager
1920import android.telephony.TelephonyManager
2021import android.view.WindowManager
22+ import androidx.core.content.ContextCompat
2123import com.appcontrolx.model.*
2224import dagger.hilt.android.qualifiers.ApplicationContext
2325import java.io.File
@@ -516,16 +518,32 @@ class SystemMonitor @Inject constructor(
516518 private fun getNetworkStats (): NetworkStats {
517519 return try {
518520 val connectivityManager = context.getSystemService(Context .CONNECTIVITY_SERVICE ) as ConnectivityManager
521+ val hasNetworkStatePermission = ContextCompat .checkSelfPermission(
522+ context,
523+ Manifest .permission.ACCESS_NETWORK_STATE
524+ ) == PackageManager .PERMISSION_GRANTED
525+ val hasWifiStatePermission = ContextCompat .checkSelfPermission(
526+ context,
527+ Manifest .permission.ACCESS_WIFI_STATE
528+ ) == PackageManager .PERMISSION_GRANTED
529+ val hasReadPhoneStatePermission = ContextCompat .checkSelfPermission(
530+ context,
531+ Manifest .permission.READ_PHONE_STATE
532+ ) == PackageManager .PERMISSION_GRANTED
519533
520534 // Check permissions for WifiManager and TelephonyManager access
521535 // If we don't handle this, it crashes on restricted devices
522536 val wifiStats = try {
523- val wifiManager = context.applicationContext.getSystemService(Context .WIFI_SERVICE ) as WifiManager
524- val network = connectivityManager.activeNetwork
525- val capabilities = network?.let { connectivityManager.getNetworkCapabilities(it) }
526- val wifiConnected = capabilities?.hasTransport(NetworkCapabilities .TRANSPORT_WIFI ) == true
537+ val wifiConnected = if (hasNetworkStatePermission) {
538+ val network = connectivityManager.activeNetwork
539+ val capabilities = network?.let { connectivityManager.getNetworkCapabilities(it) }
540+ capabilities?.hasTransport(NetworkCapabilities .TRANSPORT_WIFI ) == true
541+ } else {
542+ false
543+ }
527544
528- if (wifiConnected) {
545+ if (wifiConnected && hasWifiStatePermission) {
546+ val wifiManager = context.applicationContext.getSystemService(Context .WIFI_SERVICE ) as WifiManager
529547 @Suppress(" DEPRECATION" )
530548 val wifiInfo = wifiManager.connectionInfo
531549 val ssid = wifiInfo.ssid?.replace(" \" " , " " ) ? : " Unknown"
@@ -554,24 +572,36 @@ class SystemMonitor @Inject constructor(
554572
555573 val (mobileConnected, mobileType, simPresent) = try {
556574 val telephonyManager = context.getSystemService(Context .TELEPHONY_SERVICE ) as TelephonyManager
557- val network = connectivityManager.activeNetwork
558- val capabilities = network?.let { connectivityManager.getNetworkCapabilities(it) }
559- val mobConnected = capabilities?.hasTransport(NetworkCapabilities .TRANSPORT_CELLULAR ) == true
575+ val mobConnected = if (hasNetworkStatePermission) {
576+ val network = connectivityManager.activeNetwork
577+ val capabilities = network?.let { connectivityManager.getNetworkCapabilities(it) }
578+ capabilities?.hasTransport(NetworkCapabilities .TRANSPORT_CELLULAR ) == true
579+ } else {
580+ false
581+ }
560582
561583 val type = if (mobConnected) {
562- @Suppress(" DEPRECATION" )
563- when (telephonyManager.networkType) {
564- TelephonyManager .NETWORK_TYPE_LTE -> " LTE"
565- TelephonyManager .NETWORK_TYPE_NR -> " 5G"
566- TelephonyManager .NETWORK_TYPE_HSPAP -> " HSPA+"
567- TelephonyManager .NETWORK_TYPE_HSPA -> " HSPA"
568- TelephonyManager .NETWORK_TYPE_EDGE -> " EDGE"
569- TelephonyManager .NETWORK_TYPE_GPRS -> " GPRS"
570- else -> " Mobile"
584+ if (hasReadPhoneStatePermission) {
585+ @Suppress(" DEPRECATION" )
586+ when (telephonyManager.networkType) {
587+ TelephonyManager .NETWORK_TYPE_LTE -> " LTE"
588+ TelephonyManager .NETWORK_TYPE_NR -> " 5G"
589+ TelephonyManager .NETWORK_TYPE_HSPAP -> " HSPA+"
590+ TelephonyManager .NETWORK_TYPE_HSPA -> " HSPA"
591+ TelephonyManager .NETWORK_TYPE_EDGE -> " EDGE"
592+ TelephonyManager .NETWORK_TYPE_GPRS -> " GPRS"
593+ else -> " Mobile"
594+ }
595+ } else {
596+ " Mobile"
571597 }
572598 } else " "
573599
574- val sim = telephonyManager.simState == TelephonyManager .SIM_STATE_READY
600+ val sim = if (hasReadPhoneStatePermission) {
601+ telephonyManager.simState == TelephonyManager .SIM_STATE_READY
602+ } else {
603+ false
604+ }
575605 Triple (mobConnected, type, sim)
576606 } catch (e: Exception ) {
577607 Triple (false , " " , false )
0 commit comments