blob: f4e3eab8593d7e0f10a0dbfcc69bcae8bd4ab04a [file] [log] [blame]
/*
* Copyright (C) 2023 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.systemui.statusbar.pipeline.mobile.data.model
import android.os.PersistableBundle
import android.telephony.CarrierConfigManager.KEY_INFLATE_SIGNAL_STRENGTH_BOOL
import android.telephony.CarrierConfigManager.KEY_SHOW_OPERATOR_NAME_IN_STATUSBAR_BOOL
import androidx.annotation.VisibleForTesting
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
/**
* Represents, for a given subscription ID, the set of keys about which SystemUI cares.
*
* Upon first creation, this config represents only the default configuration (see
* [android.telephony.CarrierConfigManager.getDefaultConfig]).
*
* Upon request (see
* [com.android.systemui.statusbar.pipeline.mobile.data.repository.CarrierConfigRepository]), an
* instance of this class may be created for a given subscription Id, and will default to
* representing the default carrier configuration. However, once a carrier config is received for
* this [subId], all fields will reflect those in the received config, using [PersistableBundle]'s
* default of false for any config that is not present in the override.
*
* To keep things relatively simple, this class defines a wrapper around each config key which
* exposes a StateFlow<Boolean> for each config we care about. It also tracks whether or not it is
* using the default config for logging purposes.
*
* NOTE to add new keys to be tracked:
* 1. Define a new `private val` wrapping the key using [BooleanCarrierConfig]
* 2. Define a public `val` exposing the wrapped flow using [BooleanCarrierConfig.config]
* 3. Add the new [BooleanCarrierConfig] to the list of tracked configs, so they are properly
* updated when a new carrier config comes down
*/
class SystemUiCarrierConfig
internal constructor(
val subId: Int,
defaultConfig: PersistableBundle,
) {
@VisibleForTesting
var isUsingDefault = true
private set
private val inflateSignalStrength =
BooleanCarrierConfig(KEY_INFLATE_SIGNAL_STRENGTH_BOOL, defaultConfig)
/** Flow tracking the [KEY_INFLATE_SIGNAL_STRENGTH_BOOL] carrier config */
val shouldInflateSignalStrength: StateFlow<Boolean> = inflateSignalStrength.config
private val showOperatorName =
BooleanCarrierConfig(KEY_SHOW_OPERATOR_NAME_IN_STATUSBAR_BOOL, defaultConfig)
/** Flow tracking the [KEY_SHOW_OPERATOR_NAME_IN_STATUSBAR_BOOL] config */
val showOperatorNameInStatusBar: StateFlow<Boolean> = showOperatorName.config
private val trackedConfigs =
listOf(
inflateSignalStrength,
showOperatorName,
)
/** Ingest a new carrier config, and switch all of the tracked keys over to the new values */
fun processNewCarrierConfig(config: PersistableBundle) {
isUsingDefault = false
trackedConfigs.forEach { it.update(config) }
}
/** For dumpsys, shortcut if we haven't overridden any keys */
fun toStringConsideringDefaults(): String {
return if (isUsingDefault) {
"using defaults"
} else {
trackedConfigs.joinToString { it.toString() }
}
}
override fun toString(): String = trackedConfigs.joinToString { it.toString() }
}
/** Extracts [key] from the carrier config, and stores it in a flow */
private class BooleanCarrierConfig(
val key: String,
defaultConfig: PersistableBundle,
) {
private val _configValue = MutableStateFlow(defaultConfig.getBoolean(key))
val config = _configValue.asStateFlow()
fun update(config: PersistableBundle) {
_configValue.value = config.getBoolean(key)
}
override fun toString(): String {
return "$key=${config.value}"
}
}