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

Commit 0ac37497 authored by Jack He's avatar Jack He Committed by Automerger Merge Worker
Browse files

Merge "[le audio] Add PBP support to leaudio test app" am: 49dfb247

parents efe15e7c 49dfb247
Loading
Loading
Loading
Loading
+4 −8
Original line number Diff line number Diff line
@@ -1361,10 +1361,10 @@ public class BluetoothProxy {
        return mBroadcastStatusMutableLive;
    }

    public boolean startBroadcast(BluetoothLeAudioContentMetadata meta, byte[] code) {
    public boolean startBroadcast(BluetoothLeBroadcastSettings settings) {
        if (mBluetoothLeBroadcast == null)
            return false;
        mBluetoothLeBroadcast.startBroadcast(meta, code);
        mBluetoothLeBroadcast.startBroadcast(settings);
        return true;
    }

@@ -1379,14 +1379,10 @@ public class BluetoothProxy {
        return mBluetoothLeBroadcast.getAllBroadcastMetadata();
    }

    public boolean updateBroadcast(int broadcastId, String programInfo) {
    public boolean updateBroadcast(int broadcastId, BluetoothLeBroadcastSettings settings) {
        if (mBluetoothLeBroadcast == null) return false;

        BluetoothLeAudioContentMetadata.Builder contentBuilder =
                new BluetoothLeAudioContentMetadata.Builder();
        contentBuilder.setProgramInfo(programInfo);

        mBluetoothLeBroadcast.updateBroadcast(broadcastId, contentBuilder.build());
        mBluetoothLeBroadcast.updateBroadcast(broadcastId, settings);
        return true;
    }

+23 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.bluetooth.leaudio;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothLeAudioContentMetadata;
import android.bluetooth.BluetoothLeBroadcastChannel;
import android.bluetooth.BluetoothLeBroadcastMetadata;
import android.bluetooth.BluetoothLeBroadcastSubgroup;
@@ -29,6 +30,7 @@ import android.view.View;
import android.widget.EditText;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AlertDialog;
@@ -84,6 +86,27 @@ public class BroadcastScanActivity extends AppCompatActivity {
                        inflater.inflate(R.layout.broadcast_scan_add_encrypted_source_dialog,
                                         null);

                boolean isPublic = broadcast.isPublicBroadcast();
                TextView addr_text = alertView.findViewById(R.id.broadcast_with_pbp_text);
                addr_text.setText("Broadcast with PBP: " + (isPublic ? "Yes" : "No"));

                String name = broadcast.getBroadcastName();
                addr_text = alertView.findViewById(R.id.broadcast_name_text);
                if (isPublic && name != null) {
                    addr_text.setText("Public Name: " + name);
                } else {
                    addr_text.setVisibility(View.INVISIBLE);
                }

                BluetoothLeAudioContentMetadata publicMetadata =
                        broadcast.getPublicBroadcastMetadata();
                addr_text = alertView.findViewById(R.id.public_program_info_text);
                if (isPublic && publicMetadata != null) {
                    addr_text.setText("Public Info: " + publicMetadata.getProgramInfo());
                } else {
                    addr_text.setVisibility(View.INVISIBLE);
                }

                final EditText channels_input_text =
                        alertView.findViewById(R.id.broadcast_channel_map);

+101 −9
Original line number Diff line number Diff line
@@ -19,11 +19,14 @@ package com.android.bluetooth.leaudio;

import android.bluetooth.BluetoothLeAudioContentMetadata;
import android.bluetooth.BluetoothLeBroadcastMetadata;
import android.bluetooth.BluetoothLeBroadcastSettings;
import android.bluetooth.BluetoothLeBroadcastSubgroupSettings;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.NumberPicker;
import android.widget.TextView;
@@ -62,7 +65,10 @@ public class BroadcasterActivity extends AppCompatActivity {
                final EditText code_input_text = alertView.findViewById(R.id.broadcast_code_input);
                final EditText program_info = alertView.findViewById(R.id.broadcast_program_info_input);
                final NumberPicker contextPicker = alertView.findViewById(R.id.context_picker);

                final EditText broadcast_name = alertView.findViewById(R.id.broadcast_name_input);
                final CheckBox publicCheckbox = alertView.findViewById(R.id.is_public_checkbox);
                final EditText public_content =
                        alertView.findViewById(R.id.broadcast_public_content_input);
                // Add context type selector
                contextPicker.setMinValue(1);
                contextPicker.setMaxValue(
@@ -81,6 +87,13 @@ public class BroadcasterActivity extends AppCompatActivity {
                        contentBuilder.setProgramInfo(programInfo);
                    }

                    final BluetoothLeAudioContentMetadata.Builder publicContentBuilder =
                            new BluetoothLeAudioContentMetadata.Builder();
                    final String publicContent = public_content.getText().toString();
                    if (!publicContent.isEmpty()) {
                        publicContentBuilder.setProgramInfo(publicContent);
                    }

                    // Extract raw metadata
                    byte[] metaBuffer = contentBuilder.build().getRawMetadata();
                    ByteArrayOutputStream stream = new ByteArrayOutputStream();
@@ -93,11 +106,26 @@ public class BroadcasterActivity extends AppCompatActivity {
                    stream.write((byte)(contextValue & 0x00FF)); // Value LSB
                    stream.write((byte)((contextValue & 0xFF00) >> 8)); // Value MSB

                    if (mViewModel.startBroadcast(
                                BluetoothLeAudioContentMetadata.fromRawBytes(stream.toByteArray()),
                            code_input_text.getText() == null
                    BluetoothLeBroadcastSubgroupSettings.Builder subgroupBuilder =
                            new BluetoothLeBroadcastSubgroupSettings.Builder()
                            .setContentMetadata(BluetoothLeAudioContentMetadata
                                    .fromRawBytes(stream.toByteArray()));
                    final boolean is_public_option = publicCheckbox.isChecked();
                    final String broadcastName = broadcast_name.getText().toString();
                    BluetoothLeBroadcastSettings.Builder builder =
                            new BluetoothLeBroadcastSettings.Builder()
                                    .setPublicBroadcast(is_public_option)
                                    .setBroadcastName(broadcastName.isEmpty() ? null
                                            : broadcastName)
                                    .setBroadcastCode(code_input_text.getText() == null
                                            || code_input_text.getText().length() == 0 ? null
                                            : code_input_text.getText().toString().getBytes()))
                                            : code_input_text.getText().toString().getBytes())
                                    .setPublicBroadcastMetadata(publicContentBuilder.build());

                    // builder expect at least one subgroup setting
                    builder.addSubgroupSettings(subgroupBuilder.build());

                    if (mViewModel.startBroadcast(builder.build()))
                        Toast.makeText(BroadcasterActivity.this, "Broadcast was created.",
                                Toast.LENGTH_SHORT).show();
                });
@@ -144,7 +172,28 @@ public class BroadcasterActivity extends AppCompatActivity {
                addr_text.setText("Pa Sync Interval: " + metadata.getPaSyncInterval());

                addr_text = metaLayout.findViewById(R.id.is_encrypted_text);
                addr_text.setText("Is Encrypted: " + metadata.isEncrypted());
                addr_text.setText("Is Encrypted: " + (metadata.isEncrypted() ? "Yes" : "No"));

                boolean isPublic = metadata.isPublicBroadcast();
                addr_text = metaLayout.findViewById(R.id.is_public_text);
                addr_text.setText("Is Public Broadcast: " + (isPublic ? "Yes" : "No"));

                String name = metadata.getBroadcastName();
                addr_text = metaLayout.findViewById(R.id.broadcast_name_text);
                if (isPublic && name != null) {
                    addr_text.setText("Public Name: " + name);
                } else {
                    addr_text.setVisibility(View.INVISIBLE);
                }

                BluetoothLeAudioContentMetadata publicMetadata =
                        metadata.getPublicBroadcastMetadata();
                addr_text = metaLayout.findViewById(R.id.public_program_info_text);
                if (isPublic && publicMetadata != null) {
                    addr_text.setText("Public Info: " + publicMetadata.getProgramInfo());
                } else {
                    addr_text.setVisibility(View.INVISIBLE);
                }

                byte[] code = metadata.getBroadcastCode();
                addr_text = metaLayout.findViewById(R.id.broadcast_code_text);
@@ -170,18 +219,61 @@ public class BroadcasterActivity extends AppCompatActivity {

                LayoutInflater inflater = getLayoutInflater();
                View alertView = inflater.inflate(R.layout.broadcaster_add_broadcast_dialog, null);
                EditText program_info_input_text = alertView.findViewById(R.id.broadcast_program_info_input);
                EditText program_info_input_text =
                        alertView.findViewById(R.id.broadcast_program_info_input);
                EditText broadcast_name_input_text =
                        alertView.findViewById(R.id.broadcast_name_input);
                EditText public_content_input_text =
                        alertView.findViewById(R.id.broadcast_public_content_input);

                // The Code cannot be changed, so just hide it
                final EditText code_input_text = alertView.findViewById(R.id.broadcast_code_input);
                code_input_text.setVisibility(View.GONE);
                // Public broadcast flag cannot be changed, so just hide it
                final CheckBox public_input_checkbox =
                        alertView.findViewById(R.id.is_public_checkbox);
                public_input_checkbox.setVisibility(View.GONE);
                // Context picker cannot be changed, so just hide it
                final NumberPicker content_input_text = alertView.findViewById(R.id.context_picker);
                content_input_text.setVisibility(View.GONE);

                modifyAlert.setView(alertView)
                        .setNegativeButton("Cancel", (modifyDialog, modifyWhich) -> {
                            // Do nothing
                        }).setPositiveButton("Update", (modifyDialog, modifyWhich) -> {
                            BluetoothLeAudioContentMetadata.Builder contentBuilder =
                                    new BluetoothLeAudioContentMetadata.Builder();
                            String programInfo = program_info_input_text.getText().toString();
                            if (!programInfo.isEmpty()) {
                                contentBuilder.setProgramInfo(programInfo);
                            }

                            final BluetoothLeAudioContentMetadata.Builder publicContentBuilder =
                                    new BluetoothLeAudioContentMetadata.Builder();
                            final String publicContent =
                                    public_content_input_text.getText().toString();
                            if (!publicContent.isEmpty()) {
                                publicContentBuilder.setProgramInfo(publicContent);
                            }

                            BluetoothLeBroadcastSubgroupSettings.Builder subgroupBuilder =
                                    new BluetoothLeBroadcastSubgroupSettings.Builder()
                                    .setContentMetadata(contentBuilder.build());

                            final String broadcastName =
                                    broadcast_name_input_text.getText().toString();
                            BluetoothLeBroadcastSettings.Builder builder =
                                    new BluetoothLeBroadcastSettings.Builder()
                                            .setBroadcastName(broadcastName.isEmpty() ? null
                                                    : broadcastName)
                                            .setPublicBroadcastMetadata(
                                                    publicContentBuilder.build());

                            // builder expect at least one subgroup setting
                            builder.addSubgroupSettings(subgroupBuilder.build());

                            if (mViewModel.updateBroadcast(broadcastId,
                                    program_info_input_text.getText().toString()))
                                    builder.build()))
                                Toast.makeText(BroadcasterActivity.this, "Broadcast was updated.",
                                        Toast.LENGTH_SHORT).show();
                        });
+5 −4
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.bluetooth.leaudio;

import android.app.Application;
import android.bluetooth.BluetoothLeBroadcastMetadata;
import android.bluetooth.BluetoothLeBroadcastSettings;
import android.bluetooth.BluetoothLeAudioContentMetadata;

import androidx.annotation.NonNull;
@@ -40,16 +41,16 @@ public class BroadcasterViewModel extends AndroidViewModel {
        mBluetooth.initProfiles();
    }

    public boolean startBroadcast(BluetoothLeAudioContentMetadata meta, byte[] code) {
        return mBluetooth.startBroadcast(meta, code);
    public boolean startBroadcast(BluetoothLeBroadcastSettings settings) {
        return mBluetooth.startBroadcast(settings);
    }

    public boolean stopBroadcast(int broadcastId) {
        return mBluetooth.stopBroadcast(broadcastId);
    }

    public boolean updateBroadcast(int broadcastId, String programInfo) {
        return mBluetooth.updateBroadcast(broadcastId, programInfo);
    public boolean updateBroadcast(int broadcastId, BluetoothLeBroadcastSettings settings) {
        return mBluetooth.updateBroadcast(broadcastId, settings);
    }

    public int getMaximumNumberOfBroadcast() {
+21 −0
Original line number Diff line number Diff line
@@ -35,6 +35,27 @@
        android:layout_weight="1"
        android:text="" />

    <TextView
        android:id="@+id/is_public_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="" />

    <TextView
        android:id="@+id/broadcast_name_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="" />

    <TextView
        android:id="@+id/public_program_info_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="" />

    <TextView
        android:id="@+id/broadcast_code_text"
        android:layout_width="wrap_content"
Loading