package com.tale.prettybundle; import android.os.Bundle; import android.os.Parcelable; import java.lang.reflect.Array; import java.util.Arrays; /** * Created by giang on 2/24/15. */ public enum ExtraBinder { STRING { @Override public String get(Bundle bundle, String key) { return bundle.getString(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putString(key, (String) value); } }, CHAR_SEQUENCE { @Override public CharSequence get(Bundle bundle, String key) { return bundle.getCharSequence(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putCharSequence(key, (CharSequence) value); } }, INTEGER { @Override public Integer get(Bundle bundle, String key) { return bundle.getInt(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putInt(key, (Integer) value); } }, LONG { @Override public Long get(Bundle bundle, String key) { return bundle.getLong(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putLong(key, (Long) value); } }, FLOAT { @Override public Float get(Bundle bundle, String key) { return bundle.getFloat(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putFloat(key, (Float) value); } }, DOUBLE { @Override public Double get(Bundle bundle, String key) { return bundle.getDouble(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putDouble(key, (Double) value); } }, BOOLEAN { @Override public Boolean get(Bundle bundle, String key) { return bundle.getBoolean(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putBoolean(key, (Boolean) value); } }, BYTE { @Override public Byte get(Bundle bundle, String key) { return bundle.getByte(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putByte(key, (Byte) value); } }, CHAR { @Override public Character get(Bundle bundle, String key) { return bundle.getChar(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putChar(key, (Character) value); } }, SHORT { @Override public Short get(Bundle bundle, String key) { return bundle.getShort(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putShort(key, (Short) value); } }, PARCELABLE { @Override public <T> T get(Bundle bundle, String key) { return (T) bundle.getParcelable(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putParcelable(key, (Parcelable) value); } }, STRING_ARRAY { @Override public <T> T get(Bundle bundle, String key) { return (T) bundle.getStringArray(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putStringArray(key, (String[]) value); } }, CHAR_SEQUENCE_ARRAY { @Override public <T> T get(Bundle bundle, String key) { return (T) bundle.getCharSequenceArray(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putCharSequenceArray(key, (CharSequence[]) value); } }, INTEGER_ARRAY { @Override public <T> T get(Bundle bundle, String key) { return (T) bundle.getIntArray(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putIntArray(key, (int[]) value); } }, LONG_ARRAY { @Override public <T> T get(Bundle bundle, String key) { return (T) bundle.getLongArray(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putLongArray(key, (long[]) value); } }, FLOAT_ARRAY { @Override public <T> T get(Bundle bundle, String key) { return (T) bundle.getFloatArray(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putFloatArray(key, (float[]) value); } }, DOUBLE_ARRAY { @Override public <T> T get(Bundle bundle, String key) { return (T) bundle.getDoubleArray(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putDoubleArray(key, (double[]) value); } }, BOOLEAN_ARRAY { @Override public <T> T get(Bundle bundle, String key) { return (T) bundle.getBooleanArray(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putBooleanArray(key, (boolean[]) value); } }, BYTE_ARRAY { @Override public <T> T get(Bundle bundle, String key) { return (T) bundle.getByteArray(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putByteArray(key, (byte[]) value); } }, CHAR_ARRAY { @Override public <T> T get(Bundle bundle, String key) { return (T) bundle.getCharArray(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putCharArray(key, (char[]) value); } }, SHORT_ARRAY { @Override public <T> T get(Bundle bundle, String key) { return (T) bundle.getShortArray(key); } @Override public void set(Bundle bundle, String key, Object value) { bundle.putShortArray(key, (short[]) value); } }, PARCELABLE_ARRAY { @Override public <T> T get(Bundle bundle, String key) { final Class<?> dataTypeClass = getDataTypeClass(); final Parcelable[] parcelables = bundle.getParcelableArray(key); final String dataTypeClassName = dataTypeClass.getCanonicalName(); if (dataTypeClassName.equals("android.os.Parcelable[]")) { // Check if class of data type is Parcelable we can cast the array to return return (T) parcelables; } if (parcelables != null && parcelables.length > 0) { // We must convert data type from Parcelable array to T array base on dataTypeClass which was registered in code generated. return (T) Arrays.asList(parcelables).toArray((Object[]) Array.newInstance(dataTypeClass, parcelables.length)); } return null; } @Override public void set(Bundle bundle, String key, Object value) { bundle.putParcelableArray(key, (Parcelable[]) value); } }, NOP { @Override public <T> T get(Bundle bundle, String key) { return null; } @Override public void set(Bundle bundle, String key, Object value) { } }; protected Class<?> dataTypeClass; public void setDataTypeClass(Class<?> clazz) { this.dataTypeClass = clazz; } public Class<?> getDataTypeClass() { return dataTypeClass; } public abstract <T> T get(Bundle bundle, String key); public abstract void set(Bundle bundle, String key, Object value); }