Merge "Revert "Migrate HearingDevicesTile"" into main
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/HearingDevicesTileMapperTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/HearingDevicesTileMapperTest.kt
deleted file mode 100644
index cdf6bda..0000000
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/HearingDevicesTileMapperTest.kt
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * 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.systemui.qs.tiles.impl.hearingdevices.domain
-
-import android.graphics.drawable.TestStubDrawable
-import android.widget.Switch
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.common.shared.model.Icon
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.qs.tiles.impl.custom.QSTileStateSubject
-import com.android.systemui.qs.tiles.impl.hearingdevices.domain.model.HearingDevicesTileModel
-import com.android.systemui.qs.tiles.impl.hearingdevices.qsHearingDevicesTileConfig
-import com.android.systemui.qs.tiles.viewmodel.QSTileState
-import com.android.systemui.res.R
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class HearingDevicesTileMapperTest : SysuiTestCase() {
-    private val kosmos = Kosmos()
-    private val qsTileConfig = kosmos.qsHearingDevicesTileConfig
-    private val mapper by lazy {
-        HearingDevicesTileMapper(
-            context.orCreateTestableResources
-                .apply { addOverride(R.drawable.qs_hearing_devices_icon, TestStubDrawable()) }
-                .resources,
-            context.theme,
-        )
-    }
-
-    @Test
-    fun map_anyActiveHearingDevice_anyPairedHearingDevice_activeState() {
-        val tileState: QSTileState =
-            mapper.map(
-                qsTileConfig,
-                HearingDevicesTileModel(
-                    isAnyActiveHearingDevice = true,
-                    isAnyPairedHearingDevice = true,
-                ),
-            )
-        val expectedState =
-            createHearingDevicesTileState(
-                QSTileState.ActivationState.ACTIVE,
-                context.getString(R.string.quick_settings_hearing_devices_connected),
-            )
-        QSTileStateSubject.assertThat(tileState).isEqualTo(expectedState)
-    }
-
-    @Test
-    fun map_noActiveHearingDevice_anyPairedHearingDevice_inactiveState() {
-        val tileState: QSTileState =
-            mapper.map(
-                qsTileConfig,
-                HearingDevicesTileModel(
-                    isAnyActiveHearingDevice = false,
-                    isAnyPairedHearingDevice = true,
-                ),
-            )
-        val expectedState =
-            createHearingDevicesTileState(
-                QSTileState.ActivationState.INACTIVE,
-                context.getString(R.string.quick_settings_hearing_devices_disconnected),
-            )
-        QSTileStateSubject.assertThat(tileState).isEqualTo(expectedState)
-    }
-
-    @Test
-    fun map_noActiveHearingDevice_noPairedHearingDevice_inactiveState() {
-        val tileState: QSTileState =
-            mapper.map(
-                qsTileConfig,
-                HearingDevicesTileModel(
-                    isAnyActiveHearingDevice = false,
-                    isAnyPairedHearingDevice = false,
-                ),
-            )
-        val expectedState =
-            createHearingDevicesTileState(QSTileState.ActivationState.INACTIVE, secondaryLabel = "")
-        QSTileStateSubject.assertThat(tileState).isEqualTo(expectedState)
-    }
-
-    private fun createHearingDevicesTileState(
-        activationState: QSTileState.ActivationState,
-        secondaryLabel: String,
-    ): QSTileState {
-        val label = context.getString(R.string.quick_settings_hearing_devices_label)
-        val iconRes = R.drawable.qs_hearing_devices_icon
-        return QSTileState(
-            { Icon.Loaded(context.getDrawable(iconRes)!!, null) },
-            iconRes,
-            label,
-            activationState,
-            secondaryLabel,
-            setOf(QSTileState.UserAction.CLICK, QSTileState.UserAction.LONG_CLICK),
-            label,
-            null,
-            QSTileState.SideViewIcon.Chevron,
-            QSTileState.EnabledState.ENABLED,
-            Switch::class.qualifiedName,
-        )
-    }
-}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/interactor/HearingDevicesTileDataInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/interactor/HearingDevicesTileDataInteractorTest.kt
deleted file mode 100644
index 1dfa2cd..0000000
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/interactor/HearingDevicesTileDataInteractorTest.kt
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * 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.systemui.qs.tiles.impl.hearingdevices.domain.interactor
-
-import android.os.UserHandle
-import android.platform.test.annotations.DisableFlags
-import android.platform.test.annotations.EnableFlags
-import android.platform.test.annotations.EnabledOnRavenwood
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.Flags
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.accessibility.hearingaid.HearingDevicesChecker
-import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.coroutines.collectValues
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.kosmos.testScope
-import com.android.systemui.qs.tiles.base.interactor.DataUpdateTrigger
-import com.android.systemui.qs.tiles.impl.hearingdevices.domain.model.HearingDevicesTileModel
-import com.android.systemui.statusbar.policy.fakeBluetoothController
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.flowOf
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mock
-import org.mockito.junit.MockitoJUnit
-import org.mockito.junit.MockitoRule
-import org.mockito.kotlin.whenever
-
-@OptIn(ExperimentalCoroutinesApi::class)
-@SmallTest
-@EnabledOnRavenwood
-@RunWith(AndroidJUnit4::class)
-class HearingDevicesTileDataInteractorTest : SysuiTestCase() {
-    private val kosmos = Kosmos()
-    private val testScope = kosmos.testScope
-    private val testUser = UserHandle.of(1)
-
-    private val controller = kosmos.fakeBluetoothController
-    private lateinit var underTest: HearingDevicesTileDataInteractor
-
-    @Rule @JvmField val mockitoRule: MockitoRule = MockitoJUnit.rule()
-    @Mock private lateinit var checker: HearingDevicesChecker
-
-    @Before
-    fun setup() {
-        underTest = HearingDevicesTileDataInteractor(testScope.testScheduler, controller, checker)
-    }
-
-    @EnableFlags(Flags.FLAG_HEARING_AIDS_QS_TILE_DIALOG)
-    @Test
-    fun availability_flagEnabled_returnTrue() =
-        testScope.runTest {
-            val availability by collectLastValue(underTest.availability(testUser))
-
-            assertThat(availability).isTrue()
-        }
-
-    @DisableFlags(Flags.FLAG_HEARING_AIDS_QS_TILE_DIALOG)
-    @Test
-    fun availability_flagDisabled_returnFalse() =
-        testScope.runTest {
-            val availability by collectLastValue(underTest.availability(testUser))
-
-            assertThat(availability).isFalse()
-        }
-
-    @Test
-    fun tileData_bluetoothStateChanged_dataMatchesChecker() =
-        testScope.runTest {
-            val flowValues: List<HearingDevicesTileModel> by
-                collectValues(
-                    underTest.tileData(testUser, flowOf(DataUpdateTrigger.InitialRequest))
-                )
-            runCurrent()
-            assertThat(flowValues.size).isEqualTo(1) // from addCallback in setup()
-
-            whenever(checker.isAnyPairedHearingDevice).thenReturn(false)
-            whenever(checker.isAnyActiveHearingDevice).thenReturn(false)
-            controller.isBluetoothEnabled = false
-            runCurrent()
-            assertThat(flowValues.size).isEqualTo(1) // model unchanged, no new flow value
-
-            whenever(checker.isAnyPairedHearingDevice).thenReturn(true)
-            whenever(checker.isAnyActiveHearingDevice).thenReturn(false)
-            controller.isBluetoothEnabled = true
-            runCurrent()
-            assertThat(flowValues.size).isEqualTo(2)
-
-            whenever(checker.isAnyPairedHearingDevice).thenReturn(true)
-            whenever(checker.isAnyActiveHearingDevice).thenReturn(true)
-            controller.isBluetoothEnabled = true
-            runCurrent()
-            assertThat(flowValues.size).isEqualTo(3)
-
-            assertThat(flowValues.map { it.isAnyPairedHearingDevice })
-                .containsExactly(false, true, true)
-                .inOrder()
-            assertThat(flowValues.map { it.isAnyActiveHearingDevice })
-                .containsExactly(false, false, true)
-                .inOrder()
-        }
-
-    @Test
-    fun tileData_bluetoothDeviceChanged_dataMatchesChecker() =
-        testScope.runTest {
-            val flowValues: List<HearingDevicesTileModel> by
-                collectValues(
-                    underTest.tileData(testUser, flowOf(DataUpdateTrigger.InitialRequest))
-                )
-            runCurrent()
-            assertThat(flowValues.size).isEqualTo(1) // from addCallback in setup()
-
-            whenever(checker.isAnyPairedHearingDevice).thenReturn(false)
-            whenever(checker.isAnyActiveHearingDevice).thenReturn(false)
-            controller.onBluetoothDevicesChanged()
-            runCurrent()
-            assertThat(flowValues.size).isEqualTo(1) // model unchanged, no new flow value
-
-            whenever(checker.isAnyPairedHearingDevice).thenReturn(true)
-            whenever(checker.isAnyActiveHearingDevice).thenReturn(false)
-            controller.onBluetoothDevicesChanged()
-            runCurrent()
-            assertThat(flowValues.size).isEqualTo(2)
-
-            whenever(checker.isAnyPairedHearingDevice).thenReturn(true)
-            whenever(checker.isAnyActiveHearingDevice).thenReturn(true)
-            controller.onBluetoothDevicesChanged()
-            runCurrent()
-            assertThat(flowValues.size).isEqualTo(3)
-
-            assertThat(flowValues.map { it.isAnyPairedHearingDevice })
-                .containsExactly(false, true, true)
-                .inOrder()
-            assertThat(flowValues.map { it.isAnyActiveHearingDevice })
-                .containsExactly(false, false, true)
-                .inOrder()
-        }
-}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/interactor/HearingDevicesTileUserActionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/interactor/HearingDevicesTileUserActionInteractorTest.kt
deleted file mode 100644
index 00ee1c3..0000000
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/interactor/HearingDevicesTileUserActionInteractorTest.kt
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * 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.systemui.qs.tiles.impl.hearingdevices.domain.interactor
-
-import android.platform.test.annotations.EnabledOnRavenwood
-import android.provider.Settings
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.accessibility.hearingaid.HearingDevicesDialogManager
-import com.android.systemui.accessibility.hearingaid.HearingDevicesUiEventLogger.Companion.LAUNCH_SOURCE_QS_TILE
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.kosmos.testScope
-import com.android.systemui.qs.tiles.base.actions.FakeQSTileIntentUserInputHandler
-import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandlerSubject
-import com.android.systemui.qs.tiles.base.interactor.QSTileInputTestKtx
-import com.android.systemui.qs.tiles.impl.hearingdevices.domain.model.HearingDevicesTileModel
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentMatchers.eq
-import org.mockito.Mock
-import org.mockito.junit.MockitoJUnit
-import org.mockito.junit.MockitoRule
-import org.mockito.kotlin.anyOrNull
-import org.mockito.kotlin.verify
-
-@SmallTest
-@EnabledOnRavenwood
-@RunWith(AndroidJUnit4::class)
-class HearingDevicesTileUserActionInteractorTest : SysuiTestCase() {
-    private val kosmos = Kosmos()
-    private val testScope = kosmos.testScope
-    private val inputHandler = FakeQSTileIntentUserInputHandler()
-
-    private lateinit var underTest: HearingDevicesTileUserActionInteractor
-
-    @Rule @JvmField val mockitoRule: MockitoRule = MockitoJUnit.rule()
-    @Mock private lateinit var dialogManager: HearingDevicesDialogManager
-
-    @Before
-    fun setUp() {
-        underTest =
-            HearingDevicesTileUserActionInteractor(
-                testScope.coroutineContext,
-                inputHandler,
-                dialogManager,
-            )
-    }
-
-    @Test
-    fun handleClick_launchDialog() =
-        testScope.runTest {
-            val input =
-                HearingDevicesTileModel(
-                    isAnyActiveHearingDevice = true,
-                    isAnyPairedHearingDevice = true,
-                )
-
-            underTest.handleInput(QSTileInputTestKtx.click(input))
-
-            verify(dialogManager).showDialog(anyOrNull(), eq(LAUNCH_SOURCE_QS_TILE))
-        }
-
-    @Test
-    fun handleLongClick_launchSettings() =
-        testScope.runTest {
-            val input =
-                HearingDevicesTileModel(
-                    isAnyActiveHearingDevice = true,
-                    isAnyPairedHearingDevice = true,
-                )
-
-            underTest.handleInput(QSTileInputTestKtx.longClick(input))
-
-            QSTileIntentUserInputHandlerSubject.assertThat(inputHandler).handledOneIntentInput {
-                assertThat(it.intent.action).isEqualTo(Settings.ACTION_HEARING_DEVICES_SETTINGS)
-            }
-        }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/qs/QSAccessibilityModule.kt b/packages/SystemUI/src/com/android/systemui/accessibility/qs/QSAccessibilityModule.kt
index 610e3f8a..cd9efaf 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/qs/QSAccessibilityModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/qs/QSAccessibilityModule.kt
@@ -39,10 +39,6 @@
 import com.android.systemui.qs.tiles.impl.fontscaling.domain.interactor.FontScalingTileDataInteractor
 import com.android.systemui.qs.tiles.impl.fontscaling.domain.interactor.FontScalingTileUserActionInteractor
 import com.android.systemui.qs.tiles.impl.fontscaling.domain.model.FontScalingTileModel
-import com.android.systemui.qs.tiles.impl.hearingdevices.domain.HearingDevicesTileMapper
-import com.android.systemui.qs.tiles.impl.hearingdevices.domain.interactor.HearingDevicesTileDataInteractor
-import com.android.systemui.qs.tiles.impl.hearingdevices.domain.interactor.HearingDevicesTileUserActionInteractor
-import com.android.systemui.qs.tiles.impl.hearingdevices.domain.model.HearingDevicesTileModel
 import com.android.systemui.qs.tiles.impl.inversion.domain.ColorInversionTileMapper
 import com.android.systemui.qs.tiles.impl.inversion.domain.interactor.ColorInversionTileDataInteractor
 import com.android.systemui.qs.tiles.impl.inversion.domain.interactor.ColorInversionUserActionInteractor
@@ -163,13 +159,6 @@
         impl: NightDisplayTileDataInteractor
     ): QSTileAvailabilityInteractor
 
-    @Binds
-    @IntoMap
-    @StringKey(HEARING_DEVICES_TILE_SPEC)
-    fun provideHearingDevicesAvailabilityInteractor(
-        impl: HearingDevicesTileDataInteractor
-    ): QSTileAvailabilityInteractor
-
     companion object {
         const val COLOR_CORRECTION_TILE_SPEC = "color_correction"
         const val COLOR_INVERSION_TILE_SPEC = "inversion"
@@ -202,7 +191,7 @@
             factory: QSTileViewModelFactory.Static<ColorCorrectionTileModel>,
             mapper: ColorCorrectionTileMapper,
             stateInteractor: ColorCorrectionTileDataInteractor,
-            userActionInteractor: ColorCorrectionUserActionInteractor,
+            userActionInteractor: ColorCorrectionUserActionInteractor
         ): QSTileViewModel =
             factory.create(
                 TileSpec.create(COLOR_CORRECTION_TILE_SPEC),
@@ -234,7 +223,7 @@
             factory: QSTileViewModelFactory.Static<ColorInversionTileModel>,
             mapper: ColorInversionTileMapper,
             stateInteractor: ColorInversionTileDataInteractor,
-            userActionInteractor: ColorInversionUserActionInteractor,
+            userActionInteractor: ColorInversionUserActionInteractor
         ): QSTileViewModel =
             factory.create(
                 TileSpec.create(COLOR_INVERSION_TILE_SPEC),
@@ -266,7 +255,7 @@
             factory: QSTileViewModelFactory.Static<FontScalingTileModel>,
             mapper: FontScalingTileMapper,
             stateInteractor: FontScalingTileDataInteractor,
-            userActionInteractor: FontScalingTileUserActionInteractor,
+            userActionInteractor: FontScalingTileUserActionInteractor
         ): QSTileViewModel =
             factory.create(
                 TileSpec.create(FONT_SCALING_TILE_SPEC),
@@ -290,6 +279,21 @@
                 category = TileCategory.DISPLAY,
             )
 
+        @Provides
+        @IntoMap
+        @StringKey(HEARING_DEVICES_TILE_SPEC)
+        fun provideHearingDevicesTileConfig(uiEventLogger: QsEventLogger): QSTileConfig =
+            QSTileConfig(
+                tileSpec = TileSpec.create(HEARING_DEVICES_TILE_SPEC),
+                uiConfig =
+                    QSTileUIConfig.Resource(
+                        iconRes = R.drawable.qs_hearing_devices_icon,
+                        labelRes = R.string.quick_settings_hearing_devices_label,
+                    ),
+                instanceId = uiEventLogger.getNewInstanceId(),
+                category = TileCategory.ACCESSIBILITY,
+            )
+
         /**
          * Inject Reduce Bright Colors Tile into tileViewModelMap in QSModule. The tile is hidden
          * behind a flag.
@@ -301,7 +305,7 @@
             factory: QSTileViewModelFactory.Static<ReduceBrightColorsTileModel>,
             mapper: ReduceBrightColorsTileMapper,
             stateInteractor: ReduceBrightColorsTileDataInteractor,
-            userActionInteractor: ReduceBrightColorsTileUserActionInteractor,
+            userActionInteractor: ReduceBrightColorsTileUserActionInteractor
         ): QSTileViewModel =
             if (Flags.qsNewTilesFuture())
                 factory.create(
@@ -335,7 +339,7 @@
             factory: QSTileViewModelFactory.Static<OneHandedModeTileModel>,
             mapper: OneHandedModeTileMapper,
             stateInteractor: OneHandedModeTileDataInteractor,
-            userActionInteractor: OneHandedModeTileUserActionInteractor,
+            userActionInteractor: OneHandedModeTileUserActionInteractor
         ): QSTileViewModel =
             if (Flags.qsNewTilesFuture())
                 factory.create(
@@ -372,7 +376,7 @@
             factory: QSTileViewModelFactory.Static<NightDisplayTileModel>,
             mapper: NightDisplayTileMapper,
             stateInteractor: NightDisplayTileDataInteractor,
-            userActionInteractor: NightDisplayTileUserActionInteractor,
+            userActionInteractor: NightDisplayTileUserActionInteractor
         ): QSTileViewModel =
             if (Flags.qsNewTilesFuture())
                 factory.create(
@@ -382,43 +386,5 @@
                     mapper,
                 )
             else StubQSTileViewModel
-
-        @Provides
-        @IntoMap
-        @StringKey(HEARING_DEVICES_TILE_SPEC)
-        fun provideHearingDevicesTileConfig(uiEventLogger: QsEventLogger): QSTileConfig =
-            QSTileConfig(
-                tileSpec = TileSpec.create(HEARING_DEVICES_TILE_SPEC),
-                uiConfig =
-                    QSTileUIConfig.Resource(
-                        iconRes = R.drawable.qs_hearing_devices_icon,
-                        labelRes = R.string.quick_settings_hearing_devices_label,
-                    ),
-                instanceId = uiEventLogger.getNewInstanceId(),
-                category = TileCategory.ACCESSIBILITY,
-            )
-
-        /**
-         * Inject HearingDevices Tile into tileViewModelMap in QSModule. The tile is hidden behind a
-         * flag.
-         */
-        @Provides
-        @IntoMap
-        @StringKey(HEARING_DEVICES_TILE_SPEC)
-        fun provideHearingDevicesTileViewModel(
-            factory: QSTileViewModelFactory.Static<HearingDevicesTileModel>,
-            mapper: HearingDevicesTileMapper,
-            stateInteractor: HearingDevicesTileDataInteractor,
-            userActionInteractor: HearingDevicesTileUserActionInteractor,
-        ): QSTileViewModel {
-            return if (Flags.hearingAidsQsTileDialog() && Flags.qsNewTilesFuture()) {
-                factory.create(
-                    TileSpec.create(HEARING_DEVICES_TILE_SPEC),
-                    userActionInteractor,
-                    stateInteractor,
-                    mapper,
-                )
-            } else StubQSTileViewModel
-        }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/HearingDevicesTileMapper.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/HearingDevicesTileMapper.kt
deleted file mode 100644
index 8dd611f..0000000
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/HearingDevicesTileMapper.kt
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * 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.systemui.qs.tiles.impl.hearingdevices.domain
-
-import android.content.res.Resources
-import com.android.systemui.common.shared.model.Icon
-import com.android.systemui.dagger.qualifiers.Main
-import com.android.systemui.qs.tiles.base.interactor.QSTileDataToStateMapper
-import com.android.systemui.qs.tiles.impl.hearingdevices.domain.model.HearingDevicesTileModel
-import com.android.systemui.qs.tiles.viewmodel.QSTileConfig
-import com.android.systemui.qs.tiles.viewmodel.QSTileState
-import com.android.systemui.res.R
-import javax.inject.Inject
-
-/** Maps [HearingDevicesTileModel] to [QSTileState]. */
-class HearingDevicesTileMapper
-@Inject
-constructor(@Main private val resources: Resources, private val theme: Resources.Theme) :
-    QSTileDataToStateMapper<HearingDevicesTileModel> {
-
-    override fun map(config: QSTileConfig, data: HearingDevicesTileModel): QSTileState =
-        QSTileState.build(resources, theme, config.uiConfig) {
-            label = resources.getString(R.string.quick_settings_hearing_devices_label)
-            iconRes = R.drawable.qs_hearing_devices_icon
-            val loadedIcon =
-                Icon.Loaded(resources.getDrawable(iconRes!!, theme), contentDescription = null)
-            icon = { loadedIcon }
-            sideViewIcon = QSTileState.SideViewIcon.Chevron
-            contentDescription = label
-            if (data.isAnyActiveHearingDevice) {
-                activationState = QSTileState.ActivationState.ACTIVE
-                secondaryLabel =
-                    resources.getString(R.string.quick_settings_hearing_devices_connected)
-            } else if (data.isAnyPairedHearingDevice) {
-                activationState = QSTileState.ActivationState.INACTIVE
-                secondaryLabel =
-                    resources.getString(R.string.quick_settings_hearing_devices_disconnected)
-            } else {
-                activationState = QSTileState.ActivationState.INACTIVE
-                secondaryLabel = ""
-            }
-            supportedActions =
-                setOf(QSTileState.UserAction.CLICK, QSTileState.UserAction.LONG_CLICK)
-        }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/interactor/HearingDevicesTileDataInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/interactor/HearingDevicesTileDataInteractor.kt
deleted file mode 100644
index be8a618..0000000
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/interactor/HearingDevicesTileDataInteractor.kt
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.systemui.qs.tiles.impl.hearingdevices.domain.interactor
-
-import android.os.UserHandle
-import com.android.app.tracing.coroutines.flow.flowOn
-import com.android.systemui.Flags
-import com.android.systemui.accessibility.hearingaid.HearingDevicesChecker
-import com.android.systemui.dagger.qualifiers.Background
-import com.android.systemui.qs.tiles.base.interactor.DataUpdateTrigger
-import com.android.systemui.qs.tiles.base.interactor.QSTileDataInteractor
-import com.android.systemui.qs.tiles.impl.hearingdevices.domain.model.HearingDevicesTileModel
-import com.android.systemui.statusbar.policy.BluetoothController
-import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
-import javax.inject.Inject
-import kotlin.coroutines.CoroutineContext
-import kotlinx.coroutines.channels.awaitClose
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.distinctUntilChanged
-import kotlinx.coroutines.flow.flowOf
-
-/** Observes hearing devices state changes providing the [HearingDevicesTileModel]. */
-class HearingDevicesTileDataInteractor
-@Inject
-constructor(
-    @Background private val backgroundContext: CoroutineContext,
-    private val bluetoothController: BluetoothController,
-    private val hearingDevicesChecker: HearingDevicesChecker,
-) : QSTileDataInteractor<HearingDevicesTileModel> {
-    override fun tileData(
-        user: UserHandle,
-        triggers: Flow<DataUpdateTrigger>,
-    ): Flow<HearingDevicesTileModel> =
-        conflatedCallbackFlow {
-                val callback =
-                    object : BluetoothController.Callback {
-                        override fun onBluetoothStateChange(enabled: Boolean) {
-                            trySend(getModel())
-                        }
-
-                        override fun onBluetoothDevicesChanged() {
-                            trySend(getModel())
-                        }
-                    }
-                bluetoothController.addCallback(callback)
-                awaitClose { bluetoothController.removeCallback(callback) }
-            }
-            .flowOn(backgroundContext)
-            .distinctUntilChanged()
-
-    override fun availability(user: UserHandle): Flow<Boolean> =
-        flowOf(Flags.hearingAidsQsTileDialog())
-
-    private fun getModel() =
-        HearingDevicesTileModel(
-            hearingDevicesChecker.isAnyActiveHearingDevice,
-            hearingDevicesChecker.isAnyPairedHearingDevice,
-        )
-}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/interactor/HearingDevicesTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/interactor/HearingDevicesTileUserActionInteractor.kt
deleted file mode 100644
index 5e7172e..0000000
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/interactor/HearingDevicesTileUserActionInteractor.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.systemui.qs.tiles.impl.hearingdevices.domain.interactor
-
-import android.content.Intent
-import android.provider.Settings
-import com.android.systemui.accessibility.hearingaid.HearingDevicesDialogManager
-import com.android.systemui.accessibility.hearingaid.HearingDevicesUiEventLogger.Companion.LAUNCH_SOURCE_QS_TILE
-import com.android.systemui.dagger.qualifiers.Main
-import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandler
-import com.android.systemui.qs.tiles.base.interactor.QSTileInput
-import com.android.systemui.qs.tiles.base.interactor.QSTileUserActionInteractor
-import com.android.systemui.qs.tiles.impl.hearingdevices.domain.model.HearingDevicesTileModel
-import com.android.systemui.qs.tiles.viewmodel.QSTileUserAction
-import javax.inject.Inject
-import kotlin.coroutines.CoroutineContext
-import kotlinx.coroutines.withContext
-
-/** Handles hearing devices tile clicks. */
-class HearingDevicesTileUserActionInteractor
-@Inject
-constructor(
-    @Main private val mainContext: CoroutineContext,
-    private val qsTileIntentUserActionHandler: QSTileIntentUserInputHandler,
-    private val hearingDevicesDialogManager: HearingDevicesDialogManager,
-) : QSTileUserActionInteractor<HearingDevicesTileModel> {
-
-    override suspend fun handleInput(input: QSTileInput<HearingDevicesTileModel>) =
-        with(input) {
-            when (action) {
-                is QSTileUserAction.Click -> {
-                    withContext(mainContext) {
-                        hearingDevicesDialogManager.showDialog(
-                            action.expandable,
-                            LAUNCH_SOURCE_QS_TILE,
-                        )
-                    }
-                }
-                is QSTileUserAction.LongClick -> {
-                    qsTileIntentUserActionHandler.handle(
-                        action.expandable,
-                        Intent(Settings.ACTION_HEARING_DEVICES_SETTINGS),
-                    )
-                }
-                is QSTileUserAction.ToggleClick -> {}
-            }
-        }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/model/HearingDevicesTileModel.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/model/HearingDevicesTileModel.kt
deleted file mode 100644
index 4e37b77..0000000
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/hearingdevices/domain/model/HearingDevicesTileModel.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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.systemui.qs.tiles.impl.hearingdevices.domain.model
-
-/** Hearing devices tile model */
-data class HearingDevicesTileModel(
-    val isAnyActiveHearingDevice: Boolean,
-    val isAnyPairedHearingDevice: Boolean,
-)
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/impl/hearingdevices/HearingDevicesTileKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/impl/hearingdevices/HearingDevicesTileKosmos.kt
deleted file mode 100644
index e16756b..0000000
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/impl/hearingdevices/HearingDevicesTileKosmos.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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.systemui.qs.tiles.impl.hearingdevices
-
-import com.android.systemui.accessibility.qs.QSAccessibilityModule
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.qs.qsEventLogger
-
-val Kosmos.qsHearingDevicesTileConfig by
-    Kosmos.Fixture { QSAccessibilityModule.provideHearingDevicesTileConfig(qsEventLogger) }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/BluetoothControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/BluetoothControllerKosmos.kt
deleted file mode 100644
index 14f4d75..0000000
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/BluetoothControllerKosmos.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * 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.systemui.statusbar.policy
-
-import com.android.systemui.kosmos.Kosmos
-
-val Kosmos.fakeBluetoothController by Kosmos.Fixture { FakeBluetoothController() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/FakeBluetoothController.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/FakeBluetoothController.kt
deleted file mode 100644
index 4876cd8..0000000
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/FakeBluetoothController.kt
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * 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.systemui.statusbar.policy
-
-import android.bluetooth.BluetoothAdapter
-import com.android.internal.annotations.VisibleForTesting
-import com.android.settingslib.bluetooth.CachedBluetoothDevice
-import com.android.systemui.statusbar.policy.BluetoothController.Callback
-import java.io.PrintWriter
-import java.util.Collections
-import java.util.concurrent.Executor
-
-class FakeBluetoothController : BluetoothController {
-
-    private var callbacks = mutableListOf<Callback>()
-    private var enabled = false
-
-    override fun addCallback(listener: Callback) {
-        callbacks += listener
-        listener.onBluetoothStateChange(isBluetoothEnabled)
-    }
-
-    override fun removeCallback(listener: Callback) {
-        callbacks -= listener
-    }
-
-    override fun dump(pw: PrintWriter, args: Array<out String>) {}
-
-    override fun isBluetoothSupported(): Boolean = false
-
-    override fun isBluetoothEnabled(): Boolean = enabled
-
-    override fun getBluetoothState(): Int = 0
-
-    override fun isBluetoothConnected(): Boolean = false
-
-    override fun isBluetoothConnecting(): Boolean = false
-
-    override fun isBluetoothAudioProfileOnly(): Boolean = false
-
-    override fun isBluetoothAudioActive(): Boolean = false
-
-    override fun getConnectedDeviceName(): String? = null
-
-    override fun setBluetoothEnabled(enabled: Boolean) {
-        this.enabled = enabled
-        callbacks.forEach { it.onBluetoothStateChange(enabled) }
-    }
-
-    override fun canConfigBluetooth(): Boolean = false
-
-    override fun getConnectedDevices(): MutableList<CachedBluetoothDevice> = Collections.emptyList()
-
-    override fun addOnMetadataChangedListener(
-        device: CachedBluetoothDevice?,
-        executor: Executor?,
-        listener: BluetoothAdapter.OnMetadataChangedListener?,
-    ) {}
-
-    override fun removeOnMetadataChangedListener(
-        device: CachedBluetoothDevice?,
-        listener: BluetoothAdapter.OnMetadataChangedListener?,
-    ) {}
-
-    /** Trigger the [Callback.onBluetoothDevicesChanged] method for all registered callbacks. */
-    @VisibleForTesting
-    fun onBluetoothDevicesChanged() {
-        callbacks.forEach { it.onBluetoothDevicesChanged() }
-    }
-}