Add onErrorListner for SliceLiveData

SliceLiveData is changed in the framework, where the way it handles null
slices is different. Thus, we handle the case of null slices by adding
onSliceError() to make slice refreshing back to normal and to prevent
from non responding action on slices.

Fixes: 141293788
Test: visual
Change-Id: I4751d57ae478eec66a1a951841d36521556cacd7
This commit is contained in:
Yi-Ling Chuang
2019-10-01 15:14:18 +08:00
parent 8a4cf7c903
commit 19c2a20d9a

View File

@@ -43,6 +43,7 @@ import com.android.settings.homepage.contextualcards.CardContentProvider;
import com.android.settings.homepage.contextualcards.ContextualCard; import com.android.settings.homepage.contextualcards.ContextualCard;
import com.android.settings.homepage.contextualcards.ContextualCardRenderer; import com.android.settings.homepage.contextualcards.ContextualCardRenderer;
import com.android.settings.homepage.contextualcards.ControllerRendererPool; import com.android.settings.homepage.contextualcards.ControllerRendererPool;
import com.android.settingslib.utils.ThreadUtils;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@@ -104,7 +105,15 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, Life
LiveData<Slice> sliceLiveData = mSliceLiveDataMap.get(uri); LiveData<Slice> sliceLiveData = mSliceLiveDataMap.get(uri);
if (sliceLiveData == null) { if (sliceLiveData == null) {
sliceLiveData = SliceLiveData.fromUri(mContext, uri); sliceLiveData = SliceLiveData.fromUri(mContext, uri,
(int type, Throwable source) -> {
// onSliceError doesn't handle error Slices.
Log.w(TAG, "Slice may be null. uri = " + uri + ", error = " + type);
ThreadUtils.postOnMainThread(
() -> mSliceLiveDataMap.get(uri).removeObservers(mLifecycleOwner));
mContext.getContentResolver()
.notifyChange(CardContentProvider.REFRESH_CARD_URI, null);
});
mSliceLiveDataMap.put(uri, sliceLiveData); mSliceLiveDataMap.put(uri, sliceLiveData);
} }
@@ -115,13 +124,6 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, Life
swipeBackground.setVisibility(View.GONE); swipeBackground.setVisibility(View.GONE);
} }
sliceLiveData.observe(mLifecycleOwner, slice -> { sliceLiveData.observe(mLifecycleOwner, slice -> {
if (slice == null) {
Log.w(TAG, "Slice is null");
mContext.getContentResolver().notifyChange(CardContentProvider.REFRESH_CARD_URI,
null);
return;
}
if (slice.hasHint(HINT_ERROR)) { if (slice.hasHint(HINT_ERROR)) {
Log.w(TAG, "Slice has HINT_ERROR, skipping rendering. uri=" + slice.getUri()); Log.w(TAG, "Slice has HINT_ERROR, skipping rendering. uri=" + slice.getUri());
mSliceLiveDataMap.get(slice.getUri()).removeObservers(mLifecycleOwner); mSliceLiveDataMap.get(slice.getUri()).removeObservers(mLifecycleOwner);