blob: 7fa63b06afc8616118580201a988fe2bab373267 [file] [log] [blame]
/*
* 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.app.Dialog;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import com.android.settings.R;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.media.MediaOutputConstants;
/**
* This Dialog allowed users to do some actions for broadcast media or find the
* nearby broadcast sources.
*/
public class BluetoothBroadcastDialog extends InstrumentedDialogFragment {
public static final String KEY_APP_LABEL = "app_label";
public static final String KEY_DEVICE_ADDRESS =
BluetoothFindBroadcastsFragment.KEY_DEVICE_ADDRESS;
public static final String KEY_MEDIA_STREAMING = "media_streaming";
private static final String TAG = "BTBroadcastsDialog";
private static final CharSequence UNKNOWN_APP_LABEL = "unknown";
private Context mContext;
private CharSequence mCurrentAppLabel = UNKNOWN_APP_LABEL;
private String mDeviceAddress;
private boolean mIsMediaStreaming;
private LocalBluetoothManager mLocalBluetoothManager;
private AlertDialog mAlertDialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = getActivity();
mCurrentAppLabel = getActivity().getIntent().getCharSequenceExtra(KEY_APP_LABEL);
mDeviceAddress = getActivity().getIntent().getStringExtra(KEY_DEVICE_ADDRESS);
mIsMediaStreaming = getActivity().getIntent().getBooleanExtra(KEY_MEDIA_STREAMING, false);
mLocalBluetoothManager = Utils.getLocalBtManager(mContext);
setShowsDialog(true);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
View layout = View.inflate(mContext,
com.android.settingslib.R.layout.broadcast_dialog, null);
TextView title = layout.findViewById(com.android.settingslib.R.id.dialog_title);
TextView subTitle = layout.findViewById(com.android.settingslib.R.id.dialog_subtitle);
Button broadcastBtn = layout.findViewById(com.android.settingslib.R.id.positive_btn);
if (isBroadcastSupported() && mIsMediaStreaming) {
title.setText(mContext.getString(R.string.bluetooth_broadcast_dialog_title));
subTitle.setText(
mContext.getString(R.string.bluetooth_broadcast_dialog_broadcast_message));
broadcastBtn.setVisibility(View.VISIBLE);
if (TextUtils.isEmpty(mCurrentAppLabel)) {
broadcastBtn.setText(mContext.getString(R.string.bluetooth_broadcast_dialog_title));
} else {
broadcastBtn.setText(mContext.getString(
R.string.bluetooth_broadcast_dialog_broadcast_app,
String.valueOf(mCurrentAppLabel)));
}
broadcastBtn.setOnClickListener((view) -> {
launchMediaOutputBroadcastDialog();
});
} else {
title.setText(mContext.getString(R.string.bluetooth_find_broadcast));
subTitle.setText(
mContext.getString(R.string.bluetooth_broadcast_dialog_find_message));
broadcastBtn.setVisibility(View.GONE);
}
Button findBroadcastBtn = layout.findViewById(com.android.settingslib.R.id.negative_btn);
findBroadcastBtn.setText(mContext.getString(R.string.bluetooth_find_broadcast));
findBroadcastBtn.setOnClickListener((view) -> {
launchFindBroadcastsActivity();
});
Button cancelBtn = layout.findViewById(com.android.settingslib.R.id.neutral_btn);
cancelBtn.setOnClickListener((view) -> {
dismiss();
getActivity().finish();
});
mAlertDialog = new AlertDialog.Builder(mContext,
com.android.settingslib.R.style.Theme_AlertDialog_SettingsLib)
.setView(layout)
.create();
return mAlertDialog;
}
@Override
public void onStart() {
super.onStart();
}
@Override
public int getMetricsCategory() {
return SettingsEnums.DIALOG_LE_AUDIO_BROADCAST;
}
@Override
public void onCancel(@NonNull DialogInterface dialog) {
dismiss();
getActivity().finish();
}
private void launchFindBroadcastsActivity() {
Bundle bundle = new Bundle();
bundle.putString(KEY_DEVICE_ADDRESS, mDeviceAddress);
new SubSettingLauncher(mContext)
.setTitleRes(R.string.bluetooth_find_broadcast_title)
.setDestination(BluetoothFindBroadcastsFragment.class.getName())
.setArguments(bundle)
.setSourceMetricsCategory(SettingsEnums.PAGE_UNKNOWN)
.launch();
dismissVolumePanel();
}
private void launchMediaOutputBroadcastDialog() {
if (startBroadcast()) {
mContext.sendBroadcast(new Intent()
.setPackage(MediaOutputConstants.SYSTEMUI_PACKAGE_NAME)
.setAction(MediaOutputConstants.ACTION_LAUNCH_MEDIA_OUTPUT_BROADCAST_DIALOG)
.putExtra(MediaOutputConstants.EXTRA_PACKAGE_NAME,
getActivity().getPackageName()));
dismissVolumePanel();
}
}
private LocalBluetoothLeBroadcast getLEAudioBroadcastProfile() {
if (mLocalBluetoothManager != null && mLocalBluetoothManager.getProfileManager() != null) {
LocalBluetoothLeBroadcast bluetoothLeBroadcast =
mLocalBluetoothManager.getProfileManager().getLeAudioBroadcastProfile();
if (bluetoothLeBroadcast != null) {
return bluetoothLeBroadcast;
}
}
Log.d(TAG, "Can not get LE Audio Broadcast Profile");
return null;
}
private boolean startBroadcast() {
LocalBluetoothLeBroadcast btLeBroadcast = getLEAudioBroadcastProfile();
if (btLeBroadcast != null) {
btLeBroadcast.startBroadcast(String.valueOf(mCurrentAppLabel), null);
return true;
}
Log.d(TAG, "Can not broadcast successfully");
return false;
}
private void dismissVolumePanel() {
// Dismiss volume panel
mContext.sendBroadcast(new Intent()
.setPackage(MediaOutputConstants.SETTINGS_PACKAGE_NAME)
.setAction(MediaOutputConstants.ACTION_CLOSE_PANEL));
}
boolean isBroadcastSupported() {
LocalBluetoothLeBroadcast broadcast =
mLocalBluetoothManager.getProfileManager().getLeAudioBroadcastProfile();
return broadcast != null;
}
}