use of seemoo.fitbit.information.Alarm in project fitness-app by seemoo-lab.
the class DumpInteraction method readOut.
/**
* Reads out the information from a micro- or mega dump.
*
* @return The information or null if it is an alarm or memory dump.
*/
private InformationList readOut() {
InformationList result = new InformationList("");
String temp = "";
if (dumpType == 0 || dumpType == 1) {
// Microdump || Megadump
String model;
String type;
String id;
int noncePos = 12;
int serialPos = 20;
temp = dataList.get(0).toString().substring(0, 8);
switch(temp.substring(0, 2)) {
case "2c":
model = "Megadump";
break;
case "30":
model = "Microdump";
break;
case "03":
// Ionic format is new, generic dump, different offsets
model = "Dump";
noncePos = 10;
serialPos = 18;
break;
default:
model = temp.substring(0, 2);
}
switch(temp.substring(2, 4)) {
case "02":
type = "Tracker";
break;
case "04":
type = "Smartwatch";
break;
default:
type = temp.substring(2, 4);
}
temp = dataList.get(0).toString().substring(serialPos + 10, serialPos + 12);
switch(temp.substring(0, 2)) {
// FIXME do this via ConstantValues
case "01":
id = "Zip";
break;
case "05":
id = "One";
break;
case "07":
id = "Flex";
break;
case "08":
id = "Charge";
break;
case "12":
id = "Charge HR";
break;
case "15":
id = "Alta";
break;
case "10":
id = "Surge";
break;
case "11":
id = "Electron";
break;
case "1b":
id = "Ionic";
break;
default:
id = temp;
}
result.add(new Information("SiteProto: " + model + ", " + type));
result.add(new Information("Encrypted: " + encrypted()));
result.add(new Information("Nonce: " + Utilities.rotateBytes(dataList.get(0).toString().substring(noncePos, noncePos + 4))));
String productCode = dataList.get(0).toString().substring(serialPos, serialPos + 12);
result.add(new Information("Serial Number: " + Utilities.rotateBytes(productCode)));
AuthValues.setSerialNumber(productCode);
if (AuthValues.NONCE == null) {
InternalStorage.loadAuthFiles(activity);
}
result.add(new Information("ID: " + id));
if (!encrypted()) {
result.add(new Information("Version: " + Utilities.rotateBytes(dataList.get(0).toString().substring(16, 20))));
}
temp = dataList.get(dataList.size() - 2).toString() + dataList.get(dataList.size() - 1).toString();
result.add(new Information("Length: " + Utilities.hexStringToInt(Utilities.rotateBytes(temp.substring(temp.length() - 6, temp.length()))) + " byte"));
} else {
// Alarms
ArrayList<Information> input = new ArrayList<>();
input.addAll(dataList.getList());
for (int i = 0; i < 11; i++) {
temp = temp + input.get(i);
}
setAlarmIndex(temp);
result.add(new Information("Alarms:"));
for (int i = 0; i < 8; i++) {
result.add(new Alarm(temp.substring(28 + i * 48, 28 + (i + 1) * 48)));
}
result.add(new Information(""));
result.add(new Information(ConstantValues.ADDITIONAL_INFO));
result.add(new Information("Number of Alarms: " + Utilities.hexStringToInt(Utilities.rotateBytes(input.get(0).toString().substring(20, 24)))));
result.add(new Information("CRC_CCITT: " + Utilities.rotateBytes(temp.substring(412, 416))));
result.add(new Information("Length: " + Utilities.hexStringToInt(Utilities.rotateBytes(temp.substring(428, 434))) + " byte"));
}
return result;
}
use of seemoo.fitbit.information.Alarm in project fitness-app by seemoo-lab.
the class UploadInteraction method selectDay.
/**
* Lets the user select day of the alarm to override.
*/
private void selectDay() {
dayFlags = 0;
final String[] days = new String[] { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setCancelable(false);
builder.setTitle("Which day(s):");
boolean[] checkedItems = ((Alarm) alarms.get(position)).getDays();
for (int i = 0; i < checkedItems.length; i++) {
if (checkedItems[i]) {
// exponential
dayFlags = dayFlags + (int) Math.pow(2, i);
}
}
builder.setMultiChoiceItems(days, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if (isChecked) {
dayFlags = dayFlags + (int) Math.pow(2, which);
} else {
dayFlags = dayFlags - (int) Math.pow(2, which);
}
}
});
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (dayFlags != 0) {
selectTime();
} else {
alarms.set(position, new Alarm(ConstantValues.EMPTY_ALARM));
String data = createData();
sendingData.addAll(Encoding.slip(data));
commands.comUploadInitialize(createExtra(data));
interactions.intGetAlarm();
}
}
});
builder.show();
}
});
}
use of seemoo.fitbit.information.Alarm in project fitness-app by seemoo-lab.
the class UploadInteraction method selectRepeat.
/**
* Lets the user select if the alarm shall be repeated.
*/
private void selectRepeat() {
final String[] repeat = new String[] { "Yes", "No" };
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setCancelable(false);
builder.setTitle("Repeat the alarm:");
builder.setItems(repeat, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == 0) {
// 128 = 2^6 = seventh bit
dayFlags = dayFlags + 128;
}
alarms.set(position, new Alarm(createAlarm()));
String data = createData();
sendingData.addAll(Encoding.slip(data));
commands.comUploadInitialize(createExtra(data));
interactions.intGetAlarm();
}
});
builder.show();
}
});
}
use of seemoo.fitbit.information.Alarm in project fitness-app by seemoo-lab.
the class WorkActivity method onCreate.
/**
* {@inheritDoc}
* Initializes several objects and connects to the deivec.
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_work);
setFinishOnTouchOutside(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
initialize();
collectBasicInformation();
connect();
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
/**
* {@inheritDoc}
* Lets the user change an alarm, with the current view shows the alarms.
*/
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (information.get(ConstantValues.INFORMATION_ALARM) != null && services.size() != 0 && position > 0 && position < 9) {
InformationList temp = new InformationList("");
temp.addAll(information.get(ConstantValues.INFORMATION_ALARM));
for (int i = temp.size() - 1; i >= 0; i--) {
if (!(temp.get(i) instanceof Alarm)) {
temp.remove(i);
}
}
interactions.intSetAlarm(position - 1, temp);
}
}
});
}
use of seemoo.fitbit.information.Alarm in project fitness-app by seemoo-lab.
the class UploadInteraction method selectTime.
/**
* Lets the user select time of the alarm to override.
*/
private void selectTime() {
final int hours;
final int minutes;
if (((Alarm) alarms.get(position)).isEmpty()) {
Calendar calendar = Calendar.getInstance();
hours = calendar.get(Calendar.HOUR_OF_DAY);
minutes = calendar.get(Calendar.MINUTE);
} else {
hours = ((Alarm) alarms.get(position)).getHours();
minutes = ((Alarm) alarms.get(position)).getMinutes();
}
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
TimePickerDialog mTimePickerDialog = new TimePickerDialog(activity, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hour, int minute) {
secondsAfterMidnight = hour * 3600 + minute * 60;
selectRepeat();
}
}, hours, minutes, true);
mTimePickerDialog.setTitle("Select time:");
mTimePickerDialog.setButton(TimePickerDialog.BUTTON_NEGATIVE, "", mTimePickerDialog);
mTimePickerDialog.setCancelable(false);
mTimePickerDialog.show();
}
});
}
Aggregations