Fix volume panel hang
SliceLiveData changed its behavior, if slice is null, it will not notify LiveData observer but callback to onErrorListener. We only reduce PanelSlicesLoaderCountdownLatch in LiveData observer. Therefore the error slice caused PanelSlicesLoaderCountdownLatch never count to 0, the UI was not displayed. It is solved by reducing PanelSlicesLoaderCountdownLatch in onErrorListener and also not return null in MediaOutputIndicatorSlice. Test: manual Fixes: 141084035 Change-Id: Iddb2dbdc0e0d2ac3e26071960bb667937f181121
This commit is contained in:
@@ -17,6 +17,8 @@
|
||||
|
||||
package com.android.settings.media;
|
||||
|
||||
import static android.app.slice.Slice.HINT_ERROR;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Mockito.spy;
|
||||
@@ -110,11 +112,13 @@ public class MediaOutputIndicatorSliceTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getSlice_noConnectedDevice_returnNull() {
|
||||
public void getSlice_noConnectedDevice_returnErrorSlice() {
|
||||
mDevicesList.clear();
|
||||
when(mA2dpProfile.getConnectedDevices()).thenReturn(mDevicesList);
|
||||
|
||||
assertThat(mMediaOutputIndicatorSlice.getSlice()).isNull();
|
||||
final Slice mediaSlice = mMediaOutputIndicatorSlice.getSlice();
|
||||
final SliceMetadata metadata = SliceMetadata.from(mContext, mediaSlice);
|
||||
assertThat(metadata.isErrorSlice()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -129,6 +133,7 @@ public class MediaOutputIndicatorSliceTest {
|
||||
assertThat(metadata.getTitle()).isEqualTo(mContext.getText(R.string.media_output_title));
|
||||
assertThat(metadata.getSubtitle()).isEqualTo(mContext.getText(
|
||||
R.string.media_output_default_summary));
|
||||
assertThat(metadata.isErrorSlice()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -141,6 +146,7 @@ public class MediaOutputIndicatorSliceTest {
|
||||
final SliceMetadata metadata = SliceMetadata.from(mContext, mediaSlice);
|
||||
assertThat(metadata.getTitle()).isEqualTo(mContext.getText(R.string.media_output_title));
|
||||
assertThat(metadata.getSubtitle()).isEqualTo(TEST_A2DP_DEVICE_NAME);
|
||||
assertThat(metadata.isErrorSlice()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -154,32 +160,39 @@ public class MediaOutputIndicatorSliceTest {
|
||||
final SliceMetadata metadata = SliceMetadata.from(mContext, mediaSlice);
|
||||
assertThat(metadata.getTitle()).isEqualTo(mContext.getText(R.string.media_output_title));
|
||||
assertThat(metadata.getSubtitle()).isEqualTo(TEST_HAP_DEVICE_NAME);
|
||||
assertThat(metadata.isErrorSlice()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getSlice_audioModeIsInCommunication_returnNull() {
|
||||
public void getSlice_audioModeIsInCommunication_returnErrorSlice() {
|
||||
mDevicesList.add(mA2dpDevice);
|
||||
when(mA2dpProfile.getConnectedDevices()).thenReturn(mDevicesList);
|
||||
mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
|
||||
|
||||
assertThat(mMediaOutputIndicatorSlice.getSlice()).isNull();
|
||||
final Slice mediaSlice = mMediaOutputIndicatorSlice.getSlice();
|
||||
final SliceMetadata metadata = SliceMetadata.from(mContext, mediaSlice);
|
||||
assertThat(metadata.isErrorSlice()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getSlice_audioModeIsRingtone_returnNull() {
|
||||
public void getSlice_audioModeIsRingtone_returnErrorSlice() {
|
||||
mDevicesList.add(mA2dpDevice);
|
||||
when(mA2dpProfile.getConnectedDevices()).thenReturn(mDevicesList);
|
||||
mAudioManager.setMode(AudioManager.MODE_RINGTONE);
|
||||
|
||||
assertThat(mMediaOutputIndicatorSlice.getSlice()).isNull();
|
||||
final Slice mediaSlice = mMediaOutputIndicatorSlice.getSlice();
|
||||
final SliceMetadata metadata = SliceMetadata.from(mContext, mediaSlice);
|
||||
assertThat(metadata.isErrorSlice()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getSlice_audioModeIsInCall_returnNull() {
|
||||
public void getSlice_audioModeIsInCall_returnErrorSlice() {
|
||||
mDevicesList.add(mA2dpDevice);
|
||||
when(mA2dpProfile.getConnectedDevices()).thenReturn(mDevicesList);
|
||||
mAudioManager.setMode(AudioManager.MODE_IN_CALL);
|
||||
|
||||
assertThat(mMediaOutputIndicatorSlice.getSlice()).isNull();
|
||||
final Slice mediaSlice = mMediaOutputIndicatorSlice.getSlice();
|
||||
final SliceMetadata metadata = SliceMetadata.from(mContext, mediaSlice);
|
||||
assertThat(metadata.isErrorSlice()).isTrue();
|
||||
}
|
||||
}
|
||||
|
@@ -49,7 +49,9 @@ import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.android.controller.ActivityController;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class PanelSlicesAdapterTest {
|
||||
@@ -61,7 +63,7 @@ public class PanelSlicesAdapterTest {
|
||||
private PanelFeatureProvider mPanelFeatureProvider;
|
||||
private FakeFeatureFactory mFakeFeatureFactory;
|
||||
private FakePanelContent mFakePanelContent;
|
||||
private List<LiveData<Slice>> mData = new ArrayList<>();
|
||||
private Map<Uri, LiveData<Slice>> mData = new LinkedHashMap<>();
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
@@ -93,7 +95,7 @@ public class PanelSlicesAdapterTest {
|
||||
doReturn(uri).when(slice).getUri();
|
||||
final LiveData<Slice> liveData = mock(LiveData.class);
|
||||
when(liveData.getValue()).thenReturn(slice);
|
||||
mData.add(liveData);
|
||||
mData.put(uri, liveData);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -111,7 +113,7 @@ public class PanelSlicesAdapterTest {
|
||||
@Test
|
||||
public void sizeOfAdapter_shouldNotExceedMaxNum() {
|
||||
for (int i = 0; i < MAX_NUM_OF_SLICES + 2; i++) {
|
||||
addTestLiveData(DATA_URI);
|
||||
addTestLiveData(Uri.parse("uri" + i));
|
||||
}
|
||||
|
||||
assertThat(mData.size()).isEqualTo(MAX_NUM_OF_SLICES + 2);
|
||||
|
@@ -187,8 +187,6 @@ public class OwnerInfoPreferenceControllerTest {
|
||||
|
||||
preference.performClick();
|
||||
|
||||
// Called once in setTargetFragment, and a second time to display the fragment.
|
||||
verify(mFragment, times(2)).getFragmentManager();
|
||||
verify(mFragment.getFragmentManager().beginTransaction())
|
||||
.add(any(OwnerInfoSettings.class), anyString());
|
||||
}
|
||||
|
Reference in New Issue
Block a user