package com.kedzie.vbox.app; import java.io.Serializable; import java.util.ArrayList; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Messenger; import android.os.Parcelable; import android.os.RemoteException; import android.util.SparseArray; import com.kedzie.vbox.api.IManagedObjectRef; import com.kedzie.vbox.api.IVirtualBox; import com.kedzie.vbox.soap.VBoxSvc; /** * Builder pattern for {@link Bundle}. * Also contains functionality for wrapping VirtualBox remote proxies in Parcels * @apiviz.stereotype utility */ public class BundleBuilder { private Bundle b = new Bundle(); /** * Add a parceled remote proxy to bundle * @param key entry key * @param value remote proxy * @return builder pattern */ public static void putProxy(Bundle b, String key, IManagedObjectRef value) { if(value==null) return; if(value instanceof Parcelable) b.putParcelable(key, (Parcelable)value); else b.putSerializable(key, (Serializable)value); } /** * Add a parceled remote proxy to intent * @param intent the intent * @param name name of extra * @param obj remote proxy */ public static void addProxy(Intent intent, String name, IManagedObjectRef obj) { if(obj==null) return; if(obj instanceof Parcelable) intent.putExtra(name, (Parcelable)obj); else intent.putExtra(name, (Serializable)obj); } /** * Unparcel a remote proxy from bundle * @param bundle the bundle * @param name name of extra * @param clazz remote proxy interface * @return unbundled remote proxy */ public static <T> T getProxy(Bundle bundle, String name, Class<T> clazz) { if(Parcelable.class.isAssignableFrom(clazz)) return clazz.cast( bundle.getParcelable(name) ); else return clazz.cast( bundle.getSerializable(name) ); } /** * Unparcel a remote proxy from intent * @param intent the intent * @param name name of extra * @param clazz remote proxy interface * @return the un-parceled remote proxy */ public static <T> T getProxy(Intent intent, String name, Class<T> clazz) { return getProxy(intent.getExtras(), name, clazz); } /** * Unparcel a @{link VBoxSvc} from intent * @param intent the intent * @return the un-parceled remote proxy */ public static VBoxSvc getVBoxSvc(Intent intent) { return getVBoxSvc(intent.getExtras()); } /** * Unparcel a @{link VBoxSvc} from bundle * @param bundle the bungle * @return the un-parceled remote proxy */ public static VBoxSvc getVBoxSvc(Bundle bundle) { VBoxSvc ret = bundle.getParcelable(VBoxSvc.BUNDLE); IVirtualBox vbox = bundle.getParcelable(IVirtualBox.BUNDLE); if(vbox!=null) ret.setVBox(vbox); return ret; } /** * Add a parceled {@link VBoxSvc} to bundle * @param vmgr VirtualBox service * @return builder pattern */ public static void putVBoxSvc(Bundle bundle, VBoxSvc vmgr) { bundle.putParcelable(IVirtualBox.BUNDLE, vmgr.getVBox()); bundle.putParcelable(VBoxSvc.BUNDLE, vmgr); } /** * Add a parceled {@link VBoxSvc} to intent * @param vmgr VirtualBox service * @return builder pattern */ public static void putVBoxSvc(Intent intent, VBoxSvc vmgr) { intent.putExtra(VBoxSvc.BUNDLE, (Parcelable)vmgr); intent.putExtra(IVirtualBox.BUNDLE, vmgr.getVBox()); } /** * Add a parceled {@link VBoxSvc} to bundle * @param vmgr VirtualBox service * @return builder pattern */ public BundleBuilder putVBoxSvc(VBoxSvc vmgr) { b.putParcelable(IVirtualBox.BUNDLE, vmgr.getVBox()); b.putParcelable(VBoxSvc.BUNDLE, vmgr); return this; } /** * Add a parceled remote proxy to bundle * @param key entry key * @param value remote proxy * @return builder pattern */ public BundleBuilder putProxy(String key, IManagedObjectRef value) { if(value instanceof Parcelable) b.putParcelable(key, (Parcelable)value); else b.putSerializable(key, (Serializable)value); return this; } public BundleBuilder putAll(Bundle map) { b.putAll(map); return this; } public BundleBuilder putBoolean(String key, boolean value) { b.putBoolean(key, value); return this; } public BundleBuilder putByte(String key, byte value) { b.putByte(key, value); return this; } public BundleBuilder putChar(String key, char value) { b.putChar(key, value); return this; } public BundleBuilder putShort(String key, short value) { b.putShort(key, value); return this; } public BundleBuilder putInt(String key, int value) { b.putInt(key, value); return this; } public BundleBuilder putLong(String key, long value) { b.putLong(key, value); return this; } public BundleBuilder putFloat(String key, float value) { b.putFloat(key, value); return this; } public BundleBuilder putDouble(String key, double value) { b.putDouble(key, value); return this; } public BundleBuilder putString(String key, String value) { b.putString(key, value); return this; } public BundleBuilder putCharSequence(String key, CharSequence value) { b.putCharSequence(key, value); return this; } public BundleBuilder putParcelable(String key, Parcelable value) { b.putParcelable(key, value); return this; } public BundleBuilder putParcelableArray(String key, Parcelable[] value) { b.putParcelableArray(key, value); return this; } public BundleBuilder putParcelableArrayList(String key, ArrayList<? extends Parcelable> value) { b.putParcelableArrayList(key, value); return this; } public BundleBuilder putSparseParcelableArray(String key, SparseArray<? extends Parcelable> value) { b.putSparseParcelableArray(key, value); return this; } public BundleBuilder putIntegerArrayList(String key, ArrayList<Integer> value) { b.putIntegerArrayList(key, value); return this; } public BundleBuilder putStringArrayList(String key, ArrayList<String> value) { b.putStringArrayList(key, value); return this; } public BundleBuilder putCharSequenceArrayList(String key, ArrayList<CharSequence> value) { b.putCharSequenceArrayList(key, value); return this; } public BundleBuilder putSerializable(String key, Serializable value) { b.putSerializable(key, value); return this; } public BundleBuilder putBooleanArray(String key, boolean[] value) { b.putBooleanArray(key, value); return this; } public BundleBuilder putByteArray(String key, byte[] value) { b.putByteArray(key, value); return this; } public BundleBuilder putShortArray(String key, short[] value) { b.putShortArray(key, value); return this; } public BundleBuilder putCharArray(String key, char[] value) { b.putCharArray(key, value); return this; } public BundleBuilder putIntArray(String key, int[] value) { b.putIntArray(key, value); return this; } public BundleBuilder putLongArray(String key, long[] value) { b.putLongArray(key, value); return this; } public BundleBuilder putFloatArray(String key, float[] value) { b.putFloatArray(key, value); return this; } public BundleBuilder putDoubleArray(String key, double[] value) { b.putDoubleArray(key, value); return this; } public BundleBuilder putStringArray(String key, String[] value) { b.putStringArray(key, value); return this; } public BundleBuilder putCharSequenceArray(String key, CharSequence[] value) { b.putCharSequenceArray(key, value); return this; } public BundleBuilder putBundle(String key, Bundle value) { b.putBundle(key, value); return this; } public Bundle create() { return b; } public void sendMessage(Handler h, int what) { Message msg = h.obtainMessage(what); msg.setData(b); msg.sendToTarget(); } public void sendMessage(Messenger m, int what) throws RemoteException { Message msg = new Message(); msg.what = what; msg.setData(b); m.send(msg); } }