Merge "Guard new added freezen metric by feature flag." into main
diff --git a/packages/SettingsLib/Spa/build.gradle.kts b/packages/SettingsLib/Spa/build.gradle.kts
index 0b7a568..1c8ddcb 100644
--- a/packages/SettingsLib/Spa/build.gradle.kts
+++ b/packages/SettingsLib/Spa/build.gradle.kts
@@ -26,7 +26,7 @@
}
allprojects {
- extra["jetpackComposeVersion"] = "1.6.0-alpha07"
+ extra["jetpackComposeVersion"] = "1.6.0-alpha08"
}
subprojects {
diff --git a/packages/SettingsLib/Spa/settings.gradle.kts b/packages/SettingsLib/Spa/settings.gradle.kts
index aac0fe9..b8dfae3 100644
--- a/packages/SettingsLib/Spa/settings.gradle.kts
+++ b/packages/SettingsLib/Spa/settings.gradle.kts
@@ -26,7 +26,14 @@
rulesMode.set(RulesMode.FAIL_ON_PROJECT_RULES)
repositories {
- google()
+ google {
+ content {
+ includeGroupAndSubgroups("com.google")
+ includeGroupAndSubgroups("com.android")
+ includeGroupAndSubgroups("android")
+ includeGroupAndSubgroups("androidx")
+ }
+ }
mavenCentral()
maven {
url = uri("https://jitpack.io")
diff --git a/packages/SettingsLib/Spa/spa/build.gradle.kts b/packages/SettingsLib/Spa/spa/build.gradle.kts
index b73bbd8..189c2dd 100644
--- a/packages/SettingsLib/Spa/spa/build.gradle.kts
+++ b/packages/SettingsLib/Spa/spa/build.gradle.kts
@@ -57,7 +57,7 @@
api("androidx.slice:slice-builders:1.1.0-alpha02")
api("androidx.slice:slice-core:1.1.0-alpha02")
api("androidx.slice:slice-view:1.1.0-alpha02")
- api("androidx.compose.material3:material3:1.2.0-alpha09")
+ api("androidx.compose.material3:material3:1.2.0-alpha10")
api("androidx.compose.material:material-icons-extended:$jetpackComposeVersion")
api("androidx.compose.runtime:runtime-livedata:$jetpackComposeVersion")
api("androidx.compose.ui:ui-tooling-preview:$jetpackComposeVersion")
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/BaseLayout.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/BaseLayout.kt
index 4d42fba..56d75d8 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/BaseLayout.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/BaseLayout.kt
@@ -26,13 +26,11 @@
import androidx.compose.foundation.layout.width
import androidx.compose.material3.HorizontalDivider
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.State
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
-import com.android.settingslib.spa.framework.compose.toState
import com.android.settingslib.spa.framework.theme.SettingsDimension
import com.android.settingslib.spa.framework.theme.SettingsOpacity.alphaForEnabled
import com.android.settingslib.spa.framework.theme.SettingsTheme
@@ -44,7 +42,7 @@
subTitle: @Composable () -> Unit,
modifier: Modifier = Modifier,
icon: (@Composable () -> Unit)? = null,
- enabled: State<Boolean> = true.toState(),
+ enabled: () -> Boolean = { true },
paddingStart: Dp = SettingsDimension.itemPaddingStart,
paddingEnd: Dp = SettingsDimension.itemPaddingEnd,
paddingVertical: Dp = SettingsDimension.itemPaddingVertical,
@@ -56,7 +54,7 @@
.padding(end = paddingEnd),
verticalAlignment = Alignment.CenterVertically,
) {
- val alphaModifier = Modifier.alphaForEnabled(enabled.value)
+ val alphaModifier = Modifier.alphaForEnabled(enabled())
BaseIcon(icon, alphaModifier, paddingStart)
Titles(
title = title,
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/BasePreference.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/BasePreference.kt
index 081e668..194ed81 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/BasePreference.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/BasePreference.kt
@@ -20,11 +20,9 @@
import androidx.compose.material.icons.outlined.BatteryChargingFull
import androidx.compose.material3.Icon
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.State
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
-import com.android.settingslib.spa.framework.compose.toState
import com.android.settingslib.spa.framework.theme.SettingsDimension
import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.widget.ui.SettingsBody
@@ -32,11 +30,11 @@
@Composable
internal fun BasePreference(
title: String,
- summary: State<String>,
+ summary: () -> String,
modifier: Modifier = Modifier,
singleLineSummary: Boolean = false,
icon: @Composable (() -> Unit)? = null,
- enabled: State<Boolean> = true.toState(),
+ enabled: () -> Boolean = { true },
paddingStart: Dp = SettingsDimension.itemPaddingStart,
paddingEnd: Dp = SettingsDimension.itemPaddingEnd,
paddingVertical: Dp = SettingsDimension.itemPaddingVertical,
@@ -46,7 +44,7 @@
title = title,
subTitle = {
SettingsBody(
- body = summary.value,
+ body = summary(),
maxLines = if (singleLineSummary) 1 else Int.MAX_VALUE,
)
},
@@ -66,7 +64,7 @@
SettingsTheme {
BasePreference(
title = "Screen Saver",
- summary = "Clock".toState(),
+ summary = { "Clock" },
)
}
}
@@ -77,7 +75,7 @@
SettingsTheme {
BasePreference(
title = "Screen Saver",
- summary = "Clock".toState(),
+ summary = { "Clock" },
icon = {
Icon(imageVector = Icons.Outlined.BatteryChargingFull, contentDescription = null)
},
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/ListPreference.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/ListPreference.kt
index 19779f6..74f9c9d 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/ListPreference.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/ListPreference.kt
@@ -89,7 +89,7 @@
) {
Column(modifier = Modifier.selectableGroup()) {
for (option in model.options) {
- Radio(option, model.selectedId, model.enabled) {
+ Radio(option, model.selectedId.intValue, model.enabled.value) {
dialogOpened = false
model.onIdSelected(it)
}
@@ -113,12 +113,11 @@
@Composable
private fun Radio(
option: ListPreferenceOption,
- selectedId: IntState,
- enabledState: State<Boolean>,
+ selectedId: Int,
+ enabled: Boolean,
onIdSelected: (id: Int) -> Unit,
) {
- val selected = option.id == selectedId.intValue
- val enabled = enabledState.value
+ val selected = option.id == selectedId
Row(
modifier = Modifier
.fillMaxWidth()
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/MainSwitchPreference.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/MainSwitchPreference.kt
index 0c16c8b..35c34d4 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/MainSwitchPreference.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/MainSwitchPreference.kt
@@ -43,8 +43,8 @@
) {
InternalSwitchPreference(
title = model.title,
- checked = model.checked,
- changeable = model.changeable,
+ checked = model.checked.value,
+ changeable = model.changeable.value,
onCheckedChange = model.onCheckedChange,
paddingStart = 20.dp,
paddingEnd = 20.dp,
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/Preference.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/Preference.kt
index b6099e9..7ecbec7 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/Preference.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/Preference.kt
@@ -119,11 +119,11 @@
EntryHighlight {
BasePreference(
title = model.title,
- summary = model.summary,
+ summary = { model.summary.value },
singleLineSummary = singleLineSummary,
modifier = modifier,
icon = model.icon,
- enabled = model.enabled,
+ enabled = { model.enabled.value },
)
}
}
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SwitchPreference.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SwitchPreference.kt
index ba8c03d..f14f68c 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SwitchPreference.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SwitchPreference.kt
@@ -32,7 +32,6 @@
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import com.android.settingslib.spa.framework.compose.stateOf
-import com.android.settingslib.spa.framework.compose.toState
import com.android.settingslib.spa.framework.theme.SettingsDimension
import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.framework.util.EntryHighlight
@@ -96,10 +95,10 @@
EntryHighlight {
InternalSwitchPreference(
title = model.title,
- summary = model.summary,
+ summary = { model.summary.value },
icon = model.icon,
- checked = model.checked,
- changeable = model.changeable,
+ checked = model.checked.value,
+ changeable = model.changeable.value,
onCheckedChange = model.onCheckedChange,
)
}
@@ -108,25 +107,25 @@
@Composable
internal fun InternalSwitchPreference(
title: String,
- summary: State<String> = "".toState(),
+ summary: () -> String = { "" },
icon: @Composable (() -> Unit)? = null,
- checked: State<Boolean?>,
- changeable: State<Boolean> = true.toState(),
+ checked: Boolean?,
+ changeable: Boolean = true,
paddingStart: Dp = SettingsDimension.itemPaddingStart,
paddingEnd: Dp = SettingsDimension.itemPaddingEnd,
paddingVertical: Dp = SettingsDimension.itemPaddingVertical,
onCheckedChange: ((newChecked: Boolean) -> Unit)?,
) {
- val checkedValue = checked.value
val indication = LocalIndication.current
val onChangeWithLog = wrapOnSwitchWithLog(onCheckedChange)
- val modifier = remember(checkedValue, changeable.value) {
- if (checkedValue != null && onChangeWithLog != null) {
+ val interactionSource = remember { MutableInteractionSource() }
+ val modifier = remember(checked, changeable) {
+ if (checked != null && onChangeWithLog != null) {
Modifier.toggleable(
- value = checkedValue,
- interactionSource = MutableInteractionSource(),
+ value = checked,
+ interactionSource = interactionSource,
indication = indication,
- enabled = changeable.value,
+ enabled = changeable,
role = Role.Switch,
onValueChange = onChangeWithLog,
)
@@ -136,7 +135,7 @@
title = title,
summary = summary,
modifier = modifier,
- enabled = changeable,
+ enabled = { changeable },
paddingStart = paddingStart,
paddingEnd = paddingEnd,
paddingVertical = paddingVertical,
@@ -145,10 +144,11 @@
Spacer(Modifier.width(SettingsDimension.itemPaddingEnd))
SettingsSwitch(
checked = checked,
- changeable = changeable,
+ changeable = { changeable },
// The onCheckedChange is handled on the whole SwitchPreference.
// DO NOT set it on SettingsSwitch.
onCheckedChange = null,
+ interactionSource = interactionSource,
)
}
}
@@ -160,19 +160,19 @@
Column {
InternalSwitchPreference(
title = "Use Dark theme",
- checked = true.toState(),
+ checked = true,
onCheckedChange = {},
)
InternalSwitchPreference(
title = "Use Dark theme",
- summary = "Summary".toState(),
- checked = false.toState(),
+ summary = { "Summary" },
+ checked = false,
onCheckedChange = {},
)
InternalSwitchPreference(
title = "Use Dark theme",
- summary = "Summary".toState(),
- checked = true.toState(),
+ summary = { "Summary" },
+ checked = true,
onCheckedChange = {},
icon = @Composable {
SettingsIcon(imageVector = Icons.Outlined.AirplanemodeActive)
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetSwitchPreference.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetSwitchPreference.kt
index 63de2c8..9a6580c 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetSwitchPreference.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetSwitchPreference.kt
@@ -34,8 +34,8 @@
icon = icon,
) {
SettingsSwitch(
- checked = model.checked,
- changeable = model.changeable,
+ checked = model.checked.value,
+ changeable = { model.changeable.value },
onCheckedChange = model.onCheckedChange,
)
}
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/ProgressBar.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/ProgressBar.kt
index 0f5e935..2988be8 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/ProgressBar.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/ProgressBar.kt
@@ -95,8 +95,8 @@
fun CircularProgressBar(progress: Float, radius: Float = 40f) {
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
CircularProgressIndicator(
- progress = progress,
- modifier = Modifier.size(radius.dp, radius.dp)
+ progress = { progress },
+ modifier = Modifier.size(radius.dp, radius.dp),
)
}
}
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Switch.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Switch.kt
index 9831b91..a0da241 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Switch.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Switch.kt
@@ -16,29 +16,32 @@
package com.android.settingslib.spa.widget.ui
+import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.material3.Switch
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.State
+import androidx.compose.runtime.remember
import com.android.settingslib.spa.framework.util.wrapOnSwitchWithLog
@Composable
-fun SettingsSwitch(
- checked: State<Boolean?>,
- changeable: State<Boolean>,
+internal fun SettingsSwitch(
+ checked: Boolean?,
+ changeable: () -> Boolean,
onCheckedChange: ((newChecked: Boolean) -> Unit)? = null,
+ interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
) {
- val checkedValue = checked.value
- if (checkedValue != null) {
+ if (checked != null) {
Switch(
- checked = checkedValue,
+ checked = checked,
onCheckedChange = wrapOnSwitchWithLog(onCheckedChange),
- enabled = changeable.value,
+ enabled = changeable(),
+ interactionSource = interactionSource,
)
} else {
Switch(
checked = false,
onCheckedChange = null,
enabled = false,
+ interactionSource = interactionSource,
)
}
}
diff --git a/services/core/java/com/android/server/net/NetworkManagementService.java b/services/core/java/com/android/server/net/NetworkManagementService.java
index a5a934f..550ad5d 100644
--- a/services/core/java/com/android/server/net/NetworkManagementService.java
+++ b/services/core/java/com/android/server/net/NetworkManagementService.java
@@ -74,6 +74,7 @@
import com.android.internal.util.DumpUtils;
import com.android.internal.util.HexDump;
import com.android.modules.utils.build.SdkLevel;
+import com.android.net.flags.Flags;
import com.android.net.module.util.NetdUtils;
import com.android.net.module.util.PermissionUtils;
import com.android.server.FgThread;
@@ -1059,17 +1060,25 @@
Log.w(TAG, "setDataSaverMode(): already " + mDataSaverMode);
return true;
}
- Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "bandwidthEnableDataSaver");
+ Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "setDataSaverModeEnabled");
try {
- final boolean changed = mNetdService.bandwidthEnableDataSaver(enable);
- if (changed) {
+ if (Flags.setDataSaverViaCm()) {
+ // setDataSaverEnabled throws if it fails to set data saver.
+ mContext.getSystemService(ConnectivityManager.class)
+ .setDataSaverEnabled(enable);
mDataSaverMode = enable;
+ return true;
} else {
- Log.w(TAG, "setDataSaverMode(" + enable + "): netd command silently failed");
+ final boolean changed = mNetdService.bandwidthEnableDataSaver(enable);
+ if (changed) {
+ mDataSaverMode = enable;
+ } else {
+ Log.e(TAG, "setDataSaverMode(" + enable + "): failed to set iptables");
+ }
+ return changed;
}
- return changed;
- } catch (RemoteException e) {
- Log.w(TAG, "setDataSaverMode(" + enable + "): netd command failed", e);
+ } catch (RemoteException | IllegalStateException e) {
+ Log.e(TAG, "setDataSaverMode(" + enable + "): failed with exception", e);
return false;
} finally {
Trace.traceEnd(Trace.TRACE_TAG_NETWORK);
diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkManagementServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkManagementServiceTest.java
index af144cf..2cdfbff 100644
--- a/services/tests/servicestests/src/com/android/server/net/NetworkManagementServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/net/NetworkManagementServiceTest.java
@@ -57,6 +57,7 @@
import androidx.test.runner.AndroidJUnit4;
import com.android.internal.app.IBatteryStats;
+import com.android.net.flags.Flags;
import org.junit.After;
import org.junit.Before;
@@ -263,7 +264,11 @@
verify(mCm).addUidToMeteredNetworkDenyList(TEST_UID);
mNMService.setDataSaverModeEnabled(true);
- verify(mNetdService).bandwidthEnableDataSaver(true);
+ if (Flags.setDataSaverViaCm()) {
+ verify(mCm).setDataSaverEnabled(true);
+ } else {
+ verify(mNetdService).bandwidthEnableDataSaver(true);
+ }
mNMService.setUidOnMeteredNetworkDenylist(TEST_UID, false);
assertTrue("Should be true since data saver is on and the uid is not allowlisted",
@@ -279,7 +284,11 @@
mNMService.setUidOnMeteredNetworkAllowlist(TEST_UID, false);
verify(mCm).removeUidFromMeteredNetworkAllowList(TEST_UID);
mNMService.setDataSaverModeEnabled(false);
- verify(mNetdService).bandwidthEnableDataSaver(false);
+ if (Flags.setDataSaverViaCm()) {
+ verify(mCm).setDataSaverEnabled(false);
+ } else {
+ verify(mNetdService).bandwidthEnableDataSaver(false);
+ }
assertFalse("Network should not be restricted when data saver is off",
mNMService.isNetworkRestricted(TEST_UID));
}