[Audiosharing] Add logging 3.

Test: atest -c com.android.settings.connecteddevice.audiosharing.audiostreams
Bug: 308368124
Change-Id: Idc96c23d20041a00d4fb1e20a7457baaa0f55527
This commit is contained in:
chelseahao
2024-06-12 14:29:06 +08:00
committed by Chelsea Hao
parent a3b1638c4b
commit 8a8c89a49c
5 changed files with 159 additions and 108 deletions

View File

@@ -22,6 +22,7 @@ import android.content.Context;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.Fragment;
import com.android.settings.R; import com.android.settings.R;
import com.android.settingslib.utils.ThreadUtils; import com.android.settingslib.utils.ThreadUtils;
@@ -78,12 +79,10 @@ class AddSourceWaitForResponseState extends AudioStreamStateHandler {
ThreadUtils.postOnMainThread( ThreadUtils.postOnMainThread(
() -> { () -> {
if (controller.getFragment() != null) { if (controller.getFragment() != null) {
AudioStreamsDialogFragment.show( showBroadcastUnavailableNoRetryDialog(
controller.getFragment(), controller.getFragment(),
getBroadcastUnavailableNoRetryDialog( preference.getContext(),
preference.getContext(), AudioStreamsHelper.getBroadcastName(metadata));
AudioStreamsHelper.getBroadcastName(
metadata)));
} }
}); });
} }
@@ -103,13 +102,21 @@ class AddSourceWaitForResponseState extends AudioStreamStateHandler {
return AudioStreamsProgressCategoryController.AudioStreamState.ADD_SOURCE_WAIT_FOR_RESPONSE; return AudioStreamsProgressCategoryController.AudioStreamState.ADD_SOURCE_WAIT_FOR_RESPONSE;
} }
private AudioStreamsDialogFragment.DialogBuilder getBroadcastUnavailableNoRetryDialog( private void showBroadcastUnavailableNoRetryDialog(
Context context, String broadcastName) { Fragment fragment, Context context, String broadcastName) {
return new AudioStreamsDialogFragment.DialogBuilder(context) var broadcastUnavailableNoRetryDialog =
.setTitle(context.getString(R.string.audio_streams_dialog_stream_is_not_available)) new AudioStreamsDialogFragment.DialogBuilder(context)
.setSubTitle1(broadcastName) .setTitle(
.setSubTitle2(context.getString(R.string.audio_streams_is_not_playing)) context.getString(
.setRightButtonText(context.getString(R.string.audio_streams_dialog_close)) R.string.audio_streams_dialog_stream_is_not_available))
.setRightButtonOnClickListener(AlertDialog::dismiss); .setSubTitle1(broadcastName)
.setSubTitle2(context.getString(R.string.audio_streams_is_not_playing))
.setRightButtonText(context.getString(R.string.audio_streams_dialog_close))
.setRightButtonOnClickListener(AlertDialog::dismiss);
AudioStreamsDialogFragment.show(
fragment,
broadcastUnavailableNoRetryDialog,
SettingsEnums.DIALOG_AUDIO_STREAM_MAIN_JOIN_FAILED_TIMEOUT);
} }
} }

View File

@@ -21,101 +21,84 @@ import static com.android.settings.connecteddevice.audiosharing.audiostreams.Aud
import android.app.Activity; import android.app.Activity;
import android.app.Dialog; import android.app.Dialog;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothLeBroadcastMetadata; import android.bluetooth.BluetoothLeBroadcastMetadata;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.bluetooth.Utils; import com.android.settings.bluetooth.Utils;
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
import com.android.settings.connecteddevice.audiosharing.AudioSharingUtils; import com.android.settings.connecteddevice.audiosharing.AudioSharingUtils;
import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.SubSettingLauncher;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settingslib.bluetooth.BluetoothLeBroadcastMetadataExt; import com.android.settingslib.bluetooth.BluetoothLeBroadcastMetadataExt;
import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcastAssistant;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
import com.google.common.base.Strings;
public class AudioStreamConfirmDialog extends InstrumentedDialogFragment { public class AudioStreamConfirmDialog extends InstrumentedDialogFragment {
private static final String TAG = "AudioStreamConfirmDialog"; private static final String TAG = "AudioStreamConfirmDialog";
private static final int DEFAULT_DEVICE_NAME = R.string.audio_streams_dialog_default_device; private static final int DEFAULT_DEVICE_NAME = R.string.audio_streams_dialog_default_device;
@Nullable private LocalBluetoothManager mLocalBluetoothManager; private Context mContext;
@Nullable private LocalBluetoothProfileManager mProfileManager;
@Nullable private Activity mActivity; @Nullable private Activity mActivity;
@Nullable private String mBroadcastMetadataStr;
@Nullable private BluetoothLeBroadcastMetadata mBroadcastMetadata; @Nullable private BluetoothLeBroadcastMetadata mBroadcastMetadata;
private boolean mIsRequestValid = false; @Nullable private BluetoothDevice mConnectedDevice;
private int mAudioStreamConfirmDialogId = SettingsEnums.PAGE_UNKNOWN;
@Override
public void onAttach(Context context) {
mContext = context;
mActivity = getActivity();
if (mActivity == null) {
Log.w(TAG, "onAttach() mActivity is null!");
return;
}
Intent intent = mActivity.getIntent();
mBroadcastMetadata = getMetadata(intent);
mConnectedDevice = getConnectedDevice();
mAudioStreamConfirmDialogId =
getDialogId(mBroadcastMetadata != null, mConnectedDevice != null);
super.onAttach(context);
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setShowsDialog(true); setShowsDialog(true);
mActivity = getActivity();
if (mActivity == null) {
Log.w(TAG, "onCreate() mActivity is null!");
return;
}
mLocalBluetoothManager = Utils.getLocalBluetoothManager(mActivity);
mProfileManager =
mLocalBluetoothManager == null ? null : mLocalBluetoothManager.getProfileManager();
mBroadcastMetadataStr = mActivity.getIntent().getStringExtra(KEY_BROADCAST_METADATA);
if (Strings.isNullOrEmpty(mBroadcastMetadataStr)) {
Log.w(TAG, "onCreate() mBroadcastMetadataStr is null or empty!");
return;
}
mBroadcastMetadata =
BluetoothLeBroadcastMetadataExt.INSTANCE.convertToBroadcastMetadata(
mBroadcastMetadataStr);
if (mBroadcastMetadata == null) {
Log.w(TAG, "onCreate() mBroadcastMetadata is null!");
} else {
mIsRequestValid = true;
}
} }
@Override @Override
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
if (!AudioSharingUtils.isFeatureEnabled()) { return switch (mAudioStreamConfirmDialogId) {
return getUnsupporteDialog(); case SettingsEnums.DIALOG_AUDIO_STREAM_CONFIRM_FEATURE_UNSUPPORTED ->
} getUnsupportedDialog();
if (AudioSharingUtils.isAudioSharingProfileReady(mProfileManager)) { case SettingsEnums.DIALOG_AUDIO_STREAM_CONFIRM_NO_LE_DEVICE -> getNoLeDeviceDialog();
CachedBluetoothDevice connectedLeDevice = case SettingsEnums.DIALOG_AUDIO_STREAM_CONFIRM_LISTEN -> getConfirmDialog();
AudioStreamsHelper.getCachedBluetoothDeviceInSharingOrLeConnected( default -> getErrorDialog();
mLocalBluetoothManager) };
.orElse(null);
if (connectedLeDevice == null) {
return getNoLeDeviceDialog();
}
String deviceName = connectedLeDevice.getName();
return mIsRequestValid ? getConfirmDialog(deviceName) : getErrorDialog(deviceName);
}
Log.d(TAG, "onCreateDialog() : profile not ready!");
String defaultDeviceName =
mActivity != null ? mActivity.getString(DEFAULT_DEVICE_NAME) : "";
return mIsRequestValid
? getConfirmDialog(defaultDeviceName)
: getErrorDialog(defaultDeviceName);
} }
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
// TODO(chelseahao): update metrics id return mAudioStreamConfirmDialogId;
return 0;
} }
private Dialog getConfirmDialog(String name) { private Dialog getConfirmDialog() {
return new AudioStreamsDialogFragment.DialogBuilder(getActivity()) return new AudioStreamsDialogFragment.DialogBuilder(getActivity())
.setTitle(getString(R.string.audio_streams_dialog_listen_to_audio_stream)) .setTitle(getString(R.string.audio_streams_dialog_listen_to_audio_stream))
.setSubTitle1( .setSubTitle1(
mBroadcastMetadata != null mBroadcastMetadata != null
? AudioStreamsHelper.getBroadcastName(mBroadcastMetadata) ? AudioStreamsHelper.getBroadcastName(mBroadcastMetadata)
: "") : "")
.setSubTitle2(getString(R.string.audio_streams_dialog_control_volume, name)) .setSubTitle2(
getString(
R.string.audio_streams_dialog_control_volume,
getConnectedDeviceName()))
.setLeftButtonText(getString(com.android.settings.R.string.cancel)) .setLeftButtonText(getString(com.android.settings.R.string.cancel))
.setLeftButtonOnClickListener( .setLeftButtonOnClickListener(
unused -> { unused -> {
@@ -127,6 +110,10 @@ public class AudioStreamConfirmDialog extends InstrumentedDialogFragment {
.setRightButtonText(getString(R.string.audio_streams_dialog_listen)) .setRightButtonText(getString(R.string.audio_streams_dialog_listen))
.setRightButtonOnClickListener( .setRightButtonOnClickListener(
unused -> { unused -> {
mMetricsFeatureProvider.action(
getActivity(),
SettingsEnums
.ACTION_AUDIO_STREAM_CONFIRM_LAUNCH_MAIN_BUTTON_CLICK);
launchAudioStreamsActivity(); launchAudioStreamsActivity();
dismiss(); dismiss();
if (mActivity != null) { if (mActivity != null) {
@@ -136,7 +123,7 @@ public class AudioStreamConfirmDialog extends InstrumentedDialogFragment {
.build(); .build();
} }
private Dialog getUnsupporteDialog() { private Dialog getUnsupportedDialog() {
return new AudioStreamsDialogFragment.DialogBuilder(getActivity()) return new AudioStreamsDialogFragment.DialogBuilder(getActivity())
.setTitle(getString(R.string.audio_streams_dialog_cannot_listen)) .setTitle(getString(R.string.audio_streams_dialog_cannot_listen))
.setSubTitle2(getString(R.string.audio_streams_dialog_unsupported_device_subtitle)) .setSubTitle2(getString(R.string.audio_streams_dialog_unsupported_device_subtitle))
@@ -151,10 +138,13 @@ public class AudioStreamConfirmDialog extends InstrumentedDialogFragment {
.build(); .build();
} }
private Dialog getErrorDialog(String name) { private Dialog getErrorDialog() {
return new AudioStreamsDialogFragment.DialogBuilder(getActivity()) return new AudioStreamsDialogFragment.DialogBuilder(getActivity())
.setTitle(getString(R.string.audio_streams_dialog_cannot_listen)) .setTitle(getString(R.string.audio_streams_dialog_cannot_listen))
.setSubTitle2(getString(R.string.audio_streams_dialog_cannot_play, name)) .setSubTitle2(
getString(
R.string.audio_streams_dialog_cannot_play,
getConnectedDeviceName()))
.setRightButtonText(getString(R.string.audio_streams_dialog_close)) .setRightButtonText(getString(R.string.audio_streams_dialog_close))
.setRightButtonOnClickListener( .setRightButtonOnClickListener(
unused -> { unused -> {
@@ -181,11 +171,12 @@ public class AudioStreamConfirmDialog extends InstrumentedDialogFragment {
.setRightButtonText(getString(R.string.audio_streams_dialog_no_le_device_button)) .setRightButtonText(getString(R.string.audio_streams_dialog_no_le_device_button))
.setRightButtonOnClickListener( .setRightButtonOnClickListener(
dialog -> { dialog -> {
if (mActivity != null) { new SubSettingLauncher(mContext)
mActivity.startActivity( .setDestination(
new Intent(Settings.ACTION_BLUETOOTH_SETTINGS) ConnectedDeviceDashboardFragment.class.getName())
.setPackage(mActivity.getPackageName())); .setSourceMetricsCategory(
} SettingsEnums.DIALOG_AUDIO_STREAM_CONFIRM_NO_LE_DEVICE)
.launch();
dismiss(); dismiss();
if (mActivity != null) { if (mActivity != null) {
mActivity.finish(); mActivity.finish();
@@ -196,14 +187,60 @@ public class AudioStreamConfirmDialog extends InstrumentedDialogFragment {
private void launchAudioStreamsActivity() { private void launchAudioStreamsActivity() {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putString(KEY_BROADCAST_METADATA, mBroadcastMetadataStr); bundle.putParcelable(KEY_BROADCAST_METADATA, mBroadcastMetadata);
if (mActivity != null) { if (mActivity != null) {
new SubSettingLauncher(getActivity()) new SubSettingLauncher(getActivity())
.setTitleText(getString(R.string.audio_streams_activity_title)) .setTitleText(getString(R.string.audio_streams_activity_title))
.setDestination(AudioStreamsDashboardFragment.class.getName()) .setDestination(AudioStreamsDashboardFragment.class.getName())
.setArguments(bundle) .setArguments(bundle)
.setSourceMetricsCategory(SettingsEnums.PAGE_UNKNOWN) .setSourceMetricsCategory(getMetricsCategory())
.launch(); .launch();
} }
} }
private @Nullable BluetoothLeBroadcastMetadata getMetadata(Intent intent) {
String metadata = intent.getStringExtra(KEY_BROADCAST_METADATA);
if (metadata == null || metadata.isEmpty()) {
return null;
}
return BluetoothLeBroadcastMetadataExt.INSTANCE.convertToBroadcastMetadata(metadata);
}
private int getDialogId(boolean hasMetadata, boolean hasConnectedDevice) {
if (!AudioSharingUtils.isFeatureEnabled()) {
return SettingsEnums.DIALOG_AUDIO_STREAM_CONFIRM_FEATURE_UNSUPPORTED;
}
if (!hasConnectedDevice) {
return SettingsEnums.DIALOG_AUDIO_STREAM_CONFIRM_NO_LE_DEVICE;
}
return hasMetadata
? SettingsEnums.DIALOG_AUDIO_STREAM_CONFIRM_LISTEN
: SettingsEnums.DIALOG_AUDIO_STREAM_CONFIRM_DATA_ERROR;
}
@Nullable
private BluetoothDevice getConnectedDevice() {
var localBluetoothManager = Utils.getLocalBluetoothManager(getActivity());
if (localBluetoothManager == null) {
return null;
}
LocalBluetoothLeBroadcastAssistant assistant =
localBluetoothManager.getProfileManager().getLeAudioBroadcastAssistantProfile();
if (assistant == null) {
return null;
}
var devices =
assistant.getDevicesMatchingConnectionStates(
new int[] {BluetoothProfile.STATE_CONNECTED});
return devices.isEmpty() ? null : devices.get(0);
}
private String getConnectedDeviceName() {
if (mConnectedDevice != null) {
String alias = mConnectedDevice.getAlias();
return TextUtils.isEmpty(alias) ? getString(DEFAULT_DEVICE_NAME) : alias;
}
Log.w(TAG, "getConnectedDeviceName : no connected device!");
return getString(DEFAULT_DEVICE_NAME);
}
} }

View File

@@ -18,6 +18,7 @@ package com.android.settings.connecteddevice.audiosharing.audiostreams;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
@@ -43,15 +44,16 @@ import java.util.function.Consumer;
public class AudioStreamsDialogFragment extends InstrumentedDialogFragment { public class AudioStreamsDialogFragment extends InstrumentedDialogFragment {
private static final String TAG = "AudioStreamsDialogFragment"; private static final String TAG = "AudioStreamsDialogFragment";
private final DialogBuilder mDialogBuilder; private final DialogBuilder mDialogBuilder;
private int mDialogId = SettingsEnums.PAGE_UNKNOWN;
AudioStreamsDialogFragment(DialogBuilder dialogBuilder) { AudioStreamsDialogFragment(DialogBuilder dialogBuilder, int dialogId) {
mDialogBuilder = dialogBuilder; mDialogBuilder = dialogBuilder;
mDialogId = dialogId;
} }
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
// TODO(chelseahao): update metrics id return mDialogId;
return 0;
} }
@Override @Override
@@ -64,14 +66,15 @@ public class AudioStreamsDialogFragment extends InstrumentedDialogFragment {
* *
* @param host The fragment to host the dialog. * @param host The fragment to host the dialog.
* @param dialogBuilder The builder for constructing the dialog. * @param dialogBuilder The builder for constructing the dialog.
* @param dialogId The dialog settings enum for logging
*/ */
public static void show(Fragment host, DialogBuilder dialogBuilder) { public static void show(Fragment host, DialogBuilder dialogBuilder, int dialogId) {
if (!host.isAdded()) { if (!host.isAdded()) {
Log.w(TAG, "The host fragment is not added to the activity!"); Log.w(TAG, "The host fragment is not added to the activity!");
return; return;
} }
FragmentManager manager = host.getChildFragmentManager(); FragmentManager manager = host.getChildFragmentManager();
(new AudioStreamsDialogFragment(dialogBuilder)).show(manager, TAG); (new AudioStreamsDialogFragment(dialogBuilder, dialogId)).show(manager, TAG);
} }
static void dismissAll(Fragment host) { static void dismissAll(Fragment host) {

View File

@@ -481,7 +481,10 @@ public class AudioStreamsProgressCategoryController extends BasePreferenceContro
mContext, mContext,
() -> { () -> {
if (mFragment != null) { if (mFragment != null) {
AudioStreamsDialogFragment.show(mFragment, getNoLeDeviceDialog()); AudioStreamsDialogFragment.show(
mFragment,
getNoLeDeviceDialog(),
SettingsEnums.DIALOG_AUDIO_STREAM_MAIN_NO_LE_DEVICE);
} }
}); });
} }

View File

@@ -68,13 +68,10 @@ class WaitForSyncState extends AudioStreamStateHandler {
ThreadUtils.postOnMainThread( ThreadUtils.postOnMainThread(
() -> { () -> {
if (controller.getFragment() != null) { if (controller.getFragment() != null) {
AudioStreamsDialogFragment.show( showBroadcastUnavailableDialog(
controller.getFragment(), controller.getFragment(),
getBroadcastUnavailableDialog( preference.getContext(),
preference.getContext(), AudioStreamsHelper.getBroadcastName(metadata));
AudioStreamsHelper.getBroadcastName(
metadata),
controller));
} }
}); });
} }
@@ -93,24 +90,28 @@ class WaitForSyncState extends AudioStreamStateHandler {
return AudioStreamsProgressCategoryController.AudioStreamState.WAIT_FOR_SYNC; return AudioStreamsProgressCategoryController.AudioStreamState.WAIT_FOR_SYNC;
} }
private AudioStreamsDialogFragment.DialogBuilder getBroadcastUnavailableDialog( private void showBroadcastUnavailableDialog(
Context context, Fragment fragment, Context context, String broadcastName) {
String broadcastName, var broadcastUnavailableDialog =
AudioStreamsProgressCategoryController controller) { new AudioStreamsDialogFragment.DialogBuilder(context)
return new AudioStreamsDialogFragment.DialogBuilder(context) .setTitle(
.setTitle(context.getString(R.string.audio_streams_dialog_stream_is_not_available)) context.getString(
.setSubTitle1(broadcastName) R.string.audio_streams_dialog_stream_is_not_available))
.setSubTitle2(context.getString(R.string.audio_streams_is_not_playing)) .setSubTitle1(broadcastName)
.setLeftButtonText(context.getString(R.string.audio_streams_dialog_close)) .setSubTitle2(context.getString(R.string.audio_streams_is_not_playing))
.setLeftButtonOnClickListener(AlertDialog::dismiss) .setLeftButtonText(context.getString(R.string.audio_streams_dialog_close))
.setRightButtonText(context.getString(R.string.audio_streams_dialog_retry)) .setLeftButtonOnClickListener(AlertDialog::dismiss)
.setRightButtonOnClickListener( .setRightButtonText(context.getString(R.string.audio_streams_dialog_retry))
dialog -> { .setRightButtonOnClickListener(
if (controller.getFragment() != null) { dialog -> {
launchQrCodeScanFragment(context, controller.getFragment()); launchQrCodeScanFragment(context, fragment);
dialog.dismiss(); dialog.dismiss();
} });
});
AudioStreamsDialogFragment.show(
fragment,
broadcastUnavailableDialog,
SettingsEnums.DIALOG_AUDIO_STREAM_MAIN_WAIT_FOR_SYNC_TIMEOUT);
} }
private void launchQrCodeScanFragment(Context context, Fragment fragment) { private void launchQrCodeScanFragment(Context context, Fragment fragment) {