package com.crossbow.wear.core; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * Custom packing of transformer params to reduce the wearable to handheld * overhead from the bundle. Only supports primitives, string, charsequence and Serializable objects */ public class ParamsBundle { private Map<String, Object> internalMapping; public ParamsBundle() { this(8); } public ParamsBundle(int size) { internalMapping = new HashMap<>(); } private ParamsBundle(Map<String, Object> map) { internalMapping = map; } public int getInt(String key, int defaultValue) { if(internalMapping.containsKey(key)) { return (int) internalMapping.get(key); } else { return defaultValue; } } public long getLong(String key, long defaultValue) { if(internalMapping.containsKey(key)) { return (long) internalMapping.get(key); } else { return defaultValue; } } public float getFloat(String key, float defaultValue) { if(internalMapping.containsKey(key)) { return (float) internalMapping.get(key); } else { return defaultValue; } } public double getDouble(String key, double defaultValue) { if(internalMapping.containsKey(key)) { return (double) internalMapping.get(key); } else { return defaultValue; } } public char getChar(String key, char defaultValue) { if(internalMapping.containsKey(key)) { return (char) internalMapping.get(key); } else { return defaultValue; } } public boolean getBoolean(String key, boolean defaultValue) { if(internalMapping.containsKey(key)) { return (boolean) internalMapping.get(key); } else { return defaultValue; } } public String getString(String key) { if(internalMapping.containsKey(key)) { return (String) internalMapping.get(key); } else { return null; } } public CharSequence getCharSequence(String key) { if(internalMapping.containsKey(key)) { return (CharSequence) internalMapping.get(key); } else { return null; } } public byte[] getByteArray(String key) { if(internalMapping.containsKey(key)) { return (byte[]) internalMapping.get(key); } else { return new byte[0]; } } public int[] getIntArray(String key) { if(internalMapping.containsKey(key)) { return (int[]) internalMapping.get(key); } else { return new int[0]; } } public long[] getLongArray(String key) { if(internalMapping.containsKey(key)) { return (long[]) internalMapping.get(key); } else { return new long[0]; } } public float[] getFloatArray(String key) { if(internalMapping.containsKey(key)) { return (float[]) internalMapping.get(key); } else { return new float[0]; } } public double[] getDoubleArray(String key) { if(internalMapping.containsKey(key)) { return (double[]) internalMapping.get(key); } else { return new double[0]; } } public boolean[] getBooleanArray(String key) { if(internalMapping.containsKey(key)) { return (boolean[]) internalMapping.get(key); } else { return new boolean[0]; } } public char[] getCharArray(String key) { if(internalMapping.containsKey(key)) { return (char[]) internalMapping.get(key); } else { return new char[0]; } } public Serializable[] getSerializableArray(String key) { if(internalMapping.containsKey(key)) { return (Serializable[]) internalMapping.get(key); } else { return new Serializable[0]; } } public Serializable getSerializable(String key) { if(internalMapping.containsKey(key)) { return (Serializable) internalMapping.get(key); } else { return null; } } public String[] getStringArray(String key) { if(internalMapping.containsKey(key)) { return (String[]) internalMapping.get(key); } else { return new String[0]; } } public CharSequence[] getCharSequenceArray(String key) { if(internalMapping.containsKey(key)) { return (CharSequence[]) internalMapping.get(key); } else { return new CharSequence[0]; } } public int size() { return internalMapping.size(); } public Set<String> keySet() { return internalMapping.keySet(); } public boolean containsKey(String key) { return internalMapping.containsKey(key); } public Object get(String key) { return internalMapping.get(key); } public void putInt(String key, int value) { internalMapping.put(key, value); } public void putLong(String key, long value) { internalMapping.put(key, value); } public void putFloat(String key, float value) { internalMapping.put(key, value); } public void putDouble(String key, double value) { internalMapping.put(key, value); } public void putChar(String key, char value) { internalMapping.put(key, value); } public void putBoolean(String key, boolean value) { internalMapping.put(key, value); } public void putString(String key, String value) { internalMapping.put(key, value); } public void putStringArray(String key, String[] value) { internalMapping.put(key, value); } public void putCharSequence(String key, CharSequence value) { internalMapping.put(key, value); } public void putCharSequenceArray(String key, CharSequence[] value) { internalMapping.put(key, value); } public void putByteArray(String key, byte[] value) { internalMapping.put(key, value); } public void putIntArray(String key, int[] value) { internalMapping.put(key, value); } public void putLongArray(String key, long[] value) { internalMapping.put(key, value); } public void putFloatArray(String key, float[] value) { internalMapping.put(key, value); } public void putDoubleArray(String key, double[] value) { internalMapping.put(key, value); } public void putCharArray(String key, char[] value) { internalMapping.put(key, value); } public void putBooleanArray(String key, boolean[] value) { internalMapping.put(key, value); } public void putSerializable(String key, Serializable value) { internalMapping.put(key, value); } public void putSerializableArray(String key, Serializable[] value) { internalMapping.put(key, value); } public void writeToStream(DataOutputStream dataStream) throws IOException { ObjectOutputStream objectOutputStream = new ObjectOutputStream(dataStream); objectOutputStream.writeObject(internalMapping); } public static ParamsBundle readFromStream(DataInputStream dataInputStream) throws IOException { ObjectInputStream objectInputStream = new ObjectInputStream(dataInputStream); try { Map<String, Object> map = (Map<String, Object>) objectInputStream.readObject(); return new ParamsBundle(map); } catch (ClassNotFoundException e) { throw new IOException(e); } } }