package gueei.binding.serialization;
import gueei.binding.IObservable;
import java.lang.reflect.Field;
import java.util.ArrayList;
import android.os.Bundle;
import android.os.Parcelable;
public class ViewModelParceler {
// Parcel all the 'Parcelable' Observables in the View Model
public static Bundle parcelViewModel(Object viewModel){
Bundle bundle = new Bundle();
Field[] fields = viewModel.getClass().getFields();
for(Field f : fields){
try {
Object fieldValue = f.get(viewModel);
String fieldName = f.getName();
if (fieldValue instanceof IObservable){
if (f.getAnnotation(NoParcel.class)!=null) continue;
IObservable<?> obs = (IObservable<?>)fieldValue;
if (obs!=null){
Object value = obs.get();
if (value!=null){
if (value instanceof Parcelable)
//((Parcelable)value).
bundle.putParcelable(fieldName, (Parcelable)value);
else if (value instanceof Short)
bundle.putShort(fieldName, (Short)value);
else if (value instanceof Integer)
bundle.putInt(fieldName, (Integer)value);
else if(value instanceof Long)
bundle.putLong(fieldName, (Long)value);
else if (value instanceof Float)
bundle.putFloat(fieldName, (Float)value);
else if (value instanceof Double)
bundle.putDouble(fieldName, (Double)value);
else if (value instanceof String)
bundle.putString(fieldName, (String)value);
else if (value instanceof CharSequence)
bundle.putCharSequence(fieldName, (CharSequence)value);
else if (value instanceof Boolean)
bundle.putBoolean(fieldName, (Boolean)value);
}
}
}
} catch (IllegalArgumentException e) {
continue;
} catch (IllegalAccessException e) {
continue;
}
}
return bundle;
}
public static void restoreViewModel(Bundle bundle, Object viewModel){
if (bundle==null) return;
Field[] fields = viewModel.getClass().getFields();
for(Field f : fields){
try {
if (!IObservable.class.isAssignableFrom(f.getType())) continue;
String fieldName = f.getName();
if (f.getAnnotation(NoParcel.class)!=null) continue;
if (!bundle.containsKey(fieldName)) continue;
Object fieldValue = f.get(viewModel);
if (fieldValue != null){
IObservable<?> obs = (IObservable<?>)fieldValue;
Object obj = bundle.get(fieldName);
obs._setObject(obj, new ArrayList<Object>());
}
} catch (IllegalArgumentException e) {
continue;
} catch (IllegalAccessException e) {
continue;
}
}
}
}