Merge "[Settings] Avoid to unregister wrong observer" into udc-dev am: 0af8c60342
am: 77e126db56
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/23162866 Change-Id: Ia012c94bca619f1d2165a89908341b2c9aed98d6 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -44,6 +44,7 @@ public class SlicePreferenceController extends BasePreferenceController implemen
|
|||||||
LiveData<Slice> mLiveData;
|
LiveData<Slice> mLiveData;
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
SlicePreference mSlicePreference;
|
SlicePreference mSlicePreference;
|
||||||
|
private boolean mIsObservering = false;
|
||||||
private Uri mUri;
|
private Uri mUri;
|
||||||
|
|
||||||
public SlicePreferenceController(Context context, String preferenceKey) {
|
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
|
//TODO(b/120803703): figure out why we need to remove observer first
|
||||||
mLiveData.removeObserver(this);
|
removeLiveDataObserver();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStart() {
|
public void onStart() {
|
||||||
if (mLiveData != null) {
|
if (mLiveData != null && !mIsObservering) {
|
||||||
|
mIsObservering = true;
|
||||||
mLiveData.observeForever(this);
|
mLiveData.observeForever(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStop() {
|
public void onStop() {
|
||||||
if (mLiveData != null) {
|
removeLiveDataObserver();
|
||||||
mLiveData.removeObserver(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onChanged(Slice slice) {
|
public void onChanged(Slice slice) {
|
||||||
mSlicePreference.onSliceUpdated(slice);
|
mSlicePreference.onSliceUpdated(slice);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void removeLiveDataObserver() {
|
||||||
|
if (mLiveData != null && mIsObservering && mLiveData.hasActiveObservers()) {
|
||||||
|
mIsObservering = false;
|
||||||
|
mLiveData.removeObserver(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -18,8 +18,10 @@ package com.android.settings.slices;
|
|||||||
|
|
||||||
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.Mockito.spy;
|
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 android.content.Context;
|
import android.content.Context;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
@@ -43,11 +45,11 @@ public class SlicePreferenceControllerTest {
|
|||||||
private LiveData<Slice> mLiveData;
|
private LiveData<Slice> mLiveData;
|
||||||
@Mock
|
@Mock
|
||||||
private SlicePreference mSlicePreference;
|
private SlicePreference mSlicePreference;
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private SlicePreferenceController mController;
|
private SlicePreferenceController mController;
|
||||||
private Uri mUri;
|
private Uri mUri;
|
||||||
|
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
@@ -78,10 +80,30 @@ public class SlicePreferenceControllerTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onStop_unregisterObserver() {
|
public void onStop_unregisterObserver() {
|
||||||
|
when(mLiveData.hasActiveObservers()).thenReturn(true);
|
||||||
|
mController.onStart();
|
||||||
|
|
||||||
mController.onStop();
|
mController.onStop();
|
||||||
verify(mLiveData).removeObserver(mController);
|
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
|
@Test
|
||||||
public void onChanged_nullSlice_updateSlice() {
|
public void onChanged_nullSlice_updateSlice() {
|
||||||
mController.onChanged(null);
|
mController.onChanged(null);
|
||||||
|
Reference in New Issue
Block a user