Catch NPE for AllAppsContainerView.dispatchRestoreInstanceState

TL;DR;;
Missing view id for work profile recycler view
caused restore failure as there are different type of
views that contains same id. However, even after that fix,
lack of view id in slice views generated by other process
causes failure when mFlags on these not restored slice
views needs to be accessed.

Bug: 186596139
Test: manual
Change-Id: I8a97598c27acbc05ac8a39c50fe5862e541d62ad
This commit is contained in:
Hyunyoung Song
2021-05-17 00:33:54 -07:00
parent e010332efd
commit 2cecad8e75
2 changed files with 18 additions and 0 deletions

View File

@@ -30,11 +30,13 @@ import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Parcelable;
import android.os.Process;
import android.text.Selection;
import android.text.SpannableStringBuilder;
import android.util.AttributeSet;
import android.util.Log;
import android.util.SparseArray;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@@ -133,6 +135,7 @@ public class AllAppsContainerView extends SpringRelativeLayout implements DragSo
private int mHeaderColor;
public AllAppsContainerView(Context context) {
this(context, null);
}
@@ -171,6 +174,19 @@ public class AllAppsContainerView extends SpringRelativeLayout implements DragSo
mAllAppsStore.addUpdateListener(this::onAppsUpdated);
}
@Override
protected void dispatchRestoreInstanceState(SparseArray<Parcelable> sparseArray) {
try {
// Many slice view id is not properly assigned, and hence throws null
// pointer exception in the underneath method. Catching the exception
// simply doesn't restore these slice views. This doesn't have any
// user visible effect because because we query them again.
super.dispatchRestoreInstanceState(sparseArray);
} catch (Exception e) {
Log.e("AllAppsContainerView", "restoreInstanceState viewId = 0", e);
}
}
/**
* Sets the long click listener for icons
*/
@@ -438,6 +454,7 @@ public class AllAppsContainerView extends SpringRelativeLayout implements DragSo
setupWorkToggle();
mAH[AdapterHolder.MAIN].setup(mViewPager.getChildAt(0), mPersonalMatcher);
mAH[AdapterHolder.WORK].setup(mViewPager.getChildAt(1), mWorkMatcher);
mAH[AdapterHolder.WORK].recyclerView.setId(R.id.apps_list_view_work);
mViewPager.getPageIndicator().setActiveMarker(AdapterHolder.MAIN);
findViewById(R.id.tab_personal)
.setOnClickListener((View view) -> {