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:
Tom Hsu
2023-05-12 06:48:00 +00:00
committed by Automerger Merge Worker
2 changed files with 35 additions and 6 deletions

View File

@@ -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);
}
}
} }

View File

@@ -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);