package com.solderbyte.openfit.util; import android.graphics.Bitmap; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class OpenFitVariableDataComposer { private final List<IVariableData> mDataList = new ArrayList<IVariableData>(); private int mPayloadSize; static final ByteOrder BYTE_ORDER = ByteOrder.LITTLE_ENDIAN; static final Charset DEFAULT_CHARSET = Charset.forName("UCS-2"); public static byte[] convertToByteArray(String pString) { if(pString == null) { String p = "Error"; return p.getBytes(DEFAULT_CHARSET); } return pString.getBytes(DEFAULT_CHARSET); } public static void writeCurrentTimeInfo(OpenFitVariableDataComposer pDataComposer) { pDataComposer.writeInt((int)(System.currentTimeMillis() / 1000L)); } public static void writeStringWithOneByteLength(OpenFitVariableDataComposer pDataComposer, String pString) { writeStringWithOneByteLength(pDataComposer, pString, 255); } public static void writeStringWithOneByteLength(OpenFitVariableDataComposer pDataComposer, String pString, int paramInt) { byte[] oString = convertToByteArray(pString); paramInt = Math.min(paramInt, oString.length); pDataComposer.writeByte((byte)paramInt); if(paramInt > 0) { pDataComposer.writeBytes(oString, 0, paramInt); } } public static void writeTimeInfo(OpenFitVariableDataComposer paramDataComposer, long paramLong) { paramDataComposer.writeInt((int)(paramLong / 1000L)); } private void addData(IVariableData paramIVariableData) { this.mDataList.add(paramIVariableData); this.mPayloadSize += paramIVariableData.getByteSize(); } protected int getPayloadSize() { return this.mPayloadSize; } public void reset() { this.mDataList.clear(); this.mPayloadSize = 0; } public void toByteArray(byte[] pArrayOfByte, int paramInt) { ByteBuffer paramArrayOfByte = ByteBuffer.wrap(pArrayOfByte, paramInt, this.mPayloadSize); paramArrayOfByte.order(BYTE_ORDER); int i = this.mDataList.size(); paramInt = 0; while(paramInt < i) { ((IVariableData)this.mDataList.get(paramInt)).writeTo(paramArrayOfByte); paramInt += 1; } } public byte[] toByteArray() { byte[] arrayOfByte = new byte[this.mPayloadSize]; toByteArray(arrayOfByte, 0); return arrayOfByte; } public String toString() { return "VariableDataComposer : Payload(" + this.mPayloadSize + ")"; } public void writeBoolean(boolean paramBoolean) { addData(new BooleanData(paramBoolean)); } public void writeByte(byte paramByte) { addData(new ByteData(paramByte)); } public void writeBytes(byte[] paramArrayOfByte) { addData(new ByteArrayData(paramArrayOfByte)); } public void writeBytes(byte[] paramArrayOfByte, int paramInt1, int paramInt2) { addData(new ByteArrayData(paramArrayOfByte, paramInt1, paramInt2)); } public void writeDouble(double paramDouble) { addData(new DoubleData(paramDouble)); } public void writeFloat(float paramFloat) { addData(new FloatData(paramFloat)); } public void writeImage(Bitmap paramBitmap) { throw new UnsupportedOperationException("Not impelemented!"); } public void writeInt(int paramInt) { addData(new IntData(paramInt)); } public void writeLong(long paramLong) { addData(new LongData(paramLong)); } public void writeShort(short paramShort) { addData(new ShortData(paramShort)); } public void writeString(String paramString) { writeBytes(paramString.getBytes(DEFAULT_CHARSET)); } private static class BooleanData implements OpenFitVariableDataComposer.IVariableData { private final boolean mValue; BooleanData(boolean paramBoolean) { this.mValue = paramBoolean; } public int getByteSize() { return 1; } public void writeTo(ByteBuffer paramByteBuffer) { if(this.mValue) { paramByteBuffer.put((byte)1); } else { paramByteBuffer.put((byte)0); } } } private static class ByteArrayData implements OpenFitVariableDataComposer.IVariableData { private final byte[] mCopied; ByteArrayData(byte[] paramArrayOfByte) { this.mCopied = Arrays.copyOf(paramArrayOfByte, paramArrayOfByte.length); } ByteArrayData(byte[] paramArrayOfByte, int paramInt1, int paramInt2) { if(paramArrayOfByte.length < paramInt1 + paramInt2) { throw new IndexOutOfBoundsException(); } this.mCopied = Arrays.copyOfRange(paramArrayOfByte, paramInt1, paramInt1 + paramInt2); } public int getByteSize() { return this.mCopied.length; } public void writeTo(ByteBuffer paramByteBuffer) { paramByteBuffer.put(this.mCopied); } } private static class ByteData implements OpenFitVariableDataComposer.IVariableData { final byte mByte; ByteData(byte paramByte) { this.mByte = paramByte; } public int getByteSize() { return 1; } public void writeTo(ByteBuffer paramByteBuffer) { paramByteBuffer.put(this.mByte); } } private static class DoubleData implements OpenFitVariableDataComposer.IVariableData { private final double mValue; DoubleData(double paramDouble) { this.mValue = paramDouble; } public int getByteSize() { return 8; } public void writeTo(ByteBuffer paramByteBuffer) { paramByteBuffer.putDouble(this.mValue); } } private static class FloatData implements OpenFitVariableDataComposer.IVariableData { private final float mValue; FloatData(float paramFloat) { this.mValue = paramFloat; } public int getByteSize() { return 4; } public void writeTo(ByteBuffer paramByteBuffer) { paramByteBuffer.putFloat(this.mValue); } } public static abstract interface IVariableData { public abstract int getByteSize(); public abstract void writeTo(ByteBuffer paramByteBuffer); } private static class IntData implements OpenFitVariableDataComposer.IVariableData { private final int mValue; IntData(int paramInt) { this.mValue = paramInt; } public int getByteSize() { return 4; } public void writeTo(ByteBuffer paramByteBuffer) { paramByteBuffer.putInt(this.mValue); } } private static class LongData implements OpenFitVariableDataComposer.IVariableData { private final long mValue; LongData(long paramLong) { this.mValue = paramLong; } public int getByteSize() { return 8; } public void writeTo(ByteBuffer paramByteBuffer) { paramByteBuffer.putLong(this.mValue); } } private static class ShortData implements OpenFitVariableDataComposer.IVariableData { private final short mValue; ShortData(short paramShort) { this.mValue = paramShort; } public int getByteSize() { return 2; } public void writeTo(ByteBuffer paramByteBuffer) { paramByteBuffer.putShort(this.mValue); } } }