Merge branch 'master' into feature-weather

This commit is contained in:
Andreas Shimokawa 2015-12-29 20:14:32 +01:00
commit c962dbbac2
4 changed files with 64 additions and 9 deletions

View File

@ -47,7 +47,7 @@ public class GBDeviceAdapter extends ArrayAdapter<GBDevice> {
ImageView deviceImageView = (ImageView) view.findViewById(R.id.device_image); ImageView deviceImageView = (ImageView) view.findViewById(R.id.device_image);
ProgressBar busyIndicator = (ProgressBar) view.findViewById(R.id.device_busy_indicator); ProgressBar busyIndicator = (ProgressBar) view.findViewById(R.id.device_busy_indicator);
deviceNameLabel.setText(device.getName()); deviceNameLabel.setText(getUniqueDeviceName(device));
deviceInfoLabel.setText(device.getInfoString()); deviceInfoLabel.setText(device.getInfoString());
if (device.isBusy()) { if (device.isBusy()) {
@ -93,4 +93,25 @@ public class GBDeviceAdapter extends ArrayAdapter<GBDevice> {
return view; return view;
} }
private String getUniqueDeviceName(GBDevice device) {
String deviceName = device.getName();
if (!isUniqueDeviceName(device, deviceName)) {
deviceName = deviceName + " " + device.getShortAddress();
}
return deviceName;
}
private boolean isUniqueDeviceName(GBDevice device, String deviceName) {
for (int i = 0; i < getCount(); i++) {
GBDevice item = getItem(i);
if (item == device) {
continue;
}
if (deviceName.equals(item.getName())) {
return false;
}
}
return true;
}
} }

View File

@ -4,6 +4,7 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import android.support.annotation.NonNull;
import android.support.v4.content.LocalBroadcastManager; import android.support.v4.content.LocalBroadcastManager;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -309,6 +310,22 @@ public class GBDevice implements Parcelable {
return "Device " + getName() + ", " + getAddress() + ", " + getStateString(); return "Device " + getName() + ", " + getAddress() + ", " + getStateString();
} }
/**
* Returns a shortened form of the device's address, in order to form a
* unique name in companion with #getName().
*/
@NonNull
public String getShortAddress() {
String address = getAddress();
if (address != null) {
if (address.length() > 5) {
return address.substring(address.length() - 5);
}
return address;
}
return "";
}
public enum State { public enum State {
// Note: the order is important! // Note: the order is important!
NOT_CONNECTED, NOT_CONNECTED,

View File

@ -408,6 +408,8 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport {
} catch (IOException ex) { } catch (IOException ex) {
LOG.error("Unable to set time on MI device", ex); LOG.error("Unable to set time on MI device", ex);
} }
//TODO: once we have a common strategy for sending events (e.g. EventHandler), remove this call from here. Meanwhile it does no harm.
sendCalendarEvents();
} }
/** /**
@ -796,7 +798,10 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport {
LOG.info("MI Band pairing result: " + value); LOG.info("MI Band pairing result: " + value);
} }
private void sendEvents() { /**
* Fetch the events from the android device calendars and set the alarms on the miband.
*/
private void sendCalendarEvents() {
try { try {
TransactionBuilder builder = performInitialized("Send upcoming events"); TransactionBuilder builder = performInitialized("Send upcoming events");
BluetoothGattCharacteristic characteristic = getCharacteristic(MiBandService.UUID_CHARACTERISTIC_CONTROL_POINT); BluetoothGattCharacteristic characteristic = getCharacteristic(MiBandService.UUID_CHARACTERISTIC_CONTROL_POINT);
@ -811,16 +816,17 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport {
int iteration = 0; int iteration = 0;
ArrayList<GBAlarm> alarmList = new ArrayList<>(); ArrayList<GBAlarm> alarmList = new ArrayList<>();
for(CalendarEvents.CalendarEvent mEvt : mEvents) { for(CalendarEvents.CalendarEvent mEvt : mEvents) {
if (iteration >= availableSlots) { if (iteration >= availableSlots || iteration > 2) {
break; break;
} }
int slotToUse = 2 - iteration;
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(mEvt.getBegin()); calendar.setTimeInMillis(mEvt.getBegin());
byte[] calBytes = MiBandDateConverter.calendarToRawBytes(calendar); byte[] calBytes = MiBandDateConverter.calendarToRawBytes(calendar);
byte[] alarmMessage = new byte[]{ byte[] alarmMessage = new byte[]{
MiBandService.COMMAND_SET_TIMER, MiBandService.COMMAND_SET_TIMER,
(byte)(2-iteration), (byte) slotToUse,
(byte) 1, (byte) 1,
calBytes[0], calBytes[0],
calBytes[1], calBytes[1],

View File

@ -54,21 +54,32 @@ public class AppMessageHandlerPebStyle extends AppMessageHandler {
private byte[] encodePebStyleConfig() { private byte[] encodePebStyleConfig() {
ArrayList<Pair<Integer, Object>> pairs = new ArrayList<>(); ArrayList<Pair<Integer, Object>> pairs = new ArrayList<>();
//settings that give good legibility on pebble time //settings that give good legibility on pebble time
pairs.add(new Pair<>(KEY_MAIN_CLOCK, (Object) 1)); //0 analog
pairs.add(new Pair<>(KEY_SECOND_HAND, (Object) 0)); //1 enabled pairs.add(new Pair<>(KEY_SECOND_HAND, (Object) 0)); //1 enabled
pairs.add(new Pair<>(KEY_BLUETOOTH_ALERT, (Object) 0)); //1 silent, 2 weak, up to 5 pairs.add(new Pair<>(KEY_BLUETOOTH_ALERT, (Object) 0)); //1 silent, 2 weak, up to 5
pairs.add(new Pair<>(KEY_TEMPERATURE_FORMAT, (Object) 1)); //0 fahrenheit pairs.add(new Pair<>(KEY_TEMPERATURE_FORMAT, (Object) 1)); //0 fahrenheit
pairs.add(new Pair<>(KEY_LOCATION_SERVICE, (Object) 2)); //0 uto, 1 manual pairs.add(new Pair<>(KEY_LOCATION_SERVICE, (Object) 2)); //0 uto, 1 manual
pairs.add(new Pair<>(KEY_SECONDARY_INFO_TYPE, (Object) 3)); //1 time, 2 location
pairs.add(new Pair<>(KEY_SIDEBAR_LOCATION, (Object) 1)); //0 right pairs.add(new Pair<>(KEY_SIDEBAR_LOCATION, (Object) 1)); //0 right
pairs.add(new Pair<>(KEY_COLOR_SELECTION, (Object) 1)); //1 custom pairs.add(new Pair<>(KEY_COLOR_SELECTION, (Object) 1)); //1 custom
pairs.add(new Pair<>(KEY_MAIN_COLOR, (Object) PebbleColor.Black)); pairs.add(new Pair<>(KEY_MAIN_COLOR, (Object) PebbleColor.Black));
pairs.add(new Pair<>(KEY_MAIN_BG_COLOR, (Object) PebbleColor.White)); pairs.add(new Pair<>(KEY_MAIN_BG_COLOR, (Object) PebbleColor.White));
pairs.add(new Pair<>(KEY_WEATHER_TEMP, (Object) 10)); //2 = Deutsch pairs.add(new Pair<>(KEY_SIDEBAR_BG_COLOR, (Object) PebbleColor.MediumSpringGreen));
//DIGITAL settings
/* /*
pairs.add(new Pair<>(KEY_SETTING_COLOR_SIDEBAR, (Object) Color.parseColor("#00aaff"))); pairs.add(new Pair<>(KEY_MAIN_CLOCK, (Object) 1)); //0 analog
pairs.add(new Pair<>(KEY_SECONDARY_INFO_TYPE, (Object) 3)); //1 time, 2 location
*/
//ANALOG + DIGITAL settings
pairs.add(new Pair<>(KEY_MAIN_CLOCK, (Object) 0)); //0 analog, 1 digital
pairs.add(new Pair<>(KEY_SECONDARY_INFO_TYPE, (Object) 1)); //1 time, 2 location
//WEATHER
/*
//comment the same key in the general section above!
pairs.add(new Pair<>(KEY_LOCATION_SERVICE, (Object) 0)); //0 auto, 1 manual
pairs.add(new Pair<>(KEY_WEATHER_CODE, (Object) 3));
pairs.add(new Pair<>(KEY_WEATHER_TEMP, (Object) 10));
*/ */
byte[] testMessage = mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs); byte[] testMessage = mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs);