Turn mobile account status to red when mobile connectivity is lost

This commit is contained in:
Juha Heinanen
2026-05-24 08:45:38 +03:00
parent 5668857c79
commit bbfbb66841
@@ -54,6 +54,9 @@ import android.system.OsConstants
import android.telecom.DisconnectCause import android.telecom.DisconnectCause
import android.telecom.PhoneAccountHandle import android.telecom.PhoneAccountHandle
import android.telecom.TelecomManager import android.telecom.TelecomManager
import android.telephony.ServiceState
import android.telephony.TelephonyCallback
import android.telephony.TelephonyManager
import android.view.View import android.view.View
import android.widget.RemoteViews import android.widget.RemoteViews
import android.widget.Toast import android.widget.Toast
@@ -98,6 +101,8 @@ class BaresipService: Service() {
private lateinit var wm: WifiManager private lateinit var wm: WifiManager
private lateinit var tm: TelecomManager private lateinit var tm: TelecomManager
private lateinit var btm: BluetoothManager private lateinit var btm: BluetoothManager
private lateinit var telephonyManager: TelephonyManager
private lateinit var telephonyCallback: TelephonyCallback
private lateinit var vibrator: Vibrator private lateinit var vibrator: Vibrator
private lateinit var partialWakeLock: PowerManager.WakeLock private lateinit var partialWakeLock: PowerManager.WakeLock
private lateinit var proximityWakeLock: PowerManager.WakeLock private lateinit var proximityWakeLock: PowerManager.WakeLock
@@ -122,6 +127,7 @@ class BaresipService: Service() {
private var hotSpotReceiverRegistered = false private var hotSpotReceiverRegistered = false
private var bluetoothReceiverRegistered = false private var bluetoothReceiverRegistered = false
private var airplaneModeReceiverRegistered = false private var airplaneModeReceiverRegistered = false
private var telephonyCallbackRegistered = false
private var isNotificationInCall = false private var isNotificationInCall = false
private var isServiceClean = false private var isServiceClean = false
private var cleanupRunnable: Runnable? = null private var cleanupRunnable: Runnable? = null
@@ -295,7 +301,7 @@ class BaresipService: Service() {
if (intent.action == Intent.ACTION_AIRPLANE_MODE_CHANGED) { if (intent.action == Intent.ACTION_AIRPLANE_MODE_CHANGED) {
val isAirplaneModeOn = intent.getBooleanExtra("state", false) val isAirplaneModeOn = intent.getBooleanExtra("state", false)
Log.d(TAG, "Airplane mode changed: $isAirplaneModeOn") Log.d(TAG, "Airplane mode changed: $isAirplaneModeOn")
updateMobileStatus(isAirplaneModeOn) updateMobileStatus()
} }
} }
} }
@@ -367,6 +373,23 @@ class BaresipService: Service() {
} }
} }
telephonyManager = getSystemService(TELEPHONY_SERVICE) as TelephonyManager
if (VERSION.SDK_INT >= 31) {
telephonyCallback = object : TelephonyCallback(), TelephonyCallback.ServiceStateListener {
override fun onServiceStateChanged(serviceState: ServiceState) {
val isAirplaneModeOn = Utils.isAirplaneModeOn(this@BaresipService)
val status = if (isAirplaneModeOn)
R.drawable.circle_white
else if (serviceState.state == ServiceState.STATE_IN_SERVICE)
circleGreen.getValue(colorblind)
else
circleRed.getValue(colorblind)
Log.d(TAG, "Mobile service state changed: ${serviceState.state}, updating status to $status")
updateMobileStatus(status)
}
}
}
proximityWakeLock = pm.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, proximityWakeLock = pm.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK,
"com.tutpro.baresip:proximity_wakelock") "com.tutpro.baresip:proximity_wakelock")
@@ -1575,6 +1598,15 @@ class BaresipService: Service() {
Log.d(TAG, "Received 'started' from baresip") Log.d(TAG, "Received 'started' from baresip")
isNativeReady = true isNativeReady = true
addMobileUserAgent() addMobileUserAgent()
if (VERSION.SDK_INT >= 31 && !telephonyCallbackRegistered) {
try {
telephonyManager.registerTelephonyCallback(mainExecutor, telephonyCallback)
telephonyCallbackRegistered = true
Log.d(TAG, "Registered TelephonyCallback")
} catch (e: Exception) {
Log.e(TAG, "Failed to register TelephonyCallback: ${e.message}")
}
}
Api.net_debug() Api.net_debug()
postServiceEvent( postServiceEvent(
ServiceEvent("started", arrayListOf(callActionUri), System.nanoTime()) ServiceEvent("started", arrayListOf(callActionUri), System.nanoTime())
@@ -2050,6 +2082,7 @@ class BaresipService: Service() {
val mobileUa = UserAgent(0L, account) val mobileUa = UserAgent(0L, account)
val isAirplaneModeOn = Settings.Global.getInt(contentResolver, Settings.Global.AIRPLANE_MODE_ON, 0) != 0 val isAirplaneModeOn = Settings.Global.getInt(contentResolver, Settings.Global.AIRPLANE_MODE_ON, 0) != 0
mobileUa.status = if (isAirplaneModeOn) R.drawable.circle_white else circleGreen.getValue(colorblind) mobileUa.status = if (isAirplaneModeOn) R.drawable.circle_white else circleGreen.getValue(colorblind)
updateMobileStatus()
val updatedUas = uas.value.toMutableList() val updatedUas = uas.value.toMutableList()
updatedUas.add(mobileUa) updatedUas.add(mobileUa)
@@ -2065,16 +2098,21 @@ class BaresipService: Service() {
} }
} }
private fun updateMobileStatus(isAirplaneModeOn: Boolean) { private fun updateMobileStatus(newStatus: Int? = null) {
uas.value.find { it.account.isMobile }?.let { ua -> uas.value.find { it.account.isMobile }?.let { ua ->
val status = if (isAirplaneModeOn) val isAirplaneModeOn = Utils.isAirplaneModeOn(this)
R.drawable.circle_white val status = newStatus
else ?: if (isAirplaneModeOn)
circleGreen.getValue(colorblind) R.drawable.circle_white
ua.updateStatus(status) else
updateStatusNotification() ua.status
if (isMainVisible) if (ua.status != status) {
registrationUpdate.postValue(System.currentTimeMillis()) Log.d(TAG, "Updating Mobile status to $status")
ua.updateStatus(status)
updateStatusNotification()
if (isMainVisible)
registrationUpdate.postValue(System.currentTimeMillis())
}
} }
} }
@@ -2677,6 +2715,12 @@ class BaresipService: Service() {
airplaneModeReceiverRegistered = false airplaneModeReceiverRegistered = false
} catch (_: IllegalArgumentException) {} } catch (_: IllegalArgumentException) {}
} }
if (telephonyCallbackRegistered) {
if (VERSION.SDK_INT >= 31) {
telephonyManager.unregisterTelephonyCallback(telephonyCallback)
telephonyCallbackRegistered = false
}
}
val callps = ConnectionService.connections.keys.toList() val callps = ConnectionService.connections.keys.toList()
for (callp in callps) for (callp in callps)
ConnectionService.onCallClosed(callp) ConnectionService.onCallClosed(callp)