/* * Copyright (C) 2022 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.settings.bluetooth; import android.bluetooth.BluetoothProfile; import android.content.Context; import android.content.Intent; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settingslib.bluetooth.BluetoothBroadcastUtils; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcastAssistant; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.widget.LayoutPreference; /** * This class adds a header to display the action button for joining the broadcast session * by scanning QR code and leaving the broadcast session */ public class BluetoothFindBroadcastsHeaderController extends BluetoothDetailsController { private static final String TAG = "BtFindBroadcastCtrl"; private static final String KEY_BROADCAST_HEADER = "bluetooth_find_broadcast_header"; private static final String KEY_BROADCAST_SOURCE_LIST = "broadcast_source_list"; LayoutPreference mLayoutPreference; PreferenceCategory mBroadcastSourceList; TextView mTitle; TextView mSummary; Button mBtnFindBroadcast; LinearLayout mBtnBroadcastLayout; Button mBtnLeaveBroadcast; Button mBtnScanQrCode; BluetoothFindBroadcastsFragment mBluetoothFindBroadcastsFragment; public BluetoothFindBroadcastsHeaderController(Context context, BluetoothFindBroadcastsFragment fragment, CachedBluetoothDevice device, Lifecycle lifecycle, LocalBluetoothManager bluetoothManager) { super(context, fragment, device, lifecycle); mBluetoothFindBroadcastsFragment = fragment; } @Override protected void init(PreferenceScreen screen) { mLayoutPreference = screen.findPreference(KEY_BROADCAST_HEADER); mBroadcastSourceList = screen.findPreference(KEY_BROADCAST_SOURCE_LIST); refresh(); } @Override protected void refresh() { if (mLayoutPreference == null || mCachedDevice == null) { return; } mTitle = mLayoutPreference.findViewById(R.id.entity_header_title); mTitle.setText(mCachedDevice.getName()); mSummary = mLayoutPreference.findViewById(R.id.entity_header_summary); mSummary.setText(""); mBtnFindBroadcast = mLayoutPreference.findViewById(R.id.button_find_broadcast); mBtnFindBroadcast.setOnClickListener(v -> scanBroadcastSource()); mBtnBroadcastLayout = mLayoutPreference.findViewById(R.id.button_broadcast_layout); mBtnLeaveBroadcast = mLayoutPreference.findViewById(R.id.button_leave_broadcast); mBtnLeaveBroadcast.setOnClickListener(v -> leaveBroadcastSession()); mBtnScanQrCode = mLayoutPreference.findViewById(R.id.button_scan_qr_code); mBtnScanQrCode.setOnClickListener(v -> launchQrCodeScanner()); updateHeaderLayout(); } private boolean isBroadcastSourceExist() { return mBroadcastSourceList.getPreferenceCount() > 0; } private void updateHeaderLayout() { if (isBroadcastSourceExist()) { mBtnFindBroadcast.setVisibility(View.GONE); mBtnBroadcastLayout.setVisibility(View.VISIBLE); } else { mBtnFindBroadcast.setVisibility(View.VISIBLE); mBtnBroadcastLayout.setVisibility(View.GONE); } mBtnLeaveBroadcast.setEnabled(false); if (mBluetoothFindBroadcastsFragment != null && mCachedDevice != null) { LocalBluetoothLeBroadcastAssistant broadcastAssistant = mBluetoothFindBroadcastsFragment.getLeBroadcastAssistant(); if (broadcastAssistant != null && broadcastAssistant.getConnectionStatus(mCachedDevice.getDevice()) == BluetoothProfile.STATE_CONNECTED) { mBtnLeaveBroadcast.setEnabled(true); } } } private void scanBroadcastSource() { // TODO(b/231543455) : Using the BluetoothDeviceUpdater to refactor it. if (mBluetoothFindBroadcastsFragment == null) { return; } mBluetoothFindBroadcastsFragment.scanBroadcastSource(); } private void leaveBroadcastSession() { if (mBluetoothFindBroadcastsFragment == null) { return; } mBluetoothFindBroadcastsFragment.leaveBroadcastSession(); } private void launchQrCodeScanner() { final Intent intent = new Intent(mContext, QrCodeScanModeActivity.class); intent.setAction(BluetoothBroadcastUtils.ACTION_BLUETOOTH_LE_AUDIO_QR_CODE_SCANNER) .putExtra(BluetoothBroadcastUtils.EXTRA_BLUETOOTH_SINK_IS_GROUP, false) .putExtra(BluetoothBroadcastUtils.EXTRA_BLUETOOTH_DEVICE_SINK, mCachedDevice.getDevice()); mContext.startActivity(intent); } @Override public void onDeviceAttributesChanged() { if (mCachedDevice != null) { refresh(); } } @Override public String getPreferenceKey() { return KEY_BROADCAST_HEADER; } /** * Updates the UI */ public void refreshUi() { updateHeaderLayout(); } }