diff --git a/src/com/android/settings/homepage/slices/SliceContextualCardRenderer.java b/src/com/android/settings/homepage/slices/SliceContextualCardRenderer.java index 5818e18546a..29e9aedf26c 100644 --- a/src/com/android/settings/homepage/slices/SliceContextualCardRenderer.java +++ b/src/com/android/settings/homepage/slices/SliceContextualCardRenderer.java @@ -91,14 +91,16 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, if (sliceLiveData == null) { sliceLiveData = SliceLiveData.fromUri(mContext, uri); mSliceLiveDataMap.put(uri.toString(), sliceLiveData); - sliceLiveData.observe(mLifecycleOwner, slice -> { - if (slice == null) { - Log.w(TAG, "Slice is null"); - } - cardHolder.sliceView.setSlice(slice); - }); } + sliceLiveData.removeObservers(mLifecycleOwner); + sliceLiveData.observe(mLifecycleOwner, slice -> { + if (slice == null) { + Log.w(TAG, "Slice is null"); + } + cardHolder.sliceView.setSlice(slice); + }); + // Set this listener so we can log the interaction users make on the slice cardHolder.sliceView.setOnSliceActionListener(this); } diff --git a/tests/robotests/src/com/android/settings/homepage/slices/SliceContextualCardRendererTest.java b/tests/robotests/src/com/android/settings/homepage/slices/SliceContextualCardRendererTest.java index c5ca8d79487..b8f8415a0dc 100644 --- a/tests/robotests/src/com/android/settings/homepage/slices/SliceContextualCardRendererTest.java +++ b/tests/robotests/src/com/android/settings/homepage/slices/SliceContextualCardRendererTest.java @@ -18,7 +18,7 @@ package com.android.settings.homepage.slices; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; import android.content.Context; import android.net.Uri; @@ -26,8 +26,10 @@ import android.view.LayoutInflater; import android.view.View; import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.LiveData; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import androidx.slice.Slice; import com.android.settings.homepage.ContextualCard; import com.android.settings.homepage.PersonalSettingsFragment; @@ -36,12 +38,16 @@ import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; @RunWith(SettingsRobolectricTestRunner.class) public class SliceContextualCardRendererTest { + @Mock + private LiveData mSliceLiveData; + private Context mContext; private SliceContextualCardRenderer mRenderer; private LifecycleOwner mLifecycleOwner; @@ -96,6 +102,16 @@ public class SliceContextualCardRendererTest { assertThat(mRenderer.mSliceLiveDataMap.get(sliceUri).hasObservers()).isTrue(); } + @Test + public void bindview_sliceLiveDataShouldRemoveObservers() { + final String sliceUri = "content://com.android.settings.slices/action/flashlight"; + mRenderer.mSliceLiveDataMap.put(sliceUri, mSliceLiveData); + + mRenderer.bindView(getSliceViewHolder(), buildContextualCard(sliceUri)); + + verify(mSliceLiveData).removeObservers(mLifecycleOwner); + } + private RecyclerView.ViewHolder getSliceViewHolder() { final int viewType = mRenderer.getViewType(); final RecyclerView recyclerView = new RecyclerView(mContext);