Merge "Expand @FlaggedApi(FLAG) constants in API signature files" into main
diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java
index 0ed275c..2906d86 100644
--- a/core/java/android/util/FeatureFlagUtils.java
+++ b/core/java/android/util/FeatureFlagUtils.java
@@ -187,14 +187,6 @@
public static final String SETTINGS_FLASH_NOTIFICATIONS = "settings_flash_notifications";
/**
- * Flag to disable/enable showing udfps enroll view in settings. If it's disabled, udfps enroll
- * view is shown in system ui.
- * @hide
- */
- public static final String SETTINGS_SHOW_UDFPS_ENROLL_IN_SETTINGS =
- "settings_show_udfps_enroll_in_settings";
-
- /**
* Flag to enable lock screen credentials transfer API in Android U.
* @hide
*/
@@ -208,14 +200,6 @@
public static final String SETTINGS_REMOTE_DEVICE_CREDENTIAL_VALIDATION =
"settings_remote_device_credential_validation";
- // TODO(b/295516544): Remove this when trunk stable feature flag is available.
- /**
- * Flag to enable / disable the Private Space Settings. It's disabled by default.
- * @hide
- */
- public static final String SETTINGS_PRIVATE_SPACE_SETTINGS =
- "settings_private_space_settings";
-
private static final Map<String, String> DEFAULT_FLAGS;
@@ -258,13 +242,11 @@
DEFAULT_FLAGS.put(SETTINGS_PREFER_ACCESSIBILITY_MENU_IN_SYSTEM, "false");
DEFAULT_FLAGS.put(SETTINGS_AUDIO_ROUTING, "false");
DEFAULT_FLAGS.put(SETTINGS_FLASH_NOTIFICATIONS, "true");
- DEFAULT_FLAGS.put(SETTINGS_SHOW_UDFPS_ENROLL_IN_SETTINGS, "true");
DEFAULT_FLAGS.put(SETTINGS_ENABLE_LOCKSCREEN_TRANSFER_API, "true");
DEFAULT_FLAGS.put(SETTINGS_REMOTE_DEVICE_CREDENTIAL_VALIDATION, "true");
DEFAULT_FLAGS.put(SETTINGS_BIOMETRICS2_FINGERPRINT_SETTINGS, "false");
// TODO: b/298454866 Replace with Trunk Stable Feature Flag
DEFAULT_FLAGS.put(SETTINGS_REMOTEAUTH_ENROLLMENT_SETTINGS, "false");
- DEFAULT_FLAGS.put(SETTINGS_PRIVATE_SPACE_SETTINGS, "false");
}
private static final Set<String> PERSISTENT_FLAGS;
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/service/splitscreen/flicker/DismissSplitScreenByDividerGesturalNavPortrait.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/service/splitscreen/flicker/DismissSplitScreenByDividerGesturalNavPortrait.kt
index fa1be63..2539fd5 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/service/splitscreen/flicker/DismissSplitScreenByDividerGesturalNavPortrait.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/service/splitscreen/flicker/DismissSplitScreenByDividerGesturalNavPortrait.kt
@@ -31,7 +31,8 @@
class DismissSplitScreenByDividerGesturalNavPortrait :
DismissSplitScreenByDivider(Rotation.ROTATION_0) {
- @ExpectedScenarios(["SPLIT_SCREEN_EXIT"])
+ // TODO(b/300260196): Not detecting this scenario right now
+ @ExpectedScenarios(["ENTIRE_TRACE"])
@Test
override fun dismissSplitScreenByDivider() = super.dismissSplitScreenByDivider()
diff --git a/media/java/android/media/flags/media_better_together.aconfig b/media/java/android/media/flags/media_better_together.aconfig
index 86e53f5..83d2b61 100644
--- a/media/java/android/media/flags/media_better_together.aconfig
+++ b/media/java/android/media/flags/media_better_together.aconfig
@@ -13,3 +13,10 @@
description: "Gates whether to adjust local stream volume when the app in the foreground is the last app to play audio or adjust the volume of the last active media session that the user interacted with."
bug: "275185436"
}
+
+flag {
+ namespace: "media_solutions"
+ name: "enable_audio_policies_device_and_bluetooth_controller"
+ description: "Use Audio Policies implementation for device and Bluetooth route controllers."
+ bug: "280576228"
+}
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/editor/SettingsExposedDropdownMenuCheckBoxProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/editor/SettingsExposedDropdownMenuCheckBoxProvider.kt
index 292e002..37c8eef 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/editor/SettingsExposedDropdownMenuCheckBoxProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/editor/SettingsExposedDropdownMenuCheckBoxProvider.kt
@@ -46,21 +46,23 @@
@Composable
override fun Page(arguments: Bundle?) {
RegularScaffold(title = TITLE) {
- SettingsExposedDropdownMenuCheckBox(label = exposedDropdownMenuCheckBoxLabel,
+ SettingsExposedDropdownMenuCheckBox(
+ label = exposedDropdownMenuCheckBoxLabel,
options = options,
selectedOptionsState = remember { selectedOptionsState1 },
enabled = true,
- onselectedOptionStateChange = {})
+ onSelectedOptionStateChange = {},
+ )
}
}
fun buildInjectEntry(): SettingsEntryBuilder {
return SettingsEntryBuilder.createInject(owner = createSettingsPage()).setUiLayoutFn {
- Preference(object : PreferenceModel {
- override val title = TITLE
- override val onClick = navigator(name)
- })
- }
+ Preference(object : PreferenceModel {
+ override val title = TITLE
+ override val onClick = navigator(name)
+ })
+ }
}
}
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/SettingsExposedDropdownMenuCheckBox.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/SettingsExposedDropdownMenuCheckBox.kt
index 459a783..682b4ea 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/SettingsExposedDropdownMenuCheckBox.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/SettingsExposedDropdownMenuCheckBox.kt
@@ -52,7 +52,7 @@
options: List<String>,
selectedOptionsState: SnapshotStateList<String>,
enabled: Boolean,
- onselectedOptionStateChange: (String) -> Unit,
+ onSelectedOptionStateChange: () -> Unit,
) {
var dropDownWidth by remember { mutableStateOf(0) }
var expanded by remember { mutableStateOf(false) }
@@ -70,7 +70,7 @@
.menuAnchor()
.fillMaxWidth(),
value = selectedOptionsState.joinToString(", "),
- onValueChange = onselectedOptionStateChange,
+ onValueChange = {},
label = { Text(text = label) },
trailingIcon = {
ExposedDropdownMenuDefaults.TrailingIcon(
@@ -89,18 +89,21 @@
onDismissRequest = { expanded = false },
) {
options.forEach { option ->
- TextButton(modifier = Modifier
- .fillMaxHeight()
- .fillMaxWidth(), onClick = {
- if (selectedOptionsState.contains(option)) {
- selectedOptionsState.remove(
- option
- )
- } else {
- selectedOptionsState.add(
- option
- )
- }
+ TextButton(
+ modifier = Modifier
+ .fillMaxHeight()
+ .fillMaxWidth(),
+ onClick = {
+ if (selectedOptionsState.contains(option)) {
+ selectedOptionsState.remove(
+ option
+ )
+ } else {
+ selectedOptionsState.add(
+ option
+ )
+ }
+ onSelectedOptionStateChange()
}) {
Row(
modifier = Modifier
@@ -109,9 +112,10 @@
horizontalArrangement = Arrangement.Start,
verticalAlignment = Alignment.CenterVertically
) {
- Checkbox(checked = selectedOptionsState.contains(
- option
- ), onCheckedChange = {})
+ Checkbox(
+ checked = selectedOptionsState.contains(option),
+ onCheckedChange = null,
+ )
Text(text = option)
}
}
@@ -131,6 +135,6 @@
options = options,
selectedOptionsState = selectedOptionsState,
enabled = true,
- onselectedOptionStateChange = {})
+ onSelectedOptionStateChange = {})
}
}
\ No newline at end of file
diff --git a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/editor/SettingsExposedDropdownMenuCheckBoxTest.kt b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/editor/SettingsExposedDropdownMenuCheckBoxTest.kt
index 58bc722..b0271ae1 100644
--- a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/editor/SettingsExposedDropdownMenuCheckBoxTest.kt
+++ b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/editor/SettingsExposedDropdownMenuCheckBoxTest.kt
@@ -45,11 +45,12 @@
@Test
fun exposedDropdownMenuCheckBox_displayed() {
composeTestRule.setContent {
- SettingsExposedDropdownMenuCheckBox(label = exposedDropdownMenuCheckBoxLabel,
+ SettingsExposedDropdownMenuCheckBox(
+ label = exposedDropdownMenuCheckBoxLabel,
options = options,
selectedOptionsState = remember { selectedOptionsState1 },
enabled = true,
- onselectedOptionStateChange = {})
+ ) {}
}
composeTestRule.onNodeWithText(
exposedDropdownMenuCheckBoxLabel, substring = true
@@ -59,11 +60,12 @@
@Test
fun exposedDropdownMenuCheckBox_expanded() {
composeTestRule.setContent {
- SettingsExposedDropdownMenuCheckBox(label = exposedDropdownMenuCheckBoxLabel,
+ SettingsExposedDropdownMenuCheckBox(
+ label = exposedDropdownMenuCheckBoxLabel,
options = options,
selectedOptionsState = remember { selectedOptionsState1 },
enabled = true,
- onselectedOptionStateChange = {})
+ ) {}
}
composeTestRule.onNodeWithText(item3, substring = true).assertDoesNotExist()
composeTestRule.onNodeWithText(exposedDropdownMenuCheckBoxLabel, substring = true)
@@ -74,11 +76,12 @@
@Test
fun exposedDropdownMenuCheckBox_valueAdded() {
composeTestRule.setContent {
- SettingsExposedDropdownMenuCheckBox(label = exposedDropdownMenuCheckBoxLabel,
+ SettingsExposedDropdownMenuCheckBox(
+ label = exposedDropdownMenuCheckBoxLabel,
options = options,
selectedOptionsState = remember { selectedOptionsState1 },
enabled = true,
- onselectedOptionStateChange = {})
+ ) {}
}
composeTestRule.onNodeWithText(item3, substring = true).assertDoesNotExist()
composeTestRule.onNodeWithText(exposedDropdownMenuCheckBoxLabel, substring = true)
@@ -90,11 +93,12 @@
@Test
fun exposedDropdownMenuCheckBox_valueDeleted() {
composeTestRule.setContent {
- SettingsExposedDropdownMenuCheckBox(label = exposedDropdownMenuCheckBoxLabel,
+ SettingsExposedDropdownMenuCheckBox(
+ label = exposedDropdownMenuCheckBoxLabel,
options = options,
selectedOptionsState = remember { selectedOptionsState1 },
enabled = true,
- onselectedOptionStateChange = {})
+ ) {}
}
composeTestRule.onNodeWithText(item2, substring = true).assertIsDisplayed()
composeTestRule.onNodeWithText(exposedDropdownMenuCheckBoxLabel, substring = true)
diff --git a/packages/SystemUI/proguard_common.flags b/packages/SystemUI/proguard_common.flags
index fcf1ed8..e2d8891 100644
--- a/packages/SystemUI/proguard_common.flags
+++ b/packages/SystemUI/proguard_common.flags
@@ -3,11 +3,6 @@
# the `#inject` methods are accessed via reflection to work on ContentProviders
-keepclassmembers class * extends com.android.systemui.dagger.SysUIComponent { void inject(***); }
-# Needed for builds to properly initialize KeyFrames from xml scene
--keepclassmembers class * extends androidx.constraintlayout.motion.widget.Key {
- public <init>();
-}
-
# Needed to ensure callback field references are kept in their respective
# owning classes when the downstream callback registrars only store weak refs.
# TODO(b/264686688): Handle these cases with more targeted annotations.
@@ -56,7 +51,6 @@
public <init>(android.content.Context, android.util.AttributeSet);
}
--keep class ** extends androidx.preference.PreferenceFragment
-keep class com.android.systemui.tuner.*
# The plugins and core log subpackages act as shared libraries that might be referenced in
diff --git a/packages/SystemUI/res/layout/combined_qs_header.xml b/packages/SystemUI/res/layout/combined_qs_header.xml
index 3a15ae4..60a78d6 100644
--- a/packages/SystemUI/res/layout/combined_qs_header.xml
+++ b/packages/SystemUI/res/layout/combined_qs_header.xml
@@ -118,34 +118,37 @@
app:layout_constraintStart_toEndOf="@id/date"
app:layout_constraintTop_toTopOf="@id/clock" />
- <LinearLayout
+ <FrameLayout
android:id="@+id/shade_header_system_icons"
android:layout_width="wrap_content"
android:layout_height="@dimen/shade_header_system_icons_height"
- android:clickable="true"
- android:orientation="horizontal"
- android:gravity="center_vertical"
- android:paddingStart="@dimen/shade_header_system_icons_padding_start"
- android:paddingEnd="@dimen/shade_header_system_icons_padding_end"
- android:paddingTop="@dimen/shade_header_system_icons_padding_top"
- android:paddingBottom="@dimen/shade_header_system_icons_padding_bottom"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/privacy_container"
app:layout_constraintTop_toTopOf="@id/clock">
-
- <com.android.systemui.statusbar.phone.StatusIconContainer
- android:id="@+id/statusIcons"
- android:layout_width="0dp"
- android:layout_weight="1"
- android:layout_height="wrap_content"
- android:paddingEnd="@dimen/signal_cluster_battery_padding" />
-
- <com.android.systemui.battery.BatteryMeterView
- android:id="@+id/batteryRemainingIcon"
+ <LinearLayout
+ android:id="@+id/hover_system_icons_container"
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- app:textAppearance="@style/TextAppearance.QS.Status" />
- </LinearLayout>
+ android:layout_height="match_parent"
+ android:layout_gravity="right|center_vertical"
+ android:paddingStart="@dimen/hover_system_icons_container_padding_start"
+ android:paddingEnd="@dimen/hover_system_icons_container_padding_end"
+ android:paddingTop="@dimen/hover_system_icons_container_padding_top"
+ android:paddingBottom="@dimen/hover_system_icons_container_padding_bottom">
+
+ <com.android.systemui.statusbar.phone.StatusIconContainer
+ android:id="@+id/statusIcons"
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:layout_height="wrap_content"
+ android:paddingEnd="@dimen/signal_cluster_battery_padding" />
+
+ <com.android.systemui.battery.BatteryMeterView
+ android:id="@+id/batteryRemainingIcon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ app:textAppearance="@style/TextAppearance.QS.Status" />
+ </LinearLayout>
+ </FrameLayout>
<FrameLayout
android:id="@+id/privacy_container"
diff --git a/packages/SystemUI/res/values-sw600dp/dimens.xml b/packages/SystemUI/res/values-sw600dp/dimens.xml
index 915dcdb..1e54fc9 100644
--- a/packages/SystemUI/res/values-sw600dp/dimens.xml
+++ b/packages/SystemUI/res/values-sw600dp/dimens.xml
@@ -80,10 +80,10 @@
<dimen name="large_screen_shade_header_height">42dp</dimen>
<!-- start padding is smaller to account for status icon margins coming from drawable itself -->
- <dimen name="shade_header_system_icons_padding_start">3dp</dimen>
- <dimen name="shade_header_system_icons_padding_end">4dp</dimen>
- <dimen name="shade_header_system_icons_padding_top">2dp</dimen>
- <dimen name="shade_header_system_icons_padding_bottom">2dp</dimen>
+ <dimen name="hover_system_icons_container_padding_start">3dp</dimen>
+ <dimen name="hover_system_icons_container_padding_end">4dp</dimen>
+ <dimen name="hover_system_icons_container_padding_top">2dp</dimen>
+ <dimen name="hover_system_icons_container_padding_bottom">2dp</dimen>
<!-- Lockscreen shade transition values -->
<dimen name="lockscreen_shade_transition_by_tap_distance">200dp</dimen>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index b086ed8..ae3138e 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -496,10 +496,10 @@
<dimen name="large_screen_shade_header_min_height">@dimen/qs_header_row_min_height</dimen>
<dimen name="large_screen_shade_header_left_padding">@dimen/qs_horizontal_margin</dimen>
<dimen name="shade_header_system_icons_height">@dimen/large_screen_shade_header_min_height</dimen>
- <dimen name="shade_header_system_icons_padding_start">0dp</dimen>
- <dimen name="shade_header_system_icons_padding_end">0dp</dimen>
- <dimen name="shade_header_system_icons_padding_top">0dp</dimen>
- <dimen name="shade_header_system_icons_padding_bottom">0dp</dimen>
+ <dimen name="hover_system_icons_container_padding_start">0dp</dimen>
+ <dimen name="hover_system_icons_container_padding_end">0dp</dimen>
+ <dimen name="hover_system_icons_container_padding_top">0dp</dimen>
+ <dimen name="hover_system_icons_container_padding_bottom">0dp</dimen>
<!-- The top margin of the panel that holds the list of notifications.
On phones it's always 0dp but it's overridden in Car UI
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt
index 6564118..9a356ad 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt
@@ -135,7 +135,8 @@
private val date: TextView = header.requireViewById(R.id.date)
private val iconContainer: StatusIconContainer = header.requireViewById(R.id.statusIcons)
private val mShadeCarrierGroup: ShadeCarrierGroup = header.requireViewById(R.id.carrier_group)
- private val systemIcons: View = header.requireViewById(R.id.shade_header_system_icons)
+ private val systemIconsHoverContainer: View =
+ header.requireViewById(R.id.hover_system_icons_container)
private var roundedCorners = 0
private var cutout: DisplayCutout? = null
@@ -259,14 +260,18 @@
header.paddingRight,
header.paddingBottom
)
- systemIcons.setPaddingRelative(
+ systemIconsHoverContainer.setPaddingRelative(
resources.getDimensionPixelSize(
- R.dimen.shade_header_system_icons_padding_start
+ R.dimen.hover_system_icons_container_padding_start
),
- resources.getDimensionPixelSize(R.dimen.shade_header_system_icons_padding_top),
- resources.getDimensionPixelSize(R.dimen.shade_header_system_icons_padding_end),
resources.getDimensionPixelSize(
- R.dimen.shade_header_system_icons_padding_bottom
+ R.dimen.hover_system_icons_container_padding_top
+ ),
+ resources.getDimensionPixelSize(
+ R.dimen.hover_system_icons_container_padding_end
+ ),
+ resources.getDimensionPixelSize(
+ R.dimen.hover_system_icons_container_padding_bottom
)
)
}
@@ -330,8 +335,8 @@
demoModeController.addCallback(demoModeReceiver)
statusBarIconController.addIconGroup(iconManager)
nextAlarmController.addCallback(nextAlarmCallback)
- systemIcons.setOnHoverListener(
- statusOverlayHoverListenerFactory.createListener(systemIcons)
+ systemIconsHoverContainer.setOnHoverListener(
+ statusOverlayHoverListenerFactory.createListener(systemIconsHoverContainer)
)
}
@@ -343,7 +348,7 @@
demoModeController.removeCallback(demoModeReceiver)
statusBarIconController.removeIconGroup(iconManager)
nextAlarmController.removeCallback(nextAlarmCallback)
- systemIcons.setOnHoverListener(null)
+ systemIconsHoverContainer.setOnHoverListener(null)
}
fun disable(state1: Int, state2: Int, animate: Boolean) {
@@ -479,11 +484,11 @@
if (largeScreenActive) {
logInstantEvent("Large screen constraints set")
header.setTransition(LARGE_SCREEN_HEADER_TRANSITION_ID)
- systemIcons.setOnClickListener { shadeCollapseAction?.run() }
+ systemIconsHoverContainer.setOnClickListener { shadeCollapseAction?.run() }
} else {
logInstantEvent("Small screen constraints set")
header.setTransition(HEADER_TRANSITION_ID)
- systemIcons.setOnClickListener(null)
+ systemIconsHoverContainer.setOnClickListener(null)
}
header.jumpToState(header.startState)
updatePosition()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt
index 8f8b840..7d5f68e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt
@@ -130,7 +130,7 @@
var viewVisibility = View.GONE
var viewAlpha = 1f
- private val systemIcons = LinearLayout(context)
+ private val systemIconsHoverContainer = LinearLayout(context)
private lateinit var shadeHeaderController: ShadeHeaderController
private lateinit var carrierIconSlots: List<String>
private val configurationController = FakeConfigurationController()
@@ -150,7 +150,8 @@
.thenReturn(batteryMeterView)
whenever<StatusIconContainer>(view.requireViewById(R.id.statusIcons)).thenReturn(statusIcons)
- whenever<View>(view.requireViewById(R.id.shade_header_system_icons)).thenReturn(systemIcons)
+ whenever<View>(view.requireViewById(R.id.hover_system_icons_container))
+ .thenReturn(systemIconsHoverContainer)
viewContext = Mockito.spy(context)
whenever(view.context).thenReturn(viewContext)
@@ -457,12 +458,12 @@
}
@Test
- fun testLargeScreenActive_collapseActionRun_onSystemIconsClick() {
+ fun testLargeScreenActive_collapseActionRun_onSystemIconsHoverContainerClick() {
shadeHeaderController.largeScreenActive = true
var wasRun = false
shadeHeaderController.shadeCollapseAction = Runnable { wasRun = true }
- systemIcons.performClick()
+ systemIconsHoverContainer.performClick()
assertThat(wasRun).isTrue()
}
diff --git a/services/core/java/com/android/server/media/BluetoothRouteController.java b/services/core/java/com/android/server/media/BluetoothRouteController.java
index 66985e0..ddeeacc 100644
--- a/services/core/java/com/android/server/media/BluetoothRouteController.java
+++ b/services/core/java/com/android/server/media/BluetoothRouteController.java
@@ -24,6 +24,8 @@
import android.media.MediaRoute2Info;
import android.os.UserHandle;
+import com.android.media.flags.Flags;
+
import java.util.Collections;
import java.util.List;
import java.util.Objects;
@@ -53,15 +55,10 @@
return new NoOpBluetoothRouteController();
}
- MediaFeatureFlagManager flagManager = MediaFeatureFlagManager.getInstance();
- boolean isUsingLegacyController = flagManager.getBoolean(
- MediaFeatureFlagManager.FEATURE_AUDIO_STRATEGIES_IS_USING_LEGACY_CONTROLLER,
- true);
-
- if (isUsingLegacyController) {
- return new LegacyBluetoothRouteController(context, btAdapter, listener);
- } else {
+ if (Flags.enableAudioPoliciesDeviceAndBluetoothController()) {
return new AudioPoliciesBluetoothRouteController(context, btAdapter, listener);
+ } else {
+ return new LegacyBluetoothRouteController(context, btAdapter, listener);
}
}
diff --git a/services/core/java/com/android/server/media/DeviceRouteController.java b/services/core/java/com/android/server/media/DeviceRouteController.java
index 3875c84..e17f4a3 100644
--- a/services/core/java/com/android/server/media/DeviceRouteController.java
+++ b/services/core/java/com/android/server/media/DeviceRouteController.java
@@ -25,6 +25,8 @@
import android.media.MediaRoute2Info;
import android.os.ServiceManager;
+import com.android.media.flags.Flags;
+
/**
* Controls device routes.
*
@@ -44,18 +46,13 @@
IAudioService audioService = IAudioService.Stub.asInterface(
ServiceManager.getService(Context.AUDIO_SERVICE));
- MediaFeatureFlagManager flagManager = MediaFeatureFlagManager.getInstance();
- boolean isUsingLegacyController = flagManager.getBoolean(
- MediaFeatureFlagManager.FEATURE_AUDIO_STRATEGIES_IS_USING_LEGACY_CONTROLLER,
- true);
-
- if (isUsingLegacyController) {
- return new LegacyDeviceRouteController(context,
+ if (Flags.enableAudioPoliciesDeviceAndBluetoothController()) {
+ return new AudioPoliciesDeviceRouteController(context,
audioManager,
audioService,
onDeviceRouteChangedListener);
} else {
- return new AudioPoliciesDeviceRouteController(context,
+ return new LegacyDeviceRouteController(context,
audioManager,
audioService,
onDeviceRouteChangedListener);
diff --git a/services/core/java/com/android/server/media/MediaFeatureFlagManager.java b/services/core/java/com/android/server/media/MediaFeatureFlagManager.java
index f555505..f90f64a 100644
--- a/services/core/java/com/android/server/media/MediaFeatureFlagManager.java
+++ b/services/core/java/com/android/server/media/MediaFeatureFlagManager.java
@@ -36,7 +36,6 @@
@StringDef(
prefix = "FEATURE_",
value = {
- FEATURE_AUDIO_STRATEGIES_IS_USING_LEGACY_CONTROLLER,
FEATURE_SCANNING_MINIMUM_PACKAGE_IMPORTANCE
})
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
@@ -44,14 +43,6 @@
/* package */ @interface MediaFeatureFlag {}
/**
- * Whether to use old legacy implementation of BluetoothRouteController or new
- * 'Audio Strategies'-aware controller.
- */
- /* package */ static final @MediaFeatureFlag String
- FEATURE_AUDIO_STRATEGIES_IS_USING_LEGACY_CONTROLLER =
- "BluetoothRouteController__enable_legacy_bluetooth_routes_controller";
-
- /**
* Whether to use IMPORTANCE_FOREGROUND (i.e. 100) or IMPORTANCE_FOREGROUND_SERVICE (i.e. 125)
* as the minimum package importance for scanning.
*/
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
index 2640390..e0c0ae2 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
@@ -758,14 +758,16 @@
@Test
public void testSetScreenOffBrightnessSensorEnabled_DisplayIsInDoze() {
+ mContext.getOrCreateTestableResources().addOverride(
+ com.android.internal.R.bool.config_allowAutoBrightnessWhileDozing, false);
+ mHolder = createDisplayPowerController(DISPLAY_ID, UNIQUE_ID);
+
Settings.System.putInt(mContext.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
DisplayPowerRequest dpr = new DisplayPowerRequest();
dpr.policy = DisplayPowerRequest.POLICY_DOZE;
- mContext.getOrCreateTestableResources().addOverride(
- com.android.internal.R.bool.config_allowAutoBrightnessWhileDozing, true);
mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false);
advanceTime(1); // Run updatePowerState
diff --git a/services/tests/servicestests/src/com/android/server/media/BluetoothRouteControllerTest.java b/services/tests/servicestests/src/com/android/server/media/BluetoothRouteControllerTest.java
new file mode 100644
index 0000000..75d71da
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/media/BluetoothRouteControllerTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.server.media;
+
+import static com.android.media.flags.Flags.FLAG_ENABLE_AUDIO_POLICIES_DEVICE_AND_BLUETOOTH_CONTROLLER;
+
+import android.content.Context;
+import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.google.common.truth.Truth;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class BluetoothRouteControllerTest {
+
+ private final BluetoothRouteController.BluetoothRoutesUpdatedListener
+ mBluetoothRoutesUpdatedListener = routes -> {
+ // Empty on purpose.
+ };
+
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ mContext = InstrumentationRegistry.getInstrumentation().getContext();
+ }
+
+ @Test
+ @RequiresFlagsDisabled(FLAG_ENABLE_AUDIO_POLICIES_DEVICE_AND_BLUETOOTH_CONTROLLER)
+ public void createInstance_audioPoliciesFlagIsDisabled_createsLegacyController() {
+ BluetoothRouteController deviceRouteController =
+ BluetoothRouteController.createInstance(mContext, mBluetoothRoutesUpdatedListener);
+
+ Truth.assertThat(deviceRouteController).isInstanceOf(LegacyBluetoothRouteController.class);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(FLAG_ENABLE_AUDIO_POLICIES_DEVICE_AND_BLUETOOTH_CONTROLLER)
+ public void createInstance_audioPoliciesFlagIsEnabled_createsAudioPoliciesController() {
+ BluetoothRouteController deviceRouteController =
+ BluetoothRouteController.createInstance(mContext, mBluetoothRoutesUpdatedListener);
+
+ Truth.assertThat(deviceRouteController)
+ .isInstanceOf(AudioPoliciesBluetoothRouteController.class);
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/media/DeviceRouteControllerTest.java b/services/tests/servicestests/src/com/android/server/media/DeviceRouteControllerTest.java
new file mode 100644
index 0000000..ec4b8a8
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/media/DeviceRouteControllerTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.server.media;
+
+import static com.android.media.flags.Flags.FLAG_ENABLE_AUDIO_POLICIES_DEVICE_AND_BLUETOOTH_CONTROLLER;
+
+import android.content.Context;
+import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.google.common.truth.Truth;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class DeviceRouteControllerTest {
+
+ private final DeviceRouteController.OnDeviceRouteChangedListener mOnDeviceRouteChangedListener =
+ deviceRoute -> {
+ // Empty on purpose.
+ };
+
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ mContext = InstrumentationRegistry.getInstrumentation().getContext();
+ }
+
+ @Test
+ @RequiresFlagsDisabled(FLAG_ENABLE_AUDIO_POLICIES_DEVICE_AND_BLUETOOTH_CONTROLLER)
+ public void createInstance_audioPoliciesFlagIsDisabled_createsLegacyController() {
+ DeviceRouteController deviceRouteController =
+ DeviceRouteController.createInstance(mContext, mOnDeviceRouteChangedListener);
+
+ Truth.assertThat(deviceRouteController).isInstanceOf(LegacyDeviceRouteController.class);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(FLAG_ENABLE_AUDIO_POLICIES_DEVICE_AND_BLUETOOTH_CONTROLLER)
+ public void createInstance_audioPoliciesFlagIsEnabled_createsAudioPoliciesController() {
+ DeviceRouteController deviceRouteController =
+ DeviceRouteController.createInstance(mContext, mOnDeviceRouteChangedListener);
+
+ Truth.assertThat(deviceRouteController)
+ .isInstanceOf(AudioPoliciesDeviceRouteController.class);
+ }
+}