Merge "[Audiosharing] Log action in audio sharing dialogs" into main
This commit is contained in:
@@ -18,11 +18,17 @@ package com.android.settings.connecteddevice.audiosharing;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.robolectric.shadows.ShadowLooper.shadowMainLooper;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.bluetooth.BluetoothAdapter;
|
||||
import android.bluetooth.BluetoothStatusCodes;
|
||||
import android.content.Context;
|
||||
import android.platform.test.flag.junit.SetFlagsRule;
|
||||
import android.util.Pair;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.ImageView;
|
||||
@@ -34,6 +40,7 @@ import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
|
||||
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
|
||||
import com.android.settingslib.flags.Flags;
|
||||
@@ -72,30 +79,50 @@ public class AudioSharingDialogFragmentTest {
|
||||
new AudioSharingDeviceItem(TEST_DEVICE_NAME2, /* groupId= */ 2, /* isActive= */ false);
|
||||
private static final AudioSharingDeviceItem TEST_DEVICE_ITEM3 =
|
||||
new AudioSharingDeviceItem(TEST_DEVICE_NAME3, /* groupId= */ 3, /* isActive= */ false);
|
||||
private static final AudioSharingDialogFragment.DialogEventListener EMPTY_EVENT_LISTENER =
|
||||
new AudioSharingDialogFragment.DialogEventListener() {
|
||||
@Override
|
||||
public void onItemClick(AudioSharingDeviceItem item) {}
|
||||
|
||||
@Override
|
||||
public void onCancelClick() {}
|
||||
};
|
||||
private static final Pair<Integer, Object> TEST_EVENT_DATA = Pair.create(1, 1);
|
||||
private static final Pair<Integer, Object>[] TEST_EVENT_DATA_LIST =
|
||||
new Pair[] {TEST_EVENT_DATA};
|
||||
|
||||
private Fragment mParent;
|
||||
private AudioSharingDialogFragment mFragment;
|
||||
private ShadowBluetoothAdapter mShadowBluetoothAdapter;
|
||||
private FakeFeatureFactory mFeatureFactory;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
ShadowAlertDialogCompat.reset();
|
||||
mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());
|
||||
mShadowBluetoothAdapter.setEnabled(true);
|
||||
mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
|
||||
ShadowBluetoothAdapter shadowBluetoothAdapter =
|
||||
Shadow.extract(BluetoothAdapter.getDefaultAdapter());
|
||||
shadowBluetoothAdapter.setEnabled(true);
|
||||
shadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
|
||||
BluetoothStatusCodes.FEATURE_SUPPORTED);
|
||||
mShadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported(
|
||||
shadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported(
|
||||
BluetoothStatusCodes.FEATURE_SUPPORTED);
|
||||
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||
mFragment = new AudioSharingDialogFragment();
|
||||
mParent = new Fragment();
|
||||
FragmentController.setupFragment(
|
||||
mParent, FragmentActivity.class, /* containerViewId= */ 0, /* bundle= */ null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getMetricsCategory_correctValue() {
|
||||
assertThat(mFragment.getMetricsCategory())
|
||||
.isEqualTo(SettingsEnums.DIALOG_AUDIO_SHARING_ADD_DEVICE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onCreateDialog_flagOff_dialogNotExist() {
|
||||
mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
mFragment.show(mParent, new ArrayList<>(), (item) -> {});
|
||||
AudioSharingDialogFragment.show(
|
||||
mParent, new ArrayList<>(), EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
@@ -105,14 +132,20 @@ public class AudioSharingDialogFragmentTest {
|
||||
@Test
|
||||
public void onCreateDialog_flagOn_noConnectedDevice() {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
mFragment.show(mParent, new ArrayList<>(), (item) -> {});
|
||||
AudioSharingDialogFragment.show(
|
||||
mParent, new ArrayList<>(), EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog).isNotNull();
|
||||
TextView description = dialog.findViewById(R.id.description_text);
|
||||
assertThat(description).isNotNull();
|
||||
ImageView image = dialog.findViewById(R.id.description_image);
|
||||
assertThat(image).isNotNull();
|
||||
Button shareBtn = dialog.findViewById(R.id.positive_btn);
|
||||
assertThat(shareBtn).isNotNull();
|
||||
Button cancelBtn = dialog.findViewById(R.id.negative_btn);
|
||||
assertThat(cancelBtn).isNotNull();
|
||||
assertThat(dialog.isShowing()).isTrue();
|
||||
assertThat(description.getVisibility()).isEqualTo(View.VISIBLE);
|
||||
assertThat(description.getText().toString())
|
||||
@@ -125,13 +158,22 @@ public class AudioSharingDialogFragmentTest {
|
||||
@Test
|
||||
public void onCreateDialog_noConnectedDevice_dialogDismiss() {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
mFragment.show(mParent, new ArrayList<>(), (item) -> {});
|
||||
AudioSharingDialogFragment.show(
|
||||
mParent, new ArrayList<>(), EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
dialog.findViewById(android.R.id.button2).performClick();
|
||||
assertThat(dialog).isNotNull();
|
||||
View btnView = dialog.findViewById(android.R.id.button2);
|
||||
assertThat(btnView).isNotNull();
|
||||
btnView.performClick();
|
||||
shadowMainLooper().idle();
|
||||
|
||||
assertThat(dialog.isShowing()).isFalse();
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(
|
||||
any(Context.class),
|
||||
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_NEGATIVE_BTN_CLICKED),
|
||||
eq(TEST_EVENT_DATA));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -139,15 +181,21 @@ public class AudioSharingDialogFragmentTest {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
|
||||
list.add(TEST_DEVICE_ITEM1);
|
||||
mFragment.show(mParent, list, (item) -> {});
|
||||
AudioSharingDialogFragment.show(mParent, list, EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog).isNotNull();
|
||||
TextView title = dialog.findViewById(R.id.title_text);
|
||||
assertThat(title).isNotNull();
|
||||
TextView description = dialog.findViewById(R.id.description_text);
|
||||
assertThat(description).isNotNull();
|
||||
ImageView image = dialog.findViewById(R.id.description_image);
|
||||
assertThat(image).isNotNull();
|
||||
Button shareBtn = dialog.findViewById(R.id.positive_btn);
|
||||
assertThat(shareBtn).isNotNull();
|
||||
Button cancelBtn = dialog.findViewById(R.id.negative_btn);
|
||||
assertThat(cancelBtn).isNotNull();
|
||||
assertThat(dialog.isShowing()).isTrue();
|
||||
assertThat(title.getText().toString())
|
||||
.isEqualTo(
|
||||
@@ -166,12 +214,22 @@ public class AudioSharingDialogFragmentTest {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
|
||||
list.add(TEST_DEVICE_ITEM1);
|
||||
mFragment.show(mParent, list, (item) -> {});
|
||||
AudioSharingDialogFragment.show(mParent, list, EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
dialog.findViewById(R.id.negative_btn).performClick();
|
||||
assertThat(dialog).isNotNull();
|
||||
View btnView = dialog.findViewById(R.id.negative_btn);
|
||||
assertThat(btnView).isNotNull();
|
||||
btnView.performClick();
|
||||
shadowMainLooper().idle();
|
||||
|
||||
assertThat(dialog.isShowing()).isFalse();
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(
|
||||
any(Context.class),
|
||||
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_NEGATIVE_BTN_CLICKED),
|
||||
eq(TEST_EVENT_DATA));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -180,13 +238,35 @@ public class AudioSharingDialogFragmentTest {
|
||||
ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
|
||||
list.add(TEST_DEVICE_ITEM1);
|
||||
AtomicBoolean isShareBtnClicked = new AtomicBoolean(false);
|
||||
mFragment.show(mParent, list, (item) -> isShareBtnClicked.set(true));
|
||||
AudioSharingDialogFragment.show(
|
||||
mParent,
|
||||
list,
|
||||
new AudioSharingDialogFragment.DialogEventListener() {
|
||||
@Override
|
||||
public void onItemClick(AudioSharingDeviceItem item) {
|
||||
isShareBtnClicked.set(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCancelClick() {}
|
||||
},
|
||||
TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
dialog.findViewById(R.id.positive_btn).performClick();
|
||||
assertThat(dialog).isNotNull();
|
||||
View btnView = dialog.findViewById(R.id.positive_btn);
|
||||
assertThat(btnView).isNotNull();
|
||||
btnView.performClick();
|
||||
shadowMainLooper().idle();
|
||||
|
||||
assertThat(dialog.isShowing()).isFalse();
|
||||
assertThat(isShareBtnClicked.get()).isTrue();
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(
|
||||
any(Context.class),
|
||||
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_POSITIVE_BTN_CLICKED),
|
||||
eq(TEST_EVENT_DATA));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -196,15 +276,21 @@ public class AudioSharingDialogFragmentTest {
|
||||
list.add(TEST_DEVICE_ITEM1);
|
||||
list.add(TEST_DEVICE_ITEM2);
|
||||
list.add(TEST_DEVICE_ITEM3);
|
||||
mFragment.show(mParent, list, (item) -> {});
|
||||
AudioSharingDialogFragment.show(mParent, list, EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog).isNotNull();
|
||||
TextView description = dialog.findViewById(R.id.description_text);
|
||||
assertThat(description).isNotNull();
|
||||
ImageView image = dialog.findViewById(R.id.description_image);
|
||||
assertThat(image).isNotNull();
|
||||
Button shareBtn = dialog.findViewById(R.id.positive_btn);
|
||||
assertThat(shareBtn).isNotNull();
|
||||
Button cancelBtn = dialog.findViewById(R.id.negative_btn);
|
||||
assertThat(cancelBtn).isNotNull();
|
||||
RecyclerView recyclerView = dialog.findViewById(R.id.device_btn_list);
|
||||
assertThat(recyclerView).isNotNull();
|
||||
assertThat(dialog.isShowing()).isTrue();
|
||||
assertThat(description.getVisibility()).isEqualTo(View.VISIBLE);
|
||||
assertThat(description.getText().toString())
|
||||
@@ -223,11 +309,35 @@ public class AudioSharingDialogFragmentTest {
|
||||
list.add(TEST_DEVICE_ITEM1);
|
||||
list.add(TEST_DEVICE_ITEM2);
|
||||
list.add(TEST_DEVICE_ITEM3);
|
||||
mFragment.show(mParent, list, (item) -> {});
|
||||
AtomicBoolean isCancelBtnClicked = new AtomicBoolean(false);
|
||||
AudioSharingDialogFragment.show(
|
||||
mParent,
|
||||
list,
|
||||
new AudioSharingDialogFragment.DialogEventListener() {
|
||||
@Override
|
||||
public void onItemClick(AudioSharingDeviceItem item) {}
|
||||
|
||||
@Override
|
||||
public void onCancelClick() {
|
||||
isCancelBtnClicked.set(true);
|
||||
}
|
||||
},
|
||||
TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
dialog.findViewById(R.id.negative_btn).performClick();
|
||||
assertThat(dialog).isNotNull();
|
||||
View btnView = dialog.findViewById(R.id.negative_btn);
|
||||
assertThat(btnView).isNotNull();
|
||||
btnView.performClick();
|
||||
shadowMainLooper().idle();
|
||||
|
||||
assertThat(dialog.isShowing()).isFalse();
|
||||
assertThat(isCancelBtnClicked.get()).isTrue();
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(
|
||||
any(Context.class),
|
||||
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_NEGATIVE_BTN_CLICKED),
|
||||
eq(TEST_EVENT_DATA));
|
||||
}
|
||||
}
|
||||
|
@@ -24,6 +24,7 @@ import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
import static org.robolectric.Shadows.shadowOf;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.bluetooth.BluetoothAdapter;
|
||||
import android.bluetooth.BluetoothDevice;
|
||||
import android.bluetooth.BluetoothLeBroadcastReceiveState;
|
||||
@@ -32,6 +33,7 @@ import android.bluetooth.BluetoothStatusCodes;
|
||||
import android.content.Context;
|
||||
import android.os.Looper;
|
||||
import android.platform.test.flag.junit.SetFlagsRule;
|
||||
import android.util.Pair;
|
||||
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
@@ -39,6 +41,7 @@ import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
|
||||
import com.android.settings.bluetooth.Utils;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
|
||||
import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
|
||||
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
|
||||
@@ -51,6 +54,7 @@ import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
|
||||
import com.android.settingslib.flags.Flags;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.truth.Correspondence;
|
||||
|
||||
import org.junit.Before;
|
||||
@@ -87,6 +91,7 @@ public class AudioSharingDialogHandlerTest {
|
||||
Correspondence.from(
|
||||
(Fragment fragment, String tag) ->
|
||||
fragment instanceof DialogFragment
|
||||
&& ((DialogFragment) fragment).getTag() != null
|
||||
&& ((DialogFragment) fragment).getTag().equals(tag),
|
||||
"is equal to");
|
||||
|
||||
@@ -107,20 +112,22 @@ public class AudioSharingDialogHandlerTest {
|
||||
private Fragment mParentFragment;
|
||||
@Mock private BluetoothLeBroadcastReceiveState mState;
|
||||
private Context mContext;
|
||||
private ShadowBluetoothAdapter mShadowBluetoothAdapter;
|
||||
private AudioSharingDialogHandler mHandler;
|
||||
private FakeFeatureFactory mFeatureFactory;
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
mContext = ApplicationProvider.getApplicationContext();
|
||||
ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBtManager;
|
||||
mLocalBtManager = Utils.getLocalBtManager(mContext);
|
||||
mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());
|
||||
mShadowBluetoothAdapter.setEnabled(true);
|
||||
mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
|
||||
ShadowBluetoothAdapter shadowBluetoothAdapter =
|
||||
Shadow.extract(BluetoothAdapter.getDefaultAdapter());
|
||||
shadowBluetoothAdapter.setEnabled(true);
|
||||
shadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
|
||||
BluetoothStatusCodes.FEATURE_SUPPORTED);
|
||||
mShadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported(
|
||||
shadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported(
|
||||
BluetoothStatusCodes.FEATURE_SUPPORTED);
|
||||
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
when(mLocalBtManager.getProfileManager()).thenReturn(mLocalBtProfileManager);
|
||||
when(mLocalBtProfileManager.getLeAudioBroadcastProfile()).thenReturn(mBroadcast);
|
||||
@@ -183,9 +190,33 @@ public class AudioSharingDialogHandlerTest {
|
||||
when(mAssistant.getAllSources(any())).thenReturn(ImmutableList.of(mState));
|
||||
mHandler.handleDeviceConnected(mCachedDevice2, /* userTriggered= */ true);
|
||||
shadowOf(Looper.getMainLooper()).idle();
|
||||
assertThat(mParentFragment.getChildFragmentManager().getFragments())
|
||||
List<Fragment> childFragments = mParentFragment.getChildFragmentManager().getFragments();
|
||||
assertThat(childFragments)
|
||||
.comparingElementsUsing(TAG_EQUALS)
|
||||
.containsExactly(AudioSharingStopDialogFragment.tag());
|
||||
|
||||
AudioSharingStopDialogFragment fragment =
|
||||
(AudioSharingStopDialogFragment) Iterables.getOnlyElement(childFragments);
|
||||
Pair<Integer, Object>[] eventData = fragment.getEventData();
|
||||
assertThat(eventData)
|
||||
.asList()
|
||||
.containsExactly(
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_SOURCE_PAGE_ID.ordinal(),
|
||||
SettingsEnums.SETTINGS_CONNECTED_DEVICE_CATEGORY),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_PAGE_ID.ordinal(),
|
||||
SettingsEnums.DIALOG_STOP_AUDIO_SHARING),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_USER_TRIGGERED.ordinal(), 1),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_DEVICE_COUNT_IN_SHARING
|
||||
.ordinal(),
|
||||
1),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_CANDIDATE_DEVICE_COUNT
|
||||
.ordinal(),
|
||||
0));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -211,9 +242,33 @@ public class AudioSharingDialogHandlerTest {
|
||||
when(mAssistant.getAllSources(any())).thenReturn(ImmutableList.of());
|
||||
mHandler.handleDeviceConnected(mCachedDevice1, /* userTriggered= */ true);
|
||||
shadowOf(Looper.getMainLooper()).idle();
|
||||
assertThat(mParentFragment.getChildFragmentManager().getFragments())
|
||||
List<Fragment> childFragments = mParentFragment.getChildFragmentManager().getFragments();
|
||||
assertThat(childFragments)
|
||||
.comparingElementsUsing(TAG_EQUALS)
|
||||
.containsExactly(AudioSharingJoinDialogFragment.tag());
|
||||
|
||||
AudioSharingJoinDialogFragment fragment =
|
||||
(AudioSharingJoinDialogFragment) Iterables.getOnlyElement(childFragments);
|
||||
Pair<Integer, Object>[] eventData = fragment.getEventData();
|
||||
assertThat(eventData)
|
||||
.asList()
|
||||
.containsExactly(
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_SOURCE_PAGE_ID.ordinal(),
|
||||
SettingsEnums.SETTINGS_CONNECTED_DEVICE_CATEGORY),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_PAGE_ID.ordinal(),
|
||||
SettingsEnums.DIALOG_START_AUDIO_SHARING),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_USER_TRIGGERED.ordinal(), 1),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_DEVICE_COUNT_IN_SHARING
|
||||
.ordinal(),
|
||||
0),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_CANDIDATE_DEVICE_COUNT
|
||||
.ordinal(),
|
||||
2));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -227,9 +282,33 @@ public class AudioSharingDialogHandlerTest {
|
||||
when(mAssistant.getAllSources(mDevice3)).thenReturn(ImmutableList.of(mState));
|
||||
mHandler.handleDeviceConnected(mCachedDevice1, /* userTriggered= */ true);
|
||||
shadowOf(Looper.getMainLooper()).idle();
|
||||
assertThat(mParentFragment.getChildFragmentManager().getFragments())
|
||||
List<Fragment> childFragments = mParentFragment.getChildFragmentManager().getFragments();
|
||||
assertThat(childFragments)
|
||||
.comparingElementsUsing(TAG_EQUALS)
|
||||
.containsExactly(AudioSharingJoinDialogFragment.tag());
|
||||
|
||||
AudioSharingJoinDialogFragment fragment =
|
||||
(AudioSharingJoinDialogFragment) Iterables.getOnlyElement(childFragments);
|
||||
Pair<Integer, Object>[] eventData = fragment.getEventData();
|
||||
assertThat(eventData)
|
||||
.asList()
|
||||
.containsExactly(
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_SOURCE_PAGE_ID.ordinal(),
|
||||
SettingsEnums.SETTINGS_CONNECTED_DEVICE_CATEGORY),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_PAGE_ID.ordinal(),
|
||||
SettingsEnums.DIALOG_AUDIO_SHARING_ADD_DEVICE),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_USER_TRIGGERED.ordinal(), 1),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_DEVICE_COUNT_IN_SHARING
|
||||
.ordinal(),
|
||||
1),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_CANDIDATE_DEVICE_COUNT
|
||||
.ordinal(),
|
||||
1));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -245,9 +324,33 @@ public class AudioSharingDialogHandlerTest {
|
||||
when(mAssistant.getAllSources(mDevice4)).thenReturn(ImmutableList.of(mState));
|
||||
mHandler.handleDeviceConnected(mCachedDevice1, /* userTriggered= */ true);
|
||||
shadowOf(Looper.getMainLooper()).idle();
|
||||
assertThat(mParentFragment.getChildFragmentManager().getFragments())
|
||||
List<Fragment> childFragments = mParentFragment.getChildFragmentManager().getFragments();
|
||||
assertThat(childFragments)
|
||||
.comparingElementsUsing(TAG_EQUALS)
|
||||
.containsExactly(AudioSharingDisconnectDialogFragment.tag());
|
||||
|
||||
AudioSharingDisconnectDialogFragment fragment =
|
||||
(AudioSharingDisconnectDialogFragment) Iterables.getOnlyElement(childFragments);
|
||||
Pair<Integer, Object>[] eventData = fragment.getEventData();
|
||||
assertThat(eventData)
|
||||
.asList()
|
||||
.containsExactly(
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_SOURCE_PAGE_ID.ordinal(),
|
||||
SettingsEnums.SETTINGS_CONNECTED_DEVICE_CATEGORY),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_PAGE_ID.ordinal(),
|
||||
SettingsEnums.DIALOG_AUDIO_SHARING_SWITCH_DEVICE),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_USER_TRIGGERED.ordinal(), 1),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_DEVICE_COUNT_IN_SHARING
|
||||
.ordinal(),
|
||||
2),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_CANDIDATE_DEVICE_COUNT
|
||||
.ordinal(),
|
||||
1));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -273,9 +376,33 @@ public class AudioSharingDialogHandlerTest {
|
||||
when(mAssistant.getAllSources(any())).thenReturn(ImmutableList.of(mState));
|
||||
mHandler.handleDeviceConnected(mCachedDevice2, /* userTriggered= */ false);
|
||||
shadowOf(Looper.getMainLooper()).idle();
|
||||
assertThat(mParentFragment.getChildFragmentManager().getFragments())
|
||||
List<Fragment> childFragments = mParentFragment.getChildFragmentManager().getFragments();
|
||||
assertThat(childFragments)
|
||||
.comparingElementsUsing(TAG_EQUALS)
|
||||
.containsExactly(AudioSharingStopDialogFragment.tag());
|
||||
|
||||
AudioSharingStopDialogFragment fragment =
|
||||
(AudioSharingStopDialogFragment) Iterables.getOnlyElement(childFragments);
|
||||
Pair<Integer, Object>[] eventData = fragment.getEventData();
|
||||
assertThat(eventData)
|
||||
.asList()
|
||||
.containsExactly(
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_SOURCE_PAGE_ID.ordinal(),
|
||||
SettingsEnums.SETTINGS_CONNECTED_DEVICE_CATEGORY),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_PAGE_ID.ordinal(),
|
||||
SettingsEnums.DIALOG_STOP_AUDIO_SHARING),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_USER_TRIGGERED.ordinal(), 0),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_DEVICE_COUNT_IN_SHARING
|
||||
.ordinal(),
|
||||
1),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_CANDIDATE_DEVICE_COUNT
|
||||
.ordinal(),
|
||||
0));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -301,9 +428,33 @@ public class AudioSharingDialogHandlerTest {
|
||||
when(mAssistant.getAllSources(any())).thenReturn(ImmutableList.of());
|
||||
mHandler.handleDeviceConnected(mCachedDevice1, /* userTriggered= */ false);
|
||||
shadowOf(Looper.getMainLooper()).idle();
|
||||
assertThat(mParentFragment.getChildFragmentManager().getFragments())
|
||||
List<Fragment> childFragments = mParentFragment.getChildFragmentManager().getFragments();
|
||||
assertThat(childFragments)
|
||||
.comparingElementsUsing(TAG_EQUALS)
|
||||
.containsExactly(AudioSharingJoinDialogFragment.tag());
|
||||
|
||||
AudioSharingJoinDialogFragment fragment =
|
||||
(AudioSharingJoinDialogFragment) Iterables.getOnlyElement(childFragments);
|
||||
Pair<Integer, Object>[] eventData = fragment.getEventData();
|
||||
assertThat(eventData)
|
||||
.asList()
|
||||
.containsExactly(
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_SOURCE_PAGE_ID.ordinal(),
|
||||
SettingsEnums.SETTINGS_CONNECTED_DEVICE_CATEGORY),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_PAGE_ID.ordinal(),
|
||||
SettingsEnums.DIALOG_START_AUDIO_SHARING),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_USER_TRIGGERED.ordinal(), 0),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_DEVICE_COUNT_IN_SHARING
|
||||
.ordinal(),
|
||||
0),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_CANDIDATE_DEVICE_COUNT
|
||||
.ordinal(),
|
||||
2));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -317,9 +468,33 @@ public class AudioSharingDialogHandlerTest {
|
||||
when(mAssistant.getAllSources(mDevice3)).thenReturn(ImmutableList.of(mState));
|
||||
mHandler.handleDeviceConnected(mCachedDevice1, /* userTriggered= */ false);
|
||||
shadowOf(Looper.getMainLooper()).idle();
|
||||
assertThat(mParentFragment.getChildFragmentManager().getFragments())
|
||||
List<Fragment> childFragments = mParentFragment.getChildFragmentManager().getFragments();
|
||||
assertThat(childFragments)
|
||||
.comparingElementsUsing(TAG_EQUALS)
|
||||
.containsExactly(AudioSharingJoinDialogFragment.tag());
|
||||
|
||||
AudioSharingJoinDialogFragment fragment =
|
||||
(AudioSharingJoinDialogFragment) Iterables.getOnlyElement(childFragments);
|
||||
Pair<Integer, Object>[] eventData = fragment.getEventData();
|
||||
assertThat(eventData)
|
||||
.asList()
|
||||
.containsExactly(
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_SOURCE_PAGE_ID.ordinal(),
|
||||
SettingsEnums.SETTINGS_CONNECTED_DEVICE_CATEGORY),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_PAGE_ID.ordinal(),
|
||||
SettingsEnums.DIALOG_AUDIO_SHARING_ADD_DEVICE),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_USER_TRIGGERED.ordinal(), 0),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_DEVICE_COUNT_IN_SHARING
|
||||
.ordinal(),
|
||||
1),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_CANDIDATE_DEVICE_COUNT
|
||||
.ordinal(),
|
||||
1));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -334,9 +509,33 @@ public class AudioSharingDialogHandlerTest {
|
||||
when(mAssistant.getAllSources(mDevice4)).thenReturn(ImmutableList.of(mState));
|
||||
mHandler.handleDeviceConnected(mCachedDevice1, /* userTriggered= */ false);
|
||||
shadowOf(Looper.getMainLooper()).idle();
|
||||
assertThat(mParentFragment.getChildFragmentManager().getFragments())
|
||||
List<Fragment> childFragments = mParentFragment.getChildFragmentManager().getFragments();
|
||||
assertThat(childFragments)
|
||||
.comparingElementsUsing(TAG_EQUALS)
|
||||
.containsExactly(AudioSharingDisconnectDialogFragment.tag());
|
||||
|
||||
AudioSharingDisconnectDialogFragment fragment =
|
||||
(AudioSharingDisconnectDialogFragment) Iterables.getOnlyElement(childFragments);
|
||||
Pair<Integer, Object>[] eventData = fragment.getEventData();
|
||||
assertThat(eventData)
|
||||
.asList()
|
||||
.containsExactly(
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_SOURCE_PAGE_ID.ordinal(),
|
||||
SettingsEnums.SETTINGS_CONNECTED_DEVICE_CATEGORY),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_PAGE_ID.ordinal(),
|
||||
SettingsEnums.DIALOG_AUDIO_SHARING_SWITCH_DEVICE),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_USER_TRIGGERED.ordinal(), 0),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_DEVICE_COUNT_IN_SHARING
|
||||
.ordinal(),
|
||||
2),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_CANDIDATE_DEVICE_COUNT
|
||||
.ordinal(),
|
||||
1));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -357,6 +556,11 @@ public class AudioSharingDialogHandlerTest {
|
||||
mHandler.closeOpeningDialogsForLeaDevice(mCachedDevice1);
|
||||
shadowOf(Looper.getMainLooper()).idle();
|
||||
assertThat(mParentFragment.getChildFragmentManager().getFragments()).isEmpty();
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(
|
||||
mContext,
|
||||
SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_AUTO_DISMISS,
|
||||
SettingsEnums.DIALOG_START_AUDIO_SHARING);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -377,6 +581,11 @@ public class AudioSharingDialogHandlerTest {
|
||||
mHandler.closeOpeningDialogsForNonLeaDevice(mCachedDevice2);
|
||||
shadowOf(Looper.getMainLooper()).idle();
|
||||
assertThat(mParentFragment.getChildFragmentManager().getFragments()).isEmpty();
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(
|
||||
mContext,
|
||||
SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_AUTO_DISMISS,
|
||||
SettingsEnums.DIALOG_STOP_AUDIO_SHARING);
|
||||
}
|
||||
|
||||
private void setUpBroadcast(boolean isBroadcasting) {
|
||||
|
@@ -18,13 +18,21 @@ package com.android.settings.connecteddevice.audiosharing;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
import static org.robolectric.shadows.ShadowLooper.shadowMainLooper;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.bluetooth.BluetoothAdapter;
|
||||
import android.bluetooth.BluetoothDevice;
|
||||
import android.bluetooth.BluetoothStatusCodes;
|
||||
import android.content.Context;
|
||||
import android.platform.test.flag.junit.SetFlagsRule;
|
||||
import android.util.Pair;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
@@ -33,6 +41,7 @@ import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
|
||||
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
|
||||
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
|
||||
@@ -78,15 +87,19 @@ public class AudioSharingDisconnectDialogFragmentTest {
|
||||
new AudioSharingDeviceItem(TEST_DEVICE_NAME2, TEST_GROUP_ID2, /* isActive= */ false);
|
||||
private static final AudioSharingDeviceItem TEST_DEVICE_ITEM3 =
|
||||
new AudioSharingDeviceItem(TEST_DEVICE_NAME3, TEST_GROUP_ID3, /* isActive= */ false);
|
||||
private static final AudioSharingDisconnectDialogFragment.DialogEventListener
|
||||
EMPTY_EVENT_LISTENER = (AudioSharingDeviceItem item) -> {};
|
||||
private static final Pair<Integer, Object> TEST_EVENT_DATA = Pair.create(1, 1);
|
||||
private static final Pair<Integer, Object>[] TEST_EVENT_DATA_LIST =
|
||||
new Pair[] {TEST_EVENT_DATA};
|
||||
|
||||
@Mock private BluetoothDevice mDevice1;
|
||||
@Mock private BluetoothDevice mDevice3;
|
||||
|
||||
@Mock private CachedBluetoothDevice mCachedDevice1;
|
||||
@Mock private CachedBluetoothDevice mCachedDevice3;
|
||||
private FakeFeatureFactory mFeatureFactory;
|
||||
private Fragment mParent;
|
||||
private AudioSharingDisconnectDialogFragment mFragment;
|
||||
private ShadowBluetoothAdapter mShadowBluetoothAdapter;
|
||||
private ArrayList<AudioSharingDeviceItem> mDeviceItems = new ArrayList<>();
|
||||
|
||||
@Before
|
||||
@@ -96,12 +109,14 @@ public class AudioSharingDisconnectDialogFragmentTest {
|
||||
latestAlertDialog.dismiss();
|
||||
ShadowAlertDialogCompat.reset();
|
||||
}
|
||||
mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());
|
||||
mShadowBluetoothAdapter.setEnabled(true);
|
||||
mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
|
||||
ShadowBluetoothAdapter shadowBluetoothAdapter =
|
||||
Shadow.extract(BluetoothAdapter.getDefaultAdapter());
|
||||
shadowBluetoothAdapter.setEnabled(true);
|
||||
shadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
|
||||
BluetoothStatusCodes.FEATURE_SUPPORTED);
|
||||
mShadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported(
|
||||
shadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported(
|
||||
BluetoothStatusCodes.FEATURE_SUPPORTED);
|
||||
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||
when(mDevice1.getAnonymizedAddress()).thenReturn(TEST_ADDRESS1);
|
||||
when(mDevice3.getAnonymizedAddress()).thenReturn(TEST_ADDRESS3);
|
||||
when(mCachedDevice1.getName()).thenReturn(TEST_DEVICE_NAME1);
|
||||
@@ -116,13 +131,20 @@ public class AudioSharingDisconnectDialogFragmentTest {
|
||||
mParent, FragmentActivity.class, /* containerViewId= */ 0, /* bundle= */ null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getMetricsCategory_correctValue() {
|
||||
assertThat(mFragment.getMetricsCategory())
|
||||
.isEqualTo(SettingsEnums.DIALOG_AUDIO_SHARING_SWITCH_DEVICE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onCreateDialog_flagOff_dialogNotExist() {
|
||||
mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
mDeviceItems = new ArrayList<>();
|
||||
mDeviceItems.add(TEST_DEVICE_ITEM1);
|
||||
mDeviceItems.add(TEST_DEVICE_ITEM2);
|
||||
mFragment.show(mParent, mDeviceItems, mCachedDevice3, (item) -> {});
|
||||
AudioSharingDisconnectDialogFragment.show(
|
||||
mParent, mDeviceItems, mCachedDevice3, EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
@@ -135,12 +157,15 @@ public class AudioSharingDisconnectDialogFragmentTest {
|
||||
mDeviceItems = new ArrayList<>();
|
||||
mDeviceItems.add(TEST_DEVICE_ITEM1);
|
||||
mDeviceItems.add(TEST_DEVICE_ITEM2);
|
||||
mFragment.show(mParent, mDeviceItems, mCachedDevice3, (item) -> {});
|
||||
AudioSharingDisconnectDialogFragment.show(
|
||||
mParent, mDeviceItems, mCachedDevice3, EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog).isNotNull();
|
||||
assertThat(dialog.isShowing()).isTrue();
|
||||
RecyclerView view = dialog.findViewById(R.id.device_btn_list);
|
||||
assertThat(view).isNotNull();
|
||||
assertThat(view.getAdapter().getItemCount()).isEqualTo(2);
|
||||
}
|
||||
|
||||
@@ -150,12 +175,14 @@ public class AudioSharingDisconnectDialogFragmentTest {
|
||||
mDeviceItems = new ArrayList<>();
|
||||
mDeviceItems.add(TEST_DEVICE_ITEM1);
|
||||
mDeviceItems.add(TEST_DEVICE_ITEM2);
|
||||
mFragment.show(mParent, mDeviceItems, mCachedDevice3, (item) -> {});
|
||||
AudioSharingDisconnectDialogFragment.show(
|
||||
mParent, mDeviceItems, mCachedDevice3, EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
AtomicBoolean isItemBtnClicked = new AtomicBoolean(false);
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog).isNotNull();
|
||||
assertThat(dialog.isShowing()).isTrue();
|
||||
RecyclerView view = dialog.findViewById(R.id.device_btn_list);
|
||||
assertThat(view).isNotNull();
|
||||
assertThat(view.getAdapter().getItemCount()).isEqualTo(2);
|
||||
Button btn1 =
|
||||
view.findViewHolderForAdapterPosition(0).itemView.findViewById(R.id.device_button);
|
||||
@@ -173,37 +200,71 @@ public class AudioSharingDisconnectDialogFragmentTest {
|
||||
TEST_DEVICE_NAME2));
|
||||
|
||||
// Update dialog content for device with same group
|
||||
mFragment.show(mParent, mDeviceItems, mCachedDevice3, (item) -> isItemBtnClicked.set(true));
|
||||
AtomicBoolean isItemBtnClicked = new AtomicBoolean(false);
|
||||
AudioSharingDisconnectDialogFragment.show(
|
||||
mParent,
|
||||
mDeviceItems,
|
||||
mCachedDevice3,
|
||||
(AudioSharingDeviceItem item) -> isItemBtnClicked.set(true),
|
||||
TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog.isShowing()).isTrue();
|
||||
verify(mFeatureFactory.metricsFeatureProvider, times(0))
|
||||
.action(
|
||||
any(Context.class),
|
||||
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_AUTO_DISMISS),
|
||||
eq(SettingsEnums.DIALOG_AUDIO_SHARING_SWITCH_DEVICE));
|
||||
|
||||
btn1 = view.findViewHolderForAdapterPosition(0).itemView.findViewById(R.id.device_button);
|
||||
btn1.performClick();
|
||||
shadowMainLooper().idle();
|
||||
assertThat(dialog.isShowing()).isFalse();
|
||||
assertThat(isItemBtnClicked.get()).isTrue();
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(
|
||||
any(Context.class),
|
||||
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_POSITIVE_BTN_CLICKED),
|
||||
eq(TEST_EVENT_DATA));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onCreateDialog_dialogIsShowingForNewGroup_updateDialog() {
|
||||
public void onCreateDialog_dialogIsShowingForNewGroup_showNewDialog() {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
mDeviceItems = new ArrayList<>();
|
||||
mDeviceItems.add(TEST_DEVICE_ITEM1);
|
||||
mDeviceItems.add(TEST_DEVICE_ITEM2);
|
||||
mFragment.show(mParent, mDeviceItems, mCachedDevice3, (item) -> {});
|
||||
AudioSharingDisconnectDialogFragment.show(
|
||||
mParent, mDeviceItems, mCachedDevice3, EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog).isNotNull();
|
||||
assertThat(dialog.isShowing()).isTrue();
|
||||
RecyclerView view = dialog.findViewById(R.id.device_btn_list);
|
||||
assertThat(view).isNotNull();
|
||||
assertThat(view.getAdapter().getItemCount()).isEqualTo(2);
|
||||
|
||||
// Show new dialog for device with new group
|
||||
ArrayList<AudioSharingDeviceItem> newDeviceItems = new ArrayList<>();
|
||||
newDeviceItems.add(TEST_DEVICE_ITEM2);
|
||||
newDeviceItems.add(TEST_DEVICE_ITEM3);
|
||||
mFragment.show(mParent, newDeviceItems, mCachedDevice1, (item) -> {});
|
||||
AudioSharingDisconnectDialogFragment.show(
|
||||
mParent,
|
||||
newDeviceItems,
|
||||
mCachedDevice1,
|
||||
EMPTY_EVENT_LISTENER,
|
||||
TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog.isShowing()).isTrue();
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(
|
||||
any(Context.class),
|
||||
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_AUTO_DISMISS),
|
||||
eq(SettingsEnums.DIALOG_AUDIO_SHARING_SWITCH_DEVICE));
|
||||
|
||||
view = dialog.findViewById(R.id.device_btn_list);
|
||||
assertThat(view).isNotNull();
|
||||
assertThat(view.getAdapter().getItemCount()).isEqualTo(2);
|
||||
Button btn1 =
|
||||
view.findViewHolderForAdapterPosition(0).itemView.findViewById(R.id.device_button);
|
||||
@@ -227,12 +288,27 @@ public class AudioSharingDisconnectDialogFragmentTest {
|
||||
mDeviceItems = new ArrayList<>();
|
||||
mDeviceItems.add(TEST_DEVICE_ITEM1);
|
||||
mDeviceItems.add(TEST_DEVICE_ITEM2);
|
||||
mFragment.show(mParent, mDeviceItems, mCachedDevice3, (item) -> {});
|
||||
AudioSharingDisconnectDialogFragment.show(
|
||||
mParent, mDeviceItems, mCachedDevice3, EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog).isNotNull();
|
||||
assertThat(dialog.isShowing()).isTrue();
|
||||
View btnView = dialog.findViewById(R.id.negative_btn);
|
||||
assertThat(btnView).isNotNull();
|
||||
btnView.performClick();
|
||||
shadowMainLooper().idle();
|
||||
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog.isShowing()).isTrue();
|
||||
dialog.findViewById(R.id.negative_btn).performClick();
|
||||
assertThat(dialog.isShowing()).isFalse();
|
||||
verify(mFeatureFactory.metricsFeatureProvider, times(0))
|
||||
.action(
|
||||
any(Context.class),
|
||||
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_AUTO_DISMISS),
|
||||
eq(SettingsEnums.DIALOG_AUDIO_SHARING_SWITCH_DEVICE));
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(
|
||||
any(Context.class),
|
||||
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_NEGATIVE_BTN_CLICKED),
|
||||
eq(TEST_EVENT_DATA));
|
||||
}
|
||||
}
|
||||
|
@@ -18,13 +18,19 @@ package com.android.settings.connecteddevice.audiosharing;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
import static org.robolectric.shadows.ShadowLooper.shadowMainLooper;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.bluetooth.BluetoothAdapter;
|
||||
import android.bluetooth.BluetoothStatusCodes;
|
||||
import android.content.Context;
|
||||
import android.platform.test.flag.junit.SetFlagsRule;
|
||||
import android.util.Pair;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.fragment.app.Fragment;
|
||||
@@ -32,6 +38,7 @@ import androidx.fragment.app.FragmentActivity;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.bluetooth.Utils;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
|
||||
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
|
||||
import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
|
||||
@@ -82,6 +89,9 @@ public class AudioSharingJoinDialogFragmentTest {
|
||||
@Override
|
||||
public void onCancelClick() {}
|
||||
};
|
||||
private static final Pair<Integer, Object> TEST_EVENT_DATA = Pair.create(1, 1);
|
||||
private static final Pair<Integer, Object>[] TEST_EVENT_DATA_LIST =
|
||||
new Pair[] {TEST_EVENT_DATA};
|
||||
|
||||
@Mock private CachedBluetoothDevice mCachedDevice1;
|
||||
@Mock private CachedBluetoothDevice mCachedDevice2;
|
||||
@@ -90,7 +100,7 @@ public class AudioSharingJoinDialogFragmentTest {
|
||||
@Mock private LocalBluetoothLeBroadcast mBroadcast;
|
||||
private Fragment mParent;
|
||||
private AudioSharingJoinDialogFragment mFragment;
|
||||
private ShadowBluetoothAdapter mShadowBluetoothAdapter;
|
||||
private FakeFeatureFactory mFeatureFactory;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
@@ -99,12 +109,14 @@ public class AudioSharingJoinDialogFragmentTest {
|
||||
latestAlertDialog.dismiss();
|
||||
ShadowAlertDialogCompat.reset();
|
||||
}
|
||||
mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());
|
||||
mShadowBluetoothAdapter.setEnabled(true);
|
||||
mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
|
||||
ShadowBluetoothAdapter shadowBluetoothAdapter =
|
||||
Shadow.extract(BluetoothAdapter.getDefaultAdapter());
|
||||
shadowBluetoothAdapter.setEnabled(true);
|
||||
shadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
|
||||
BluetoothStatusCodes.FEATURE_SUPPORTED);
|
||||
mShadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported(
|
||||
shadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported(
|
||||
BluetoothStatusCodes.FEATURE_SUPPORTED);
|
||||
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||
when(mCachedDevice1.getName()).thenReturn(TEST_DEVICE_NAME1);
|
||||
when(mCachedDevice2.getName()).thenReturn(TEST_DEVICE_NAME2);
|
||||
mFragment = new AudioSharingJoinDialogFragment();
|
||||
@@ -137,7 +149,12 @@ public class AudioSharingJoinDialogFragmentTest {
|
||||
@Test
|
||||
public void onCreateDialog_flagOff_dialogNotExist() {
|
||||
mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
mFragment.show(mParent, new ArrayList<>(), mCachedDevice2, EMPTY_EVENT_LISTENER);
|
||||
AudioSharingJoinDialogFragment.show(
|
||||
mParent,
|
||||
new ArrayList<>(),
|
||||
mCachedDevice2,
|
||||
EMPTY_EVENT_LISTENER,
|
||||
TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog).isNull();
|
||||
@@ -146,7 +163,12 @@ public class AudioSharingJoinDialogFragmentTest {
|
||||
@Test
|
||||
public void onCreateDialog_flagOn_dialogShowTextForSingleDevice() {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
mFragment.show(mParent, new ArrayList<>(), mCachedDevice2, EMPTY_EVENT_LISTENER);
|
||||
AudioSharingJoinDialogFragment.show(
|
||||
mParent,
|
||||
new ArrayList<>(),
|
||||
mCachedDevice2,
|
||||
EMPTY_EVENT_LISTENER,
|
||||
TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog).isNotNull();
|
||||
@@ -160,7 +182,8 @@ public class AudioSharingJoinDialogFragmentTest {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
|
||||
list.add(TEST_DEVICE_ITEM1);
|
||||
mFragment.show(mParent, list, mCachedDevice2, EMPTY_EVENT_LISTENER);
|
||||
AudioSharingJoinDialogFragment.show(
|
||||
mParent, list, mCachedDevice2, EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog).isNotNull();
|
||||
@@ -179,7 +202,8 @@ public class AudioSharingJoinDialogFragmentTest {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
ArrayList<AudioSharingDeviceItem> list = new ArrayList<>();
|
||||
list.add(TEST_DEVICE_ITEM1);
|
||||
mFragment.show(mParent, list, mCachedDevice2, EMPTY_EVENT_LISTENER);
|
||||
AudioSharingJoinDialogFragment.show(
|
||||
mParent, list, mCachedDevice2, EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog).isNotNull();
|
||||
@@ -188,7 +212,8 @@ public class AudioSharingJoinDialogFragmentTest {
|
||||
// Update the content
|
||||
ArrayList<AudioSharingDeviceItem> list2 = new ArrayList<>();
|
||||
list2.add(TEST_DEVICE_ITEM2);
|
||||
mFragment.show(mParent, list2, mCachedDevice1, EMPTY_EVENT_LISTENER);
|
||||
AudioSharingJoinDialogFragment.show(
|
||||
mParent, list2, mCachedDevice1, EMPTY_EVENT_LISTENER, TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog).isNotNull();
|
||||
@@ -205,11 +230,25 @@ public class AudioSharingJoinDialogFragmentTest {
|
||||
@Test
|
||||
public void onCreateDialog_clickCancel_dialogDismiss() {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
mFragment.show(mParent, new ArrayList<>(), mCachedDevice2, EMPTY_EVENT_LISTENER);
|
||||
AudioSharingJoinDialogFragment.show(
|
||||
mParent,
|
||||
new ArrayList<>(),
|
||||
mCachedDevice2,
|
||||
EMPTY_EVENT_LISTENER,
|
||||
TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
dialog.findViewById(R.id.negative_btn).performClick();
|
||||
assertThat(dialog).isNotNull();
|
||||
View btnView = dialog.findViewById(R.id.negative_btn);
|
||||
assertThat(btnView).isNotNull();
|
||||
btnView.performClick();
|
||||
shadowMainLooper().idle();
|
||||
assertThat(dialog.isShowing()).isFalse();
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(
|
||||
any(Context.class),
|
||||
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_NEGATIVE_BTN_CLICKED),
|
||||
eq(TEST_EVENT_DATA));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -228,12 +267,22 @@ public class AudioSharingJoinDialogFragmentTest {
|
||||
|
||||
@Override
|
||||
public void onCancelClick() {}
|
||||
});
|
||||
},
|
||||
TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
dialog.findViewById(R.id.positive_btn).performClick();
|
||||
assertThat(dialog).isNotNull();
|
||||
View btnView = dialog.findViewById(R.id.positive_btn);
|
||||
assertThat(btnView).isNotNull();
|
||||
btnView.performClick();
|
||||
shadowMainLooper().idle();
|
||||
assertThat(dialog.isShowing()).isFalse();
|
||||
assertThat(isShareBtnClicked.get()).isTrue();
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(
|
||||
any(Context.class),
|
||||
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_POSITIVE_BTN_CLICKED),
|
||||
eq(TEST_EVENT_DATA));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -252,11 +301,21 @@ public class AudioSharingJoinDialogFragmentTest {
|
||||
public void onCancelClick() {
|
||||
isCancelBtnClicked.set(true);
|
||||
}
|
||||
});
|
||||
},
|
||||
TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
dialog.findViewById(R.id.negative_btn).performClick();
|
||||
assertThat(dialog).isNotNull();
|
||||
View btnView = dialog.findViewById(R.id.negative_btn);
|
||||
assertThat(btnView).isNotNull();
|
||||
btnView.performClick();
|
||||
shadowMainLooper().idle();
|
||||
assertThat(dialog.isShowing()).isFalse();
|
||||
assertThat(isCancelBtnClicked.get()).isTrue();
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(
|
||||
any(Context.class),
|
||||
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_NEGATIVE_BTN_CLICKED),
|
||||
eq(TEST_EVENT_DATA));
|
||||
}
|
||||
}
|
||||
|
@@ -18,13 +18,21 @@ package com.android.settings.connecteddevice.audiosharing;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
import static org.robolectric.shadows.ShadowLooper.shadowMainLooper;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.bluetooth.BluetoothAdapter;
|
||||
import android.bluetooth.BluetoothDevice;
|
||||
import android.bluetooth.BluetoothStatusCodes;
|
||||
import android.content.Context;
|
||||
import android.platform.test.flag.junit.SetFlagsRule;
|
||||
import android.util.Pair;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
@@ -32,6 +40,7 @@ import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
|
||||
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
|
||||
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
|
||||
@@ -76,14 +85,19 @@ public class AudioSharingStopDialogFragmentTest {
|
||||
private static final AudioSharingDeviceItem TEST_DEVICE_ITEM3 =
|
||||
new AudioSharingDeviceItem(
|
||||
TEST_DEVICE_NAME3, TEST_DEVICE_GROUP_ID3, /* isActive= */ false);
|
||||
private static final AudioSharingStopDialogFragment.DialogEventListener EMPTY_EVENT_LISTENER =
|
||||
() -> {};
|
||||
private static final Pair<Integer, Object> TEST_EVENT_DATA = Pair.create(1, 1);
|
||||
private static final Pair<Integer, Object>[] TEST_EVENT_DATA_LIST =
|
||||
new Pair[] {TEST_EVENT_DATA};
|
||||
|
||||
@Mock private CachedBluetoothDevice mCachedDevice1;
|
||||
@Mock private CachedBluetoothDevice mCachedDevice2;
|
||||
@Mock private BluetoothDevice mDevice1;
|
||||
@Mock private BluetoothDevice mDevice2;
|
||||
private FakeFeatureFactory mFeatureFactory;
|
||||
private Fragment mParent;
|
||||
private AudioSharingStopDialogFragment mFragment;
|
||||
private ShadowBluetoothAdapter mShadowBluetoothAdapter;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
@@ -92,12 +106,14 @@ public class AudioSharingStopDialogFragmentTest {
|
||||
latestAlertDialog.dismiss();
|
||||
ShadowAlertDialogCompat.reset();
|
||||
}
|
||||
mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());
|
||||
mShadowBluetoothAdapter.setEnabled(true);
|
||||
mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
|
||||
ShadowBluetoothAdapter shadowBluetoothAdapter =
|
||||
Shadow.extract(BluetoothAdapter.getDefaultAdapter());
|
||||
shadowBluetoothAdapter.setEnabled(true);
|
||||
shadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
|
||||
BluetoothStatusCodes.FEATURE_SUPPORTED);
|
||||
mShadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported(
|
||||
shadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported(
|
||||
BluetoothStatusCodes.FEATURE_SUPPORTED);
|
||||
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||
when(mCachedDevice1.getName()).thenReturn(TEST_DEVICE_NAME1);
|
||||
when(mCachedDevice1.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID1);
|
||||
when(mCachedDevice1.getDevice()).thenReturn(mDevice1);
|
||||
@@ -110,10 +126,21 @@ public class AudioSharingStopDialogFragmentTest {
|
||||
mParent, FragmentActivity.class, /* containerViewId= */ 0, /* bundle= */ null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getMetricsCategory_correctValue() {
|
||||
assertThat(mFragment.getMetricsCategory())
|
||||
.isEqualTo(SettingsEnums.DIALOG_STOP_AUDIO_SHARING);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onCreateDialog_flagOff_dialogNotExist() {
|
||||
mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
mFragment.show(mParent, ImmutableList.of(), mCachedDevice1, () -> {});
|
||||
AudioSharingStopDialogFragment.show(
|
||||
mParent,
|
||||
ImmutableList.of(),
|
||||
mCachedDevice1,
|
||||
EMPTY_EVENT_LISTENER,
|
||||
TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog).isNull();
|
||||
@@ -122,12 +149,18 @@ public class AudioSharingStopDialogFragmentTest {
|
||||
@Test
|
||||
public void onCreateDialog_oneDeviceInSharing_showDialogWithCorrectMessage() {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
mFragment.show(mParent, ImmutableList.of(TEST_DEVICE_ITEM2), mCachedDevice1, () -> {});
|
||||
AudioSharingStopDialogFragment.show(
|
||||
mParent,
|
||||
ImmutableList.of(TEST_DEVICE_ITEM2),
|
||||
mCachedDevice1,
|
||||
EMPTY_EVENT_LISTENER,
|
||||
TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog).isNotNull();
|
||||
assertThat(dialog.isShowing()).isTrue();
|
||||
TextView view = dialog.findViewById(R.id.description_text);
|
||||
assertThat(view).isNotNull();
|
||||
assertThat(view.getText().toString())
|
||||
.isEqualTo(
|
||||
mParent.getString(
|
||||
@@ -137,16 +170,18 @@ public class AudioSharingStopDialogFragmentTest {
|
||||
@Test
|
||||
public void onCreateDialog_twoDeviceInSharing_showDialogWithCorrectMessage() {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
mFragment.show(
|
||||
AudioSharingStopDialogFragment.show(
|
||||
mParent,
|
||||
ImmutableList.of(TEST_DEVICE_ITEM2, TEST_DEVICE_ITEM3),
|
||||
mCachedDevice1,
|
||||
() -> {});
|
||||
EMPTY_EVENT_LISTENER,
|
||||
TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog).isNotNull();
|
||||
assertThat(dialog.isShowing()).isTrue();
|
||||
TextView view = dialog.findViewById(R.id.description_text);
|
||||
assertThat(view).isNotNull();
|
||||
assertThat(view.getText().toString())
|
||||
.isEqualTo(
|
||||
mParent.getString(
|
||||
@@ -158,57 +193,99 @@ public class AudioSharingStopDialogFragmentTest {
|
||||
@Test
|
||||
public void onCreateDialog_dialogIsShowingForSameDevice_updateDialog() {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
mFragment.show(mParent, ImmutableList.of(), mCachedDevice1, () -> {});
|
||||
AudioSharingStopDialogFragment.show(
|
||||
mParent,
|
||||
ImmutableList.of(),
|
||||
mCachedDevice1,
|
||||
EMPTY_EVENT_LISTENER,
|
||||
TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog).isNotNull();
|
||||
assertThat(dialog.isShowing()).isTrue();
|
||||
TextView view = dialog.findViewById(R.id.description_text);
|
||||
assertThat(view).isNotNull();
|
||||
assertThat(view.getText().toString())
|
||||
.isEqualTo(mParent.getString(R.string.audio_sharing_stop_dialog_with_more_content));
|
||||
|
||||
// Update the content
|
||||
AtomicBoolean isStopBtnClicked = new AtomicBoolean(false);
|
||||
mFragment.show(
|
||||
mParent, ImmutableList.of(), mCachedDevice1, () -> isStopBtnClicked.set(true));
|
||||
AudioSharingStopDialogFragment.show(
|
||||
mParent,
|
||||
ImmutableList.of(),
|
||||
mCachedDevice1,
|
||||
() -> isStopBtnClicked.set(true),
|
||||
TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog).isNotNull();
|
||||
assertThat(dialog.isShowing()).isTrue();
|
||||
verify(mFeatureFactory.metricsFeatureProvider, times(0))
|
||||
.action(
|
||||
any(Context.class),
|
||||
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_AUTO_DISMISS),
|
||||
eq(SettingsEnums.DIALOG_STOP_AUDIO_SHARING));
|
||||
|
||||
dialog.findViewById(android.R.id.button1).performClick();
|
||||
View btnView = dialog.findViewById(android.R.id.button1);
|
||||
assertThat(btnView).isNotNull();
|
||||
btnView.performClick();
|
||||
shadowMainLooper().idle();
|
||||
assertThat(dialog.isShowing()).isFalse();
|
||||
assertThat(isStopBtnClicked.get()).isTrue();
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(
|
||||
any(Context.class),
|
||||
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_POSITIVE_BTN_CLICKED),
|
||||
eq(TEST_EVENT_DATA));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onCreateDialog_dialogIsShowingForNewDevice_showNewDialog() {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
mFragment.show(mParent, ImmutableList.of(), mCachedDevice1, () -> {});
|
||||
AudioSharingStopDialogFragment.show(
|
||||
mParent,
|
||||
ImmutableList.of(),
|
||||
mCachedDevice1,
|
||||
EMPTY_EVENT_LISTENER,
|
||||
TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog).isNotNull();
|
||||
assertThat(dialog.isShowing()).isTrue();
|
||||
TextView view = dialog.findViewById(R.id.description_text);
|
||||
assertThat(view).isNotNull();
|
||||
assertThat(view.getText().toString())
|
||||
.isEqualTo(mParent.getString(R.string.audio_sharing_stop_dialog_with_more_content));
|
||||
TextView title = dialog.findViewById(R.id.title_text);
|
||||
assertThat(title).isNotNull();
|
||||
assertThat(title.getText().toString())
|
||||
.isEqualTo(
|
||||
mParent.getString(
|
||||
R.string.audio_sharing_stop_dialog_title, TEST_DEVICE_NAME1));
|
||||
|
||||
// Show new dialog
|
||||
mFragment.show(mParent, ImmutableList.of(), mCachedDevice2, () -> {});
|
||||
AudioSharingStopDialogFragment.show(
|
||||
mParent,
|
||||
ImmutableList.of(),
|
||||
mCachedDevice2,
|
||||
EMPTY_EVENT_LISTENER,
|
||||
TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(dialog).isNotNull();
|
||||
assertThat(dialog.isShowing()).isTrue();
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(
|
||||
any(Context.class),
|
||||
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_AUTO_DISMISS),
|
||||
eq(SettingsEnums.DIALOG_STOP_AUDIO_SHARING));
|
||||
|
||||
view = dialog.findViewById(R.id.description_text);
|
||||
assertThat(view).isNotNull();
|
||||
assertThat(view.getText().toString())
|
||||
.isEqualTo(mParent.getString(R.string.audio_sharing_stop_dialog_with_more_content));
|
||||
title = dialog.findViewById(R.id.title_text);
|
||||
assertThat(title).isNotNull();
|
||||
assertThat(title.getText().toString())
|
||||
.isEqualTo(
|
||||
mParent.getString(
|
||||
@@ -218,25 +295,60 @@ public class AudioSharingStopDialogFragmentTest {
|
||||
@Test
|
||||
public void onCreateDialog_clickCancel_dialogDismiss() {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
mFragment.show(mParent, ImmutableList.of(), mCachedDevice1, () -> {});
|
||||
AudioSharingStopDialogFragment.show(
|
||||
mParent,
|
||||
ImmutableList.of(),
|
||||
mCachedDevice1,
|
||||
EMPTY_EVENT_LISTENER,
|
||||
TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
dialog.findViewById(android.R.id.button2).performClick();
|
||||
assertThat(dialog).isNotNull();
|
||||
View btnView = dialog.findViewById(android.R.id.button2);
|
||||
assertThat(btnView).isNotNull();
|
||||
btnView.performClick();
|
||||
shadowMainLooper().idle();
|
||||
assertThat(dialog.isShowing()).isFalse();
|
||||
verify(mFeatureFactory.metricsFeatureProvider, times(0))
|
||||
.action(
|
||||
any(Context.class),
|
||||
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_AUTO_DISMISS),
|
||||
eq(SettingsEnums.DIALOG_STOP_AUDIO_SHARING));
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(
|
||||
any(Context.class),
|
||||
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_NEGATIVE_BTN_CLICKED),
|
||||
eq(TEST_EVENT_DATA));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onCreateDialog_clickShare_callbackTriggered() {
|
||||
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
|
||||
AtomicBoolean isStopBtnClicked = new AtomicBoolean(false);
|
||||
mFragment.show(
|
||||
mParent, ImmutableList.of(), mCachedDevice1, () -> isStopBtnClicked.set(true));
|
||||
AudioSharingStopDialogFragment.show(
|
||||
mParent,
|
||||
ImmutableList.of(),
|
||||
mCachedDevice1,
|
||||
() -> isStopBtnClicked.set(true),
|
||||
TEST_EVENT_DATA_LIST);
|
||||
shadowMainLooper().idle();
|
||||
AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
dialog.findViewById(android.R.id.button1).performClick();
|
||||
assertThat(dialog).isNotNull();
|
||||
View btnView = dialog.findViewById(android.R.id.button1);
|
||||
assertThat(btnView).isNotNull();
|
||||
btnView.performClick();
|
||||
shadowMainLooper().idle();
|
||||
assertThat(dialog.isShowing()).isFalse();
|
||||
assertThat(isStopBtnClicked.get()).isTrue();
|
||||
verify(mFeatureFactory.metricsFeatureProvider, times(0))
|
||||
.action(
|
||||
any(Context.class),
|
||||
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_AUTO_DISMISS),
|
||||
eq(SettingsEnums.DIALOG_STOP_AUDIO_SHARING));
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(
|
||||
any(Context.class),
|
||||
eq(SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_POSITIVE_BTN_CLICKED),
|
||||
eq(TEST_EVENT_DATA));
|
||||
}
|
||||
}
|
||||
|
@@ -23,6 +23,7 @@ import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.doNothing;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.times;
|
||||
@@ -30,6 +31,7 @@ import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
import static org.robolectric.Shadows.shadowOf;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.bluetooth.BluetoothAdapter;
|
||||
import android.bluetooth.BluetoothDevice;
|
||||
import android.bluetooth.BluetoothLeBroadcast;
|
||||
@@ -43,12 +45,17 @@ import android.content.IntentFilter;
|
||||
import android.os.Looper;
|
||||
import android.platform.test.flag.junit.SetFlagsRule;
|
||||
import android.util.FeatureFlagUtils;
|
||||
import android.util.Pair;
|
||||
import android.widget.CompoundButton;
|
||||
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.lifecycle.LifecycleOwner;
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
|
||||
import com.android.settings.bluetooth.Utils;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
|
||||
import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
|
||||
import com.android.settings.testutils.shadow.ShadowThreadUtils;
|
||||
@@ -65,6 +72,8 @@ import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.flags.Flags;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.truth.Correspondence;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
@@ -77,7 +86,9 @@ import org.mockito.junit.MockitoRule;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.annotation.Config;
|
||||
import org.robolectric.shadow.api.Shadow;
|
||||
import org.robolectric.shadows.androidx.fragment.FragmentController;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@@ -88,6 +99,18 @@ import java.util.concurrent.Executor;
|
||||
ShadowThreadUtils.class,
|
||||
})
|
||||
public class AudioSharingSwitchBarControllerTest {
|
||||
private static final String TEST_DEVICE_NAME1 = "test1";
|
||||
private static final String TEST_DEVICE_NAME2 = "test2";
|
||||
private static final int TEST_DEVICE_GROUP_ID1 = 1;
|
||||
private static final int TEST_DEVICE_GROUP_ID2 = 2;
|
||||
private static final Correspondence<Fragment, String> TAG_EQUALS =
|
||||
Correspondence.from(
|
||||
(Fragment fragment, String tag) ->
|
||||
fragment instanceof DialogFragment
|
||||
&& ((DialogFragment) fragment).getTag() != null
|
||||
&& ((DialogFragment) fragment).getTag().equals(tag),
|
||||
"is equal to");
|
||||
|
||||
@Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
|
||||
@Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
|
||||
|
||||
@@ -99,17 +122,19 @@ public class AudioSharingSwitchBarControllerTest {
|
||||
@Mock private LocalBluetoothLeBroadcastAssistant mAssistant;
|
||||
@Mock private VolumeControlProfile mVolumeControl;
|
||||
@Mock private CompoundButton mBtnView;
|
||||
@Mock private CachedBluetoothDevice mCachedDevice;
|
||||
@Mock private BluetoothDevice mDevice;
|
||||
@Mock private CachedBluetoothDevice mCachedDevice1;
|
||||
@Mock private CachedBluetoothDevice mCachedDevice2;
|
||||
@Mock private BluetoothDevice mDevice1;
|
||||
@Mock private BluetoothDevice mDevice2;
|
||||
private SettingsMainSwitchBar mSwitchBar;
|
||||
private AudioSharingSwitchBarController mController;
|
||||
private AudioSharingSwitchBarController.OnAudioSharingStateChangedListener mListener;
|
||||
private FakeFeatureFactory mFeatureFactory;
|
||||
private Lifecycle mLifecycle;
|
||||
private LifecycleOwner mLifecycleOwner;
|
||||
private boolean mOnAudioSharingStateChanged;
|
||||
private boolean mOnAudioSharingServiceConnected;
|
||||
private ShadowBluetoothAdapter mShadowBluetoothAdapter;
|
||||
private LocalBluetoothManager mLocalBluetoothManager;
|
||||
private Fragment mParentFragment;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
@@ -122,13 +147,20 @@ public class AudioSharingSwitchBarControllerTest {
|
||||
mLifecycleOwner = () -> mLifecycle;
|
||||
mLifecycle = new Lifecycle(mLifecycleOwner);
|
||||
ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBtManager;
|
||||
mLocalBluetoothManager = Utils.getLocalBtManager(mContext);
|
||||
when(mLocalBluetoothManager.getProfileManager()).thenReturn(mBtProfileManager);
|
||||
when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(mDeviceManager);
|
||||
when(mDeviceManager.findDevice(mDevice)).thenReturn(mCachedDevice);
|
||||
when(mCachedDevice.getDevice()).thenReturn(mDevice);
|
||||
when(mCachedDevice.getGroupId()).thenReturn(1);
|
||||
when(mCachedDevice.getName()).thenReturn("test");
|
||||
LocalBluetoothManager localBluetoothManager = Utils.getLocalBtManager(mContext);
|
||||
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||
when(localBluetoothManager.getProfileManager()).thenReturn(mBtProfileManager);
|
||||
when(localBluetoothManager.getCachedDeviceManager()).thenReturn(mDeviceManager);
|
||||
when(mDeviceManager.findDevice(mDevice1)).thenReturn(mCachedDevice1);
|
||||
when(mCachedDevice1.getDevice()).thenReturn(mDevice1);
|
||||
when(mCachedDevice1.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID1);
|
||||
when(mCachedDevice1.getName()).thenReturn(TEST_DEVICE_NAME1);
|
||||
when(mCachedDevice1.isActiveDevice(BluetoothProfile.LE_AUDIO)).thenReturn(false);
|
||||
when(mDeviceManager.findDevice(mDevice2)).thenReturn(mCachedDevice2);
|
||||
when(mCachedDevice2.getDevice()).thenReturn(mDevice2);
|
||||
when(mCachedDevice2.getGroupId()).thenReturn(TEST_DEVICE_GROUP_ID2);
|
||||
when(mCachedDevice2.getName()).thenReturn(TEST_DEVICE_NAME2);
|
||||
when(mCachedDevice2.isActiveDevice(BluetoothProfile.LE_AUDIO)).thenReturn(true);
|
||||
when(mBtProfileManager.getLeAudioBroadcastProfile()).thenReturn(mBroadcast);
|
||||
when(mBtProfileManager.getLeAudioBroadcastAssistantProfile()).thenReturn(mAssistant);
|
||||
when(mBtProfileManager.getVolumeControlProfile()).thenReturn(mVolumeControl);
|
||||
@@ -153,7 +185,7 @@ public class AudioSharingSwitchBarControllerTest {
|
||||
mSwitchBar.setDisabledByAdmin(mock(RestrictedLockUtils.EnforcedAdmin.class));
|
||||
mOnAudioSharingStateChanged = false;
|
||||
mOnAudioSharingServiceConnected = false;
|
||||
mListener =
|
||||
AudioSharingSwitchBarController.OnAudioSharingStateChangedListener listener =
|
||||
new AudioSharingSwitchBarController.OnAudioSharingStateChangedListener() {
|
||||
@Override
|
||||
public void onAudioSharingStateChanged() {
|
||||
@@ -165,7 +197,14 @@ public class AudioSharingSwitchBarControllerTest {
|
||||
mOnAudioSharingServiceConnected = true;
|
||||
}
|
||||
};
|
||||
mController = new AudioSharingSwitchBarController(mContext, mSwitchBar, mListener);
|
||||
mController = new AudioSharingSwitchBarController(mContext, mSwitchBar, listener);
|
||||
mParentFragment = new Fragment();
|
||||
FragmentController.setupFragment(
|
||||
mParentFragment,
|
||||
FragmentActivity.class,
|
||||
0 /* containerViewId */,
|
||||
null /* bundle */);
|
||||
mController.init(mParentFragment);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -356,7 +395,7 @@ public class AudioSharingSwitchBarControllerTest {
|
||||
when(mBtnView.isEnabled()).thenReturn(true);
|
||||
when(mAssistant.getDevicesMatchingConnectionStates(
|
||||
new int[] {BluetoothProfile.STATE_CONNECTED}))
|
||||
.thenReturn(ImmutableList.of(mDevice));
|
||||
.thenReturn(ImmutableList.of(mDevice1));
|
||||
doNothing().when(mBroadcast).startPrivateBroadcast();
|
||||
mController.onCheckedChanged(mBtnView, /* isChecked= */ true);
|
||||
verify(mBroadcast).startPrivateBroadcast();
|
||||
@@ -380,4 +419,50 @@ public class AudioSharingSwitchBarControllerTest {
|
||||
mController.onCheckedChanged(mBtnView, /* isChecked= */ false);
|
||||
verify(mBroadcast).stopBroadcast(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onPlaybackStarted_showJoinAudioSharingDialog() {
|
||||
FeatureFlagUtils.setEnabled(
|
||||
mContext, FeatureFlagUtils.SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST, true);
|
||||
when(mBtnView.isEnabled()).thenReturn(true);
|
||||
when(mAssistant.getDevicesMatchingConnectionStates(
|
||||
new int[] {BluetoothProfile.STATE_CONNECTED}))
|
||||
.thenReturn(ImmutableList.of(mDevice2, mDevice1));
|
||||
doNothing().when(mBroadcast).startPrivateBroadcast();
|
||||
mController.onCheckedChanged(mBtnView, /* isChecked= */ true);
|
||||
verify(mBroadcast).startPrivateBroadcast();
|
||||
mController.mBroadcastCallback.onPlaybackStarted(0, 0);
|
||||
shadowOf(Looper.getMainLooper()).idle();
|
||||
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(any(Context.class), eq(SettingsEnums.ACTION_AUTO_JOIN_AUDIO_SHARING));
|
||||
|
||||
List<Fragment> childFragments = mParentFragment.getChildFragmentManager().getFragments();
|
||||
assertThat(childFragments)
|
||||
.comparingElementsUsing(TAG_EQUALS)
|
||||
.containsExactly(AudioSharingDialogFragment.tag());
|
||||
|
||||
AudioSharingDialogFragment fragment =
|
||||
(AudioSharingDialogFragment) Iterables.getOnlyElement(childFragments);
|
||||
Pair<Integer, Object>[] eventData = fragment.getEventData();
|
||||
assertThat(eventData)
|
||||
.asList()
|
||||
.containsExactly(
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_SOURCE_PAGE_ID.ordinal(),
|
||||
SettingsEnums.AUDIO_SHARING_SETTINGS),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_PAGE_ID.ordinal(),
|
||||
SettingsEnums.DIALOG_AUDIO_SHARING_ADD_DEVICE),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_USER_TRIGGERED.ordinal(), 0),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_DEVICE_COUNT_IN_SHARING
|
||||
.ordinal(),
|
||||
1),
|
||||
Pair.create(
|
||||
AudioSharingUtils.MetricKey.METRIC_KEY_CANDIDATE_DEVICE_COUNT
|
||||
.ordinal(),
|
||||
1));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user