Don't save NavigationMenuPresenter state on API 9-10
Happens since it saves RecyclerView state, which will
probably be loaded from a different class loader. Rather
than crash we'll just not save state.
BUG: 30458641
Change-Id: I6f907fc09c22f3db2061872a4c4e75a271d23dcd
diff --git a/design/src/android/support/design/internal/NavigationMenuPresenter.java b/design/src/android/support/design/internal/NavigationMenuPresenter.java
index ec998c2..de2a7c5 100644
--- a/design/src/android/support/design/internal/NavigationMenuPresenter.java
+++ b/design/src/android/support/design/internal/NavigationMenuPresenter.java
@@ -20,6 +20,7 @@
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
+import android.os.Build;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.annotation.LayoutRes;
@@ -155,28 +156,36 @@
@Override
public Parcelable onSaveInstanceState() {
- Bundle state = new Bundle();
- if (mMenuView != null) {
- SparseArray<Parcelable> hierarchy = new SparseArray<>();
- mMenuView.saveHierarchyState(hierarchy);
- state.putSparseParcelableArray(STATE_HIERARCHY, hierarchy);
+ if (Build.VERSION.SDK_INT >= 11) {
+ // API 9-10 does not support ClassLoaderCreator, therefore things can crash if they're
+ // loaded via different loaders. Rather than crash we just won't save state on those
+ // platforms
+ final Bundle state = new Bundle();
+ if (mMenuView != null) {
+ SparseArray<Parcelable> hierarchy = new SparseArray<>();
+ mMenuView.saveHierarchyState(hierarchy);
+ state.putSparseParcelableArray(STATE_HIERARCHY, hierarchy);
+ }
+ if (mAdapter != null) {
+ state.putBundle(STATE_ADAPTER, mAdapter.createInstanceState());
+ }
+ return state;
}
- if (mAdapter != null) {
- state.putBundle(STATE_ADAPTER, mAdapter.createInstanceState());
- }
- return state;
+ return null;
}
@Override
- public void onRestoreInstanceState(Parcelable parcelable) {
- Bundle state = (Bundle) parcelable;
- SparseArray<Parcelable> hierarchy = state.getSparseParcelableArray(STATE_HIERARCHY);
- if (hierarchy != null) {
- mMenuView.restoreHierarchyState(hierarchy);
- }
- Bundle adapterState = state.getBundle(STATE_ADAPTER);
- if (adapterState != null) {
- mAdapter.restoreInstanceState(adapterState);
+ public void onRestoreInstanceState(final Parcelable parcelable) {
+ if (parcelable instanceof Bundle) {
+ Bundle state = (Bundle) parcelable;
+ SparseArray<Parcelable> hierarchy = state.getSparseParcelableArray(STATE_HIERARCHY);
+ if (hierarchy != null) {
+ mMenuView.restoreHierarchyState(hierarchy);
+ }
+ Bundle adapterState = state.getBundle(STATE_ADAPTER);
+ if (adapterState != null) {
+ mAdapter.restoreInstanceState(adapterState);
+ }
}
}