package com.solderbyte.openfit;
import android.util.Log;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import com.solderbyte.openfit.protocol.OpenFitNotificationProtocol;
import com.solderbyte.openfit.util.OpenFitData;
import com.solderbyte.openfit.util.OpenFitDataType;
import com.solderbyte.openfit.util.OpenFitDataTypeAndString;
import com.solderbyte.openfit.util.OpenFitTimeZoneUtil;
import com.solderbyte.openfit.util.OpenFitVariableDataComposer;
public class OpenFitApi {
public static byte[] getReady() {
//000400000003000000
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)0);
oVariableDataComposer.writeInt(OpenFitData.SIZE_OF_INT);
oVariableDataComposer.writeInt(3);
return oVariableDataComposer.toByteArray();
}
public static byte[] getUpdate() {
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte(OpenFitData.PORT_FOTA);
oVariableDataComposer.writeInt(OpenFitData.SIZE_OF_INT);
oVariableDataComposer.writeBytes("ODIN".getBytes());
//oVariableDataComposer.writeByte((byte)79); // O
//oVariableDataComposer.writeByte((byte)68); // D
//oVariableDataComposer.writeByte((byte)73); // I
//oVariableDataComposer.writeByte((byte)78); // N
return oVariableDataComposer.toByteArray();
}
public static byte[] getUpdateFollowUp() {
//640800000004020501
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte(OpenFitData.OPENFIT_DATA);
oVariableDataComposer.writeInt(OpenFitData.SIZE_OF_DOUBLE);
oVariableDataComposer.writeByte((byte)4);
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeByte((byte)1);
oVariableDataComposer.writeByte((byte)1);
oVariableDataComposer.writeByte((byte)4);
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeByte((byte)5);
oVariableDataComposer.writeByte((byte)1);
return oVariableDataComposer.toByteArray();
}
public static byte[] getFotaCommand() {
//4E020000000101
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte(OpenFitData.PORT_FOTA_COMMAND);
oVariableDataComposer.writeInt(OpenFitData.SIZE_OF_SHORT);
oVariableDataComposer.writeByte((byte)1);
oVariableDataComposer.writeByte((byte)1);
return oVariableDataComposer.toByteArray();
}
public static byte[] getFindStart() {
//05020000000100
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)5);
oVariableDataComposer.writeInt(2);
oVariableDataComposer.writeByte((byte)1);
oVariableDataComposer.writeByte((byte)OpenFitData.FIND_START);
return oVariableDataComposer.toByteArray();
}
public static byte[] getFindStop() {
//05020000000101
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)5);
oVariableDataComposer.writeInt(2);
oVariableDataComposer.writeByte((byte)1);
oVariableDataComposer.writeByte((byte)OpenFitData.FIND_STOP);
return oVariableDataComposer.toByteArray();
}
public static byte[] getMediaPrev() {
//06020000000005
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)6);
oVariableDataComposer.writeInt(2);
oVariableDataComposer.writeByte((byte)OpenFitData.CONTROL);
oVariableDataComposer.writeByte((byte)OpenFitData.REWIND);
return oVariableDataComposer.toByteArray();
}
public static byte[] getMediaNext() {
//06020000000004
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)6);
oVariableDataComposer.writeInt(2);
oVariableDataComposer.writeByte((byte)OpenFitData.CONTROL);
oVariableDataComposer.writeByte((byte)OpenFitData.FORWARD);
return oVariableDataComposer.toByteArray();
}
public static byte[] getMediaPlay() {
//06020000000001
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)6);
oVariableDataComposer.writeInt(2);
oVariableDataComposer.writeByte((byte)OpenFitData.CONTROL);
oVariableDataComposer.writeByte((byte)OpenFitData.PLAY);
return oVariableDataComposer.toByteArray();
}
public static byte[] getMediaPause() {
//06020000000002
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)6);
oVariableDataComposer.writeInt(2);
oVariableDataComposer.writeByte((byte)OpenFitData.CONTROL);
oVariableDataComposer.writeByte((byte)OpenFitData.PAUSE);
return oVariableDataComposer.toByteArray();
}
public static byte[] getMediaStop() {
//06020000000003
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)6);
oVariableDataComposer.writeInt(2);
oVariableDataComposer.writeByte((byte)OpenFitData.CONTROL);
oVariableDataComposer.writeByte((byte)OpenFitData.STOP);
return oVariableDataComposer.toByteArray();
}
public static byte[] getMediaVolume() {
//060200000001XX
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)6);
oVariableDataComposer.writeInt(2);
oVariableDataComposer.writeByte((byte)OpenFitData.VOLUME);
return oVariableDataComposer.toByteArray();
}
public static byte[] getMediaSetVolume(byte vol) {
//060200000001XX
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)6);
oVariableDataComposer.writeInt(2);
oVariableDataComposer.writeByte((byte)OpenFitData.VOLUME);
oVariableDataComposer.writeByte((byte)vol);
return oVariableDataComposer.toByteArray();
}
public static byte[] getMediaReqStart() {
//060100000003
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)6);
oVariableDataComposer.writeInt(1);
oVariableDataComposer.writeByte((byte)OpenFitData.REQUEST_START);
return oVariableDataComposer.toByteArray();
}
public static byte[] getMediaReqStop() {
//060100000004
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)6);
oVariableDataComposer.writeInt(1);
oVariableDataComposer.writeByte((byte)OpenFitData.REQUEST_STOP);
return oVariableDataComposer.toByteArray();
}
//06020000000006
//06020000000007
public static byte[] getFitness() {
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
return oVariableDataComposer.toByteArray();
}
public static byte[] getFitnessSyncRes() {
//02080000000300000001000000
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(8);
oVariableDataComposer.writeInt(3);
oVariableDataComposer.writeInt(1);
return oVariableDataComposer.toByteArray();
}
public static byte[] getFitnessRequest() {
//02050000000001000000
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(5);
oVariableDataComposer.writeByte((byte)0);
oVariableDataComposer.writeInt(1);
return oVariableDataComposer.toByteArray();
}
public static byte[] getFitnessMenu() {
//02040000001b000000
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(4);
oVariableDataComposer.writeInt(27);
return oVariableDataComposer.toByteArray();
}
public static byte[] getFitnessMenuResponse() {
//02010000001c
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(4);
oVariableDataComposer.writeInt(28);
return oVariableDataComposer.toByteArray();
}
public static byte[] getFitnessCycling() {
//02040000001200000002100000001300000003000000 3D8A2C4359DAC742
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(4);
oVariableDataComposer.writeInt(18);
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(16);
oVariableDataComposer.writeInt(19);
oVariableDataComposer.writeInt(3);
return oVariableDataComposer.toByteArray();
}
public static byte[] getHealthApp() {
//02040000001200000002100000001300000003000000 3D8A2C4359DAC742
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(4);
oVariableDataComposer.writeInt(21);
return oVariableDataComposer.toByteArray();
}
public static byte[] getHealthAppResponse() {
//02040000001200000002100000001300000003000000 3D8A2C4359DAC742
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(4);
oVariableDataComposer.writeInt(20);
return oVariableDataComposer.toByteArray();
}
public static byte[] getHealthHeartResponse() {
//02040000001200000002100000001300000003000000 3D8A2C4359DAC742
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(4);
oVariableDataComposer.writeInt(2);
return oVariableDataComposer.toByteArray();
}
public static byte[] getGPSReady(int exerciseType) {
//0204000000120000000210000000130000000100000000003B430000D642 -- walking
//0204000000120000000210000000130000000200000000003B430000D642 -- running
//0204000000120000000210000000130000000300000000003B430000D642 -- cycling
//0204000000120000000210000000130000000400000000003B430000D642 -- hiking
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(4);
oVariableDataComposer.writeInt(OpenFitData.DATA_TYPE_WINGTIP_TO_HOST_GPS_READY);
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(16);
oVariableDataComposer.writeInt(19);
oVariableDataComposer.writeInt(exerciseType);
return oVariableDataComposer.toByteArray();
}
public static byte[] getResponseGPSReady() {
//02240000001600000000000000268fbb42b4ecb6420000000000000000000000000000000000000000
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(4);
oVariableDataComposer.writeInt(OpenFitData.DATA_TYPE_HOST_TO_WINGTIP_GPS_READY);
return oVariableDataComposer.toByteArray();
}
public static byte[] getGPSSubscribe() {
//0204000000120000000210000000130000000400000000003B430000D642
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(4);
oVariableDataComposer.writeInt(OpenFitData.DATA_TYPE_WINGTIP_TO_HOST_GPS_SUBSCRIBE);
return oVariableDataComposer.toByteArray();
}
public static byte[] getGPSUnSubscribe() {
//0204000000120000000210000000130000000400000000003B430000D642
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(4);
oVariableDataComposer.writeInt(OpenFitData.DATA_TYPE_WINGTIP_TO_HOST_GPS_UNSUBSCRIBE);
return oVariableDataComposer.toByteArray();
}
public static byte[] getResponseGPSData(float tD, float cS, float cC, float cA) {
//02040000000E000000
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(24);
oVariableDataComposer.writeInt(OpenFitData.DATA_TYPE_HOST_TO_WINGTIP_GPS_DATA);
oVariableDataComposer.writeFloat(tD);
oVariableDataComposer.writeFloat(cS);
oVariableDataComposer.writeFloat(cC);
oVariableDataComposer.writeDouble(cA);
return oVariableDataComposer.toByteArray();
}
public static byte[] getResponseGPSResult(float tD, float maxA, float minA, float maxS, float avgS, float cC, float iD, float dD) {
//02040000000E000000
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(36);
oVariableDataComposer.writeInt(OpenFitData.DATA_TYPE_HOST_TO_WINGTIP_GPS_RESULT);
oVariableDataComposer.writeFloat(tD);
oVariableDataComposer.writeFloat(maxA);
oVariableDataComposer.writeFloat(minA);
oVariableDataComposer.writeFloat(maxS);
oVariableDataComposer.writeFloat(avgS);
oVariableDataComposer.writeFloat(cC);
oVariableDataComposer.writeFloat(iD);
oVariableDataComposer.writeFloat(dD);
return oVariableDataComposer.toByteArray();
}
public static byte[] getSync() {
//020400000005000000
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(4);
oVariableDataComposer.writeInt(OpenFitData.DATA_TYPE_WINGTIP_TO_HOST_SYNC_REQUEST);
return oVariableDataComposer.toByteArray();
}
public static byte[] getResponseSyncDone() {
//020400000005000000
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(4);
oVariableDataComposer.writeInt(OpenFitData.DATA_TYPE_HOST_TO_WINGTIP_SYNC_DONE);
return oVariableDataComposer.toByteArray();
}
public static byte[] getGPSEnd() {
//02040000000A00000002040000000A00000002040000001B000000
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(4);
oVariableDataComposer.writeInt(OpenFitData.DATA_TYPE_WINGTIP_TO_HOST_GPS_END);
return oVariableDataComposer.toByteArray();
}
public static byte[] getResponseGPSOFF() {
//02040000000A000000
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(4);
oVariableDataComposer.writeInt(OpenFitData.DATA_TYPE_HOST_TO_WINGTIP_GPS_GPSOFF);
return oVariableDataComposer.toByteArray();
}
public static byte[] getResponseGPSON() {
//02040000000A000000
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(4);
oVariableDataComposer.writeInt(OpenFitData.DATA_TYPE_HOST_TO_WINGTIP_GPS_GPSON);
return oVariableDataComposer.toByteArray();
}
public static byte[] getFitnessRunning() {
//02040000001200000002100000001300000002000000 3D8A2C4359DAC742
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(4);
oVariableDataComposer.writeInt(18);
oVariableDataComposer.writeByte((byte)2);
oVariableDataComposer.writeInt(16);
oVariableDataComposer.writeInt(19);
oVariableDataComposer.writeInt(2);
//return oVariableDataComposer.toByteArray();
return hexStringToByteArray("02040000000c000000");
}
public static byte[] getCurrentTimeInfo(boolean is24Hour) {
//011E0000000141CB3555F8FFFFFF000000000101010201A01DFC5490D43556100E0000
//01
//1e000000
//01
//41cb3555
//f8ffffff
//00000000
//01
//01
//01
//02
//01
//a01dfc54
//90d43556
//100e0000
// build time data
int millis = (int)(System.currentTimeMillis() / 1000L);
Calendar oCalendar = Calendar.getInstance();
TimeZone oTimeZone = oCalendar.getTimeZone();
int i = oTimeZone.getRawOffset() / 60000;
int j = i / 60;
int k = i % 60;
Date oDate = oCalendar.getTime();
boolean inDaylightTime = oTimeZone.inDaylightTime(oDate);
boolean useDaylightTime = oTimeZone.useDaylightTime();
long l = oCalendar.getTimeInMillis();
int m = (int)(OpenFitTimeZoneUtil.prevTransition(oTimeZone, l) / 1000L);
int n = (int)(OpenFitTimeZoneUtil.nextTransition(oTimeZone, l) / 1000L);
int dst = oTimeZone.getDSTSavings() / 1000;
// write time data
OpenFitVariableDataComposer oVDC = new OpenFitVariableDataComposer();
oVDC.writeByte((byte)1);
oVDC.writeInt(millis);
oVDC.writeInt(j);
oVDC.writeInt(k);
oVDC.writeByte(OpenFitData.TEXT_DATE_FORMAT_TYPE);
//oVDC.writeBoolean(OpenFitData.IS_TIME_DISPLAY_24);
oVDC.writeBoolean(is24Hour);
oVDC.writeBoolean(inDaylightTime);
oVDC.writeByte(OpenFitData.NUMBER_DATE_FORMAT_TYPE);
oVDC.writeBoolean(useDaylightTime);
oVDC.writeInt(m);
oVDC.writeInt(n);
oVDC.writeInt(dst);
int length = oVDC.toByteArray().length;
// write time byte array
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)1);
oVariableDataComposer.writeInt(length);
oVariableDataComposer.writeBytes(oVDC.toByteArray());
return oVariableDataComposer.toByteArray();
}
public static byte[] getOpenFitWelcomeNotification() {
//03
//71000000 = size of msg
//04 = DATA_TYPE_MESSAGE
//0400000000000000 = id
//10 = sender name size + 2
//FF
//FE
//4F00700065006E00460069007400 = OpenFit
//16 = sender number size + 2
//FF
//FE
//3500350035003100320033003400350036003700 = 5551234567
//10 = msg title + 2
//FF
//FE
//4E004F005400490054004C004500 = NOTITLE
//28 = msg data + 2
//00
//FF
//FE
//570065006C0063006F006D006500200074006F0020004F00700065006E004600690074002100 = Welcome to OpenFit!
//00
//5E0E8955 = time stamp
List<OpenFitDataTypeAndString> mDataList = new ArrayList<OpenFitDataTypeAndString>();
mDataList.add(new OpenFitDataTypeAndString(OpenFitDataType.BYTE, "OpenFit"));
mDataList.add(new OpenFitDataTypeAndString(OpenFitDataType.BYTE, "5551234567"));
mDataList.add(new OpenFitDataTypeAndString(OpenFitDataType.BYTE, "NOTITLE"));
mDataList.add(new OpenFitDataTypeAndString(OpenFitDataType.SHORT, "Welcome to OpenFit!"));
long id = System.currentTimeMillis() / 1000L;
byte[] msg = OpenFitNotificationProtocol.createNotificationProtocol(OpenFitData.DATA_TYPE_MESSAGE, id, mDataList, System.currentTimeMillis());
OpenFitVariableDataComposer oDatacomposer = new OpenFitVariableDataComposer();
oDatacomposer.writeByte((byte)3);
oDatacomposer.writeInt(msg.length);
oDatacomposer.writeBytes(msg);
return oDatacomposer.toByteArray();
}
public static byte[] getOpenNotification(String sender, String number, String title, String message, long id) {
//03
//71000000 = size of msg
//04 = DATA_TYPE_MESSAGE
//0400000000000000 = id
//10 = sender name size + 2
//FF
//FE
//4F00700065006E00460069007400 = OpenFit
//16 = sender number size + 2
//FF
//FE
//3500350035003100320033003400350036003700 = 5551234567
//10 = msg title + 2
//FF
//FE
//4E004F005400490054004C004500 = NOTITLE
//28 = msg data + 2
//00
//FF
//FE
//570065006C0063006F006D006500200074006F0020004F00700065006E004600690074002100 = Welcome to OpenFit!
//00
//5E0E8955 = time stamp
if(sender == null || sender.isEmpty()) {
sender = "OpenFit";
}
if(number == null || number.isEmpty()) {
number = "OpenFit";
}
if(title == null || title.isEmpty()) {
title = "OpenFit Title";
}
if(message == null || message.isEmpty()) {
message = "OpenFit Message";
}
List<OpenFitDataTypeAndString> mDataList = new ArrayList<OpenFitDataTypeAndString>();
mDataList.add(new OpenFitDataTypeAndString(OpenFitDataType.BYTE, sender));
mDataList.add(new OpenFitDataTypeAndString(OpenFitDataType.BYTE, number));
mDataList.add(new OpenFitDataTypeAndString(OpenFitDataType.BYTE, trimTitle(title)));
mDataList.add(new OpenFitDataTypeAndString(OpenFitDataType.SHORT, trimMessage(message)));
byte[] msg = OpenFitNotificationProtocol.createNotificationProtocol(OpenFitData.DATA_TYPE_MESSAGE, id, mDataList, System.currentTimeMillis());
OpenFitVariableDataComposer oDatacomposer = new OpenFitVariableDataComposer();
oDatacomposer.writeByte((byte)3);
oDatacomposer.writeInt(msg.length);
oDatacomposer.writeBytes(msg);
return oDatacomposer.toByteArray();
}
public static byte[] getOpenEmail(String sender, String number, String title, String message, long id) {
if(sender == null || sender.isEmpty()) {
sender = "OpenFit";
}
if(number == null || number.isEmpty()) {
number = "OpenFit";
}
if(title == null || title.isEmpty()) {
title = "OpenFit Title";
}
if(message == null || message.isEmpty()) {
message = "OpenFit Email";
}
List<OpenFitDataTypeAndString> mDataList = new ArrayList<OpenFitDataTypeAndString>();
mDataList.add(new OpenFitDataTypeAndString(OpenFitDataType.BYTE, sender));
mDataList.add(new OpenFitDataTypeAndString(OpenFitDataType.BYTE, number));
mDataList.add(new OpenFitDataTypeAndString(OpenFitDataType.BYTE, trimTitle(title)));
mDataList.add(new OpenFitDataTypeAndString(OpenFitDataType.SHORT, trimMessage(message)));
byte[] msg = OpenFitNotificationProtocol.createEmailProtocol(OpenFitData.DATA_TYPE_EMAIL, id, mDataList, System.currentTimeMillis());
OpenFitVariableDataComposer oDatacomposer = new OpenFitVariableDataComposer();
oDatacomposer.writeByte((byte)3);
oDatacomposer.writeInt(msg.length);
oDatacomposer.writeBytes(msg);
return oDatacomposer.toByteArray();
}
public static byte[] getOpenIncomingCall(String sender, String number, long id) {
//09
//30000000 = size of msg
//00 = DATA_TYPE_INCOMING_CALL
//fb73770c4f010000 = id
//00 = call flag
//0a = size + 2
//ff
//fe
//48006f006d006500 = sender
//16 = size + 2
//ff
//fe
//0000000000000000000000000000000000000000 = phone number
//5fc0c555
if(sender == null || sender.isEmpty()) {
sender = "OpenFit";
}
if(number == null || number.isEmpty()) {
number = "OpenFit";
}
List<OpenFitDataTypeAndString> mDataList = new ArrayList<OpenFitDataTypeAndString>();
mDataList.add(new OpenFitDataTypeAndString(OpenFitDataType.BYTE, sender));
mDataList.add(new OpenFitDataTypeAndString(OpenFitDataType.BYTE, number));
byte[] msg = OpenFitNotificationProtocol.createIncomingCallProtocol(OpenFitData.DATA_TYPE_INCOMING_CALL, id, mDataList, System.currentTimeMillis());
OpenFitVariableDataComposer oDatacomposer = new OpenFitVariableDataComposer();
oDatacomposer.writeByte((byte)9);
oDatacomposer.writeInt(msg.length);
oDatacomposer.writeBytes(msg);
return oDatacomposer.toByteArray();
}
public static byte[] getOpenRejectCall() {
//090600000003013FE1CA55
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)9);
oVariableDataComposer.writeInt(6);
oVariableDataComposer.writeByte((byte)3);
oVariableDataComposer.writeByte((byte)1);
return oVariableDataComposer.toByteArray();
}
public static byte[] getOpenIncomingCallEnd() {
//090100000002
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)9);
oVariableDataComposer.writeInt(1);
oVariableDataComposer.writeByte((byte)2);
return oVariableDataComposer.toByteArray();
}
public static byte[] getOpenRejectCallMessage() {
// 0906000000030201000000
//all msg size _| |_ index of message
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
oVariableDataComposer.writeByte((byte)9);
oVariableDataComposer.writeInt(6);
oVariableDataComposer.writeByte((byte)3);
oVariableDataComposer.writeByte((byte)2);
return oVariableDataComposer.toByteArray();
}
public static byte[] getOpenRejectCallMessageForBracelet(int allCount, int index, String msg) {
OpenFitVariableDataComposer oVariableDataComposer = new OpenFitVariableDataComposer();
byte[] arr = OpenFitVariableDataComposer.convertToByteArray(msg);
oVariableDataComposer.writeByte((byte)9);
oVariableDataComposer.writeInt(5 + arr.length);
oVariableDataComposer.writeByte((byte)4);
oVariableDataComposer.writeByte((byte)allCount);
oVariableDataComposer.writeByte((byte)index);
oVariableDataComposer.writeShort((short)arr.length);
oVariableDataComposer.writeBytes(arr);
return oVariableDataComposer.toByteArray();
}
public static byte[] getOpenMediaTrack(String track) {
//06
//26000000
//02
//24 = size + 2
//ff
//fe
//44006100660074002000500075006e006b0020002d00200046007200650073006800 = track name
byte[] msg = OpenFitNotificationProtocol.createMediaTrackProtocol(OpenFitData.DATA_TYPE_MEDIATRACK, track);
OpenFitVariableDataComposer oDatacomposer = new OpenFitVariableDataComposer();
oDatacomposer.writeByte((byte)6);
oDatacomposer.writeInt(msg.length);
oDatacomposer.writeBytes(msg);
return oDatacomposer.toByteArray();
}
public static byte[] getOpenAlarm(long id) {
//0a
//1e000000 = size of mg
//01 = msg type
//0100000000000000 = msg id
//0c = size of string
//ff
//fe
//41006c00610072006d00 = string
//c1040000 = little endian odd time stamp
//00000000 = snooze = false
List<OpenFitDataTypeAndString> mDataList = new ArrayList<OpenFitDataTypeAndString>();
mDataList.add(new OpenFitDataTypeAndString(OpenFitDataType.BYTE, "Alarm"));
Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR);
int minute = c.get(Calendar.MINUTE);
String timeString = Integer.toString(hour)+Integer.toString(minute);
int time = Integer.parseInt(timeString);
byte[] msg = OpenFitNotificationProtocol.createAlarmProtocol(OpenFitData.DATA_TYPE_ALARMCLOCK, id, mDataList, time);
OpenFitVariableDataComposer oDatacomposer = new OpenFitVariableDataComposer();
oDatacomposer.writeByte((byte)10);
oDatacomposer.writeInt(msg.length);
oDatacomposer.writeBytes(msg);
return oDatacomposer.toByteArray();
}
public static byte[] getOpenAlarmClear() {
//0a0100000000 clear from phone
OpenFitVariableDataComposer oDatacomposer = new OpenFitVariableDataComposer();
oDatacomposer.writeByte((byte)10);
oDatacomposer.writeInt(1);
oDatacomposer.writeByte((byte)0);
return oDatacomposer.toByteArray();
}
public static byte[] getOpenAlarmCleared() {
//0A020000000300 clear from gear
OpenFitVariableDataComposer oDatacomposer = new OpenFitVariableDataComposer();
oDatacomposer.writeByte((byte)10);
oDatacomposer.writeInt(2);
oDatacomposer.writeByte((byte)3);
oDatacomposer.writeByte((byte)0);
return oDatacomposer.toByteArray();
}
public static byte[] getOpenAlarmSnoozed() {
//0A020000000301 snooze from gear
OpenFitVariableDataComposer oDatacomposer = new OpenFitVariableDataComposer();
oDatacomposer.writeByte((byte)10);
oDatacomposer.writeInt(2);
oDatacomposer.writeByte((byte)3);
oDatacomposer.writeByte((byte)1);
return oDatacomposer.toByteArray();
}
public static byte[] getOpenWeatherReq() {
//01010000000C
OpenFitVariableDataComposer oDatacomposer = new OpenFitVariableDataComposer();
oDatacomposer.writeByte((byte)1);
oDatacomposer.writeInt(1);
oDatacomposer.writeByte((byte)12);
return oDatacomposer.toByteArray();
}
public static byte[] getOpenWeather(String weather, String icon, long id) {
int i = getOpenWeatherIcon(icon);
byte[] msg = OpenFitNotificationProtocol.createWeatherProtocol(OpenFitData.DATA_TYPE_WEATHER, id, weather, i, System.currentTimeMillis());
OpenFitVariableDataComposer oDatacomposer = new OpenFitVariableDataComposer();
oDatacomposer.writeByte((byte)3);
oDatacomposer.writeInt(msg.length);
oDatacomposer.writeBytes(msg);
return oDatacomposer.toByteArray();
}
public static byte[] getOpenWeatherClock(String location, String temp, String unit, String icon) {
//01
//3d000000
//09
//14 = size + 2?
//ff
//fe
//4e0069006500640065007200720061006400 = city name
//06
//40060000
//01 = units 01 C, 00 F
//00
//c944e055 = time stamp
//06
//98080000
//14050000
//06000000
//00000000
//00
//0600
//00000000
//00000000
//usage 9 = 0, 90 = 1, 900 = 9, 9000 = 90
List<OpenFitDataTypeAndString> mDataList = new ArrayList<OpenFitDataTypeAndString>();
mDataList.add(new OpenFitDataTypeAndString(OpenFitDataType.BYTE, location));
if(temp == null) {
temp = "0";
}
float t = Float.parseFloat(temp);
int tempInt = Math.round(t);
if(tempInt < 10) {
tempInt = tempInt * 100;
}
else if(tempInt < 100) {
tempInt = tempInt * 100;
}
else if(tempInt < 1000) {
tempInt = tempInt * 10;
}
int tempUnit = 1;
if(unit != null && unit.contains("F")) {
tempUnit = 0;
}
int i = getOpenWeatherClockIcon(icon);
byte[] msg = OpenFitNotificationProtocol.createWeatherClockProtocol(9, mDataList, tempInt, tempUnit, i, System.currentTimeMillis());
OpenFitVariableDataComposer oDatacomposer = new OpenFitVariableDataComposer();
oDatacomposer.writeByte((byte)1);
oDatacomposer.writeInt(msg.length);
oDatacomposer.writeBytes(msg);
return oDatacomposer.toByteArray();
}
public static int getOpenWeatherIcon(String icon) {
int i = 0;
if(icon == null) {
icon = "01";
}
if(icon.contains("01")) {
i = OpenFitData.WEATHER_TYPE_SUNNY;
}
else if(icon.contains("02")) {
i = OpenFitData.WEATHER_TYPE_MOSTLY_CLEAR;
}
else if(icon.contains("03")) {
i = OpenFitData.WEATHER_TYPE_MOSTLY_CLOUDY;
}
else if(icon.contains("04")) {
i = OpenFitData.WEATHER_TYPE_MOSTLY_CLOUDY;
}
else if(icon.contains("09")) {
i = OpenFitData.WEATHER_TYPE_HEAVY_RAIN;
}
else if(icon.contains("10")) {
i = OpenFitData.WEATHER_TYPE_PARTLY_SUNNY_SHOWERS;
}
else if(icon.contains("11")) {
i = OpenFitData.WEATHER_TYPE_THUNDERSTORMS;
}
else if(icon.contains("13")) {
i = OpenFitData.WEATHER_TYPE_SNOW;
}
else if(icon.contains("50")) {
i = OpenFitData.WEATHER_TYPE_FOG;
}
return i;
}
public static int getOpenWeatherClockIcon(String icon) {
int i = 0;
if(icon == null) {
icon = "01";
}
if(icon.contains("01")) {
i = OpenFitData.WEATHER_CLOCK_SUNNY;
}
else if(icon.contains("02")) {
i = OpenFitData.WEATHER_CLOCK_CLEAR;
}
else if(icon.contains("03")) {
i = OpenFitData.WEATHER_CLOCK_MOSTLY_CLOUDY;
}
else if(icon.contains("04")) {
i = OpenFitData.WEATHER_CLOCK_MOSTLY_CLOUDY;
}
else if(icon.contains("09")) {
i = OpenFitData.WEATHER_CLOCK_SHOWERS;
}
else if(icon.contains("10")) {
i = OpenFitData.WEATHER_CLOCK_PARTLY_SUNNY_SHOWERS;
}
else if(icon.contains("11")) {
i = OpenFitData.WEATHER_CLOCK_THUNDERSTORMS;
}
else if(icon.contains("13")) {
i = OpenFitData.WEATHER_CLOCK_SNOW;
}
else if(icon.contains("50")) {
i = OpenFitData.WEATHER_CLOCK_FOG;
}
return i;
}
public static String trimTitle(String s) {
s = s.substring(0, Math.min(s.length(), 50));
return s;
}
public static String trimMessage(String s) {
s = s.substring(0, Math.min(s.length(), 250));
return s;
}
public static byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for(int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16));
}
return data;
}
public static String hexStringToString(String hex){
StringBuilder sb = new StringBuilder();
StringBuilder temp = new StringBuilder();
for(int i=0; i<hex.length()-1; i+=2 ) {
String output = hex.substring(i, (i + 2));
int decimal = Integer.parseInt(output, 16);
sb.append((char)decimal);
temp.append(decimal);
}
return sb.toString();
}
final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
public static String byteArrayToHexString(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for ( int j = 0; j < bytes.length; j++ ) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
public static int[] byteArrayToIntArray(byte[] bArray) {
int[] iarray = new int[bArray.length];
int i = 0;
for(byte b : bArray) {
iarray[i++] = b & 0xff;
}
return iarray;
}
}