Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a3507d53 authored by Chaohui Wang's avatar Chaohui Wang
Browse files

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
parent 3a12c7b1
Loading
Loading
Loading
Loading
+2 −7
Original line number Diff line number Diff line
@@ -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))
    }
}
+11 −22
Original line number Diff line number Diff line
@@ -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<SettingsDropdownCheckOption> =
        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<SettingsDropdownCheckOption>,
        networkType: Long,
    ): SnapshotStateMap<SettingsDropdownCheckOption, Boolean> {
        val stateMap = mutableStateMapOf<SettingsDropdownCheckOption, Boolean>()
        Types.forEachIndexed { index, type ->
            if (networkType and TelephonyManager.getBitMaskForNetworkType(type) != 0L) {
                stateMap[options[index]] = true
            }
        }
        return stateMap
    fun getNetworkTypeOptions(networkType: Long): List<SettingsDropdownCheckOption> =
        Types.map { type ->
            val selected = networkType and TelephonyManager.getBitMaskForNetworkType(type) != 0L
            SettingsDropdownCheckOption(
                text = TelephonyManager.getNetworkTypeName(type),
                selected = mutableStateOf(selected),
            )
        }

    /**
     * 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<SettingsDropdownCheckOption>,
        stateMap: SnapshotStateMap<SettingsDropdownCheckOption, Boolean>,
    ): Long {
    fun optionsToNetworkType(options: List<SettingsDropdownCheckOption>): Long {
        var networkType = 0L
        options.forEachIndexed { index, option ->
            if (stateMap[option] == true) {
            if (option.selected.value) {
                networkType = networkType or TelephonyManager.getBitMaskForNetworkType(Types[index])
            }
        }
+58 −0
Original line number Diff line number Diff line
/*
 * 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)
    }
}