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

Commit 38141f92 authored by Yiyi Shen's avatar Yiyi Shen
Browse files

[Audiosharing] Impl output switch chip in audio sharing

1. The chip name is "Sharing audio"
2. The chip is disabled.

Bug: 305620450
Flag: ACONFIG com.android.settingslib.flags.enable_le_audio_sharing DEVELOPMENT
Test: atest
Change-Id: If4d66f58db4892fa08422a0a08d8d6fbe68f1d99
parent 18dfbc05
Loading
Loading
Loading
Loading
+87 −0
Original line number Diff line number Diff line
<!--
  ~ 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.
  -->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:autoMirrored="true"
        android:height="24dp"
        android:width="24dp"
        android:viewportHeight="24"
        android:viewportWidth="24"
        android:tint="?android:attr/colorControlNormal">
    <path
        android:fillColor="#000000"
        android:pathData="M16.984,24H7.279L12.131,15.508L16.984,24ZM10.481,22.144H13.781L12.131,19.257L10.481,22.144Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M12.131,14.295C13.471,14.295 14.558,13.209 14.558,11.869C14.558,10.529 13.471,9.442 12.131,9.442C10.791,9.442 9.705,10.529 9.705,11.869C9.705,13.209 10.791,14.295 12.131,14.295Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M4.573,21.368C4.052,20.943 3.967,20.179 4.379,19.657C4.804,19.136 5.568,19.051 6.09,19.463C6.611,19.876 6.696,20.64 6.284,21.174C6.041,21.465 5.689,21.623 5.338,21.623C5.071,21.623 4.804,21.538 4.573,21.368Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M17.991,21.162C17.579,20.628 17.663,19.876 18.185,19.451C18.707,19.039 19.471,19.124 19.896,19.646C20.308,20.167 20.223,20.931 19.702,21.344C19.471,21.526 19.204,21.611 18.949,21.611C18.586,21.611 18.234,21.453 17.991,21.162Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M1.213,17.145C0.91,16.551 1.165,15.823 1.771,15.532C2.378,15.241 3.093,15.495 3.397,16.09C3.688,16.697 3.433,17.424 2.827,17.715C2.657,17.8 2.475,17.837 2.305,17.837C1.844,17.837 1.419,17.582 1.213,17.145Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M21.449,17.691C20.842,17.4 20.588,16.684 20.879,16.077C21.17,15.471 21.898,15.216 22.504,15.507C23.099,15.798 23.354,16.526 23.062,17.133C22.856,17.557 22.419,17.812 21.971,17.812C21.789,17.812 21.619,17.776 21.449,17.691Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M0,11.892C0,11.225 0.546,10.679 1.213,10.679C1.88,10.679 2.426,11.212 2.426,11.892C2.426,12.559 1.88,13.105 1.213,13.105C0.546,13.105 0,12.559 0,11.892Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M21.837,11.869C21.837,11.857 21.837,11.845 21.837,11.833C21.824,11.153 22.37,10.62 23.05,10.607C23.717,10.607 24.251,11.153 24.263,11.821C24.263,11.833 24.263,11.845 24.263,11.845C24.263,11.857 24.263,11.869 24.263,11.869C24.263,12.536 23.717,13.082 23.05,13.082C22.382,13.082 21.837,12.536 21.837,11.869Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M1.759,8.242C1.152,7.963 0.898,7.235 1.189,6.628C1.48,6.022 2.196,5.767 2.802,6.058C3.409,6.349 3.664,7.077 3.372,7.684C3.166,8.108 2.729,8.363 2.281,8.363C2.099,8.363 1.929,8.327 1.759,8.242Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M20.866,7.622C20.563,7.028 20.818,6.3 21.424,6.009C22.019,5.706 22.747,5.96 23.038,6.567C23.038,6.567 23.038,6.567 23.05,6.567C23.341,7.161 23.087,7.889 22.48,8.181C22.31,8.265 22.128,8.302 21.958,8.302C21.509,8.302 21.073,8.059 20.866,7.622Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M4.355,4.104C3.931,3.582 4.016,2.818 4.537,2.406C5.071,1.981 5.823,2.066 6.248,2.588C6.672,3.109 6.588,3.874 6.066,4.298C5.835,4.48 5.569,4.565 5.302,4.565C4.95,4.565 4.598,4.407 4.355,4.104Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M18.161,4.262C17.627,3.838 17.542,3.073 17.955,2.552C18.379,2.03 19.132,1.945 19.666,2.358C20.187,2.77 20.272,3.534 19.86,4.068C19.617,4.359 19.265,4.517 18.913,4.517C18.646,4.517 18.379,4.432 18.161,4.262Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M8.492,1.497C8.334,0.854 8.747,0.199 9.402,0.041C10.057,-0.105 10.7,0.308 10.858,0.963C11.003,1.606 10.591,2.261 9.948,2.407C9.851,2.431 9.754,2.443 9.669,2.443C9.123,2.443 8.613,2.067 8.492,1.497Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M14.267,2.395C13.599,2.249 13.199,1.606 13.345,0.951C13.49,0.296 14.133,-0.116 14.788,0.029C15.443,0.175 15.856,0.83 15.71,1.485C15.589,2.043 15.08,2.431 14.534,2.431C14.437,2.431 14.352,2.419 14.267,2.395Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M7,17.037C6.527,16.564 6.527,15.8 7,15.326C7.473,14.841 8.237,14.841 8.71,15.314C9.196,15.787 9.196,16.552 8.723,17.025C8.48,17.267 8.177,17.389 7.861,17.389C7.546,17.389 7.242,17.267 7,17.037Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M15.565,17.012C15.092,16.539 15.092,15.762 15.565,15.289C16.038,14.816 16.814,14.816 17.288,15.289C17.761,15.762 17.761,16.539 17.288,17.012C17.045,17.243 16.742,17.364 16.426,17.364C16.111,17.364 15.807,17.243 15.565,17.012Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M4.853,11.917C4.853,11.237 5.386,10.691 6.054,10.691C6.721,10.691 7.279,11.225 7.279,11.892C7.279,12.56 6.745,13.106 6.078,13.118C5.398,13.118 4.853,12.584 4.853,11.917Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M16.984,11.868C16.984,11.856 16.984,11.844 16.984,11.832C16.984,11.832 16.984,11.82 16.984,11.807C16.972,11.14 17.506,10.582 18.185,10.582C18.852,10.57 19.398,11.116 19.41,11.783C19.41,11.795 19.41,11.82 19.41,11.832C19.41,11.844 19.41,11.856 19.41,11.868C19.41,12.535 18.865,13.081 18.197,13.081C17.53,13.081 16.984,12.535 16.984,11.868Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M6.952,8.471C6.478,7.997 6.478,7.233 6.952,6.76C6.952,6.76 6.952,6.76 6.939,6.76C7.413,6.275 8.189,6.275 8.662,6.748C9.135,7.221 9.147,7.985 8.674,8.458C8.432,8.701 8.116,8.822 7.813,8.822C7.497,8.822 7.194,8.701 6.952,8.471Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M15.529,8.399C15.043,7.938 15.043,7.161 15.504,6.688C15.977,6.203 16.742,6.203 17.227,6.664C17.7,7.137 17.712,7.901 17.239,8.387C17.009,8.629 16.693,8.751 16.378,8.751C16.075,8.751 15.759,8.629 15.529,8.399Z"/>
    <path
        android:fillColor="#000000"
        android:pathData="M10.87,5.815C10.858,5.148 11.392,4.59 12.071,4.59C12.738,4.578 13.284,5.124 13.284,5.791C13.296,6.458 12.762,7.016 12.083,7.016C11.416,7.016 10.87,6.483 10.87,5.815Z"/>
</vector>
+2 −0
Original line number Diff line number Diff line
@@ -3129,6 +3129,8 @@
    <!-- [CHAR LIMIT=25] Long label used by Note Task Shortcut -->
    <string name="note_task_shortcut_long_label">Note-taking, <xliff:g id="note_taking_app" example="Note-taking App">%1$s</xliff:g></string>

    <!-- [CHAR LIMIT=NONE] Output switch chip text during broadcasting -->
    <string name="audio_sharing_description">Sharing audio</string>
    <!-- [CHAR LIMIT=NONE] Le audio broadcast dialog, media app is broadcasting -->
    <string name="broadcasting_description_is_broadcasting">Broadcasting</string>
    <!-- [CHAR LIMIT=NONE] Le audio broadcast dialog, title -->
+25 −8
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@ import androidx.annotation.MainThread
import androidx.annotation.WorkerThread
import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast
import com.android.settingslib.bluetooth.LocalBluetoothManager
import com.android.settingslib.flags.Flags.enableLeAudioSharing
import com.android.settingslib.flags.Flags.legacyLeAudioSharing
import com.android.settingslib.media.LocalMediaManager
import com.android.settingslib.media.MediaDevice
import com.android.settingslib.media.PhoneMediaDevice
@@ -332,6 +334,19 @@ constructor(
        @WorkerThread
        private fun updateCurrent() {
            if (isLeAudioBroadcastEnabled()) {
                if (enableLeAudioSharing()) {
                    current =
                        MediaDeviceData(
                            enabled = false,
                            icon =
                                context.getDrawable(
                                    com.android.settingslib.R.drawable.ic_bt_le_audio_sharing
                                ),
                            name = context.getString(R.string.audio_sharing_description),
                            intent = null,
                            showBroadcastButton = false
                        )
                } else {
                    current =
                        MediaDeviceData(
                            /* enabled */ true,
@@ -340,6 +355,7 @@ constructor(
                            /* intent */ null,
                            /* showBroadcastButton */ showBroadcastButton = true
                        )
                }
            } else {
                val aboutToConnect = aboutToConnectDeviceOverride
                if (
@@ -420,6 +436,7 @@ constructor(

        @WorkerThread
        private fun isLeAudioBroadcastEnabled(): Boolean {
            if (!enableLeAudioSharing() && !legacyLeAudioSharing()) return false
            val localBluetoothManager = localBluetoothManager.get()
            if (localBluetoothManager != null) {
                val profileManager = localBluetoothManager.profileManager
+88 −2
Original line number Diff line number Diff line
@@ -27,12 +27,16 @@ import android.media.RoutingSessionInfo
import android.media.session.MediaController
import android.media.session.MediaController.PlaybackInfo
import android.media.session.MediaSession
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.DeviceFlagsValueProvider
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import androidx.test.filters.SmallTest
import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast
import com.android.settingslib.bluetooth.LocalBluetoothManager
import com.android.settingslib.bluetooth.LocalBluetoothProfileManager
import com.android.settingslib.flags.Flags
import com.android.settingslib.media.LocalMediaManager
import com.android.settingslib.media.MediaDevice
import com.android.settingslib.media.PhoneMediaDevice
@@ -83,6 +87,7 @@ private const val NORMAL_APP_NAME = "NORMAL_APP_NAME"
@RunWith(AndroidTestingRunner::class)
@TestableLooper.RunWithLooper
public class MediaDeviceManagerTest : SysuiTestCase() {
    @get:Rule val checkFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()

    private lateinit var manager: MediaDeviceManager
    @Mock private lateinit var controllerFactory: MediaControllerFactory
@@ -668,7 +673,28 @@ public class MediaDeviceManagerTest : SysuiTestCase() {
    }

    @Test
    fun onBroadcastStarted_currentMediaDeviceDataIsBroadcasting() {
    fun onBroadcastStarted_flagOff_currentMediaDeviceDataIsBroadcasting() {
        mSetFlagsRule.disableFlags(Flags.FLAG_LEGACY_LE_AUDIO_SHARING)
        mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
        val broadcastCallback = setupBroadcastCallback()
        setupLeAudioConfiguration(true)
        setupBroadcastPackage(BROADCAST_APP_NAME)
        broadcastCallback.onBroadcastStarted(1, 1)

        manager.onMediaDataLoaded(KEY, null, mediaData)
        fakeBgExecutor.runAllReady()
        fakeFgExecutor.runAllReady()

        val data = captureDeviceData(KEY)
        assertThat(data.showBroadcastButton).isFalse()
        assertThat(data.enabled).isTrue()
        assertThat(data.name).isEqualTo(DEVICE_NAME)
    }

    @Test
    @EnableFlags(Flags.FLAG_LEGACY_LE_AUDIO_SHARING)
    @DisableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
    fun onBroadcastStarted_legacy_currentMediaDeviceDataIsBroadcasting() {
        val broadcastCallback = setupBroadcastCallback()
        setupLeAudioConfiguration(true)
        setupBroadcastPackage(BROADCAST_APP_NAME)
@@ -686,7 +712,9 @@ public class MediaDeviceManagerTest : SysuiTestCase() {
    }

    @Test
    fun onBroadcastStarted_currentMediaDeviceDataIsNotBroadcasting() {
    @EnableFlags(Flags.FLAG_LEGACY_LE_AUDIO_SHARING)
    @DisableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
    fun onBroadcastStarted_legacy_currentMediaDeviceDataIsNotBroadcasting() {
        val broadcastCallback = setupBroadcastCallback()
        setupLeAudioConfiguration(true)
        setupBroadcastPackage(NORMAL_APP_NAME)
@@ -703,6 +731,62 @@ public class MediaDeviceManagerTest : SysuiTestCase() {
    }

    @Test
    @EnableFlags(Flags.FLAG_LEGACY_LE_AUDIO_SHARING)
    @DisableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
    fun onBroadcastStopped_legacy_bluetoothLeBroadcastIsDisabledAndBroadcastingButtonIsGone() {
        val broadcastCallback = setupBroadcastCallback()
        setupLeAudioConfiguration(false)
        broadcastCallback.onBroadcastStopped(1, 1)

        manager.onMediaDataLoaded(KEY, null, mediaData)
        fakeBgExecutor.runAllReady()
        fakeFgExecutor.runAllReady()

        val data = captureDeviceData(KEY)
        assertThat(data.showBroadcastButton).isFalse()
    }

    @Test
    @DisableFlags(Flags.FLAG_LEGACY_LE_AUDIO_SHARING)
    @EnableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
    fun onBroadcastStarted_currentMediaDeviceDataIsBroadcasting() {
        val broadcastCallback = setupBroadcastCallback()
        setupLeAudioConfiguration(true)
        setupBroadcastPackage(BROADCAST_APP_NAME)
        broadcastCallback.onBroadcastStarted(1, 1)

        manager.onMediaDataLoaded(KEY, null, mediaData)
        fakeBgExecutor.runAllReady()
        fakeFgExecutor.runAllReady()

        val data = captureDeviceData(KEY)
        assertThat(data.showBroadcastButton).isFalse()
        assertThat(data.enabled).isFalse()
        assertThat(data.name).isEqualTo(context.getString(R.string.audio_sharing_description))
    }

    @Test
    @DisableFlags(Flags.FLAG_LEGACY_LE_AUDIO_SHARING)
    @EnableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
    fun onBroadcastStarted_currentMediaDeviceDataIsNotBroadcasting() {
        val broadcastCallback = setupBroadcastCallback()
        setupLeAudioConfiguration(true)
        setupBroadcastPackage(NORMAL_APP_NAME)
        broadcastCallback.onBroadcastStarted(1, 1)

        manager.onMediaDataLoaded(KEY, null, mediaData)
        fakeBgExecutor.runAllReady()
        fakeFgExecutor.runAllReady()

        val data = captureDeviceData(KEY)
        assertThat(data.showBroadcastButton).isFalse()
        assertThat(data.enabled).isFalse()
        assertThat(data.name).isEqualTo(context.getString(R.string.audio_sharing_description))
    }

    @Test
    @DisableFlags(Flags.FLAG_LEGACY_LE_AUDIO_SHARING)
    @EnableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
    fun onBroadcastStopped_bluetoothLeBroadcastIsDisabledAndBroadcastingButtonIsGone() {
        val broadcastCallback = setupBroadcastCallback()
        setupLeAudioConfiguration(false)
@@ -714,6 +798,8 @@ public class MediaDeviceManagerTest : SysuiTestCase() {

        val data = captureDeviceData(KEY)
        assertThat(data.showBroadcastButton).isFalse()
        assertThat(data.name?.equals(context.getString(R.string.audio_sharing_description)))
            .isFalse()
    }

    private fun captureCallback(): LocalMediaManager.DeviceCallback {