Skip to content

Commit 3b750c1

Browse files
authored
Merge pull request #203 from hap-java/fix/202-valve-duration-uint32
Advertise uint32 format for valve duration characteristics
2 parents b11d77f + dc610bc commit 3b750c1

5 files changed

Lines changed: 109 additions & 1 deletion

File tree

‎CHANGES.md‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# HAP-Java 2.0.9
2+
* Fix Set Duration and Remaining Duration characteristics to advertise format `uint32` instead of `int` [#202](https://github.com/hap-java/HAP-Java/issues/202)
3+
14
# HAP-Java 2.0.8
25
* Updated bouncy castle to 1.83
36
* Updated netty to 4.1.126.Final

‎src/main/java/io/github/hapjava/characteristics/impl/base/IntegerCharacteristic.java‎

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,55 @@ public IntegerCharacteristic(
4747
Optional<ExceptionalConsumer<Integer>> setter,
4848
Optional<Consumer<HomekitCharacteristicChangeCallback>> subscriber,
4949
Optional<Runnable> unsubscriber) {
50+
this(
51+
type,
52+
"int",
53+
description,
54+
minValue,
55+
maxValue,
56+
unit,
57+
getter,
58+
setter,
59+
subscriber,
60+
unsubscriber);
61+
}
62+
63+
/**
64+
* Constructor for characteristics whose HAP format differs from the default "int", e.g. "uint8",
65+
* "uint16" or "uint32". Values are still handled as Java {@link Integer}, so the supported range
66+
* must fit into a signed 32-bit integer.
67+
*
68+
* @param type a string containing a UUID that indicates the type of characteristic. Apple defines
69+
* a set of these, however implementors can create their own as well.
70+
* @param format the HAP format to advertise, e.g. "int" or "uint32".
71+
* @param description a description of the characteristic to be passed to the consuming device.
72+
* @param minValue the minimum supported value.
73+
* @param maxValue the maximum supported value
74+
* @param unit a description of the unit this characteristic supports.
75+
* @param getter getter for value
76+
* @param setter setter for value
77+
* @param subscriber subscribers to changes
78+
* @param unsubscriber unsubscribers to changes
79+
*/
80+
protected IntegerCharacteristic(
81+
String type,
82+
String format,
83+
String description,
84+
int minValue,
85+
int maxValue,
86+
String unit,
87+
Optional<Supplier<CompletableFuture<Integer>>> getter,
88+
Optional<ExceptionalConsumer<Integer>> setter,
89+
Optional<Consumer<HomekitCharacteristicChangeCallback>> subscriber,
90+
Optional<Runnable> unsubscriber) {
5091
super(
51-
type, "int", description, getter.isPresent(), setter.isPresent(), subscriber, unsubscriber);
92+
type,
93+
format,
94+
description,
95+
getter.isPresent(),
96+
setter.isPresent(),
97+
subscriber,
98+
unsubscriber);
5299
this.minValue = minValue;
53100
this.maxValue = maxValue;
54101
this.unit = unit;

‎src/main/java/io/github/hapjava/characteristics/impl/valve/RemainingDurationCharacteristic.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public RemainingDurationCharacteristic(
2626
Runnable unsubscriber) {
2727
super(
2828
"000000D4-0000-1000-8000-0026BB765291",
29+
"uint32",
2930
"remaining duration",
3031
minValue,
3132
maxValue,

‎src/main/java/io/github/hapjava/characteristics/impl/valve/SetDurationCharacteristic.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public SetDurationCharacteristic(
2424
Runnable unsubscriber) {
2525
super(
2626
"000000D3-0000-1000-8000-0026BB765291",
27+
"uint32",
2728
"set duration",
2829
minValue,
2930
maxValue,
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package io.github.hapjava.characteristics.impl.valve;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import io.github.hapjava.characteristics.impl.windowcovering.CurrentPositionCharacteristic;
6+
import java.util.concurrent.CompletableFuture;
7+
import javax.json.JsonObject;
8+
import org.junit.Test;
9+
10+
/** Regression tests for https://github.com/hap-java/HAP-Java/issues/202 */
11+
public class DurationCharacteristicFormatTest {
12+
13+
@Test
14+
public void setDurationAdvertisesUint32() {
15+
SetDurationCharacteristic characteristic =
16+
new SetDurationCharacteristic(
17+
() -> CompletableFuture.completedFuture(300), value -> {}, callback -> {}, () -> {});
18+
19+
JsonObject json = characteristic.toJson(12).join();
20+
21+
assertThat(json.getString("type")).isEqualTo("D3");
22+
assertThat(json.getString("format")).isEqualTo("uint32");
23+
assertThat(json.getInt("value")).isEqualTo(300);
24+
assertThat(json.getInt("minValue")).isEqualTo(0);
25+
assertThat(json.getInt("maxValue")).isEqualTo(3600);
26+
assertThat(json.getInt("minStep")).isEqualTo(1);
27+
assertThat(json.getString("unit")).isEqualTo("s");
28+
}
29+
30+
@Test
31+
public void remainingDurationAdvertisesUint32() {
32+
RemainingDurationCharacteristic characteristic =
33+
new RemainingDurationCharacteristic(
34+
() -> CompletableFuture.completedFuture(180), callback -> {}, () -> {});
35+
36+
JsonObject json = characteristic.toJson(13).join();
37+
38+
assertThat(json.getString("type")).isEqualTo("D4");
39+
assertThat(json.getString("format")).isEqualTo("uint32");
40+
assertThat(json.getInt("value")).isEqualTo(180);
41+
assertThat(json.getInt("minValue")).isEqualTo(0);
42+
assertThat(json.getInt("maxValue")).isEqualTo(3600);
43+
assertThat(json.getString("unit")).isEqualTo("s");
44+
}
45+
46+
@Test
47+
public void otherIntegerCharacteristicsKeepIntFormat() {
48+
CurrentPositionCharacteristic characteristic =
49+
new CurrentPositionCharacteristic(
50+
() -> CompletableFuture.completedFuture(50), callback -> {}, () -> {});
51+
52+
JsonObject json = characteristic.toJson(14).join();
53+
54+
assertThat(json.getString("format")).isEqualTo("int");
55+
}
56+
}

0 commit comments

Comments
 (0)