Loading src/com/android/settings/connecteddevice/audiosharing/AudioSharingLoadingStateDialogFragment.java +14 −9 Original line number Original line Diff line number Diff line Loading @@ -44,7 +44,7 @@ public class AudioSharingLoadingStateDialogFragment extends InstrumentedDialogFr private static final String TAG = "AudioSharingLoadingDlg"; private static final String TAG = "AudioSharingLoadingDlg"; private static final String BUNDLE_KEY_MESSAGE = "bundle_key_message"; private static final String BUNDLE_KEY_MESSAGE = "bundle_key_message"; private static final long AUTO_DISMISS_TIME_THRESHOLD_MS = TimeUnit.SECONDS.toMillis(10); private static final long AUTO_DISMISS_TIME_THRESHOLD_MS = TimeUnit.SECONDS.toMillis(15); private static final int AUTO_DISMISS_MESSAGE_ID = R.id.message; private static final int AUTO_DISMISS_MESSAGE_ID = R.id.message; private static String sMessage = ""; private static String sMessage = ""; Loading Loading @@ -74,14 +74,16 @@ public class AudioSharingLoadingStateDialogFragment extends InstrumentedDialogFr } } AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG); AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG); if (dialog != null) { if (dialog != null) { if (sMessage.equals(message)) { if (!sMessage.equals(message)) { Log.d(TAG, "Dialog is showing with same message, return."); Log.d(TAG, "Update dialog message."); return; TextView messageView = dialog.findViewById(R.id.message); } else { if (messageView != null) { Log.d(TAG, "Dialog is showing with different message, dismiss and reshow."); messageView.setText(message); dialog.dismiss(); } } } } Log.d(TAG, "Dialog is showing, return."); return; } sMessage = message; sMessage = message; Log.d(TAG, "Show up the loading dialog."); Log.d(TAG, "Show up the loading dialog."); Bundle args = new Bundle(); Bundle args = new Bundle(); Loading Loading @@ -113,8 +115,10 @@ public class AudioSharingLoadingStateDialogFragment extends InstrumentedDialogFr @NonNull @NonNull public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { mHandler = new Handler(Looper.getMainLooper()); mHandler = new Handler(Looper.getMainLooper()); mHandler.postDelayed(() -> dismiss(), AUTO_DISMISS_MESSAGE_ID, mHandler.postDelayed(() -> { AUTO_DISMISS_TIME_THRESHOLD_MS); Log.d(TAG, "Auto dismiss dialog after timeout"); dismiss(); }, AUTO_DISMISS_MESSAGE_ID, AUTO_DISMISS_TIME_THRESHOLD_MS); Bundle args = requireArguments(); Bundle args = requireArguments(); String message = args.getString(BUNDLE_KEY_MESSAGE, ""); String message = args.getString(BUNDLE_KEY_MESSAGE, ""); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); Loading @@ -132,6 +136,7 @@ public class AudioSharingLoadingStateDialogFragment extends InstrumentedDialogFr public void onDismiss(@NonNull DialogInterface dialog) { public void onDismiss(@NonNull DialogInterface dialog) { super.onDismiss(dialog); super.onDismiss(dialog); if (mHandler != null) { if (mHandler != null) { Log.d(TAG, "Dialog dismissed, remove auto dismiss task"); mHandler.removeMessages(AUTO_DISMISS_MESSAGE_ID); mHandler.removeMessages(AUTO_DISMISS_MESSAGE_ID); } } } } Loading src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java +57 −18 Original line number Original line Diff line number Diff line Loading @@ -70,6 +70,7 @@ import java.util.HashMap; import java.util.List; import java.util.List; import java.util.Locale; import java.util.Locale; import java.util.Map; import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.Executor; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean; Loading Loading @@ -112,12 +113,13 @@ public class AudioSharingSwitchBarController extends BasePreferenceController private final MetricsFeatureProvider mMetricsFeatureProvider; private final MetricsFeatureProvider mMetricsFeatureProvider; private final OnAudioSharingStateChangedListener mListener; private final OnAudioSharingStateChangedListener mListener; private Map<Integer, List<BluetoothDevice>> mGroupedConnectedDevices = new HashMap<>(); private Map<Integer, List<BluetoothDevice>> mGroupedConnectedDevices = new HashMap<>(); private List<BluetoothDevice> mTargetActiveSinks = new ArrayList<>(); @Nullable private AudioSharingDeviceItem mTargetActiveItem; private List<AudioSharingDeviceItem> mDeviceItemsForSharing = new ArrayList<>(); private List<AudioSharingDeviceItem> mDeviceItemsForSharing = new ArrayList<>(); @VisibleForTesting IntentFilter mIntentFilter; @VisibleForTesting IntentFilter mIntentFilter; private final AtomicBoolean mCallbacksRegistered = new AtomicBoolean(false); private final AtomicBoolean mCallbacksRegistered = new AtomicBoolean(false); private AtomicInteger mIntentHandleStage = private AtomicInteger mIntentHandleStage = new AtomicInteger(StartIntentHandleStage.TO_HANDLE.ordinal()); new AtomicInteger(StartIntentHandleStage.TO_HANDLE.ordinal()); private CopyOnWriteArrayList<BluetoothDevice> mSinksInAdding = new CopyOnWriteArrayList<>(); @VisibleForTesting @VisibleForTesting BroadcastReceiver mReceiver = BroadcastReceiver mReceiver = Loading Loading @@ -294,7 +296,16 @@ public class AudioSharingSwitchBarController extends BasePreferenceController public void onReceiveStateChanged( public void onReceiveStateChanged( @NonNull BluetoothDevice sink, @NonNull BluetoothDevice sink, int sourceId, int sourceId, @NonNull BluetoothLeBroadcastReceiveState state) {} @NonNull BluetoothLeBroadcastReceiveState state) { if (BluetoothUtils.isConnected(state)) { if (mSinksInAdding.contains(sink)) { mSinksInAdding.remove(sink); } dismissLoadingStateDialogIfNeeded(); Log.d(TAG, "onReceiveStateChanged() connected, sink = " + sink + ", remaining sinks = " + mSinksInAdding); } } }; }; AudioSharingSwitchBarController( AudioSharingSwitchBarController( Loading Loading @@ -506,17 +517,20 @@ public class AudioSharingSwitchBarController extends BasePreferenceController mBtManager, mGroupedConnectedDevices, /* filterByInSharing= */ false); mBtManager, mGroupedConnectedDevices, /* filterByInSharing= */ false); // deviceItems is ordered. The active device is the first place if exits. // deviceItems is ordered. The active device is the first place if exits. mDeviceItemsForSharing = new ArrayList<>(deviceItems); mDeviceItemsForSharing = new ArrayList<>(deviceItems); mTargetActiveSinks = new ArrayList<>(); mTargetActiveItem = null; if (!deviceItems.isEmpty() && deviceItems.get(0).isActive()) { if (!deviceItems.isEmpty() && deviceItems.get(0).isActive()) { // If active device exists for audio sharing, share to it // If active device exists for audio sharing, share to it // automatically once the broadcast is started. // automatically once the broadcast is started. mTargetActiveSinks = mTargetActiveItem = deviceItems.get(0); mGroupedConnectedDevices.getOrDefault( deviceItems.get(0).getGroupId(), ImmutableList.of()); mDeviceItemsForSharing.remove(0); mDeviceItemsForSharing.remove(0); } } if (mBroadcast != null) { if (mBroadcast != null) { mBroadcast.startPrivateBroadcast(); mBroadcast.startPrivateBroadcast(); mSinksInAdding.clear(); // TODO: use string res once finalized. AudioSharingUtils.postOnMainThread(mContext, () -> AudioSharingLoadingStateDialogFragment.show(mFragment, "Starting audio stream...")); mMetricsFeatureProvider.action( mMetricsFeatureProvider.action( mContext, mContext, SettingsEnums.ACTION_AUDIO_SHARING_MAIN_SWITCH_ON, SettingsEnums.ACTION_AUDIO_SHARING_MAIN_SWITCH_ON, Loading Loading @@ -580,27 +594,30 @@ public class AudioSharingSwitchBarController extends BasePreferenceController } } private void handleOnBroadcastReady() { private void handleOnBroadcastReady() { List<BluetoothDevice> targetActiveSinks = mTargetActiveItem == null ? ImmutableList.of() : mGroupedConnectedDevices.getOrDefault( mTargetActiveItem.getGroupId(), ImmutableList.of()); Pair<Integer, Object>[] eventData = Pair<Integer, Object>[] eventData = AudioSharingUtils.buildAudioSharingDialogEventData( AudioSharingUtils.buildAudioSharingDialogEventData( SettingsEnums.AUDIO_SHARING_SETTINGS, SettingsEnums.AUDIO_SHARING_SETTINGS, SettingsEnums.DIALOG_AUDIO_SHARING_ADD_DEVICE, SettingsEnums.DIALOG_AUDIO_SHARING_ADD_DEVICE, /* userTriggered= */ false, /* userTriggered= */ false, /* deviceCountInSharing= */ mTargetActiveSinks.isEmpty() ? 0 : 1, /* deviceCountInSharing= */ targetActiveSinks.isEmpty() ? 0 : 1, /* candidateDeviceCount= */ mDeviceItemsForSharing.size()); /* candidateDeviceCount= */ mDeviceItemsForSharing.size()); if (!mTargetActiveSinks.isEmpty()) { if (!targetActiveSinks.isEmpty() && mTargetActiveItem != null) { Log.d(TAG, "handleOnBroadcastReady: automatically add source to active sinks."); Log.d(TAG, "handleOnBroadcastReady: automatically add source to active sinks."); AudioSharingUtils.addSourceToTargetSinks(mTargetActiveSinks, mBtManager); addSourceToTargetSinks(targetActiveSinks, mTargetActiveItem.getName()); mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_AUTO_JOIN_AUDIO_SHARING); mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_AUTO_JOIN_AUDIO_SHARING); mTargetActiveSinks.clear(); mTargetActiveItem = null; if (mIntentHandleStage.compareAndSet( if (mIntentHandleStage.compareAndSet( StartIntentHandleStage.HANDLE_AUTO_ADD.ordinal(), StartIntentHandleStage.HANDLE_AUTO_ADD.ordinal(), StartIntentHandleStage.HANDLED.ordinal()) StartIntentHandleStage.HANDLED.ordinal()) && mDeviceItemsForSharing.size() == 1) { && mDeviceItemsForSharing.size() == 1) { Log.d(TAG, "handleOnBroadcastReady: auto add source to the second device"); Log.d(TAG, "handleOnBroadcastReady: auto add source to the second device"); AudioSharingUtils.addSourceToTargetSinks( AudioSharingDeviceItem target = mDeviceItemsForSharing.get(0); mGroupedConnectedDevices.getOrDefault( List<BluetoothDevice> targetSinks = mGroupedConnectedDevices.getOrDefault( mDeviceItemsForSharing.get(0).getGroupId(), ImmutableList.of()), target.getGroupId(), ImmutableList.of()); mBtManager); addSourceToTargetSinks(targetSinks, target.getName()); cleanUp(); cleanUp(); // TODO: Add metric for auto add by intent // TODO: Add metric for auto add by intent return; return; Loading @@ -611,6 +628,7 @@ public class AudioSharingSwitchBarController extends BasePreferenceController StartIntentHandleStage.HANDLED.ordinal()); StartIntentHandleStage.HANDLED.ordinal()); if (mFragment == null) { if (mFragment == null) { Log.d(TAG, "handleOnBroadcastReady: dialog fail to show due to null fragment."); Log.d(TAG, "handleOnBroadcastReady: dialog fail to show due to null fragment."); dismissLoadingStateDialogIfNeeded(); cleanUp(); cleanUp(); return; return; } } Loading @@ -622,15 +640,15 @@ public class AudioSharingSwitchBarController extends BasePreferenceController new AudioSharingDialogFragment.DialogEventListener() { new AudioSharingDialogFragment.DialogEventListener() { @Override @Override public void onItemClick(@NonNull AudioSharingDeviceItem item) { public void onItemClick(@NonNull AudioSharingDeviceItem item) { AudioSharingUtils.addSourceToTargetSinks( List<BluetoothDevice> targetSinks = mGroupedConnectedDevices.getOrDefault( mGroupedConnectedDevices.getOrDefault( item.getGroupId(), ImmutableList.of()); item.getGroupId(), ImmutableList.of()), addSourceToTargetSinks(targetSinks, item.getName()); mBtManager); cleanUp(); cleanUp(); } } @Override @Override public void onCancelClick() { public void onCancelClick() { dismissLoadingStateDialogIfNeeded(); cleanUp(); cleanUp(); } } }; }; Loading Loading @@ -700,6 +718,27 @@ public class AudioSharingSwitchBarController extends BasePreferenceController }); }); } } private void addSourceToTargetSinks(List<BluetoothDevice> targetActiveSinks, @NonNull String sinkName) { mSinksInAdding.addAll(targetActiveSinks); AudioSharingUtils.addSourceToTargetSinks(targetActiveSinks, mBtManager); // TODO: move to res once finalized String loadingMessage = "Sharing with " + sinkName + "..."; showLoadingStateDialog(loadingMessage); } private void showLoadingStateDialog(@NonNull String loadingMessage) { AudioSharingUtils.postOnMainThread(mContext, () -> AudioSharingLoadingStateDialogFragment.show(mFragment, loadingMessage)); } private void dismissLoadingStateDialogIfNeeded() { if (mSinksInAdding.isEmpty()) { AudioSharingUtils.postOnMainThread(mContext, () -> AudioSharingLoadingStateDialogFragment.dismiss(mFragment)); } } private void cleanUp() { private void cleanUp() { mGroupedConnectedDevices.clear(); mGroupedConnectedDevices.clear(); mDeviceItemsForSharing.clear(); mDeviceItemsForSharing.clear(); Loading tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingLoadingStateDialogFragmentTest.java +2 −7 Original line number Original line Diff line number Diff line Loading @@ -150,7 +150,7 @@ public class AudioSharingLoadingStateDialogFragmentTest { } } @Test @Test public void showDialog_newMessage_dismissAndShowNewDialog() { public void showDialog_newMessage_keepAndUpdateDialog() { mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); AudioSharingLoadingStateDialogFragment.show(mParent, TEST_MESSAGE1); AudioSharingLoadingStateDialogFragment.show(mParent, TEST_MESSAGE1); shadowMainLooper().idle(); shadowMainLooper().idle(); Loading @@ -163,12 +163,7 @@ public class AudioSharingLoadingStateDialogFragmentTest { AudioSharingLoadingStateDialogFragment.show(mParent, TEST_MESSAGE2); AudioSharingLoadingStateDialogFragment.show(mParent, TEST_MESSAGE2); shadowMainLooper().idle(); shadowMainLooper().idle(); assertThat(dialog.isShowing()).isFalse(); assertThat(dialog.isShowing()).isTrue(); AlertDialog newDialog = ShadowAlertDialogCompat.getLatestAlertDialog(); assertThat(newDialog).isNotNull(); assertThat(newDialog.isShowing()).isTrue(); view = newDialog.findViewById(R.id.message); assertThat(view).isNotNull(); assertThat(view.getText().toString()).isEqualTo(TEST_MESSAGE2); assertThat(view.getText().toString()).isEqualTo(TEST_MESSAGE2); } } } } tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarControllerTest.java +129 −20 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
src/com/android/settings/connecteddevice/audiosharing/AudioSharingLoadingStateDialogFragment.java +14 −9 Original line number Original line Diff line number Diff line Loading @@ -44,7 +44,7 @@ public class AudioSharingLoadingStateDialogFragment extends InstrumentedDialogFr private static final String TAG = "AudioSharingLoadingDlg"; private static final String TAG = "AudioSharingLoadingDlg"; private static final String BUNDLE_KEY_MESSAGE = "bundle_key_message"; private static final String BUNDLE_KEY_MESSAGE = "bundle_key_message"; private static final long AUTO_DISMISS_TIME_THRESHOLD_MS = TimeUnit.SECONDS.toMillis(10); private static final long AUTO_DISMISS_TIME_THRESHOLD_MS = TimeUnit.SECONDS.toMillis(15); private static final int AUTO_DISMISS_MESSAGE_ID = R.id.message; private static final int AUTO_DISMISS_MESSAGE_ID = R.id.message; private static String sMessage = ""; private static String sMessage = ""; Loading Loading @@ -74,14 +74,16 @@ public class AudioSharingLoadingStateDialogFragment extends InstrumentedDialogFr } } AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG); AlertDialog dialog = AudioSharingDialogHelper.getDialogIfShowing(manager, TAG); if (dialog != null) { if (dialog != null) { if (sMessage.equals(message)) { if (!sMessage.equals(message)) { Log.d(TAG, "Dialog is showing with same message, return."); Log.d(TAG, "Update dialog message."); return; TextView messageView = dialog.findViewById(R.id.message); } else { if (messageView != null) { Log.d(TAG, "Dialog is showing with different message, dismiss and reshow."); messageView.setText(message); dialog.dismiss(); } } } } Log.d(TAG, "Dialog is showing, return."); return; } sMessage = message; sMessage = message; Log.d(TAG, "Show up the loading dialog."); Log.d(TAG, "Show up the loading dialog."); Bundle args = new Bundle(); Bundle args = new Bundle(); Loading Loading @@ -113,8 +115,10 @@ public class AudioSharingLoadingStateDialogFragment extends InstrumentedDialogFr @NonNull @NonNull public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { mHandler = new Handler(Looper.getMainLooper()); mHandler = new Handler(Looper.getMainLooper()); mHandler.postDelayed(() -> dismiss(), AUTO_DISMISS_MESSAGE_ID, mHandler.postDelayed(() -> { AUTO_DISMISS_TIME_THRESHOLD_MS); Log.d(TAG, "Auto dismiss dialog after timeout"); dismiss(); }, AUTO_DISMISS_MESSAGE_ID, AUTO_DISMISS_TIME_THRESHOLD_MS); Bundle args = requireArguments(); Bundle args = requireArguments(); String message = args.getString(BUNDLE_KEY_MESSAGE, ""); String message = args.getString(BUNDLE_KEY_MESSAGE, ""); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); Loading @@ -132,6 +136,7 @@ public class AudioSharingLoadingStateDialogFragment extends InstrumentedDialogFr public void onDismiss(@NonNull DialogInterface dialog) { public void onDismiss(@NonNull DialogInterface dialog) { super.onDismiss(dialog); super.onDismiss(dialog); if (mHandler != null) { if (mHandler != null) { Log.d(TAG, "Dialog dismissed, remove auto dismiss task"); mHandler.removeMessages(AUTO_DISMISS_MESSAGE_ID); mHandler.removeMessages(AUTO_DISMISS_MESSAGE_ID); } } } } Loading
src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java +57 −18 Original line number Original line Diff line number Diff line Loading @@ -70,6 +70,7 @@ import java.util.HashMap; import java.util.List; import java.util.List; import java.util.Locale; import java.util.Locale; import java.util.Map; import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.Executor; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean; Loading Loading @@ -112,12 +113,13 @@ public class AudioSharingSwitchBarController extends BasePreferenceController private final MetricsFeatureProvider mMetricsFeatureProvider; private final MetricsFeatureProvider mMetricsFeatureProvider; private final OnAudioSharingStateChangedListener mListener; private final OnAudioSharingStateChangedListener mListener; private Map<Integer, List<BluetoothDevice>> mGroupedConnectedDevices = new HashMap<>(); private Map<Integer, List<BluetoothDevice>> mGroupedConnectedDevices = new HashMap<>(); private List<BluetoothDevice> mTargetActiveSinks = new ArrayList<>(); @Nullable private AudioSharingDeviceItem mTargetActiveItem; private List<AudioSharingDeviceItem> mDeviceItemsForSharing = new ArrayList<>(); private List<AudioSharingDeviceItem> mDeviceItemsForSharing = new ArrayList<>(); @VisibleForTesting IntentFilter mIntentFilter; @VisibleForTesting IntentFilter mIntentFilter; private final AtomicBoolean mCallbacksRegistered = new AtomicBoolean(false); private final AtomicBoolean mCallbacksRegistered = new AtomicBoolean(false); private AtomicInteger mIntentHandleStage = private AtomicInteger mIntentHandleStage = new AtomicInteger(StartIntentHandleStage.TO_HANDLE.ordinal()); new AtomicInteger(StartIntentHandleStage.TO_HANDLE.ordinal()); private CopyOnWriteArrayList<BluetoothDevice> mSinksInAdding = new CopyOnWriteArrayList<>(); @VisibleForTesting @VisibleForTesting BroadcastReceiver mReceiver = BroadcastReceiver mReceiver = Loading Loading @@ -294,7 +296,16 @@ public class AudioSharingSwitchBarController extends BasePreferenceController public void onReceiveStateChanged( public void onReceiveStateChanged( @NonNull BluetoothDevice sink, @NonNull BluetoothDevice sink, int sourceId, int sourceId, @NonNull BluetoothLeBroadcastReceiveState state) {} @NonNull BluetoothLeBroadcastReceiveState state) { if (BluetoothUtils.isConnected(state)) { if (mSinksInAdding.contains(sink)) { mSinksInAdding.remove(sink); } dismissLoadingStateDialogIfNeeded(); Log.d(TAG, "onReceiveStateChanged() connected, sink = " + sink + ", remaining sinks = " + mSinksInAdding); } } }; }; AudioSharingSwitchBarController( AudioSharingSwitchBarController( Loading Loading @@ -506,17 +517,20 @@ public class AudioSharingSwitchBarController extends BasePreferenceController mBtManager, mGroupedConnectedDevices, /* filterByInSharing= */ false); mBtManager, mGroupedConnectedDevices, /* filterByInSharing= */ false); // deviceItems is ordered. The active device is the first place if exits. // deviceItems is ordered. The active device is the first place if exits. mDeviceItemsForSharing = new ArrayList<>(deviceItems); mDeviceItemsForSharing = new ArrayList<>(deviceItems); mTargetActiveSinks = new ArrayList<>(); mTargetActiveItem = null; if (!deviceItems.isEmpty() && deviceItems.get(0).isActive()) { if (!deviceItems.isEmpty() && deviceItems.get(0).isActive()) { // If active device exists for audio sharing, share to it // If active device exists for audio sharing, share to it // automatically once the broadcast is started. // automatically once the broadcast is started. mTargetActiveSinks = mTargetActiveItem = deviceItems.get(0); mGroupedConnectedDevices.getOrDefault( deviceItems.get(0).getGroupId(), ImmutableList.of()); mDeviceItemsForSharing.remove(0); mDeviceItemsForSharing.remove(0); } } if (mBroadcast != null) { if (mBroadcast != null) { mBroadcast.startPrivateBroadcast(); mBroadcast.startPrivateBroadcast(); mSinksInAdding.clear(); // TODO: use string res once finalized. AudioSharingUtils.postOnMainThread(mContext, () -> AudioSharingLoadingStateDialogFragment.show(mFragment, "Starting audio stream...")); mMetricsFeatureProvider.action( mMetricsFeatureProvider.action( mContext, mContext, SettingsEnums.ACTION_AUDIO_SHARING_MAIN_SWITCH_ON, SettingsEnums.ACTION_AUDIO_SHARING_MAIN_SWITCH_ON, Loading Loading @@ -580,27 +594,30 @@ public class AudioSharingSwitchBarController extends BasePreferenceController } } private void handleOnBroadcastReady() { private void handleOnBroadcastReady() { List<BluetoothDevice> targetActiveSinks = mTargetActiveItem == null ? ImmutableList.of() : mGroupedConnectedDevices.getOrDefault( mTargetActiveItem.getGroupId(), ImmutableList.of()); Pair<Integer, Object>[] eventData = Pair<Integer, Object>[] eventData = AudioSharingUtils.buildAudioSharingDialogEventData( AudioSharingUtils.buildAudioSharingDialogEventData( SettingsEnums.AUDIO_SHARING_SETTINGS, SettingsEnums.AUDIO_SHARING_SETTINGS, SettingsEnums.DIALOG_AUDIO_SHARING_ADD_DEVICE, SettingsEnums.DIALOG_AUDIO_SHARING_ADD_DEVICE, /* userTriggered= */ false, /* userTriggered= */ false, /* deviceCountInSharing= */ mTargetActiveSinks.isEmpty() ? 0 : 1, /* deviceCountInSharing= */ targetActiveSinks.isEmpty() ? 0 : 1, /* candidateDeviceCount= */ mDeviceItemsForSharing.size()); /* candidateDeviceCount= */ mDeviceItemsForSharing.size()); if (!mTargetActiveSinks.isEmpty()) { if (!targetActiveSinks.isEmpty() && mTargetActiveItem != null) { Log.d(TAG, "handleOnBroadcastReady: automatically add source to active sinks."); Log.d(TAG, "handleOnBroadcastReady: automatically add source to active sinks."); AudioSharingUtils.addSourceToTargetSinks(mTargetActiveSinks, mBtManager); addSourceToTargetSinks(targetActiveSinks, mTargetActiveItem.getName()); mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_AUTO_JOIN_AUDIO_SHARING); mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_AUTO_JOIN_AUDIO_SHARING); mTargetActiveSinks.clear(); mTargetActiveItem = null; if (mIntentHandleStage.compareAndSet( if (mIntentHandleStage.compareAndSet( StartIntentHandleStage.HANDLE_AUTO_ADD.ordinal(), StartIntentHandleStage.HANDLE_AUTO_ADD.ordinal(), StartIntentHandleStage.HANDLED.ordinal()) StartIntentHandleStage.HANDLED.ordinal()) && mDeviceItemsForSharing.size() == 1) { && mDeviceItemsForSharing.size() == 1) { Log.d(TAG, "handleOnBroadcastReady: auto add source to the second device"); Log.d(TAG, "handleOnBroadcastReady: auto add source to the second device"); AudioSharingUtils.addSourceToTargetSinks( AudioSharingDeviceItem target = mDeviceItemsForSharing.get(0); mGroupedConnectedDevices.getOrDefault( List<BluetoothDevice> targetSinks = mGroupedConnectedDevices.getOrDefault( mDeviceItemsForSharing.get(0).getGroupId(), ImmutableList.of()), target.getGroupId(), ImmutableList.of()); mBtManager); addSourceToTargetSinks(targetSinks, target.getName()); cleanUp(); cleanUp(); // TODO: Add metric for auto add by intent // TODO: Add metric for auto add by intent return; return; Loading @@ -611,6 +628,7 @@ public class AudioSharingSwitchBarController extends BasePreferenceController StartIntentHandleStage.HANDLED.ordinal()); StartIntentHandleStage.HANDLED.ordinal()); if (mFragment == null) { if (mFragment == null) { Log.d(TAG, "handleOnBroadcastReady: dialog fail to show due to null fragment."); Log.d(TAG, "handleOnBroadcastReady: dialog fail to show due to null fragment."); dismissLoadingStateDialogIfNeeded(); cleanUp(); cleanUp(); return; return; } } Loading @@ -622,15 +640,15 @@ public class AudioSharingSwitchBarController extends BasePreferenceController new AudioSharingDialogFragment.DialogEventListener() { new AudioSharingDialogFragment.DialogEventListener() { @Override @Override public void onItemClick(@NonNull AudioSharingDeviceItem item) { public void onItemClick(@NonNull AudioSharingDeviceItem item) { AudioSharingUtils.addSourceToTargetSinks( List<BluetoothDevice> targetSinks = mGroupedConnectedDevices.getOrDefault( mGroupedConnectedDevices.getOrDefault( item.getGroupId(), ImmutableList.of()); item.getGroupId(), ImmutableList.of()), addSourceToTargetSinks(targetSinks, item.getName()); mBtManager); cleanUp(); cleanUp(); } } @Override @Override public void onCancelClick() { public void onCancelClick() { dismissLoadingStateDialogIfNeeded(); cleanUp(); cleanUp(); } } }; }; Loading Loading @@ -700,6 +718,27 @@ public class AudioSharingSwitchBarController extends BasePreferenceController }); }); } } private void addSourceToTargetSinks(List<BluetoothDevice> targetActiveSinks, @NonNull String sinkName) { mSinksInAdding.addAll(targetActiveSinks); AudioSharingUtils.addSourceToTargetSinks(targetActiveSinks, mBtManager); // TODO: move to res once finalized String loadingMessage = "Sharing with " + sinkName + "..."; showLoadingStateDialog(loadingMessage); } private void showLoadingStateDialog(@NonNull String loadingMessage) { AudioSharingUtils.postOnMainThread(mContext, () -> AudioSharingLoadingStateDialogFragment.show(mFragment, loadingMessage)); } private void dismissLoadingStateDialogIfNeeded() { if (mSinksInAdding.isEmpty()) { AudioSharingUtils.postOnMainThread(mContext, () -> AudioSharingLoadingStateDialogFragment.dismiss(mFragment)); } } private void cleanUp() { private void cleanUp() { mGroupedConnectedDevices.clear(); mGroupedConnectedDevices.clear(); mDeviceItemsForSharing.clear(); mDeviceItemsForSharing.clear(); Loading
tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingLoadingStateDialogFragmentTest.java +2 −7 Original line number Original line Diff line number Diff line Loading @@ -150,7 +150,7 @@ public class AudioSharingLoadingStateDialogFragmentTest { } } @Test @Test public void showDialog_newMessage_dismissAndShowNewDialog() { public void showDialog_newMessage_keepAndUpdateDialog() { mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); AudioSharingLoadingStateDialogFragment.show(mParent, TEST_MESSAGE1); AudioSharingLoadingStateDialogFragment.show(mParent, TEST_MESSAGE1); shadowMainLooper().idle(); shadowMainLooper().idle(); Loading @@ -163,12 +163,7 @@ public class AudioSharingLoadingStateDialogFragmentTest { AudioSharingLoadingStateDialogFragment.show(mParent, TEST_MESSAGE2); AudioSharingLoadingStateDialogFragment.show(mParent, TEST_MESSAGE2); shadowMainLooper().idle(); shadowMainLooper().idle(); assertThat(dialog.isShowing()).isFalse(); assertThat(dialog.isShowing()).isTrue(); AlertDialog newDialog = ShadowAlertDialogCompat.getLatestAlertDialog(); assertThat(newDialog).isNotNull(); assertThat(newDialog.isShowing()).isTrue(); view = newDialog.findViewById(R.id.message); assertThat(view).isNotNull(); assertThat(view.getText().toString()).isEqualTo(TEST_MESSAGE2); assertThat(view.getText().toString()).isEqualTo(TEST_MESSAGE2); } } } }
tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarControllerTest.java +129 −20 File changed.Preview size limit exceeded, changes collapsed. Show changes