[Audiosharing] Move entry preference out of group category

Test: atest
Bug: 305620450
Flag: com.android.settingslib.flags.enable_le_audio_sharing
Change-Id: I0573c9c35c05ca7915f94e6f67064cc5b3d79fec
This commit is contained in:
Yiyi Shen
2025-01-20 18:16:55 +08:00
parent 2141d62f95
commit 5a8e10bbe3
5 changed files with 187 additions and 48 deletions

View File

@@ -30,13 +30,6 @@
android:key="audio_sharing_device_list" android:key="audio_sharing_device_list"
android:title="@string/audio_sharing_device_group_title" android:title="@string/audio_sharing_device_group_title"
settings:controller="com.android.settings.connecteddevice.audiosharing.AudioSharingDevicePreferenceController"> settings:controller="com.android.settings.connecteddevice.audiosharing.AudioSharingDevicePreferenceController">
<Preference
android:fragment="com.android.settings.connecteddevice.audiosharing.AudioSharingDashboardFragment"
android:icon="@drawable/ic_bt_le_audio_sharing"
android:key="connected_device_audio_sharing_settings"
android:order="100"
android:title="@string/audio_sharing_title"
settings:searchable="false" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory
@@ -44,6 +37,14 @@
android:title="@string/connected_device_temp_bond_device_title" android:title="@string/connected_device_temp_bond_device_title"
settings:controller="com.android.settings.connecteddevice.audiosharing.TemporaryBondDeviceGroupController" /> settings:controller="com.android.settings.connecteddevice.audiosharing.TemporaryBondDeviceGroupController" />
<Preference
android:fragment="com.android.settings.connecteddevice.audiosharing.AudioSharingDashboardFragment"
android:icon="@drawable/ic_bt_le_audio_sharing"
android:key="connected_device_audio_sharing_settings"
android:title="@string/audio_sharing_title"
settings:controller="com.android.settings.connecteddevice.audiosharing.AudioSharingPreferenceController"
settings:searchable="false" />
<PreferenceCategory <PreferenceCategory
android:key="available_device_list" android:key="available_device_list"
android:title="@string/connected_device_media_device_title" android:title="@string/connected_device_media_device_title"

View File

@@ -78,8 +78,6 @@ public class AudioSharingDevicePreferenceController extends BasePreferenceContro
private static final String TAG = "AudioSharingDevicePrefController"; private static final String TAG = "AudioSharingDevicePrefController";
private static final String KEY = "audio_sharing_device_list"; private static final String KEY = "audio_sharing_device_list";
private static final String KEY_AUDIO_SHARING_SETTINGS =
"connected_device_audio_sharing_settings";
@Nullable private final LocalBluetoothManager mBtManager; @Nullable private final LocalBluetoothManager mBtManager;
@Nullable private final CachedBluetoothDeviceManager mDeviceManager; @Nullable private final CachedBluetoothDeviceManager mDeviceManager;
@@ -89,7 +87,6 @@ public class AudioSharingDevicePreferenceController extends BasePreferenceContro
private final Executor mExecutor; private final Executor mExecutor;
private final MetricsFeatureProvider mMetricsFeatureProvider; private final MetricsFeatureProvider mMetricsFeatureProvider;
@Nullable private PreferenceGroup mPreferenceGroup; @Nullable private PreferenceGroup mPreferenceGroup;
@Nullable private Preference mAudioSharingSettingsPreference;
@Nullable private BluetoothDeviceUpdater mBluetoothDeviceUpdater; @Nullable private BluetoothDeviceUpdater mBluetoothDeviceUpdater;
@Nullable private DashboardFragment mFragment; @Nullable private DashboardFragment mFragment;
@Nullable private AudioSharingDialogHandler mDialogHandler; @Nullable private AudioSharingDialogHandler mDialogHandler;
@@ -280,13 +277,8 @@ public class AudioSharingDevicePreferenceController extends BasePreferenceContro
super.displayPreference(screen); super.displayPreference(screen);
mPreferenceGroup = screen.findPreference(KEY); mPreferenceGroup = screen.findPreference(KEY);
if (mPreferenceGroup != null) { if (mPreferenceGroup != null) {
mAudioSharingSettingsPreference =
mPreferenceGroup.findPreference(KEY_AUDIO_SHARING_SETTINGS);
mPreferenceGroup.setVisible(false); mPreferenceGroup.setVisible(false);
} }
if (mAudioSharingSettingsPreference != null) {
mAudioSharingSettingsPreference.setVisible(false);
}
if (isAvailable()) { if (isAvailable()) {
if (mBluetoothDeviceUpdater != null) { if (mBluetoothDeviceUpdater != null) {
@@ -320,11 +312,8 @@ public class AudioSharingDevicePreferenceController extends BasePreferenceContro
@Override @Override
public void onDeviceAdded(Preference preference) { public void onDeviceAdded(Preference preference) {
if (mPreferenceGroup != null) { if (mPreferenceGroup != null) {
if (mPreferenceGroup.getPreferenceCount() == 1) { if (mPreferenceGroup.getPreferenceCount() == 0) {
mPreferenceGroup.setVisible(true); mPreferenceGroup.setVisible(true);
if (mAudioSharingSettingsPreference != null) {
mAudioSharingSettingsPreference.setVisible(true);
}
} }
mPreferenceGroup.addPreference(preference); mPreferenceGroup.addPreference(preference);
} }
@@ -334,11 +323,8 @@ public class AudioSharingDevicePreferenceController extends BasePreferenceContro
public void onDeviceRemoved(Preference preference) { public void onDeviceRemoved(Preference preference) {
if (mPreferenceGroup != null) { if (mPreferenceGroup != null) {
mPreferenceGroup.removePreference(preference); mPreferenceGroup.removePreference(preference);
if (mPreferenceGroup.getPreferenceCount() == 1) { if (mPreferenceGroup.getPreferenceCount() == 0) {
mPreferenceGroup.setVisible(false); mPreferenceGroup.setVisible(false);
if (mAudioSharingSettingsPreference != null) {
mAudioSharingSettingsPreference.setVisible(false);
}
} }
} }
} }

View File

@@ -45,6 +45,9 @@ import java.util.concurrent.Executors;
public class AudioSharingPreferenceController extends BasePreferenceController public class AudioSharingPreferenceController extends BasePreferenceController
implements DefaultLifecycleObserver, BluetoothCallback { implements DefaultLifecycleObserver, BluetoothCallback {
private static final String TAG = "AudioSharingPreferenceController"; private static final String TAG = "AudioSharingPreferenceController";
private static final String CONNECTED_DEVICES_PREF_KEY =
"connected_device_audio_sharing_settings";
private static final String CONNECTION_PREFERENCES_PREF_KEY = "audio_sharing_settings";
@Nullable private final LocalBluetoothManager mBtManager; @Nullable private final LocalBluetoothManager mBtManager;
@Nullable private final BluetoothEventManager mEventManager; @Nullable private final BluetoothEventManager mEventManager;
@@ -57,7 +60,7 @@ public class AudioSharingPreferenceController extends BasePreferenceController
new BluetoothLeBroadcast.Callback() { new BluetoothLeBroadcast.Callback() {
@Override @Override
public void onBroadcastStarted(int reason, int broadcastId) { public void onBroadcastStarted(int reason, int broadcastId) {
refreshSummary(); refreshPreference();
} }
@Override @Override
@@ -69,7 +72,7 @@ public class AudioSharingPreferenceController extends BasePreferenceController
@Override @Override
public void onBroadcastStopped(int reason, int broadcastId) { public void onBroadcastStopped(int reason, int broadcastId) {
refreshSummary(); refreshPreference();
} }
@Override @Override
@@ -111,6 +114,7 @@ public class AudioSharingPreferenceController extends BasePreferenceController
} }
mEventManager.registerCallback(this); mEventManager.registerCallback(this);
mBroadcast.registerServiceCallBack(mExecutor, mBroadcastCallback); mBroadcast.registerServiceCallBack(mExecutor, mBroadcastCallback);
updateVisibility();
} }
@Override @Override
@@ -131,6 +135,13 @@ public class AudioSharingPreferenceController extends BasePreferenceController
public void displayPreference(@NonNull PreferenceScreen screen) { public void displayPreference(@NonNull PreferenceScreen screen) {
super.displayPreference(screen); super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey()); mPreference = screen.findPreference(getPreferenceKey());
// super.displayPreference set the visibility based on isAvailable()
// immediately set the preference invisible on Connected devices page to avoid the audio
// sharing entrance being shown before updateVisibility(need binder call) take effects.
if (mPreference != null && CONNECTED_DEVICES_PREF_KEY.equals(getPreferenceKey())) {
mPreference.setVisible(false);
}
updateVisibility();
} }
@Override @Override
@@ -141,14 +152,51 @@ public class AudioSharingPreferenceController extends BasePreferenceController
@Override @Override
public CharSequence getSummary() { public CharSequence getSummary() {
return BluetoothUtils.isBroadcasting(mBtManager) return switch (getPreferenceKey()) {
? mContext.getString(R.string.audio_sharing_summary_on) case CONNECTION_PREFERENCES_PREF_KEY -> BluetoothUtils.isBroadcasting(mBtManager)
: mContext.getString(R.string.audio_sharing_summary_off); ? mContext.getString(R.string.audio_sharing_summary_on)
: mContext.getString(R.string.audio_sharing_summary_off);
default -> "";
};
} }
@Override @Override
public void onBluetoothStateChanged(@AdapterState int bluetoothState) { public void onBluetoothStateChanged(@AdapterState int bluetoothState) {
refreshSummary(); refreshPreference();
}
private void refreshPreference() {
switch (getPreferenceKey()) {
// Audio sharing entrance on Connected devices page has no summary, but its visibility
// will change based on audio sharing state
case CONNECTED_DEVICES_PREF_KEY -> updateVisibility();
// Audio sharing entrance on Connection preferences page always show up, but its summary
// will change based on audio sharing state
case CONNECTION_PREFERENCES_PREF_KEY -> refreshSummary();
}
}
private void updateVisibility() {
if (mPreference == null) {
return;
}
switch (getPreferenceKey()) {
case CONNECTED_DEVICES_PREF_KEY -> {
var unused =
ThreadUtils.postOnBackgroundThread(
() -> {
boolean visible = BluetoothUtils.isBroadcasting(mBtManager);
AudioSharingUtils.postOnMainThread(
mContext,
() -> {
// Check nullability to pass NullAway check
if (mPreference != null) {
mPreference.setVisible(visible);
}
});
});
}
}
} }
private void refreshSummary() { private void refreshSummary() {

View File

@@ -117,8 +117,6 @@ import java.util.concurrent.Executor;
}) })
public class AudioSharingDevicePreferenceControllerTest { public class AudioSharingDevicePreferenceControllerTest {
private static final String KEY = "audio_sharing_device_list"; private static final String KEY = "audio_sharing_device_list";
private static final String KEY_AUDIO_SHARING_SETTINGS =
"connected_device_audio_sharing_settings";
private static final String TEST_DEVICE_NAME = "test"; private static final String TEST_DEVICE_NAME = "test";
@Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule(); @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
@@ -151,7 +149,6 @@ public class AudioSharingDevicePreferenceControllerTest {
private Lifecycle mLifecycle; private Lifecycle mLifecycle;
private LifecycleOwner mLifecycleOwner; private LifecycleOwner mLifecycleOwner;
private PreferenceCategory mPreferenceGroup; private PreferenceCategory mPreferenceGroup;
private Preference mAudioSharingPreference;
private FakeFeatureFactory mFeatureFactory; private FakeFeatureFactory mFeatureFactory;
private AudioManager mAudioManager; private AudioManager mAudioManager;
@@ -189,10 +186,6 @@ public class AudioSharingDevicePreferenceControllerTest {
when(mScreen.getContext()).thenReturn(mContext); when(mScreen.getContext()).thenReturn(mContext);
mPreferenceGroup = spy(new PreferenceCategory(mContext)); mPreferenceGroup = spy(new PreferenceCategory(mContext));
doReturn(mPreferenceManager).when(mPreferenceGroup).getPreferenceManager(); doReturn(mPreferenceManager).when(mPreferenceGroup).getPreferenceManager();
mAudioSharingPreference = new Preference(mContext);
mPreferenceGroup.addPreference(mAudioSharingPreference);
when(mPreferenceGroup.findPreference(KEY_AUDIO_SHARING_SETTINGS))
.thenReturn(mAudioSharingPreference);
when(mScreen.findPreference(KEY)).thenReturn(mPreferenceGroup); when(mScreen.findPreference(KEY)).thenReturn(mPreferenceGroup);
mController = new AudioSharingDevicePreferenceController(mContext); mController = new AudioSharingDevicePreferenceController(mContext);
mController.init(mFragment); mController.init(mFragment);
@@ -260,7 +253,6 @@ public class AudioSharingDevicePreferenceControllerTest {
mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
assertThat(mPreferenceGroup.isVisible()).isFalse(); assertThat(mPreferenceGroup.isVisible()).isFalse();
assertThat(mAudioSharingPreference.isVisible()).isFalse();
verify(mBluetoothDeviceUpdater, never()).forceUpdate(); verify(mBluetoothDeviceUpdater, never()).forceUpdate();
} }
@@ -269,7 +261,6 @@ public class AudioSharingDevicePreferenceControllerTest {
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
assertThat(mPreferenceGroup.isVisible()).isFalse(); assertThat(mPreferenceGroup.isVisible()).isFalse();
assertThat(mAudioSharingPreference.isVisible()).isFalse();
verify(mBluetoothDeviceUpdater).setPrefContext(mContext); verify(mBluetoothDeviceUpdater).setPrefContext(mContext);
verify(mBluetoothDeviceUpdater).forceUpdate(); verify(mBluetoothDeviceUpdater).forceUpdate();
} }
@@ -299,8 +290,7 @@ public class AudioSharingDevicePreferenceControllerTest {
shadowOf(Looper.getMainLooper()).idle(); shadowOf(Looper.getMainLooper()).idle();
assertThat(mPreferenceGroup.isVisible()).isTrue(); assertThat(mPreferenceGroup.isVisible()).isTrue();
assertThat(mAudioSharingPreference.isVisible()).isTrue(); assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
} }
@Test @Test
@@ -312,8 +302,7 @@ public class AudioSharingDevicePreferenceControllerTest {
shadowOf(Looper.getMainLooper()).idle(); shadowOf(Looper.getMainLooper()).idle();
assertThat(mPreferenceGroup.isVisible()).isFalse(); assertThat(mPreferenceGroup.isVisible()).isFalse();
assertThat(mAudioSharingPreference.isVisible()).isFalse(); assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
} }
@Test @Test

View File

@@ -25,8 +25,10 @@ import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_
import static com.google.common.truth.Truth.assertThat; 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.anyBoolean;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
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.shadowOf; import static org.robolectric.Shadows.shadowOf;
@@ -77,7 +79,8 @@ import org.robolectric.shadow.api.Shadow;
ShadowThreadUtils.class ShadowThreadUtils.class
}) })
public class AudioSharingPreferenceControllerTest { public class AudioSharingPreferenceControllerTest {
private static final String PREF_KEY = "audio_sharing_settings"; private static final String PREF_KEY1 = "audio_sharing_settings";
private static final String PREF_KEY2 = "connected_device_audio_sharing_settings";
@Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule(); @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
@Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@@ -110,9 +113,6 @@ public class AudioSharingPreferenceControllerTest {
when(localBluetoothManager.getEventManager()).thenReturn(mBtEventManager); when(localBluetoothManager.getEventManager()).thenReturn(mBtEventManager);
when(localBluetoothManager.getProfileManager()).thenReturn(mLocalBtProfileManager); when(localBluetoothManager.getProfileManager()).thenReturn(mLocalBtProfileManager);
when(mLocalBtProfileManager.getLeAudioBroadcastProfile()).thenReturn(mBroadcast); when(mLocalBtProfileManager.getLeAudioBroadcastProfile()).thenReturn(mBroadcast);
mController = new AudioSharingPreferenceController(mContext, PREF_KEY);
mPreference = spy(new Preference(mContext));
when(mScreen.findPreference(PREF_KEY)).thenReturn(mPreference);
} }
@After @After
@@ -124,6 +124,7 @@ public class AudioSharingPreferenceControllerTest {
@Test @Test
public void onStart_flagOn_registerCallback() { public void onStart_flagOn_registerCallback() {
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
setupControllerWithKey(PREF_KEY1);
mController.onStart(mLifecycleOwner); mController.onStart(mLifecycleOwner);
verify(mBtEventManager).registerCallback(mController); verify(mBtEventManager).registerCallback(mController);
verify(mBroadcast).registerServiceCallBack(any(), any(BluetoothLeBroadcast.Callback.class)); verify(mBroadcast).registerServiceCallBack(any(), any(BluetoothLeBroadcast.Callback.class));
@@ -132,6 +133,7 @@ public class AudioSharingPreferenceControllerTest {
@Test @Test
public void onStart_flagOff_skipRegisterCallback() { public void onStart_flagOff_skipRegisterCallback() {
mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
setupControllerWithKey(PREF_KEY1);
mController.onStart(mLifecycleOwner); mController.onStart(mLifecycleOwner);
verify(mBtEventManager, never()).registerCallback(mController); verify(mBtEventManager, never()).registerCallback(mController);
verify(mBroadcast, never()) verify(mBroadcast, never())
@@ -141,6 +143,7 @@ public class AudioSharingPreferenceControllerTest {
@Test @Test
public void onStop_flagOn_unregisterCallback() { public void onStop_flagOn_unregisterCallback() {
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
setupControllerWithKey(PREF_KEY1);
mController.onStop(mLifecycleOwner); mController.onStop(mLifecycleOwner);
verify(mBtEventManager).unregisterCallback(mController); verify(mBtEventManager).unregisterCallback(mController);
verify(mBroadcast).unregisterServiceCallBack(any(BluetoothLeBroadcast.Callback.class)); verify(mBroadcast).unregisterServiceCallBack(any(BluetoothLeBroadcast.Callback.class));
@@ -149,6 +152,7 @@ public class AudioSharingPreferenceControllerTest {
@Test @Test
public void onStop_flagOff_skipUnregisterCallback() { public void onStop_flagOff_skipUnregisterCallback() {
mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
setupControllerWithKey(PREF_KEY1);
mController.onStop(mLifecycleOwner); mController.onStop(mLifecycleOwner);
verify(mBtEventManager, never()).unregisterCallback(mController); verify(mBtEventManager, never()).unregisterCallback(mController);
verify(mBroadcast, never()) verify(mBroadcast, never())
@@ -158,65 +162,147 @@ public class AudioSharingPreferenceControllerTest {
@Test @Test
public void getAvailabilityStatus_flagOn() { public void getAvailabilityStatus_flagOn() {
mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
setupControllerWithKey(PREF_KEY1);
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
} }
@Test @Test
public void getAvailabilityStatus_flagOff() { public void getAvailabilityStatus_flagOff() {
mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING); mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_LE_AUDIO_SHARING);
setupControllerWithKey(PREF_KEY1);
assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE); assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
} }
@Test @Test
public void getSummary_broadcastOn() { public void getSummary_connectionPreference_broadcastOn() {
when(mBroadcast.isEnabled(any())).thenReturn(true); when(mBroadcast.isEnabled(any())).thenReturn(true);
setupControllerWithKey(PREF_KEY1);
assertThat(mController.getSummary().toString()) assertThat(mController.getSummary().toString())
.isEqualTo(mContext.getString(R.string.audio_sharing_summary_on)); .isEqualTo(mContext.getString(R.string.audio_sharing_summary_on));
} }
@Test @Test
public void getSummary_broadcastOff() { public void getSummary_connectionPreference_broadcastOff() {
when(mBroadcast.isEnabled(any())).thenReturn(false); when(mBroadcast.isEnabled(any())).thenReturn(false);
setupControllerWithKey(PREF_KEY1);
assertThat(mController.getSummary().toString()) assertThat(mController.getSummary().toString())
.isEqualTo(mContext.getString(R.string.audio_sharing_summary_off)); .isEqualTo(mContext.getString(R.string.audio_sharing_summary_off));
} }
@Test
public void getSummary_connectedDevices_broadcastOn() {
when(mBroadcast.isEnabled(any())).thenReturn(true);
setupControllerWithKey(PREF_KEY2);
assertThat(mController.getSummary().toString()).isEmpty();
}
@Test
public void getSummary_connectedDevices_broadcastOff() {
when(mBroadcast.isEnabled(any())).thenReturn(false);
setupControllerWithKey(PREF_KEY2);
assertThat(mController.getSummary().toString()).isEmpty();
}
@Test @Test
public void onBluetoothStateChanged_refreshSummary() { public void onBluetoothStateChanged_refreshSummary() {
setupControllerWithKey(PREF_KEY1);
mController.updateState(mPreference);
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
shadowOf(Looper.getMainLooper()).idle();
assertThat(mPreference.getSummary().toString())
.isEqualTo(mContext.getString(R.string.audio_sharing_summary_off));
assertThat(mPreference.isVisible()).isTrue();
when(mBroadcast.isEnabled(any())).thenReturn(true); when(mBroadcast.isEnabled(any())).thenReturn(true);
mController.onBluetoothStateChanged(STATE_ON); mController.onBluetoothStateChanged(STATE_ON);
shadowOf(Looper.getMainLooper()).idle(); shadowOf(Looper.getMainLooper()).idle();
assertThat(mPreference.getSummary().toString()) assertThat(mPreference.getSummary().toString())
.isEqualTo(mContext.getString(R.string.audio_sharing_summary_on)); .isEqualTo(mContext.getString(R.string.audio_sharing_summary_on));
assertThat(mPreference.isVisible()).isTrue();
when(mBroadcast.isEnabled(any())).thenReturn(false); when(mBroadcast.isEnabled(any())).thenReturn(false);
mController.onBluetoothStateChanged(STATE_OFF); mController.onBluetoothStateChanged(STATE_OFF);
shadowOf(Looper.getMainLooper()).idle(); shadowOf(Looper.getMainLooper()).idle();
assertThat(mPreference.getSummary().toString()) assertThat(mPreference.getSummary().toString())
.isEqualTo(mContext.getString(R.string.audio_sharing_summary_off)); .isEqualTo(mContext.getString(R.string.audio_sharing_summary_off));
assertThat(mPreference.isVisible()).isTrue();
}
@Test
public void onBluetoothStateChanged_refreshVisibility() {
setupControllerWithKey(PREF_KEY2);
mController.updateState(mPreference);
mController.displayPreference(mScreen);
shadowOf(Looper.getMainLooper()).idle();
assertThat(mPreference.getSummary().toString()).isEmpty();
assertThat(mPreference.isVisible()).isFalse();
when(mBroadcast.isEnabled(any())).thenReturn(true);
mController.onBluetoothStateChanged(STATE_ON);
shadowOf(Looper.getMainLooper()).idle();
assertThat(mPreference.getSummary().toString()).isEmpty();
assertThat(mPreference.isVisible()).isTrue();
when(mBroadcast.isEnabled(any())).thenReturn(false);
mController.onBluetoothStateChanged(STATE_OFF);
shadowOf(Looper.getMainLooper()).idle();
assertThat(mPreference.getSummary().toString()).isEmpty();
assertThat(mPreference.isVisible()).isFalse();
} }
@Test @Test
public void testBluetoothLeBroadcastCallbacks_refreshSummary() { public void testBluetoothLeBroadcastCallbacks_refreshSummary() {
setupControllerWithKey(PREF_KEY1);
mController.updateState(mPreference);
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
shadowOf(Looper.getMainLooper()).idle();
assertThat(mPreference.getSummary().toString())
.isEqualTo(mContext.getString(R.string.audio_sharing_summary_off));
assertThat(mPreference.isVisible()).isTrue();
when(mBroadcast.isEnabled(any())).thenReturn(true); when(mBroadcast.isEnabled(any())).thenReturn(true);
mController.mBroadcastCallback.onBroadcastStarted(/* reason= */ 1, /* broadcastId= */ 1); mController.mBroadcastCallback.onBroadcastStarted(/* reason= */ 1, /* broadcastId= */ 1);
shadowOf(Looper.getMainLooper()).idle(); shadowOf(Looper.getMainLooper()).idle();
assertThat(mPreference.getSummary().toString()) assertThat(mPreference.getSummary().toString())
.isEqualTo(mContext.getString(R.string.audio_sharing_summary_on)); .isEqualTo(mContext.getString(R.string.audio_sharing_summary_on));
assertThat(mPreference.isVisible()).isTrue();
when(mBroadcast.isEnabled(any())).thenReturn(false); when(mBroadcast.isEnabled(any())).thenReturn(false);
mController.mBroadcastCallback.onBroadcastStopped(/* reason= */ 1, /* broadcastId= */ 1); mController.mBroadcastCallback.onBroadcastStopped(/* reason= */ 1, /* broadcastId= */ 1);
shadowOf(Looper.getMainLooper()).idle(); shadowOf(Looper.getMainLooper()).idle();
assertThat(mPreference.getSummary().toString()) assertThat(mPreference.getSummary().toString())
.isEqualTo(mContext.getString(R.string.audio_sharing_summary_off)); .isEqualTo(mContext.getString(R.string.audio_sharing_summary_off));
assertThat(mPreference.isVisible()).isTrue();
}
@Test
public void testBluetoothLeBroadcastCallbacks_refreshVisibility() {
setupControllerWithKey(PREF_KEY2);
mController.updateState(mPreference);
mController.displayPreference(mScreen);
shadowOf(Looper.getMainLooper()).idle();
assertThat(mPreference.getSummary().toString()).isEmpty();
assertThat(mPreference.isVisible()).isFalse();
when(mBroadcast.isEnabled(any())).thenReturn(true);
mController.mBroadcastCallback.onBroadcastStarted(/* reason= */ 1, /* broadcastId= */ 1);
shadowOf(Looper.getMainLooper()).idle();
assertThat(mPreference.getSummary().toString()).isEmpty();
assertThat(mPreference.isVisible()).isTrue();
when(mBroadcast.isEnabled(any())).thenReturn(false);
mController.mBroadcastCallback.onBroadcastStopped(/* reason= */ 1, /* broadcastId= */ 1);
shadowOf(Looper.getMainLooper()).idle();
assertThat(mPreference.getSummary().toString()).isEmpty();
assertThat(mPreference.isVisible()).isFalse();
} }
@Test @Test
public void testBluetoothLeBroadcastCallbacks_doNothing() { public void testBluetoothLeBroadcastCallbacks_doNothing() {
setupControllerWithKey(PREF_KEY1);
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
shadowOf(Looper.getMainLooper()).idle();
verify(mPreference).setVisible(anyBoolean());
mController.mBroadcastCallback.onBroadcastMetadataChanged(/* reason= */ 1, mMetadata); mController.mBroadcastCallback.onBroadcastMetadataChanged(/* reason= */ 1, mMetadata);
verify(mPreference, never()).setSummary(any()); verify(mPreference, never()).setSummary(any());
@@ -233,5 +319,34 @@ public class AudioSharingPreferenceControllerTest {
mController.mBroadcastCallback.onBroadcastUpdateFailed( mController.mBroadcastCallback.onBroadcastUpdateFailed(
/* reason= */ 1, /* broadcastId= */ 1); /* reason= */ 1, /* broadcastId= */ 1);
verify(mPreference, never()).setSummary(any()); verify(mPreference, never()).setSummary(any());
verify(mPreference).setVisible(anyBoolean());
setupControllerWithKey(PREF_KEY2);
mController.displayPreference(mScreen);
shadowOf(Looper.getMainLooper()).idle();
verify(mPreference, times(3)).setVisible(anyBoolean());
mController.mBroadcastCallback.onBroadcastMetadataChanged(/* reason= */ 1, mMetadata);
verify(mPreference, never()).setSummary(any());
mController.mBroadcastCallback.onBroadcastUpdated(/* reason= */ 1, /* broadcastId= */ 1);
verify(mPreference, never()).setSummary(any());
mController.mBroadcastCallback.onPlaybackStarted(/* reason= */ 1, /* broadcastId= */ 1);
verify(mPreference, never()).setSummary(any());
mController.mBroadcastCallback.onPlaybackStopped(/* reason= */ 1, /* broadcastId= */ 1);
verify(mPreference, never()).setSummary(any());
mController.mBroadcastCallback.onBroadcastStartFailed(/* reason= */ 1);
verify(mPreference, never()).setSummary(any());
mController.mBroadcastCallback.onBroadcastStopFailed(/* reason= */ 1);
verify(mPreference, never()).setSummary(any());
mController.mBroadcastCallback.onBroadcastUpdateFailed(
/* reason= */ 1, /* broadcastId= */ 1);
verify(mPreference, never()).setSummary(any());
verify(mPreference, times(3)).setVisible(anyBoolean());
}
private void setupControllerWithKey(String preferenceKey) {
mController = new AudioSharingPreferenceController(mContext, preferenceKey);
mPreference = spy(new Preference(mContext));
when(mScreen.findPreference(preferenceKey)).thenReturn(mPreference);
} }
} }