From a3507d535fb2eea7ebe4b5c85daf771ee4a84357 Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Tue, 19 Mar 2024 13:56:32 +0800 Subject: [PATCH] Fix APN network type not updated The issue is caused by SettingsDropdownCheckBox's interface is updated, but ApnNetworkTypeCheckBox not updated. Update ApnNetworkTypeCheckBox to fix. Bug: 329547692 Test: manual - update network type Test: unit test Change-Id: I4a5a1ad7d9d97960799f5ba0d89b5178ce410b6e --- .../network/apn/ApnNetworkTypeCheckBox.kt | 9 +-- .../settings/network/apn/ApnNetworkTypes.kt | 33 ++++------- .../network/apn/ApnNetworkTypesTest.kt | 58 +++++++++++++++++++ 3 files changed, 71 insertions(+), 29 deletions(-) create mode 100644 tests/spa_unit/src/com/android/settings/network/apn/ApnNetworkTypesTest.kt diff --git a/src/com/android/settings/network/apn/ApnNetworkTypeCheckBox.kt b/src/com/android/settings/network/apn/ApnNetworkTypeCheckBox.kt index bc85f5582b7..a42031b388a 100644 --- a/src/com/android/settings/network/apn/ApnNetworkTypeCheckBox.kt +++ b/src/com/android/settings/network/apn/ApnNetworkTypeCheckBox.kt @@ -24,18 +24,13 @@ import com.android.settingslib.spa.widget.editor.SettingsDropdownCheckBox @Composable fun ApnNetworkTypeCheckBox(apnData: ApnData, onNetworkTypeChanged: (Long) -> Unit) { - val options = remember { ApnNetworkTypes.getNetworkTypeOptions() } - val selectedStateMap = remember { - ApnNetworkTypes.networkTypeToSelectedStateMap(options, apnData.networkType) - } + val options = remember { ApnNetworkTypes.getNetworkTypeOptions(apnData.networkType) } SettingsDropdownCheckBox( label = stringResource(R.string.network_type), options = options, emptyText = stringResource(R.string.network_type_unspecified), enabled = apnData.networkTypeEnabled, ) { - onNetworkTypeChanged( - ApnNetworkTypes.selectedStateMapToNetworkType(options, selectedStateMap) - ) + onNetworkTypeChanged(ApnNetworkTypes.optionsToNetworkType(options)) } } diff --git a/src/com/android/settings/network/apn/ApnNetworkTypes.kt b/src/com/android/settings/network/apn/ApnNetworkTypes.kt index e7a93b3cb79..f14b0b34029 100644 --- a/src/com/android/settings/network/apn/ApnNetworkTypes.kt +++ b/src/com/android/settings/network/apn/ApnNetworkTypes.kt @@ -17,8 +17,7 @@ package com.android.settings.network.apn import android.telephony.TelephonyManager -import androidx.compose.runtime.mutableStateMapOf -import androidx.compose.runtime.snapshots.SnapshotStateMap +import androidx.compose.runtime.mutableStateOf import com.android.settingslib.spa.widget.editor.SettingsDropdownCheckOption object ApnNetworkTypes { @@ -40,38 +39,28 @@ object ApnNetworkTypes { TelephonyManager.NETWORK_TYPE_NR, ) - fun getNetworkTypeOptions(): List = - Types.map { SettingsDropdownCheckOption(TelephonyManager.getNetworkTypeName(it)) } - /** * Gets the selected Network type Selected Options according to network type. * @param networkType Initialized network type bitmask, often multiple network type options may * be included. */ - fun networkTypeToSelectedStateMap( - options: List, - networkType: Long, - ): SnapshotStateMap { - val stateMap = mutableStateMapOf() - Types.forEachIndexed { index, type -> - if (networkType and TelephonyManager.getBitMaskForNetworkType(type) != 0L) { - stateMap[options[index]] = true - } + fun getNetworkTypeOptions(networkType: Long): List = + Types.map { type -> + val selected = networkType and TelephonyManager.getBitMaskForNetworkType(type) != 0L + SettingsDropdownCheckOption( + text = TelephonyManager.getNetworkTypeName(type), + selected = mutableStateOf(selected), + ) } - return stateMap - } /** * Gets the network type according to the selected Network type Selected Options. - * @param stateMap the selected Network type Selected Options. + * @param options the selected Network type Selected Options. */ - fun selectedStateMapToNetworkType( - options: List, - stateMap: SnapshotStateMap, - ): Long { + fun optionsToNetworkType(options: List): Long { var networkType = 0L options.forEachIndexed { index, option -> - if (stateMap[option] == true) { + if (option.selected.value) { networkType = networkType or TelephonyManager.getBitMaskForNetworkType(Types[index]) } } diff --git a/tests/spa_unit/src/com/android/settings/network/apn/ApnNetworkTypesTest.kt b/tests/spa_unit/src/com/android/settings/network/apn/ApnNetworkTypesTest.kt new file mode 100644 index 00000000000..f8aed591327 --- /dev/null +++ b/tests/spa_unit/src/com/android/settings/network/apn/ApnNetworkTypesTest.kt @@ -0,0 +1,58 @@ +/* + * 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.apn + +import android.telephony.TelephonyManager.NETWORK_TYPE_BITMASK_CDMA +import android.telephony.TelephonyManager.NETWORK_TYPE_BITMASK_EDGE +import android.telephony.TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP +import android.telephony.TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA +import androidx.compose.runtime.mutableStateOf +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.android.settingslib.spa.widget.editor.SettingsDropdownCheckOption +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class ApnNetworkTypesTest { + + @Test + fun getNetworkTypeOptions() { + val networkTypeOptions = + ApnNetworkTypes.getNetworkTypeOptions( + NETWORK_TYPE_BITMASK_EDGE xor NETWORK_TYPE_BITMASK_CDMA + ) + + assertThat(networkTypeOptions.single { it.text == "EDGE" }.selected.value).isTrue() + assertThat(networkTypeOptions.single { it.text == "CDMA" }.selected.value).isTrue() + assertThat(networkTypeOptions.single { it.text == "GPRS" }.selected.value).isFalse() + } + + @Test + fun optionsToNetworkType() { + val options = listOf( + SettingsDropdownCheckOption(text = "", selected = mutableStateOf(false)), + SettingsDropdownCheckOption(text = "", selected = mutableStateOf(true)), + SettingsDropdownCheckOption(text = "", selected = mutableStateOf(false)), + SettingsDropdownCheckOption(text = "", selected = mutableStateOf(true)), + ) + + val networkType = ApnNetworkTypes.optionsToNetworkType(options) + + assertThat(networkType).isEqualTo(NETWORK_TYPE_BITMASK_HSPAP xor NETWORK_TYPE_BITMASK_HSUPA) + } +}