Loading src/com/android/settings/connecteddevice/audiosharing/audiostreams/AddSourceBadCodeState.java +13 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.settings.connecteddevice.audiosharing.audiostreams; import android.app.settings.SettingsEnums; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; Loading @@ -37,6 +39,17 @@ class AddSourceBadCodeState extends SyncedState { return sInstance; } @Override void performAction( AudioStreamPreference preference, AudioStreamsProgressCategoryController controller, AudioStreamsHelper helper) { mMetricsFeatureProvider.action( preference.getContext(), SettingsEnums.ACTION_AUDIO_STREAM_JOIN_FAILED_BAD_CODE, preference.getSourceOriginForLogging().ordinal()); } @Override int getSummary() { return AUDIO_STREAM_ADD_SOURCE_BAD_CODE_STATE_SUMMARY; Loading src/com/android/settings/connecteddevice/audiosharing/audiostreams/AddSourceFailedState.java +13 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.settings.connecteddevice.audiosharing.audiostreams; import android.app.settings.SettingsEnums; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; Loading @@ -37,6 +39,17 @@ class AddSourceFailedState extends SyncedState { return sInstance; } @Override void performAction( AudioStreamPreference preference, AudioStreamsProgressCategoryController controller, AudioStreamsHelper helper) { mMetricsFeatureProvider.action( preference.getContext(), SettingsEnums.ACTION_AUDIO_STREAM_JOIN_FAILED_OTHER, preference.getSourceOriginForLogging().ordinal()); } @Override int getSummary() { return AUDIO_STREAM_ADD_SOURCE_FAILED_STATE_SUMMARY; Loading src/com/android/settings/connecteddevice/audiosharing/audiostreams/AddSourceWaitForResponseState.java +9 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.settings.connecteddevice.audiosharing.audiostreams; import android.app.AlertDialog; import android.app.settings.SettingsEnums; import android.content.Context; import androidx.annotation.Nullable; Loading Loading @@ -52,6 +53,10 @@ class AddSourceWaitForResponseState extends AudioStreamStateHandler { var metadata = preference.getAudioStreamMetadata(); if (metadata != null) { helper.addSource(metadata); mMetricsFeatureProvider.action( preference.getContext(), SettingsEnums.ACTION_AUDIO_STREAM_JOIN, preference.getSourceOriginForLogging().ordinal()); // Cache the metadata that used for add source, if source is added successfully, we // will save it persistently. mAudioStreamsRepository.cacheMetadata(metadata); Loading @@ -66,6 +71,10 @@ class AddSourceWaitForResponseState extends AudioStreamStateHandler { && preference.getAudioStreamState() == getStateEnum()) { controller.handleSourceFailedToConnect( preference.getAudioStreamBroadcastId()); mMetricsFeatureProvider.action( preference.getContext(), SettingsEnums.ACTION_AUDIO_STREAM_JOIN_FAILED_TIMEOUT, preference.getSourceOriginForLogging().ordinal()); ThreadUtils.postOnMainThread( () -> { if (controller.getFragment() != null) { Loading src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamButtonController.java +82 −48 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.settings.connecteddevice.audiosharing.audiostreams; import android.app.settings.SettingsEnums; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothLeBroadcastAssistant; import android.bluetooth.BluetoothLeBroadcastMetadata; Loading @@ -33,7 +34,9 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.bluetooth.Utils; import com.android.settings.core.BasePreferenceController; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcastAssistant; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.utils.ThreadUtils; import com.android.settingslib.widget.ActionButtonsPreference; Loading @@ -44,6 +47,7 @@ public class AudioStreamButtonController extends BasePreferenceController implements DefaultLifecycleObserver { private static final String TAG = "AudioStreamButtonController"; private static final String KEY = "audio_stream_button"; private static final int SOURCE_ORIGIN_REPOSITORY = SourceOriginForLogging.REPOSITORY.ordinal(); private final BluetoothLeBroadcastAssistant.Callback mBroadcastAssistantCallback = new AudioStreamsBroadcastAssistantCallback() { @Override Loading @@ -56,6 +60,8 @@ public class AudioStreamButtonController extends BasePreferenceController public void onSourceRemoveFailed(BluetoothDevice sink, int sourceId, int reason) { super.onSourceRemoveFailed(sink, sourceId, reason); updateButton(); mMetricsFeatureProvider.action( mContext, SettingsEnums.ACTION_AUDIO_STREAM_LEAVE_FAILED); } @Override Loading @@ -66,6 +72,10 @@ public class AudioStreamButtonController extends BasePreferenceController super.onReceiveStateChanged(sink, sourceId, state); if (AudioStreamsHelper.isConnected(state)) { updateButton(); mMetricsFeatureProvider.action( mContext, SettingsEnums.ACTION_AUDIO_STREAM_JOIN_SUCCEED, SOURCE_ORIGIN_REPOSITORY); } } Loading @@ -74,6 +84,10 @@ public class AudioStreamButtonController extends BasePreferenceController BluetoothDevice sink, BluetoothLeBroadcastMetadata source, int reason) { super.onSourceAddFailed(sink, source, reason); updateButton(); mMetricsFeatureProvider.action( mContext, SettingsEnums.ACTION_AUDIO_STREAM_JOIN_FAILED_OTHER, SOURCE_ORIGIN_REPOSITORY); } @Override Loading @@ -88,6 +102,7 @@ public class AudioStreamButtonController extends BasePreferenceController private final Executor mExecutor; private final AudioStreamsHelper mAudioStreamsHelper; private final @Nullable LocalBluetoothLeBroadcastAssistant mLeBroadcastAssistant; private final MetricsFeatureProvider mMetricsFeatureProvider; private @Nullable ActionButtonsPreference mPreference; private int mBroadcastId = -1; Loading @@ -96,6 +111,7 @@ public class AudioStreamButtonController extends BasePreferenceController mExecutor = Executors.newSingleThreadExecutor(); mAudioStreamsHelper = new AudioStreamsHelper(Utils.getLocalBtManager(context)); mLeBroadcastAssistant = mAudioStreamsHelper.getLeBroadcastAssistant(); mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider(); } @Override Loading Loading @@ -124,10 +140,34 @@ public class AudioStreamButtonController extends BasePreferenceController } private void updateButton() { if (mPreference != null) { if (mAudioStreamsHelper.getAllConnectedSources().stream() if (mPreference == null) { Log.w(TAG, "updateButton(): preference is null!"); return; } boolean isConnected = mAudioStreamsHelper.getAllConnectedSources().stream() .map(BluetoothLeBroadcastReceiveState::getBroadcastId) .anyMatch(connectedBroadcastId -> connectedBroadcastId == mBroadcastId)) { .anyMatch(connectedBroadcastId -> connectedBroadcastId == mBroadcastId); View.OnClickListener onClickListener; if (isConnected) { onClickListener = unused -> ThreadUtils.postOnBackgroundThread( () -> { mAudioStreamsHelper.removeSource(mBroadcastId); mMetricsFeatureProvider.action( mContext, SettingsEnums .ACTION_AUDIO_STREAM_LEAVE_BUTTON_CLICK); ThreadUtils.postOnMainThread( () -> { if (mPreference != null) { mPreference.setButton1Enabled(false); } }); }); ThreadUtils.postOnMainThread( () -> { if (mPreference != null) { Loading @@ -136,17 +176,11 @@ public class AudioStreamButtonController extends BasePreferenceController .setButton1Text(R.string.audio_streams_disconnect) .setButton1Icon( com.android.settings.R.drawable.ic_settings_close) .setButton1OnClickListener( unused -> { if (mPreference != null) { mPreference.setButton1Enabled(false); } mAudioStreamsHelper.removeSource(mBroadcastId); }); .setButton1OnClickListener(onClickListener); } }); } else { View.OnClickListener clickToRejoin = onClickListener = unused -> ThreadUtils.postOnBackgroundThread( () -> { Loading @@ -155,11 +189,14 @@ public class AudioStreamButtonController extends BasePreferenceController mContext, mBroadcastId); if (metadata != null) { mAudioStreamsHelper.addSource(metadata); mMetricsFeatureProvider.action( mContext, SettingsEnums.ACTION_AUDIO_STREAM_JOIN, SOURCE_ORIGIN_REPOSITORY); ThreadUtils.postOnMainThread( () -> { if (mPreference != null) { mPreference.setButton1Enabled( false); mPreference.setButton1Enabled(false); } }); } Loading @@ -171,13 +208,10 @@ public class AudioStreamButtonController extends BasePreferenceController mPreference .setButton1Text(R.string.audio_streams_connect) .setButton1Icon(com.android.settings.R.drawable.ic_add_24dp) .setButton1OnClickListener(clickToRejoin); .setButton1OnClickListener(onClickListener); } }); } } else { Log.w(TAG, "updateButton(): preference is null!"); } } @Override Loading src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamPreference.java +19 −3 Original line number Diff line number Diff line Loading @@ -107,6 +107,12 @@ class AudioStreamPreference extends TwoTargetPreference { : AudioStreamsProgressCategoryController.AudioStreamState.UNKNOWN; } SourceOriginForLogging getSourceOriginForLogging() { return mAudioStream != null ? mAudioStream.getSourceOriginForLogging() : SourceOriginForLogging.UNKNOWN; } @Override protected boolean shouldHideSecondTarget() { return mIsConnected || !mIsEncrypted; Loading @@ -130,11 +136,13 @@ class AudioStreamPreference extends TwoTargetPreference { } static AudioStreamPreference fromMetadata( Context context, BluetoothLeBroadcastMetadata source) { Context context, BluetoothLeBroadcastMetadata source, SourceOriginForLogging sourceOriginForLogging) { AudioStreamPreference preference = new AudioStreamPreference(context, /* attrs= */ null); preference.setIsEncrypted(source.isEncrypted()); preference.setTitle(AudioStreamsHelper.getBroadcastName(source)); preference.setAudioStream(new AudioStream(source)); preference.setAudioStream(new AudioStream(source, sourceOriginForLogging)); return preference; } Loading @@ -158,11 +166,15 @@ class AudioStreamPreference extends TwoTargetPreference { private static final int UNAVAILABLE = -1; @Nullable private BluetoothLeBroadcastMetadata mMetadata; @Nullable private BluetoothLeBroadcastReceiveState mReceiveState; private SourceOriginForLogging mSourceOriginForLogging = SourceOriginForLogging.UNKNOWN; private AudioStreamsProgressCategoryController.AudioStreamState mState = AudioStreamsProgressCategoryController.AudioStreamState.UNKNOWN; private AudioStream(BluetoothLeBroadcastMetadata metadata) { private AudioStream( BluetoothLeBroadcastMetadata metadata, SourceOriginForLogging sourceOriginForLogging) { mMetadata = metadata; mSourceOriginForLogging = sourceOriginForLogging; } private AudioStream(BluetoothLeBroadcastReceiveState receiveState) { Loading Loading @@ -191,6 +203,10 @@ class AudioStreamPreference extends TwoTargetPreference { return mState; } private SourceOriginForLogging getSourceOriginForLogging() { return mSourceOriginForLogging; } @Nullable private BluetoothLeBroadcastMetadata getMetadata() { return mMetadata; Loading Loading
src/com/android/settings/connecteddevice/audiosharing/audiostreams/AddSourceBadCodeState.java +13 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.settings.connecteddevice.audiosharing.audiostreams; import android.app.settings.SettingsEnums; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; Loading @@ -37,6 +39,17 @@ class AddSourceBadCodeState extends SyncedState { return sInstance; } @Override void performAction( AudioStreamPreference preference, AudioStreamsProgressCategoryController controller, AudioStreamsHelper helper) { mMetricsFeatureProvider.action( preference.getContext(), SettingsEnums.ACTION_AUDIO_STREAM_JOIN_FAILED_BAD_CODE, preference.getSourceOriginForLogging().ordinal()); } @Override int getSummary() { return AUDIO_STREAM_ADD_SOURCE_BAD_CODE_STATE_SUMMARY; Loading
src/com/android/settings/connecteddevice/audiosharing/audiostreams/AddSourceFailedState.java +13 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.settings.connecteddevice.audiosharing.audiostreams; import android.app.settings.SettingsEnums; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; Loading @@ -37,6 +39,17 @@ class AddSourceFailedState extends SyncedState { return sInstance; } @Override void performAction( AudioStreamPreference preference, AudioStreamsProgressCategoryController controller, AudioStreamsHelper helper) { mMetricsFeatureProvider.action( preference.getContext(), SettingsEnums.ACTION_AUDIO_STREAM_JOIN_FAILED_OTHER, preference.getSourceOriginForLogging().ordinal()); } @Override int getSummary() { return AUDIO_STREAM_ADD_SOURCE_FAILED_STATE_SUMMARY; Loading
src/com/android/settings/connecteddevice/audiosharing/audiostreams/AddSourceWaitForResponseState.java +9 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.settings.connecteddevice.audiosharing.audiostreams; import android.app.AlertDialog; import android.app.settings.SettingsEnums; import android.content.Context; import androidx.annotation.Nullable; Loading Loading @@ -52,6 +53,10 @@ class AddSourceWaitForResponseState extends AudioStreamStateHandler { var metadata = preference.getAudioStreamMetadata(); if (metadata != null) { helper.addSource(metadata); mMetricsFeatureProvider.action( preference.getContext(), SettingsEnums.ACTION_AUDIO_STREAM_JOIN, preference.getSourceOriginForLogging().ordinal()); // Cache the metadata that used for add source, if source is added successfully, we // will save it persistently. mAudioStreamsRepository.cacheMetadata(metadata); Loading @@ -66,6 +71,10 @@ class AddSourceWaitForResponseState extends AudioStreamStateHandler { && preference.getAudioStreamState() == getStateEnum()) { controller.handleSourceFailedToConnect( preference.getAudioStreamBroadcastId()); mMetricsFeatureProvider.action( preference.getContext(), SettingsEnums.ACTION_AUDIO_STREAM_JOIN_FAILED_TIMEOUT, preference.getSourceOriginForLogging().ordinal()); ThreadUtils.postOnMainThread( () -> { if (controller.getFragment() != null) { Loading
src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamButtonController.java +82 −48 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.settings.connecteddevice.audiosharing.audiostreams; import android.app.settings.SettingsEnums; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothLeBroadcastAssistant; import android.bluetooth.BluetoothLeBroadcastMetadata; Loading @@ -33,7 +34,9 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.bluetooth.Utils; import com.android.settings.core.BasePreferenceController; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcastAssistant; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.utils.ThreadUtils; import com.android.settingslib.widget.ActionButtonsPreference; Loading @@ -44,6 +47,7 @@ public class AudioStreamButtonController extends BasePreferenceController implements DefaultLifecycleObserver { private static final String TAG = "AudioStreamButtonController"; private static final String KEY = "audio_stream_button"; private static final int SOURCE_ORIGIN_REPOSITORY = SourceOriginForLogging.REPOSITORY.ordinal(); private final BluetoothLeBroadcastAssistant.Callback mBroadcastAssistantCallback = new AudioStreamsBroadcastAssistantCallback() { @Override Loading @@ -56,6 +60,8 @@ public class AudioStreamButtonController extends BasePreferenceController public void onSourceRemoveFailed(BluetoothDevice sink, int sourceId, int reason) { super.onSourceRemoveFailed(sink, sourceId, reason); updateButton(); mMetricsFeatureProvider.action( mContext, SettingsEnums.ACTION_AUDIO_STREAM_LEAVE_FAILED); } @Override Loading @@ -66,6 +72,10 @@ public class AudioStreamButtonController extends BasePreferenceController super.onReceiveStateChanged(sink, sourceId, state); if (AudioStreamsHelper.isConnected(state)) { updateButton(); mMetricsFeatureProvider.action( mContext, SettingsEnums.ACTION_AUDIO_STREAM_JOIN_SUCCEED, SOURCE_ORIGIN_REPOSITORY); } } Loading @@ -74,6 +84,10 @@ public class AudioStreamButtonController extends BasePreferenceController BluetoothDevice sink, BluetoothLeBroadcastMetadata source, int reason) { super.onSourceAddFailed(sink, source, reason); updateButton(); mMetricsFeatureProvider.action( mContext, SettingsEnums.ACTION_AUDIO_STREAM_JOIN_FAILED_OTHER, SOURCE_ORIGIN_REPOSITORY); } @Override Loading @@ -88,6 +102,7 @@ public class AudioStreamButtonController extends BasePreferenceController private final Executor mExecutor; private final AudioStreamsHelper mAudioStreamsHelper; private final @Nullable LocalBluetoothLeBroadcastAssistant mLeBroadcastAssistant; private final MetricsFeatureProvider mMetricsFeatureProvider; private @Nullable ActionButtonsPreference mPreference; private int mBroadcastId = -1; Loading @@ -96,6 +111,7 @@ public class AudioStreamButtonController extends BasePreferenceController mExecutor = Executors.newSingleThreadExecutor(); mAudioStreamsHelper = new AudioStreamsHelper(Utils.getLocalBtManager(context)); mLeBroadcastAssistant = mAudioStreamsHelper.getLeBroadcastAssistant(); mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider(); } @Override Loading Loading @@ -124,10 +140,34 @@ public class AudioStreamButtonController extends BasePreferenceController } private void updateButton() { if (mPreference != null) { if (mAudioStreamsHelper.getAllConnectedSources().stream() if (mPreference == null) { Log.w(TAG, "updateButton(): preference is null!"); return; } boolean isConnected = mAudioStreamsHelper.getAllConnectedSources().stream() .map(BluetoothLeBroadcastReceiveState::getBroadcastId) .anyMatch(connectedBroadcastId -> connectedBroadcastId == mBroadcastId)) { .anyMatch(connectedBroadcastId -> connectedBroadcastId == mBroadcastId); View.OnClickListener onClickListener; if (isConnected) { onClickListener = unused -> ThreadUtils.postOnBackgroundThread( () -> { mAudioStreamsHelper.removeSource(mBroadcastId); mMetricsFeatureProvider.action( mContext, SettingsEnums .ACTION_AUDIO_STREAM_LEAVE_BUTTON_CLICK); ThreadUtils.postOnMainThread( () -> { if (mPreference != null) { mPreference.setButton1Enabled(false); } }); }); ThreadUtils.postOnMainThread( () -> { if (mPreference != null) { Loading @@ -136,17 +176,11 @@ public class AudioStreamButtonController extends BasePreferenceController .setButton1Text(R.string.audio_streams_disconnect) .setButton1Icon( com.android.settings.R.drawable.ic_settings_close) .setButton1OnClickListener( unused -> { if (mPreference != null) { mPreference.setButton1Enabled(false); } mAudioStreamsHelper.removeSource(mBroadcastId); }); .setButton1OnClickListener(onClickListener); } }); } else { View.OnClickListener clickToRejoin = onClickListener = unused -> ThreadUtils.postOnBackgroundThread( () -> { Loading @@ -155,11 +189,14 @@ public class AudioStreamButtonController extends BasePreferenceController mContext, mBroadcastId); if (metadata != null) { mAudioStreamsHelper.addSource(metadata); mMetricsFeatureProvider.action( mContext, SettingsEnums.ACTION_AUDIO_STREAM_JOIN, SOURCE_ORIGIN_REPOSITORY); ThreadUtils.postOnMainThread( () -> { if (mPreference != null) { mPreference.setButton1Enabled( false); mPreference.setButton1Enabled(false); } }); } Loading @@ -171,13 +208,10 @@ public class AudioStreamButtonController extends BasePreferenceController mPreference .setButton1Text(R.string.audio_streams_connect) .setButton1Icon(com.android.settings.R.drawable.ic_add_24dp) .setButton1OnClickListener(clickToRejoin); .setButton1OnClickListener(onClickListener); } }); } } else { Log.w(TAG, "updateButton(): preference is null!"); } } @Override Loading
src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamPreference.java +19 −3 Original line number Diff line number Diff line Loading @@ -107,6 +107,12 @@ class AudioStreamPreference extends TwoTargetPreference { : AudioStreamsProgressCategoryController.AudioStreamState.UNKNOWN; } SourceOriginForLogging getSourceOriginForLogging() { return mAudioStream != null ? mAudioStream.getSourceOriginForLogging() : SourceOriginForLogging.UNKNOWN; } @Override protected boolean shouldHideSecondTarget() { return mIsConnected || !mIsEncrypted; Loading @@ -130,11 +136,13 @@ class AudioStreamPreference extends TwoTargetPreference { } static AudioStreamPreference fromMetadata( Context context, BluetoothLeBroadcastMetadata source) { Context context, BluetoothLeBroadcastMetadata source, SourceOriginForLogging sourceOriginForLogging) { AudioStreamPreference preference = new AudioStreamPreference(context, /* attrs= */ null); preference.setIsEncrypted(source.isEncrypted()); preference.setTitle(AudioStreamsHelper.getBroadcastName(source)); preference.setAudioStream(new AudioStream(source)); preference.setAudioStream(new AudioStream(source, sourceOriginForLogging)); return preference; } Loading @@ -158,11 +166,15 @@ class AudioStreamPreference extends TwoTargetPreference { private static final int UNAVAILABLE = -1; @Nullable private BluetoothLeBroadcastMetadata mMetadata; @Nullable private BluetoothLeBroadcastReceiveState mReceiveState; private SourceOriginForLogging mSourceOriginForLogging = SourceOriginForLogging.UNKNOWN; private AudioStreamsProgressCategoryController.AudioStreamState mState = AudioStreamsProgressCategoryController.AudioStreamState.UNKNOWN; private AudioStream(BluetoothLeBroadcastMetadata metadata) { private AudioStream( BluetoothLeBroadcastMetadata metadata, SourceOriginForLogging sourceOriginForLogging) { mMetadata = metadata; mSourceOriginForLogging = sourceOriginForLogging; } private AudioStream(BluetoothLeBroadcastReceiveState receiveState) { Loading Loading @@ -191,6 +203,10 @@ class AudioStreamPreference extends TwoTargetPreference { return mState; } private SourceOriginForLogging getSourceOriginForLogging() { return mSourceOriginForLogging; } @Nullable private BluetoothLeBroadcastMetadata getMetadata() { return mMetadata; Loading