From 56ff329900d81066ae7efc5f03e47b91a88b781f Mon Sep 17 00:00:00 2001 From: tomhsu Date: Thu, 19 Sep 2024 02:52:14 +0000 Subject: [PATCH] Fix crash when phone process has problem. - Phone process may not exist in some situation. It shall catch the exception to avoid Settings crash. Flag: EXEMPT bugfix fix: 365669913 Test: build pass Change-Id: I2b95f46b8887a9c8416fb4a5724537ad27e86850 --- .../network/telephony/VoNrRepository.kt | 25 ++++++++++++++---- .../network/telephony/VoNrRepositoryTest.kt | 26 ++++++++++++++++++- 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/com/android/settings/network/telephony/VoNrRepository.kt b/src/com/android/settings/network/telephony/VoNrRepository.kt index 635c57223be..7f3823b6481 100644 --- a/src/com/android/settings/network/telephony/VoNrRepository.kt +++ b/src/com/android/settings/network/telephony/VoNrRepository.kt @@ -19,6 +19,7 @@ package com.android.settings.network.telephony import android.content.Context import android.telephony.CarrierConfigManager import android.telephony.SubscriptionManager +import android.telephony.TelephonyManager import android.util.Log import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow @@ -37,12 +38,13 @@ class VoNrRepository( fun isVoNrAvailable(subId: Int): Boolean { if (!nrRepository.isNrAvailable(subId)) return false data class Config(val isVoNrEnabled: Boolean, val isVoNrSettingVisibility: Boolean) + val carrierConfig = carrierConfigRepository.transformConfig(subId) { Config( isVoNrEnabled = getBoolean(CarrierConfigManager.KEY_VONR_ENABLED_BOOL), isVoNrSettingVisibility = - getBoolean(CarrierConfigManager.KEY_VONR_SETTING_VISIBILITY_BOOL), + getBoolean(CarrierConfigManager.KEY_VONR_SETTING_VISIBILITY_BOOL), ) } return carrierConfig.isVoNrEnabled && carrierConfig.isVoNrSettingVisibility @@ -52,7 +54,14 @@ class VoNrRepository( val telephonyManager = context.telephonyManager(subId) return context .subscriptionsChangedFlow() - .map { telephonyManager.isVoNrEnabled } + .map { + try { + telephonyManager.isVoNrEnabled + } catch (e: IllegalStateException) { + Log.e(TAG, "IllegalStateException - isVoNrEnabled : $e") + false + } + } .conflate() .onEach { Log.d(TAG, "[$subId] isVoNrEnabled: $it") } .flowOn(Dispatchers.Default) @@ -61,11 +70,17 @@ class VoNrRepository( suspend fun setVoNrEnabled(subId: Int, enabled: Boolean) = withContext(Dispatchers.Default) { if (!SubscriptionManager.isValidSubscriptionId(subId)) return@withContext - val result = context.telephonyManager(subId).setVoNrEnabled(enabled) - Log.d(TAG, "[$subId] setVoNrEnabled: $enabled, result: $result") + var result = TelephonyManager.ENABLE_VONR_RADIO_INVALID_STATE + try { + result = context.telephonyManager(subId).setVoNrEnabled(enabled) + } catch (e: IllegalStateException) { + Log.e(TAG, "IllegalStateException - setVoNrEnabled : $e") + } finally { + Log.d(TAG, "[$subId] setVoNrEnabled: $enabled, result: $result") + } } private companion object { private const val TAG = "VoNrRepository" } -} +} \ No newline at end of file diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/VoNrRepositoryTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/VoNrRepositoryTest.kt index 90d0aa56d77..265cd33f3bf 100644 --- a/tests/spa_unit/src/com/android/settings/network/telephony/VoNrRepositoryTest.kt +++ b/tests/spa_unit/src/com/android/settings/network/telephony/VoNrRepositoryTest.kt @@ -27,7 +27,9 @@ import kotlinx.coroutines.runBlocking import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.mockito.kotlin.any import org.mockito.kotlin.doReturn +import org.mockito.kotlin.doThrow import org.mockito.kotlin.mock import org.mockito.kotlin.spy import org.mockito.kotlin.stub @@ -134,6 +136,15 @@ class VoNrRepositoryTest { assertThat(isVoNrEnabled).isTrue() } + @Test + fun isVoNrEnabledFlow_noPhoneProcess_noCrash() = runBlocking { + mockTelephonyManager.stub { on { isVoNrEnabled } doThrow IllegalStateException("no Phone") } + + val isVoNrEnabled = repository.isVoNrEnabledFlow(SUB_ID).firstWithTimeoutOrNull() + + assertThat(isVoNrEnabled).isFalse() + } + @Test fun setVoNrEnabled(): Unit = runBlocking { repository.setVoNrEnabled(SUB_ID, true) @@ -141,7 +152,20 @@ class VoNrRepositoryTest { verify(mockTelephonyManager).setVoNrEnabled(true) } + @Test + fun setVoNrEnabled_noPhoneProcess_noCrash(): Unit = runBlocking { + mockTelephonyManager.stub { + on { + setVoNrEnabled(any()) + } doThrow IllegalStateException("no Phone") + } + + repository.setVoNrEnabled(SUB_ID, true) + + verify(mockTelephonyManager).setVoNrEnabled(true) + } + private companion object { const val SUB_ID = 1 } -} +} \ No newline at end of file