diff --git a/src/com/android/settings/slices/SlicePreferenceController.java b/src/com/android/settings/slices/SlicePreferenceController.java index df28304f738..eb10bd42be1 100644 --- a/src/com/android/settings/slices/SlicePreferenceController.java +++ b/src/com/android/settings/slices/SlicePreferenceController.java @@ -44,6 +44,7 @@ public class SlicePreferenceController extends BasePreferenceController implemen LiveData mLiveData; @VisibleForTesting SlicePreference mSlicePreference; + private boolean mIsObservering = false; private Uri mUri; public SlicePreferenceController(Context context, String preferenceKey) { @@ -68,25 +69,31 @@ public class SlicePreferenceController extends BasePreferenceController implemen }); //TODO(b/120803703): figure out why we need to remove observer first - mLiveData.removeObserver(this); + removeLiveDataObserver(); } @Override public void onStart() { - if (mLiveData != null) { + if (mLiveData != null && !mIsObservering) { + mIsObservering = true; mLiveData.observeForever(this); } } @Override public void onStop() { - if (mLiveData != null) { - mLiveData.removeObserver(this); - } + removeLiveDataObserver(); } @Override public void onChanged(Slice slice) { mSlicePreference.onSliceUpdated(slice); } + + private void removeLiveDataObserver() { + if (mLiveData != null && mIsObservering && mLiveData.hasActiveObservers()) { + mIsObservering = false; + mLiveData.removeObserver(this); + } + } } diff --git a/tests/robotests/src/com/android/settings/slices/SlicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/slices/SlicePreferenceControllerTest.java index 65eaddd50ab..e8bd27d97e6 100644 --- a/tests/robotests/src/com/android/settings/slices/SlicePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/slices/SlicePreferenceControllerTest.java @@ -18,8 +18,10 @@ package com.android.settings.slices; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.content.Context; import android.net.Uri; @@ -43,11 +45,11 @@ public class SlicePreferenceControllerTest { private LiveData mLiveData; @Mock private SlicePreference mSlicePreference; + private Context mContext; private SlicePreferenceController mController; private Uri mUri; - @Before public void setUp() { MockitoAnnotations.initMocks(this); @@ -78,10 +80,30 @@ public class SlicePreferenceControllerTest { @Test public void onStop_unregisterObserver() { + when(mLiveData.hasActiveObservers()).thenReturn(true); + mController.onStart(); + mController.onStop(); verify(mLiveData).removeObserver(mController); } + @Test + public void onStop_noActiveObservers_notUnregisterObserver() { + when(mLiveData.hasActiveObservers()).thenReturn(false); + mController.onStart(); + + mController.onStop(); + verify(mLiveData, never()).removeObserver(mController); + } + + @Test + public void onStop_notRegisterObserver_notUnregisterObserver() { + when(mLiveData.hasActiveObservers()).thenReturn(true); + + mController.onStop(); + verify(mLiveData, never()).removeObserver(mController); + } + @Test public void onChanged_nullSlice_updateSlice() { mController.onChanged(null);