mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-12-25 10:05:49 +01:00
Casio2C2DSupport: refactor DeviceSetting for better reusability
This commit is contained in:
parent
e5438a856e
commit
ec0a38c7c0
@ -381,11 +381,46 @@ public abstract class Casio2C2DSupport extends CasioSupport {
|
||||
}
|
||||
}
|
||||
|
||||
public interface UpdateValuesHandler {
|
||||
public void apply(byte[][] data);
|
||||
}
|
||||
public interface ReadValuesHandler {
|
||||
public boolean apply(byte[][] data);
|
||||
}
|
||||
|
||||
public abstract class DeviceSetting {
|
||||
// which features to request
|
||||
public abstract FeatureRequest[] getFeatureRequests();
|
||||
// compares and updates watch data, cached previous data and GB state, returns true if data was changed
|
||||
public abstract boolean mergeValues(byte[][] data, byte[][] previous, SharedPreferences.Editor editor);
|
||||
|
||||
public final boolean mergeValues(byte[][] data, byte[][] previous, UpdateValuesHandler updateValues, ReadValuesHandler readValues) {
|
||||
boolean needsUpdating = false;
|
||||
// check if GB state has changed
|
||||
if (previous != null) {
|
||||
byte[][] copies = new byte[previous.length][];
|
||||
for (int i = 0; i < previous.length; i++) {
|
||||
copies[i] = previous[i].clone();
|
||||
}
|
||||
updateValues.apply(copies);
|
||||
for (int i = 0; i < previous.length; i++) {
|
||||
if (!Arrays.equals(previous[i], copies[i])) {
|
||||
needsUpdating = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// update GB state and check if data needs change
|
||||
if (!needsUpdating) {
|
||||
needsUpdating = readValues.apply(data);
|
||||
}
|
||||
// maybe update data
|
||||
if (needsUpdating) {
|
||||
updateValues.apply(data);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
ArrayList<DeviceSetting> deviceSettings = new ArrayList();
|
||||
@ -442,7 +477,30 @@ public abstract class Casio2C2DSupport extends CasioSupport {
|
||||
builder.queue(getQueue());
|
||||
}
|
||||
|
||||
public class DeviceAlarms extends DeviceSetting {
|
||||
public abstract class DeviceItems<Item> extends DeviceSetting {
|
||||
|
||||
public void onSet(ArrayList<? extends Item> items) {
|
||||
if (!isInitialized()) {
|
||||
return;
|
||||
}
|
||||
byte[][] currentValues = featureCache.get(getFeatureRequests());
|
||||
if (currentValues == null) {
|
||||
return;
|
||||
}
|
||||
updateValues(currentValues, items);
|
||||
|
||||
SharedPreferences.Editor editor = GBApplication.getDeviceSpecificSharedPrefs(gbDevice.getAddress()).edit();
|
||||
featureCache.save(editor);
|
||||
editor.apply();
|
||||
|
||||
sendSettingsToDevice(currentValues);
|
||||
}
|
||||
|
||||
public abstract void updateValues(byte[][] data, List<? extends Item> items);
|
||||
|
||||
}
|
||||
|
||||
public class DeviceAlarms extends DeviceItems<Alarm> {
|
||||
|
||||
@Override
|
||||
public FeatureRequest[] getFeatureRequests() {
|
||||
@ -457,6 +515,7 @@ public abstract class Casio2C2DSupport extends CasioSupport {
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public void updateValues(byte[][] data, List<? extends Alarm> alarms) {
|
||||
for (Alarm alarm: alarms) {
|
||||
updateValues(data, alarm);
|
||||
@ -491,7 +550,7 @@ public abstract class Casio2C2DSupport extends CasioSupport {
|
||||
LinkedHashSet<Integer> foundAlarms = new LinkedHashSet();
|
||||
for (nodomain.freeyourgadget.gadgetbridge.entities.Alarm alarm: DBHelper.getAlarms(gbDevice)) {
|
||||
foundAlarms.add(alarm.getPosition());
|
||||
if (mergeValues(data, previous, alarm)) {
|
||||
if (mergeValues(data, previous, uData -> updateValues(uData, alarm), rData -> readValues(rData, alarm, false))) {
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
@ -509,34 +568,6 @@ public abstract class Casio2C2DSupport extends CasioSupport {
|
||||
return changed;
|
||||
}
|
||||
|
||||
public boolean mergeValues(byte[][] data, byte[][] previous, nodomain.freeyourgadget.gadgetbridge.entities.Alarm alarm) {
|
||||
LOG.info("merge " + alarm.getPosition() + " : " + Arrays.toString(data[1]));
|
||||
boolean needsUpdating = false;
|
||||
// check if GB state has changed
|
||||
if (previous != null) {
|
||||
byte[][] copies = new byte[][] {previous[0].clone(), previous[1].clone()};
|
||||
updateValues(copies, alarm);
|
||||
if (!Arrays.equals(previous[0], copies[0]) || ! Arrays.equals(previous[1], copies[1])) {
|
||||
LOG.info("GB changed");
|
||||
needsUpdating = true;
|
||||
}
|
||||
}
|
||||
// update GB state and check if data needs change
|
||||
if (!needsUpdating) {
|
||||
needsUpdating = readValues(data, alarm, false);
|
||||
if (needsUpdating) {
|
||||
LOG.info("updated from watch");
|
||||
}
|
||||
}
|
||||
// maybe update data
|
||||
if (needsUpdating) {
|
||||
updateValues(data, alarm);
|
||||
LOG.info("updated from GB");
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean readValues(byte[][] data, nodomain.freeyourgadget.gadgetbridge.entities.Alarm alarm, boolean forceStore) {
|
||||
int pos = alarm.getPosition();
|
||||
int alm = pos == 0 ? 0 : 1;
|
||||
@ -567,21 +598,7 @@ public abstract class Casio2C2DSupport extends CasioSupport {
|
||||
|
||||
@Override
|
||||
public void onSetAlarms(ArrayList<? extends Alarm> alarms) {
|
||||
if (!isInitialized()) {
|
||||
return;
|
||||
}
|
||||
byte[][] currentValues = featureCache.get(deviceAlarms.getFeatureRequests());
|
||||
if (currentValues == null) {
|
||||
LOG.error("unknown current alarm watch values");
|
||||
return;
|
||||
}
|
||||
deviceAlarms.updateValues(currentValues, alarms);
|
||||
|
||||
SharedPreferences.Editor editor = GBApplication.getDeviceSpecificSharedPrefs(gbDevice.getAddress()).edit();
|
||||
featureCache.save(editor);
|
||||
editor.apply();
|
||||
|
||||
sendSettingsToDevice(currentValues);
|
||||
deviceAlarms.onSet(alarms);
|
||||
}
|
||||
|
||||
public abstract class DevicePreference extends DeviceSetting {
|
||||
@ -604,25 +621,7 @@ public abstract class Casio2C2DSupport extends CasioSupport {
|
||||
|
||||
@Override
|
||||
public final boolean mergeValues(byte[][] data, byte[][] previous, SharedPreferences.Editor editor) {
|
||||
boolean needsUpdating = false;
|
||||
// check if GB state has changed
|
||||
if (previous != null) {
|
||||
byte[] copy = previous[0].clone();
|
||||
updateValue(copy);
|
||||
if (!Arrays.equals(previous[0], copy)) {
|
||||
needsUpdating = true;
|
||||
}
|
||||
}
|
||||
// update GB state and check if data needs change
|
||||
if (!needsUpdating) {
|
||||
needsUpdating = readValue(data[0], editor);
|
||||
}
|
||||
// maybe update data
|
||||
if (needsUpdating) {
|
||||
updateValue(data[0]);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
return mergeValues(data, previous, uData -> updateValue(uData[0]), rData -> readValue(rData[0], editor));
|
||||
}
|
||||
|
||||
public abstract boolean readValue(byte[] data, SharedPreferences.Editor editor);
|
||||
|
Loading…
Reference in New Issue
Block a user