Merge "Create VoNrRepository" into main

This commit is contained in:
Chaohui Wang
2024-05-17 02:21:31 +00:00
committed by Android (Google) Code Review
7 changed files with 453 additions and 435 deletions

View File

@@ -0,0 +1,135 @@
/*
* Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.network.telephony
import android.content.Context
import androidx.compose.ui.test.assertIsEnabled
import androidx.compose.ui.test.assertIsNotEnabled
import androidx.compose.ui.test.assertIsOff
import androidx.compose.ui.test.assertIsOn
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.onRoot
import androidx.compose.ui.test.performClick
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settings.R
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.runBlocking
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import org.mockito.kotlin.spy
import org.mockito.kotlin.stub
import org.mockito.kotlin.verify
@RunWith(AndroidJUnit4::class)
class NrAdvancedCallingPreferenceControllerTest {
@get:Rule
val composeTestRule = createComposeRule()
private val context: Context = spy(ApplicationProvider.getApplicationContext()) {}
private val callStateRepository = mock<CallStateRepository> {
on { isInCallFlow() } doReturn flowOf(false)
}
private val voNrRepository = mock<VoNrRepository>()
private val controller = NrAdvancedCallingPreferenceController(
context = context,
key = TEST_KEY,
callStateRepository = callStateRepository,
).apply { init(SUB_ID, voNrRepository) }
@Test
fun isChecked_voNrEnabled_on() {
voNrRepository.stub {
on { isVoNrEnabledFlow() } doReturn flowOf(true)
}
composeTestRule.setContent {
controller.Content()
}
composeTestRule.onNodeWithText(context.getString(R.string.nr_advanced_calling_title))
.assertIsOn()
}
@Test
fun isChecked_voNrDisabled_off() {
voNrRepository.stub {
on { isVoNrEnabledFlow() } doReturn flowOf(false)
}
composeTestRule.setContent {
controller.Content()
}
composeTestRule.onNodeWithText(context.getString(R.string.nr_advanced_calling_title))
.assertIsOff()
}
@Test
fun isEnabled_notInCall_enabled() {
callStateRepository.stub {
on { isInCallFlow() } doReturn flowOf(false)
}
composeTestRule.setContent {
controller.Content()
}
composeTestRule.onNodeWithText(context.getString(R.string.nr_advanced_calling_title))
.assertIsEnabled()
}
@Test
fun isEnabled_inCall_notEnabled() {
callStateRepository.stub {
on { isInCallFlow() } doReturn flowOf(true)
}
composeTestRule.setContent {
controller.Content()
}
composeTestRule.onNodeWithText(context.getString(R.string.nr_advanced_calling_title))
.assertIsNotEnabled()
}
@Test
fun onClick_setVoNrEnabled(): Unit = runBlocking {
voNrRepository.stub {
on { isVoNrEnabledFlow() } doReturn flowOf(false)
}
composeTestRule.setContent {
controller.Content()
}
composeTestRule.onRoot().performClick()
verify(voNrRepository).setVoNrEnabled(true)
}
private companion object {
const val TEST_KEY = "test_key"
const val SUB_ID = 2
}
}

View File

@@ -0,0 +1,169 @@
/*
* Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.network.telephony
import android.content.Context
import android.telephony.CarrierConfigManager
import android.telephony.TelephonyManager
import androidx.core.os.persistableBundleOf
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settingslib.spa.testutils.firstWithTimeoutOrNull
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.runBlocking
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.anyVararg
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.eq
import org.mockito.kotlin.mock
import org.mockito.kotlin.spy
import org.mockito.kotlin.stub
import org.mockito.kotlin.verify
@RunWith(AndroidJUnit4::class)
class VoNrRepositoryTest {
private val mockTelephonyManager = mock<TelephonyManager> {
on { createForSubscriptionId(SUB_ID) } doReturn mock
on { supportedRadioAccessFamily } doReturn TelephonyManager.NETWORK_TYPE_BITMASK_NR
}
private val carrierConfig = persistableBundleOf(
CarrierConfigManager.KEY_VONR_ENABLED_BOOL to true,
CarrierConfigManager.KEY_VONR_SETTING_VISIBILITY_BOOL to true,
CarrierConfigManager.KEY_CARRIER_NR_AVAILABILITIES_INT_ARRAY to intArrayOf(1, 2),
)
private val mockCarrierConfigManager = mock<CarrierConfigManager> {
on { getConfigForSubId(eq(SUB_ID), anyVararg()) } doReturn carrierConfig
}
private val context: Context = spy(ApplicationProvider.getApplicationContext()) {
on { getSystemService(TelephonyManager::class.java) } doReturn mockTelephonyManager
on { getSystemService(CarrierConfigManager::class.java) } doReturn mockCarrierConfigManager
}
private val repository = VoNrRepository(context, SUB_ID)
@Test
fun isVoNrAvailable_visibleDisable_returnFalse() {
carrierConfig.apply {
putBoolean(CarrierConfigManager.KEY_VONR_SETTING_VISIBILITY_BOOL, false)
}
val available = repository.isVoNrAvailable()
assertThat(available).isFalse()
}
@Test
fun isVoNrAvailable_voNrDisabled_returnFalse() {
carrierConfig.apply {
putBoolean(CarrierConfigManager.KEY_VONR_ENABLED_BOOL, false)
}
val available = repository.isVoNrAvailable()
assertThat(available).isFalse()
}
@Test
fun isVoNrAvailable_allEnabled_returnTrue() {
mockTelephonyManager.stub {
on { supportedRadioAccessFamily } doReturn TelephonyManager.NETWORK_TYPE_BITMASK_NR
}
carrierConfig.apply {
putBoolean(CarrierConfigManager.KEY_VONR_ENABLED_BOOL, true)
putBoolean(CarrierConfigManager.KEY_VONR_SETTING_VISIBILITY_BOOL, true)
putIntArray(
CarrierConfigManager.KEY_CARRIER_NR_AVAILABILITIES_INT_ARRAY,
intArrayOf(1, 2),
)
}
val available = repository.isVoNrAvailable()
assertThat(available).isTrue()
}
@Test
fun isVoNrAvailable_deviceNoNr_returnFalse() {
mockTelephonyManager.stub {
on { supportedRadioAccessFamily } doReturn TelephonyManager.NETWORK_TYPE_BITMASK_LTE
}
val available = repository.isVoNrAvailable()
assertThat(available).isFalse()
}
@Test
fun isVoNrAvailable_carrierNoNr_returnFalse() {
carrierConfig.apply {
putIntArray(CarrierConfigManager.KEY_CARRIER_NR_AVAILABILITIES_INT_ARRAY, intArrayOf())
}
val available = repository.isVoNrAvailable()
assertThat(available).isFalse()
}
@Test
fun isVoNrAvailable_carrierConfigNrIsNull_returnFalse() {
carrierConfig.apply {
putIntArray(CarrierConfigManager.KEY_CARRIER_NR_AVAILABILITIES_INT_ARRAY, null)
}
val available = repository.isVoNrAvailable()
assertThat(available).isFalse()
}
@Test
fun isVoNrEnabledFlow_voNrDisabled() = runBlocking {
mockTelephonyManager.stub {
on { isVoNrEnabled } doReturn false
}
val isVoNrEnabled = repository.isVoNrEnabledFlow().firstWithTimeoutOrNull()
assertThat(isVoNrEnabled).isFalse()
}
@Test
fun isVoNrEnabledFlow_voNrEnabled() = runBlocking {
mockTelephonyManager.stub {
on { isVoNrEnabled } doReturn true
}
val isVoNrEnabled = repository.isVoNrEnabledFlow().firstWithTimeoutOrNull()
assertThat(isVoNrEnabled).isTrue()
}
@Test
fun setVoNrEnabled(): Unit = runBlocking {
repository.setVoNrEnabled(true)
verify(mockTelephonyManager).setVoNrEnabled(true)
}
private companion object {
const val SUB_ID = 1
}
}

View File

@@ -1,196 +0,0 @@
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.network.telephony;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import androidx.preference.TwoStatePreference;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.network.CarrierConfigCache;
import com.android.settingslib.RestrictedSwitchPreference;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class)
public class NrAdvancedCallingPreferenceControllerTest {
private static final int SUB_ID = 2;
@Mock
private TelephonyManager mTelephonyManager;
@Mock
private TelephonyManager mInvalidTelephonyManager;
@Mock
private SubscriptionManager mSubscriptionManager;
@Mock
private CarrierConfigCache mCarrierConfigCache;
private NrAdvancedCallingPreferenceController mController;
private TwoStatePreference mPreference;
private PersistableBundle mCarrierConfig;
private Context mContext;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(ApplicationProvider.getApplicationContext());
when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
CarrierConfigCache.setTestInstance(mContext, mCarrierConfigCache);
doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
doReturn(mInvalidTelephonyManager).when(mTelephonyManager).createForSubscriptionId(
SubscriptionManager.INVALID_SUBSCRIPTION_ID);
doReturn(TelephonyManager.NETWORK_TYPE_BITMASK_NR).when(
mTelephonyManager).getSupportedRadioAccessFamily();
doReturn(false).when(mTelephonyManager).isVoNrEnabled();
doReturn(TelephonyManager.ENABLE_VONR_REQUEST_NOT_SUPPORTED).when(
mTelephonyManager).setVoNrEnabled(anyBoolean());
mCarrierConfig = new PersistableBundle();
doReturn(mCarrierConfig).when(mCarrierConfigCache).getConfigForSubId(SUB_ID);
mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_ENABLED_BOOL, false);
mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_SETTING_VISIBILITY_BOOL, true);
mCarrierConfig.putIntArray(CarrierConfigManager.KEY_CARRIER_NR_AVAILABILITIES_INT_ARRAY,
new int[]{1, 2});
mPreference = new RestrictedSwitchPreference(mContext);
mController = spy(new NrAdvancedCallingPreferenceController(mContext, "VoNr"));
mController.init(SUB_ID);
doReturn(true).when(mController).isCallStateIdle();
mPreference.setKey(mController.getPreferenceKey());
}
@Test
public void getAvailabilityStatus_vonrEnabledAndVisibleDisable_returnUnavailable() {
mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_ENABLED_BOOL, true);
mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_SETTING_VISIBILITY_BOOL, false);
mController.init(SUB_ID);
assertThat(mController.getAvailabilityStatus()).isEqualTo(
BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
}
@Test
public void getAvailabilityStatus_vonrDisabledAndVisibleDisable_returnUnavailable() {
mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_ENABLED_BOOL, false);
mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_SETTING_VISIBILITY_BOOL, false);
mController.init(SUB_ID);
assertThat(mController.getAvailabilityStatus()).isEqualTo(
BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
}
@Test
public void getAvailabilityStatus_vonrDisabledAndVisibleEnable_returnUnavailable() {
mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_ENABLED_BOOL, false);
mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_SETTING_VISIBILITY_BOOL, true);
mController.init(SUB_ID);
assertThat(mController.getAvailabilityStatus()).isEqualTo(
BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
}
@Test
public void getAvailabilityStatus_vonrEnabledAndVisibleEnable_returnAvailable() {
mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_ENABLED_BOOL, true);
mCarrierConfig.putBoolean(CarrierConfigManager.KEY_VONR_SETTING_VISIBILITY_BOOL, true);
mController.init(SUB_ID);
assertThat(mController.getAvailabilityStatus()).isEqualTo(
BasePreferenceController.AVAILABLE);
}
@Test
public void getAvailabilityStatus_deviceNoNr_returnUnavailable() {
doReturn(TelephonyManager.NETWORK_TYPE_BITMASK_LTE).when(
mTelephonyManager).getSupportedRadioAccessFamily();
mController.init(SUB_ID);
assertThat(mController.getAvailabilityStatus()).isEqualTo(
BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
}
@Test
public void getAvailabilityStatus_carrierNoNr_returnUnavailable() {
mCarrierConfig.putIntArray(CarrierConfigManager.KEY_CARRIER_NR_AVAILABILITIES_INT_ARRAY,
new int[0]);
mController.init(SUB_ID);
assertThat(mController.getAvailabilityStatus()).isEqualTo(
BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
}
@Test
public void getAvailabilityStatus_carrierConfigNrIsNull_returnUnavailable() {
mCarrierConfig.putIntArray(CarrierConfigManager.KEY_CARRIER_NR_AVAILABILITIES_INT_ARRAY,
null);
mController.init(SUB_ID);
assertThat(mController.getAvailabilityStatus()).isEqualTo(
BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
}
@Test
public void updateState_callStateNotIdle_prefDisabled() {
doReturn(false).when(mController).isCallStateIdle();
mPreference.setEnabled(true);
mController.updateState(mPreference);
assertThat(mPreference.isEnabled()).isFalse();
}
@Test
@Ignore("b/339542743")
public void updateState_configOn_prefChecked() {
doReturn(TelephonyManager.ENABLE_VONR_SUCCESS).when(
mTelephonyManager).setVoNrEnabled(anyBoolean());
doReturn(true).when(mTelephonyManager).isVoNrEnabled();
mPreference.setChecked(false);
mController.init(SUB_ID);
mController.updateState(mPreference);
assertThat(mPreference.isChecked()).isTrue();
}
}