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

Commit 6e9a211d authored by Chaohui Wang's avatar Chaohui Wang Committed by Android (Google) Code Review
Browse files

Merge changes I3e618b37,I697cab6f into main

* changes:
  Add search support for Automatic data switching
  Add HighlightBox for AUTO_DATA_SWITCH_SETTING_R_ID
parents 57794a66 b56dee64
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.view.View
import androidx.annotation.VisibleForTesting
import androidx.preference.Preference
import com.android.settings.R
import com.android.settings.SettingsActivity.EXTRA_FRAGMENT_ARG_KEY
import com.android.settings.SettingsPreferenceFragment
import com.android.settings.dashboard.DashboardFragment
import com.android.settings.flags.Flags
@@ -47,7 +48,10 @@ class MobileNetworkListFragment : DashboardFragment() {
        super.onCreate(icicle)

        if (Flags.isDualSimOnboardingEnabled()) {
            context?.startSpaActivity(NetworkCellularGroupProvider.fileName)
            context?.startSpaActivity(
                destination = NetworkCellularGroupProvider.fileName,
                highlightItemKey = arguments?.getString(EXTRA_FRAGMENT_ARG_KEY),
            )
            finish()
        }
    }
+9 −5
Original line number Diff line number Diff line
@@ -53,11 +53,15 @@ class SpaActivity : BrowseActivity() {
                false
            }

        @JvmStatic
        fun Context.startSpaActivity(destination: String) {
            val intent = Intent(this, SpaActivity::class.java)
                .appendSpaParams(destination = destination)
                .appendSpaParams(sessionName = SESSION_BROWSE)
        @[JvmStatic JvmOverloads]
        fun Context.startSpaActivity(destination: String, highlightItemKey: String? = null) {
            val intent =
                Intent(this, SpaActivity::class.java)
                    .appendSpaParams(
                        destination = destination,
                        highlightItemKey = highlightItemKey,
                        sessionName = SESSION_BROWSE,
                    )
            startActivity(intent)
        }
    }
+48 −0
Original line number Diff line number Diff line
@@ -16,17 +16,65 @@

package com.android.settings.spa.network

import android.content.Context
import android.telephony.SubscriptionManager
import android.telephony.TelephonyManager
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
import com.android.settings.R
import com.android.settings.network.telephony.MobileDataRepository
import com.android.settings.network.telephony.wificalling.CrossSimCallingViewModel
import com.android.settingslib.spa.framework.compose.HighlightBox
import com.android.settingslib.spa.framework.compose.rememberContext
import com.android.settingslib.spa.search.SearchablePage.SearchItem
import com.android.settingslib.spa.widget.preference.SwitchPreference
import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

/**
 * ID for AutomaticDataSwitchingPreference.
 *
 * Caution, has external dependencies on this:
 * - frameworks/opt/telephony
 * - frameworks/base/packages/SystemUI
 */
private const val AUTO_DATA_SWITCH_SETTING_R_ID = "auto_data_switch"

fun getAutomaticDataSwitchingSearchItem(context: Context) =
    SearchItem(
        highlightItemKey = AUTO_DATA_SWITCH_SETTING_R_ID,
        itemTitle = context.getString(R.string.primary_sim_automatic_data_title),
    )

@Composable
fun AutomaticDataSwitchingPreference(nonDds: Int) {
    if (!SubscriptionManager.isValidSubscriptionId(nonDds)) return

    val mobileDataRepository = rememberContext(::MobileDataRepository)
    val isAutoDataEnabled by
        remember(nonDds) {
                mobileDataRepository.isMobileDataPolicyEnabledFlow(
                    subId = nonDds,
                    policy = TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH,
                )
            }
            .collectAsStateWithLifecycle(initialValue = null)
    HighlightBox(AUTO_DATA_SWITCH_SETTING_R_ID) {
        AutomaticDataSwitchingPreference(
            isAutoDataEnabled = { isAutoDataEnabled },
            setAutoDataEnabled = { newEnabled ->
                mobileDataRepository.setAutoDataSwitch(nonDds, newEnabled)
            },
        )
    }
}

@Composable
fun AutomaticDataSwitchingPreference(
    isAutoDataEnabled: () -> Boolean?,
+5 −20
Original line number Diff line number Diff line
@@ -58,7 +58,6 @@ import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.framework.compose.navigator
import com.android.settingslib.spa.framework.compose.rememberContext
import com.android.settingslib.spa.search.SearchablePage
import com.android.settingslib.spa.search.SearchablePage.SearchItem
import com.android.settingslib.spa.widget.preference.Preference
@@ -198,10 +197,11 @@ open class NetworkCellularGroupProvider : SettingsPageProvider, SearchablePage {

    override fun getSearchItems(context: Context): List<SearchItem> {
        if (!isPageSearchable(context)) return emptyList()
        val activeSubscriptionCount =
            context.requireSubscriptionManager().activeSubscriptionInfoCount
        return buildList {
            if (context.requireSubscriptionManager().activeSubscriptionInfoCount > 0) {
                add(getMobileDataSearchItem(context))
            }
            if (activeSubscriptionCount > 0) add(getMobileDataSearchItem(context))
            if (activeSubscriptionCount >= 2) add(getAutomaticDataSwitchingSearchItem(context))
        }
    }

@@ -215,25 +215,10 @@ open class NetworkCellularGroupProvider : SettingsPageProvider, SearchablePage {

@Composable
fun MobileDataSectionImpl(mobileDataSelectedId: Int, nonDds: Int) {
    val mobileDataRepository = rememberContext(::MobileDataRepository)

    Category(title = stringResource(id = R.string.mobile_data_settings_title)) {
        MobileDataSwitchPreference(subId = mobileDataSelectedId)

        val isAutoDataEnabled by remember(nonDds) {
            mobileDataRepository.isMobileDataPolicyEnabledFlow(
                subId = nonDds,
                policy = TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH
            )
        }.collectAsStateWithLifecycle(initialValue = null)
        if (SubscriptionManager.isValidSubscriptionId(nonDds)) {
            AutomaticDataSwitchingPreference(
                isAutoDataEnabled = { isAutoDataEnabled },
                setAutoDataEnabled = { newEnabled ->
                    mobileDataRepository.setAutoDataSwitch(nonDds, newEnabled)
                },
            )
        }
        AutomaticDataSwitchingPreference(nonDds)
    }
}

+15 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import com.android.settings.spa.SpaActivity.Companion.startSpaActivity
import com.android.settings.spa.app.AllAppListPageProvider
import com.android.settings.spa.app.appinfo.AppInfoSettingsProvider
import com.android.settingslib.spa.framework.util.KEY_DESTINATION
import com.android.settingslib.spa.framework.util.KEY_HIGHLIGHT_ITEM_KEY
import com.google.android.setupcompat.util.WizardManagerHelper
import com.google.common.truth.Truth.assertThat
import org.junit.After
@@ -86,7 +87,7 @@ class SpaActivityTest {

    @Test
    fun startSpaActivity() {
        context.startSpaActivity(DESTINATION)
        context.startSpaActivity(destination = DESTINATION)

        val intent = argumentCaptor<Intent> {
            verify(context).startActivity(capture())
@@ -95,7 +96,20 @@ class SpaActivityTest {
        assertThat(intent.getStringExtra(KEY_DESTINATION)).isEqualTo(DESTINATION)
    }

    @Test
    fun startSpaActivity_withHighlightItemKey() {
        context.startSpaActivity(destination = DESTINATION, highlightItemKey = HIGHLIGHT_ITEM_KEY)

        val intent = argumentCaptor<Intent> {
            verify(context).startActivity(capture())
        }.firstValue
        assertThat(intent.component?.className).isEqualTo(SpaActivity::class.qualifiedName)
        assertThat(intent.getStringExtra(KEY_DESTINATION)).isEqualTo(DESTINATION)
        assertThat(intent.getStringExtra(KEY_HIGHLIGHT_ITEM_KEY)).isEqualTo(HIGHLIGHT_ITEM_KEY)
    }

    private companion object {
        const val DESTINATION = "Destination"
        const val HIGHLIGHT_ITEM_KEY = "highlight_item_key"
    }
}