package de.westnordost.streetcomplete.util;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import android.view.View;
import javax.inject.Inject;
import de.westnordost.streetcomplete.ApplicationComponent;
import de.westnordost.streetcomplete.Injector;
/** Saved states made easy ... :-P */
public class SerializedSavedState extends View.BaseSavedState
{
@Inject Serializer serializer;
private final Object data;
private final Parcel source;
public SerializedSavedState(Parcelable superState, @NonNull Object data)
{
super(superState);
inject();
this.data = data;
this.source = null;
}
private SerializedSavedState(@NonNull Parcel source)
{
super(source);
inject();
this.source = source;
this.data = null;
}
private void inject()
{
ApplicationComponent component = Injector.instance.getApplicationComponent();
// the component is null when testing
if(component != null) component.inject(this);
}
public Object get(Class<?> tClass)
{
// Android does not necessarily write the data to parcel but may reuse the data created
// for saving instance state also for restoring. In this case, source is null and data is
// defined
if(data != null) return data;
return serializer.toObject(source.createByteArray(), tClass);
}
@Override public void writeToParcel(Parcel dest, int flags)
{
super.writeToParcel(dest, flags);
dest.writeByteArray(serializer.toBytes(data));
}
public static final Creator<SerializedSavedState> CREATOR = new Creator<SerializedSavedState>()
{
@Override public SerializedSavedState createFromParcel(Parcel source)
{
return new SerializedSavedState(source);
}
@Override public SerializedSavedState[] newArray(int size)
{
return new SerializedSavedState[size];
}
};
}