Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0af8c603 authored by Tom Hsu's avatar Tom Hsu Committed by Android (Google) Code Review
Browse files

Merge "[Settings] Avoid to unregister wrong observer" into udc-dev

parents 4d917d99 5e2862f2
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ public class SlicePreferenceController extends BasePreferenceController implemen
    LiveData<Slice> 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);
        }
    }
}
+23 −1
Original line number Diff line number Diff line
@@ -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<Slice> 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);