Merge "Create VoNrRepository" into main
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user