package com.beloo.widget.chipslayoutmanager;
import android.content.res.Configuration;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.IntRange;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.SparseArray;
import com.beloo.widget.chipslayoutmanager.anchor.AnchorViewState;
import com.beloo.widget.chipslayoutmanager.cache.CacheParcelableContainer;
class ParcelableContainer implements Parcelable {
private AnchorViewState anchorViewState;
private SparseArray<Object> orientationCacheMap = new SparseArray<>();
private SparseArray<Object> cacheNormalizationPositionMap = new SparseArray<>();
//store previous orientation
private int orientation;
ParcelableContainer() {
//initial values. We should normalize cache when scrolled to zero in case first time of changing layoutOrientation state
cacheNormalizationPositionMap.put(Configuration.ORIENTATION_PORTRAIT, 0);
cacheNormalizationPositionMap.put(Configuration.ORIENTATION_LANDSCAPE, 0);
}
void putAnchorViewState(AnchorViewState anchorViewState) {
this.anchorViewState = anchorViewState;
}
AnchorViewState getAnchorViewState() {
return anchorViewState;
}
@DeviceOrientation
int getOrientation() {
return orientation;
}
void putOrientation(@DeviceOrientation int orientation) {
this.orientation = orientation;
}
@SuppressWarnings("unchecked")
private ParcelableContainer(Parcel parcel) {
anchorViewState = AnchorViewState.CREATOR.createFromParcel(parcel);
orientationCacheMap = parcel.readSparseArray(CacheParcelableContainer.class.getClassLoader());
cacheNormalizationPositionMap = parcel.readSparseArray(Integer.class.getClassLoader());
orientation = parcel.readInt();
}
@Override
public void writeToParcel(Parcel parcel, int i) {
anchorViewState.writeToParcel(parcel, i);
parcel.writeSparseArray(orientationCacheMap);
parcel.writeSparseArray(cacheNormalizationPositionMap);
parcel.writeInt(orientation);
}
void putPositionsCache(@DeviceOrientation int orientation, Parcelable parcelable) {
orientationCacheMap.put(orientation, parcelable);
}
void putNormalizationPosition(@DeviceOrientation int orientation, @Nullable Integer normalizationPosition) {
cacheNormalizationPositionMap.put(orientation, normalizationPosition);
}
@Nullable
Parcelable getPositionsCache(@DeviceOrientation int orientation) {
return (Parcelable) orientationCacheMap.get(orientation);
}
@IntRange(from = 0)
@Nullable
Integer getNormalizationPosition(@DeviceOrientation int orientation) {
return (Integer) cacheNormalizationPositionMap.get(orientation);
}
public static final Creator<ParcelableContainer> CREATOR = new Creator<ParcelableContainer>() {
@Override
public ParcelableContainer createFromParcel(Parcel parcel) {
return new ParcelableContainer(parcel);
}
@Override
public ParcelableContainer[] newArray(int i) {
return new ParcelableContainer[i];
}
};
@Override
public int describeContents() {
return 0;
}
}