[Audiosharing] Increase test coverage for audio stream states.
Test: atest -c com.android.settings.connecteddevice.audiosharing.audiostreams Flag: com.android.settingslib.flags.enable_le_audio_qr_code_private_broadcast_sharing Bug: 345686602 Change-Id: I91d9a45abd4c9659c9d0ddeca5f5aaefed36f820
This commit is contained in:
@@ -36,7 +36,8 @@ class AddSourceWaitForResponseState extends AudioStreamStateHandler {
|
|||||||
|
|
||||||
@Nullable private static AddSourceWaitForResponseState sInstance = null;
|
@Nullable private static AddSourceWaitForResponseState sInstance = null;
|
||||||
|
|
||||||
private AddSourceWaitForResponseState() {}
|
@VisibleForTesting
|
||||||
|
AddSourceWaitForResponseState() {}
|
||||||
|
|
||||||
static AddSourceWaitForResponseState getInstance() {
|
static AddSourceWaitForResponseState getInstance() {
|
||||||
if (sInstance == null) {
|
if (sInstance == null) {
|
||||||
|
@@ -35,10 +35,10 @@ class AudioStreamStateHandler {
|
|||||||
private static final boolean DEBUG = BluetoothUtils.D;
|
private static final boolean DEBUG = BluetoothUtils.D;
|
||||||
@VisibleForTesting static final int EMPTY_STRING_RES = 0;
|
@VisibleForTesting static final int EMPTY_STRING_RES = 0;
|
||||||
|
|
||||||
final AudioStreamsRepository mAudioStreamsRepository = AudioStreamsRepository.getInstance();
|
|
||||||
final Handler mHandler = new Handler(Looper.getMainLooper());
|
final Handler mHandler = new Handler(Looper.getMainLooper());
|
||||||
final MetricsFeatureProvider mMetricsFeatureProvider =
|
final MetricsFeatureProvider mMetricsFeatureProvider =
|
||||||
FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
|
FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
|
||||||
|
AudioStreamsRepository mAudioStreamsRepository = AudioStreamsRepository.getInstance();
|
||||||
|
|
||||||
AudioStreamStateHandler() {}
|
AudioStreamStateHandler() {}
|
||||||
|
|
||||||
@@ -112,4 +112,9 @@ class AudioStreamStateHandler {
|
|||||||
AudioStreamsProgressCategoryController.AudioStreamState getStateEnum() {
|
AudioStreamsProgressCategoryController.AudioStreamState getStateEnum() {
|
||||||
return AudioStreamsProgressCategoryController.AudioStreamState.UNKNOWN;
|
return AudioStreamsProgressCategoryController.AudioStreamState.UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
void setAudioStreamsRepositoryForTesting(AudioStreamsRepository repository) {
|
||||||
|
mAudioStreamsRepository = repository;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -71,7 +71,8 @@ public class AudioStreamsHelper {
|
|||||||
*
|
*
|
||||||
* @param source The LE broadcast metadata representing the audio source.
|
* @param source The LE broadcast metadata representing the audio source.
|
||||||
*/
|
*/
|
||||||
void addSource(BluetoothLeBroadcastMetadata source) {
|
@VisibleForTesting
|
||||||
|
public void addSource(BluetoothLeBroadcastMetadata source) {
|
||||||
if (mLeBroadcastAssistant == null) {
|
if (mLeBroadcastAssistant == null) {
|
||||||
Log.w(TAG, "addSource(): LeBroadcastAssistant is null!");
|
Log.w(TAG, "addSource(): LeBroadcastAssistant is null!");
|
||||||
return;
|
return;
|
||||||
@@ -97,7 +98,8 @@ public class AudioStreamsHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Removes sources from LE broadcasts associated for all active sinks based on broadcast Id. */
|
/** Removes sources from LE broadcasts associated for all active sinks based on broadcast Id. */
|
||||||
void removeSource(int broadcastId) {
|
@VisibleForTesting
|
||||||
|
public void removeSource(int broadcastId) {
|
||||||
if (mLeBroadcastAssistant == null) {
|
if (mLeBroadcastAssistant == null) {
|
||||||
Log.w(TAG, "removeSource(): LeBroadcastAssistant is null!");
|
Log.w(TAG, "removeSource(): LeBroadcastAssistant is null!");
|
||||||
return;
|
return;
|
||||||
|
@@ -32,7 +32,8 @@ class SourceAddedState extends AudioStreamStateHandler {
|
|||||||
|
|
||||||
@Nullable private static SourceAddedState sInstance = null;
|
@Nullable private static SourceAddedState sInstance = null;
|
||||||
|
|
||||||
private SourceAddedState() {}
|
@VisibleForTesting
|
||||||
|
SourceAddedState() {}
|
||||||
|
|
||||||
static SourceAddedState getInstance() {
|
static SourceAddedState getInstance() {
|
||||||
if (sInstance == null) {
|
if (sInstance == null) {
|
||||||
@@ -80,8 +81,7 @@ class SourceAddedState extends AudioStreamStateHandler {
|
|||||||
AudioStreamDetailsFragment.BROADCAST_ID_ARG, p.getAudioStreamBroadcastId());
|
AudioStreamDetailsFragment.BROADCAST_ID_ARG, p.getAudioStreamBroadcastId());
|
||||||
|
|
||||||
new SubSettingLauncher(p.getContext())
|
new SubSettingLauncher(p.getContext())
|
||||||
.setTitleText(
|
.setTitleRes(R.string.audio_streams_detail_page_title)
|
||||||
p.getContext().getString(R.string.audio_streams_detail_page_title))
|
|
||||||
.setDestination(AudioStreamDetailsFragment.class.getName())
|
.setDestination(AudioStreamDetailsFragment.class.getName())
|
||||||
.setSourceMetricsCategory(
|
.setSourceMetricsCategory(
|
||||||
controller.getFragment() == null
|
controller.getFragment() == null
|
||||||
|
@@ -39,7 +39,8 @@ class WaitForSyncState extends AudioStreamStateHandler {
|
|||||||
|
|
||||||
@Nullable private static WaitForSyncState sInstance = null;
|
@Nullable private static WaitForSyncState sInstance = null;
|
||||||
|
|
||||||
private WaitForSyncState() {}
|
@VisibleForTesting
|
||||||
|
WaitForSyncState() {}
|
||||||
|
|
||||||
static WaitForSyncState getInstance() {
|
static WaitForSyncState getInstance() {
|
||||||
if (sInstance == null) {
|
if (sInstance == null) {
|
||||||
@@ -114,7 +115,8 @@ class WaitForSyncState extends AudioStreamStateHandler {
|
|||||||
SettingsEnums.DIALOG_AUDIO_STREAM_MAIN_WAIT_FOR_SYNC_TIMEOUT);
|
SettingsEnums.DIALOG_AUDIO_STREAM_MAIN_WAIT_FOR_SYNC_TIMEOUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void launchQrCodeScanFragment(Context context, Fragment fragment) {
|
@VisibleForTesting
|
||||||
|
void launchQrCodeScanFragment(Context context, Fragment fragment) {
|
||||||
new SubSettingLauncher(context)
|
new SubSettingLauncher(context)
|
||||||
.setTitleRes(R.string.audio_streams_main_page_scan_qr_code_title)
|
.setTitleRes(R.string.audio_streams_main_page_scan_qr_code_title)
|
||||||
.setDestination(AudioStreamsQrCodeScanFragment.class.getName())
|
.setDestination(AudioStreamsQrCodeScanFragment.class.getName())
|
||||||
|
@@ -20,18 +20,40 @@ import static com.android.settings.connecteddevice.audiosharing.audiostreams.Add
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.app.settings.SettingsEnums;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
|
||||||
|
import com.android.settings.testutils.FakeFeatureFactory;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.junit.MockitoJUnit;
|
||||||
|
import org.mockito.junit.MockitoRule;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
public class AddSourceBadCodeStateTest {
|
public class AddSourceBadCodeStateTest {
|
||||||
|
@Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
|
||||||
|
private final Context mContext = ApplicationProvider.getApplicationContext();
|
||||||
|
@Mock private AudioStreamPreference mPreference;
|
||||||
|
@Mock private AudioStreamsProgressCategoryController mController;
|
||||||
|
@Mock private AudioStreamsHelper mHelper;
|
||||||
|
private FakeFeatureFactory mFeatureFactory;
|
||||||
private AddSourceBadCodeState mInstance;
|
private AddSourceBadCodeState mInstance;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mInstance = AddSourceBadCodeState.getInstance();
|
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||||
|
mInstance = new AddSourceBadCodeState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -55,4 +77,19 @@ public class AddSourceBadCodeStateTest {
|
|||||||
AudioStreamsProgressCategoryController.AudioStreamState
|
AudioStreamsProgressCategoryController.AudioStreamState
|
||||||
.ADD_SOURCE_BAD_CODE);
|
.ADD_SOURCE_BAD_CODE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPerformAction() {
|
||||||
|
when(mPreference.getContext()).thenReturn(mContext);
|
||||||
|
when(mPreference.getSourceOriginForLogging())
|
||||||
|
.thenReturn(SourceOriginForLogging.QR_CODE_SCAN_SETTINGS);
|
||||||
|
|
||||||
|
mInstance.performAction(mPreference, mController, mHelper);
|
||||||
|
|
||||||
|
verify(mFeatureFactory.metricsFeatureProvider)
|
||||||
|
.action(
|
||||||
|
eq(mContext),
|
||||||
|
eq(SettingsEnums.ACTION_AUDIO_STREAM_JOIN_FAILED_BAD_CODE),
|
||||||
|
eq(SourceOriginForLogging.QR_CODE_SCAN_SETTINGS.ordinal()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -20,18 +20,40 @@ import static com.android.settings.connecteddevice.audiosharing.audiostreams.Add
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.app.settings.SettingsEnums;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
|
||||||
|
import com.android.settings.testutils.FakeFeatureFactory;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.junit.MockitoJUnit;
|
||||||
|
import org.mockito.junit.MockitoRule;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
public class AddSourceFailedStateTest {
|
public class AddSourceFailedStateTest {
|
||||||
|
@Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
|
||||||
|
private final Context mContext = ApplicationProvider.getApplicationContext();
|
||||||
|
@Mock private AudioStreamPreference mPreference;
|
||||||
|
@Mock private AudioStreamsProgressCategoryController mController;
|
||||||
|
@Mock private AudioStreamsHelper mHelper;
|
||||||
|
private FakeFeatureFactory mFeatureFactory;
|
||||||
private AddSourceFailedState mInstance;
|
private AddSourceFailedState mInstance;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mInstance = AddSourceFailedState.getInstance();
|
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||||
|
mInstance = new AddSourceFailedState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -54,4 +76,19 @@ public class AddSourceFailedStateTest {
|
|||||||
.isEqualTo(
|
.isEqualTo(
|
||||||
AudioStreamsProgressCategoryController.AudioStreamState.ADD_SOURCE_FAILED);
|
AudioStreamsProgressCategoryController.AudioStreamState.ADD_SOURCE_FAILED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPerformAction() {
|
||||||
|
when(mPreference.getContext()).thenReturn(mContext);
|
||||||
|
when(mPreference.getSourceOriginForLogging())
|
||||||
|
.thenReturn(SourceOriginForLogging.QR_CODE_SCAN_SETTINGS);
|
||||||
|
|
||||||
|
mInstance.performAction(mPreference, mController, mHelper);
|
||||||
|
|
||||||
|
verify(mFeatureFactory.metricsFeatureProvider)
|
||||||
|
.action(
|
||||||
|
eq(mContext),
|
||||||
|
eq(SettingsEnums.ACTION_AUDIO_STREAM_JOIN_FAILED_OTHER),
|
||||||
|
eq(SourceOriginForLogging.QR_CODE_SCAN_SETTINGS.ordinal()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -22,11 +22,21 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.app.settings.SettingsEnums;
|
||||||
import android.bluetooth.BluetoothLeBroadcastMetadata;
|
import android.bluetooth.BluetoothLeBroadcastMetadata;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.testutils.FakeFeatureFactory;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
@@ -36,23 +46,36 @@ import org.mockito.Mock;
|
|||||||
import org.mockito.junit.MockitoJUnit;
|
import org.mockito.junit.MockitoJUnit;
|
||||||
import org.mockito.junit.MockitoRule;
|
import org.mockito.junit.MockitoRule;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
|
import org.robolectric.annotation.Config;
|
||||||
|
import org.robolectric.shadows.ShadowAlertDialog;
|
||||||
import org.robolectric.shadows.ShadowLooper;
|
import org.robolectric.shadows.ShadowLooper;
|
||||||
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
|
@Config(
|
||||||
|
shadows = {
|
||||||
|
ShadowAlertDialog.class,
|
||||||
|
})
|
||||||
public class AddSourceWaitForResponseStateTest {
|
public class AddSourceWaitForResponseStateTest {
|
||||||
private static final int BROADCAST_ID = 1;
|
|
||||||
@Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
|
@Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
|
||||||
|
private static final int BROADCAST_ID = 1;
|
||||||
|
private final Context mContext = spy(ApplicationProvider.getApplicationContext());
|
||||||
@Mock private AudioStreamPreference mMockPreference;
|
@Mock private AudioStreamPreference mMockPreference;
|
||||||
@Mock private AudioStreamsProgressCategoryController mMockController;
|
@Mock private AudioStreamsProgressCategoryController mMockController;
|
||||||
@Mock private AudioStreamsHelper mMockHelper;
|
@Mock private AudioStreamsHelper mMockHelper;
|
||||||
@Mock private BluetoothLeBroadcastMetadata mMockMetadata;
|
@Mock private BluetoothLeBroadcastMetadata mMockMetadata;
|
||||||
|
@Mock private AudioStreamsRepository mMockRepository;
|
||||||
|
private FakeFeatureFactory mFeatureFactory;
|
||||||
private AddSourceWaitForResponseState mInstance;
|
private AddSourceWaitForResponseState mInstance;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mInstance = AddSourceWaitForResponseState.getInstance();
|
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||||
|
mInstance = new AddSourceWaitForResponseState();
|
||||||
|
when(mMockPreference.getContext()).thenReturn(mContext);
|
||||||
|
when(mMockPreference.getSourceOriginForLogging())
|
||||||
|
.thenReturn(SourceOriginForLogging.QR_CODE_SCAN_SETTINGS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -93,11 +116,18 @@ public class AddSourceWaitForResponseStateTest {
|
|||||||
public void testPerformAction_metadataIsNotNull_addSource() {
|
public void testPerformAction_metadataIsNotNull_addSource() {
|
||||||
when(mMockPreference.getAudioStreamMetadata()).thenReturn(mMockMetadata);
|
when(mMockPreference.getAudioStreamMetadata()).thenReturn(mMockMetadata);
|
||||||
when(mMockPreference.getSourceOriginForLogging())
|
when(mMockPreference.getSourceOriginForLogging())
|
||||||
.thenReturn(SourceOriginForLogging.UNKNOWN);
|
.thenReturn(SourceOriginForLogging.QR_CODE_SCAN_SETTINGS);
|
||||||
|
mInstance.setAudioStreamsRepositoryForTesting(mMockRepository);
|
||||||
|
|
||||||
mInstance.performAction(mMockPreference, mMockController, mMockHelper);
|
mInstance.performAction(mMockPreference, mMockController, mMockHelper);
|
||||||
|
|
||||||
verify(mMockHelper).addSource(mMockMetadata);
|
verify(mMockHelper).addSource(mMockMetadata);
|
||||||
|
verify(mFeatureFactory.metricsFeatureProvider)
|
||||||
|
.action(
|
||||||
|
eq(mContext),
|
||||||
|
eq(SettingsEnums.ACTION_AUDIO_STREAM_JOIN),
|
||||||
|
eq(SourceOriginForLogging.QR_CODE_SCAN_SETTINGS.ordinal()));
|
||||||
|
verify(mMockRepository).cacheMetadata(mMockMetadata);
|
||||||
verify(mMockController, never()).handleSourceFailedToConnect(anyInt());
|
verify(mMockController, never()).handleSourceFailedToConnect(anyInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,12 +138,28 @@ public class AddSourceWaitForResponseStateTest {
|
|||||||
when(mMockPreference.getAudioStreamState()).thenReturn(mInstance.getStateEnum());
|
when(mMockPreference.getAudioStreamState()).thenReturn(mInstance.getStateEnum());
|
||||||
when(mMockPreference.getAudioStreamBroadcastId()).thenReturn(BROADCAST_ID);
|
when(mMockPreference.getAudioStreamBroadcastId()).thenReturn(BROADCAST_ID);
|
||||||
when(mMockPreference.getSourceOriginForLogging())
|
when(mMockPreference.getSourceOriginForLogging())
|
||||||
.thenReturn(SourceOriginForLogging.UNKNOWN);
|
.thenReturn(SourceOriginForLogging.QR_CODE_SCAN_SETTINGS);
|
||||||
|
when(mMockController.getFragment()).thenReturn(mock(AudioStreamsDashboardFragment.class));
|
||||||
|
mInstance.setAudioStreamsRepositoryForTesting(mMockRepository);
|
||||||
|
|
||||||
mInstance.performAction(mMockPreference, mMockController, mMockHelper);
|
mInstance.performAction(mMockPreference, mMockController, mMockHelper);
|
||||||
ShadowLooper.idleMainLooper(ADD_SOURCE_WAIT_FOR_RESPONSE_TIMEOUT_MILLIS, TimeUnit.SECONDS);
|
ShadowLooper.idleMainLooper(ADD_SOURCE_WAIT_FOR_RESPONSE_TIMEOUT_MILLIS, TimeUnit.SECONDS);
|
||||||
|
|
||||||
verify(mMockHelper).addSource(mMockMetadata);
|
verify(mMockHelper).addSource(mMockMetadata);
|
||||||
verify(mMockController).handleSourceFailedToConnect(BROADCAST_ID);
|
verify(mMockController).handleSourceFailedToConnect(BROADCAST_ID);
|
||||||
|
verify(mFeatureFactory.metricsFeatureProvider)
|
||||||
|
.action(
|
||||||
|
eq(mContext),
|
||||||
|
eq(SettingsEnums.ACTION_AUDIO_STREAM_JOIN),
|
||||||
|
eq(SourceOriginForLogging.QR_CODE_SCAN_SETTINGS.ordinal()));
|
||||||
|
verify(mMockRepository).cacheMetadata(mMockMetadata);
|
||||||
|
verify(mFeatureFactory.metricsFeatureProvider)
|
||||||
|
.action(
|
||||||
|
eq(mContext),
|
||||||
|
eq(SettingsEnums.ACTION_AUDIO_STREAM_JOIN_FAILED_TIMEOUT),
|
||||||
|
eq(SourceOriginForLogging.QR_CODE_SCAN_SETTINGS.ordinal()));
|
||||||
|
verify(mContext).getString(R.string.audio_streams_dialog_stream_is_not_available);
|
||||||
|
verify(mContext).getString(R.string.audio_streams_is_not_playing);
|
||||||
|
verify(mContext).getString(R.string.audio_streams_dialog_close);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,27 +16,71 @@
|
|||||||
|
|
||||||
package com.android.settings.connecteddevice.audiosharing.audiostreams;
|
package com.android.settings.connecteddevice.audiosharing.audiostreams;
|
||||||
|
|
||||||
|
import static android.app.settings.SettingsEnums.AUDIO_STREAM_MAIN;
|
||||||
|
|
||||||
import static com.android.settings.connecteddevice.audiosharing.audiostreams.SourceAddedState.AUDIO_STREAM_SOURCE_ADDED_STATE_SUMMARY;
|
import static com.android.settings.connecteddevice.audiosharing.audiostreams.SourceAddedState.AUDIO_STREAM_SOURCE_ADDED_STATE_SUMMARY;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.app.settings.SettingsEnums;
|
||||||
|
import android.bluetooth.BluetoothLeBroadcastMetadata;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
import androidx.preference.Preference;
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.SettingsActivity;
|
||||||
|
import com.android.settings.testutils.FakeFeatureFactory;
|
||||||
|
import com.android.settings.testutils.shadow.ShadowFragment;
|
||||||
|
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.ArgumentCaptor;
|
||||||
|
import org.mockito.Mock;
|
||||||
import org.mockito.junit.MockitoJUnit;
|
import org.mockito.junit.MockitoJUnit;
|
||||||
import org.mockito.junit.MockitoRule;
|
import org.mockito.junit.MockitoRule;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
|
import org.robolectric.annotation.Config;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
|
@Config(
|
||||||
|
shadows = {
|
||||||
|
ShadowFragment.class,
|
||||||
|
})
|
||||||
public class SourceAddedStateTest {
|
public class SourceAddedStateTest {
|
||||||
|
|
||||||
@Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
|
@Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
|
||||||
|
private static final int BROADCAST_ID = 1;
|
||||||
|
private static final String BROADCAST_TITLE = "title";
|
||||||
|
private final Context mContext = ApplicationProvider.getApplicationContext();
|
||||||
|
@Mock private AudioStreamPreference mPreference;
|
||||||
|
@Mock private AudioStreamsProgressCategoryController mController;
|
||||||
|
@Mock private AudioStreamsHelper mHelper;
|
||||||
|
@Mock private AudioStreamsRepository mRepository;
|
||||||
|
@Mock private AudioStreamsDashboardFragment mFragment;
|
||||||
|
@Mock private FragmentActivity mActivity;
|
||||||
|
private FakeFeatureFactory mFeatureFactory;
|
||||||
private SourceAddedState mInstance;
|
private SourceAddedState mInstance;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mInstance = SourceAddedState.getInstance();
|
when(mFragment.getActivity()).thenReturn(mActivity);
|
||||||
|
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||||
|
mInstance = new SourceAddedState();
|
||||||
|
when(mPreference.getAudioStreamBroadcastId()).thenReturn(BROADCAST_ID);
|
||||||
|
when(mPreference.getTitle()).thenReturn(BROADCAST_TITLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -58,4 +102,59 @@ public class SourceAddedStateTest {
|
|||||||
assertThat(stateEnum)
|
assertThat(stateEnum)
|
||||||
.isEqualTo(AudioStreamsProgressCategoryController.AudioStreamState.SOURCE_ADDED);
|
.isEqualTo(AudioStreamsProgressCategoryController.AudioStreamState.SOURCE_ADDED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPerformAction() {
|
||||||
|
mInstance.setAudioStreamsRepositoryForTesting(mRepository);
|
||||||
|
BluetoothLeBroadcastMetadata mockMetadata = mock(BluetoothLeBroadcastMetadata.class);
|
||||||
|
when(mRepository.getCachedMetadata(anyInt())).thenReturn(mockMetadata);
|
||||||
|
when(mPreference.getContext()).thenReturn(mContext);
|
||||||
|
when(mPreference.getSourceOriginForLogging())
|
||||||
|
.thenReturn(SourceOriginForLogging.QR_CODE_SCAN_SETTINGS);
|
||||||
|
|
||||||
|
mInstance.performAction(mPreference, mController, mHelper);
|
||||||
|
|
||||||
|
verify(mRepository).saveMetadata(eq(mContext), eq(mockMetadata));
|
||||||
|
verify(mFeatureFactory.metricsFeatureProvider)
|
||||||
|
.action(
|
||||||
|
eq(mContext),
|
||||||
|
eq(SettingsEnums.ACTION_AUDIO_STREAM_JOIN_SUCCEED),
|
||||||
|
eq(SourceOriginForLogging.QR_CODE_SCAN_SETTINGS.ordinal()));
|
||||||
|
verify(mHelper).startMediaService(eq(mContext), eq(BROADCAST_ID), eq(BROADCAST_TITLE));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetOnClickListener_startSubSettings() {
|
||||||
|
when(mController.getFragment()).thenReturn(mFragment);
|
||||||
|
when(mFragment.getMetricsCategory()).thenReturn(AUDIO_STREAM_MAIN);
|
||||||
|
|
||||||
|
Preference.OnPreferenceClickListener listener = mInstance.getOnClickListener(mController);
|
||||||
|
assertThat(listener).isNotNull();
|
||||||
|
|
||||||
|
// mContext is not an Activity context, calling startActivity() from outside of an Activity
|
||||||
|
// context requires the FLAG_ACTIVITY_NEW_TASK flag, create a mock to avoid this
|
||||||
|
// AndroidRuntimeException.
|
||||||
|
Context activityContext = mock(Context.class);
|
||||||
|
when(mPreference.getContext()).thenReturn(activityContext);
|
||||||
|
|
||||||
|
listener.onPreferenceClick(mPreference);
|
||||||
|
|
||||||
|
ArgumentCaptor<Intent> argumentCaptor = ArgumentCaptor.forClass(Intent.class);
|
||||||
|
verify(activityContext).startActivity(argumentCaptor.capture());
|
||||||
|
|
||||||
|
Intent intent = argumentCaptor.getValue();
|
||||||
|
assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT))
|
||||||
|
.isEqualTo(AudioStreamDetailsFragment.class.getName());
|
||||||
|
assertThat(intent.getIntExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, 0))
|
||||||
|
.isEqualTo(R.string.audio_streams_detail_page_title);
|
||||||
|
assertThat(intent.getIntExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, 0))
|
||||||
|
.isEqualTo(AUDIO_STREAM_MAIN);
|
||||||
|
|
||||||
|
Bundle bundle = intent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS);
|
||||||
|
assertThat(bundle).isNotNull();
|
||||||
|
assertThat(bundle.getString(AudioStreamDetailsFragment.BROADCAST_NAME_ARG))
|
||||||
|
.isEqualTo(BROADCAST_TITLE);
|
||||||
|
assertThat(bundle.getInt(AudioStreamDetailsFragment.BROADCAST_ID_ARG))
|
||||||
|
.isEqualTo(BROADCAST_ID);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -20,7 +20,7 @@ import static com.android.settings.connecteddevice.audiosharing.audiostreams.Aud
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
import static org.robolectric.shadows.ShadowLooper.shadowMainLooper;
|
import static org.robolectric.shadows.ShadowLooper.shadowMainLooper;
|
||||||
@@ -28,10 +28,16 @@ import static org.robolectric.shadows.ShadowLooper.shadowMainLooper;
|
|||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.bluetooth.BluetoothLeBroadcastMetadata;
|
import android.bluetooth.BluetoothLeBroadcastMetadata;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settingslib.bluetooth.BluetoothLeBroadcastMetadataExt;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
@@ -42,7 +48,9 @@ import org.mockito.junit.MockitoJUnit;
|
|||||||
import org.mockito.junit.MockitoRule;
|
import org.mockito.junit.MockitoRule;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
|
import org.robolectric.shadow.api.Shadow;
|
||||||
import org.robolectric.shadows.ShadowAlertDialog;
|
import org.robolectric.shadows.ShadowAlertDialog;
|
||||||
|
import org.robolectric.shadows.ShadowLooper;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
@Config(
|
@Config(
|
||||||
@@ -51,6 +59,10 @@ import org.robolectric.shadows.ShadowAlertDialog;
|
|||||||
})
|
})
|
||||||
public class SyncedStateTest {
|
public class SyncedStateTest {
|
||||||
@Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
|
@Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
|
||||||
|
private static final String ENCRYPTED_METADATA =
|
||||||
|
"BLUETOOTH:UUID:184F;BN:VGVzdA==;AT:1;AD:00A1A1A1A1A1;BI:1E240;BC:VGVzdENvZGU=;"
|
||||||
|
+ "MD:BgNwVGVzdA==;AS:1;PI:A0;NS:1;BS:3;NB:2;SM:BQNUZXN0BARlbmc=;;";
|
||||||
|
private static final String BROADCAST_TITLE = "title";
|
||||||
@Mock private AudioStreamsProgressCategoryController mMockController;
|
@Mock private AudioStreamsProgressCategoryController mMockController;
|
||||||
@Mock private AudioStreamPreference mMockPreference;
|
@Mock private AudioStreamPreference mMockPreference;
|
||||||
@Mock private BluetoothLeBroadcastMetadata mMockMetadata;
|
@Mock private BluetoothLeBroadcastMetadata mMockMetadata;
|
||||||
@@ -105,18 +117,47 @@ public class SyncedStateTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetOnClickListener_isEncrypted_passwordDialogShowing() {
|
public void testGetOnClickListener_isEncrypted_passwordDialogShowing() {
|
||||||
|
when(mMockPreference.getAudioStreamMetadata())
|
||||||
|
.thenReturn(
|
||||||
|
BluetoothLeBroadcastMetadataExt.INSTANCE.convertToBroadcastMetadata(
|
||||||
|
ENCRYPTED_METADATA));
|
||||||
|
when(mMockPreference.getContext()).thenReturn(mMockContext);
|
||||||
|
when(mMockPreference.getTitle()).thenReturn(BROADCAST_TITLE);
|
||||||
|
|
||||||
Preference.OnPreferenceClickListener listener =
|
Preference.OnPreferenceClickListener listener =
|
||||||
mInstance.getOnClickListener(mMockController);
|
mInstance.getOnClickListener(mMockController);
|
||||||
when(mMockPreference.getAudioStreamMetadata()).thenReturn(mMockMetadata);
|
assertThat(listener).isNotNull();
|
||||||
when(mMockPreference.getContext()).thenReturn(mMockContext);
|
|
||||||
when(mMockMetadata.isEncrypted()).thenReturn(true);
|
|
||||||
|
|
||||||
listener.onPreferenceClick(mMockPreference);
|
listener.onPreferenceClick(mMockPreference);
|
||||||
shadowMainLooper().idle();
|
shadowMainLooper().idle();
|
||||||
|
|
||||||
AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
|
AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
|
||||||
|
|
||||||
assertThat(dialog).isNotNull();
|
assertThat(dialog).isNotNull();
|
||||||
assertThat(dialog.isShowing()).isTrue();
|
assertThat(dialog.isShowing()).isTrue();
|
||||||
verify(mMockController, never()).handleSourceAddRequest(mMockPreference, mMockMetadata);
|
|
||||||
|
Button neutralButton = dialog.getButton(DialogInterface.BUTTON_NEUTRAL);
|
||||||
|
assertThat(neutralButton).isNotNull();
|
||||||
|
assertThat(neutralButton.getText().toString())
|
||||||
|
.isEqualTo(mMockContext.getString(android.R.string.cancel));
|
||||||
|
|
||||||
|
Button positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
|
||||||
|
assertThat(positiveButton).isNotNull();
|
||||||
|
assertThat(positiveButton.getText().toString())
|
||||||
|
.isEqualTo(
|
||||||
|
mMockContext.getString(R.string.bluetooth_connect_access_dialog_positive));
|
||||||
|
|
||||||
|
positiveButton.callOnClick();
|
||||||
|
ShadowLooper.idleMainLooper();
|
||||||
|
verify(mMockController).handleSourceAddRequest(any(), any());
|
||||||
|
|
||||||
|
ShadowAlertDialog shadowDialog = Shadow.extract(dialog);
|
||||||
|
TextView title = shadowDialog.getView().findViewById(R.id.broadcast_name_text);
|
||||||
|
assertThat(title).isNotNull();
|
||||||
|
assertThat(title.getText().toString()).isEqualTo(BROADCAST_TITLE);
|
||||||
|
assertThat(shadowDialog.getTitle().toString())
|
||||||
|
.isEqualTo(mMockContext.getString(R.string.find_broadcast_password_dialog_title));
|
||||||
|
|
||||||
|
dialog.cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,22 +16,39 @@
|
|||||||
|
|
||||||
package com.android.settings.connecteddevice.audiosharing.audiostreams;
|
package com.android.settings.connecteddevice.audiosharing.audiostreams;
|
||||||
|
|
||||||
|
import static android.app.settings.SettingsEnums.DIALOG_AUDIO_STREAM_MAIN_WAIT_FOR_SYNC_TIMEOUT;
|
||||||
|
|
||||||
|
import static com.android.settings.connecteddevice.audiosharing.audiostreams.AudioStreamsScanQrCodeController.REQUEST_SCAN_BT_BROADCAST_QR_CODE;
|
||||||
import static com.android.settings.connecteddevice.audiosharing.audiostreams.WaitForSyncState.AUDIO_STREAM_WAIT_FOR_SYNC_STATE_SUMMARY;
|
import static com.android.settings.connecteddevice.audiosharing.audiostreams.WaitForSyncState.AUDIO_STREAM_WAIT_FOR_SYNC_STATE_SUMMARY;
|
||||||
import static com.android.settings.connecteddevice.audiosharing.audiostreams.WaitForSyncState.WAIT_FOR_SYNC_TIMEOUT_MILLIS;
|
import static com.android.settings.connecteddevice.audiosharing.audiostreams.WaitForSyncState.WAIT_FOR_SYNC_TIMEOUT_MILLIS;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.app.settings.SettingsEnums;
|
||||||
import android.bluetooth.BluetoothLeBroadcastMetadata;
|
import android.bluetooth.BluetoothLeBroadcastMetadata;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.SettingsActivity;
|
||||||
|
import com.android.settings.testutils.FakeFeatureFactory;
|
||||||
|
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.ArgumentCaptor;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.junit.MockitoJUnit;
|
import org.mockito.junit.MockitoJUnit;
|
||||||
import org.mockito.junit.MockitoRule;
|
import org.mockito.junit.MockitoRule;
|
||||||
@@ -43,15 +60,18 @@ import java.util.concurrent.TimeUnit;
|
|||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
public class WaitForSyncStateTest {
|
public class WaitForSyncStateTest {
|
||||||
@Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
|
@Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
|
||||||
|
private final Context mContext = spy(ApplicationProvider.getApplicationContext());
|
||||||
@Mock private AudioStreamPreference mMockPreference;
|
@Mock private AudioStreamPreference mMockPreference;
|
||||||
@Mock private AudioStreamsProgressCategoryController mMockController;
|
@Mock private AudioStreamsProgressCategoryController mMockController;
|
||||||
@Mock private AudioStreamsHelper mMockHelper;
|
@Mock private AudioStreamsHelper mMockHelper;
|
||||||
@Mock private BluetoothLeBroadcastMetadata mMockMetadata;
|
@Mock private BluetoothLeBroadcastMetadata mMockMetadata;
|
||||||
|
private FakeFeatureFactory mFeatureFactory;
|
||||||
private WaitForSyncState mInstance;
|
private WaitForSyncState mInstance;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mInstance = WaitForSyncState.getInstance();
|
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||||
|
mInstance = new WaitForSyncState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -93,12 +113,49 @@ public class WaitForSyncStateTest {
|
|||||||
.thenReturn(AudioStreamsProgressCategoryController.AudioStreamState.WAIT_FOR_SYNC);
|
.thenReturn(AudioStreamsProgressCategoryController.AudioStreamState.WAIT_FOR_SYNC);
|
||||||
when(mMockPreference.getAudioStreamBroadcastId()).thenReturn(1);
|
when(mMockPreference.getAudioStreamBroadcastId()).thenReturn(1);
|
||||||
when(mMockPreference.getAudioStreamMetadata()).thenReturn(mMockMetadata);
|
when(mMockPreference.getAudioStreamMetadata()).thenReturn(mMockMetadata);
|
||||||
|
when(mMockPreference.getContext()).thenReturn(mContext);
|
||||||
when(mMockPreference.getSourceOriginForLogging())
|
when(mMockPreference.getSourceOriginForLogging())
|
||||||
.thenReturn(SourceOriginForLogging.UNKNOWN);
|
.thenReturn(SourceOriginForLogging.BROADCAST_SEARCH);
|
||||||
|
when(mMockController.getFragment()).thenReturn(mock(AudioStreamsDashboardFragment.class));
|
||||||
|
|
||||||
mInstance.performAction(mMockPreference, mMockController, mMockHelper);
|
mInstance.performAction(mMockPreference, mMockController, mMockHelper);
|
||||||
ShadowLooper.idleMainLooper(WAIT_FOR_SYNC_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
|
ShadowLooper.idleMainLooper(WAIT_FOR_SYNC_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
|
||||||
|
|
||||||
verify(mMockController).handleSourceLost(1);
|
verify(mMockController).handleSourceLost(1);
|
||||||
|
verify(mFeatureFactory.metricsFeatureProvider)
|
||||||
|
.action(
|
||||||
|
eq(mContext),
|
||||||
|
eq(SettingsEnums.ACTION_AUDIO_STREAM_JOIN_FAILED_WAIT_FOR_SYNC_TIMEOUT),
|
||||||
|
eq(SourceOriginForLogging.BROADCAST_SEARCH.ordinal()));
|
||||||
|
verify(mContext).getString(R.string.audio_streams_dialog_stream_is_not_available);
|
||||||
|
verify(mContext).getString(R.string.audio_streams_is_not_playing);
|
||||||
|
verify(mContext).getString(R.string.audio_streams_dialog_close);
|
||||||
|
verify(mContext).getString(R.string.audio_streams_dialog_retry);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLaunchQrCodeScanFragment() {
|
||||||
|
// mContext is not an Activity context, calling startActivity() from outside of an Activity
|
||||||
|
// context requires the FLAG_ACTIVITY_NEW_TASK flag, create a mock to avoid this
|
||||||
|
// AndroidRuntimeException.
|
||||||
|
Context activityContext = mock(Context.class);
|
||||||
|
AudioStreamsDashboardFragment fragment = mock(AudioStreamsDashboardFragment.class);
|
||||||
|
mInstance.launchQrCodeScanFragment(activityContext, fragment);
|
||||||
|
|
||||||
|
ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
|
||||||
|
ArgumentCaptor<Integer> requestCodeCaptor = ArgumentCaptor.forClass(Integer.class);
|
||||||
|
verify(fragment)
|
||||||
|
.startActivityForResult(intentCaptor.capture(), requestCodeCaptor.capture());
|
||||||
|
|
||||||
|
Intent intent = intentCaptor.getValue();
|
||||||
|
assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT))
|
||||||
|
.isEqualTo(AudioStreamsQrCodeScanFragment.class.getName());
|
||||||
|
assertThat(intent.getIntExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, 0))
|
||||||
|
.isEqualTo(R.string.audio_streams_main_page_scan_qr_code_title);
|
||||||
|
assertThat(intent.getIntExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, 0))
|
||||||
|
.isEqualTo(DIALOG_AUDIO_STREAM_MAIN_WAIT_FOR_SYNC_TIMEOUT);
|
||||||
|
|
||||||
|
int requestCode = requestCodeCaptor.getValue();
|
||||||
|
assertThat(requestCode).isEqualTo(REQUEST_SCAN_BT_BROADCAST_QR_CODE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user