Skip to content

Commit 298f6dd

Browse files
author
udaw
committed
Add optional Mute characteristic to Doorbell service
Mute is an optional characteristic of the Doorbell service. The 2.0.1 changelog lists it for the Doorbell service, but it was only wired into DoorService. DoorService is left unchanged to stay compatible.
1 parent a0cb6b8 commit 298f6dd

3 files changed

Lines changed: 68 additions & 0 deletions

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.10
2+
* Add optional Mute characteristic to Doorbell service
3+
14
# HAP-Java 2.0.9
25
* Fix Set Duration and Remaining Duration characteristics to advertise format `uint32` instead of `int` [#202](https://github.com/hap-java/HAP-Java/issues/202)
36
* Stop logging the SRP shared secret, derived key and M5 message data during pairing at DEBUG level

‎src/main/java/io/github/hapjava/services/impl/DoorbellService.java‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import io.github.hapjava.accessories.DoorbellAccessory;
44
import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithBrightness;
5+
import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithMute;
56
import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithName;
67
import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithVolume;
8+
import io.github.hapjava.characteristics.impl.audio.MuteCharacteristic;
79
import io.github.hapjava.characteristics.impl.audio.VolumeCharacteristic;
810
import io.github.hapjava.characteristics.impl.common.NameCharacteristic;
911
import io.github.hapjava.characteristics.impl.common.ProgrammableSwitchEventCharacteristic;
@@ -42,6 +44,14 @@ public DoorbellService(DoorbellAccessory accessory) {
4244
((AccessoryWithVolume) accessory)::subscribeVolume,
4345
((AccessoryWithVolume) accessory)::unsubscribeVolume));
4446
}
47+
if (accessory instanceof AccessoryWithMute) {
48+
addOptionalCharacteristic(
49+
new MuteCharacteristic(
50+
((AccessoryWithMute) accessory)::isMuted,
51+
((AccessoryWithMute) accessory)::setMute,
52+
((AccessoryWithMute) accessory)::subscribeMuteState,
53+
((AccessoryWithMute) accessory)::unsubscribeMuteState));
54+
}
4555
}
4656

4757
public void addOptionalCharacteristic(NameCharacteristic name) {
@@ -55,4 +65,8 @@ public void addOptionalCharacteristic(BrightnessCharacteristic brightness) {
5565
public void addOptionalCharacteristic(VolumeCharacteristic volume) {
5666
addCharacteristic(volume);
5767
}
68+
69+
public void addOptionalCharacteristic(MuteCharacteristic mute) {
70+
addCharacteristic(mute);
71+
}
5872
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package io.github.hapjava.services.impl;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.mockito.Mockito.mock;
5+
import static org.mockito.Mockito.verify;
6+
import static org.mockito.Mockito.when;
7+
import static org.mockito.Mockito.withSettings;
8+
9+
import io.github.hapjava.accessories.DoorbellAccessory;
10+
import io.github.hapjava.accessories.optionalcharacteristic.AccessoryWithMute;
11+
import io.github.hapjava.characteristics.Characteristic;
12+
import io.github.hapjava.characteristics.impl.audio.MuteCharacteristic;
13+
import io.github.hapjava.characteristics.impl.common.ProgrammableSwitchEventCharacteristic;
14+
import java.util.concurrent.CompletableFuture;
15+
import javax.json.JsonObject;
16+
import javax.json.JsonValue;
17+
import org.junit.Test;
18+
19+
public class DoorbellServiceTest {
20+
21+
@Test
22+
public void doorbellWithoutOptionalsOnlyHasSwitchEvent() {
23+
DoorbellService service = new DoorbellService(mock(DoorbellAccessory.class));
24+
25+
assertThat(service.getType()).isEqualTo("00000121-0000-1000-8000-0026BB765291");
26+
assertThat(service.getCharacteristics())
27+
.hasExactlyElementsOfTypes(ProgrammableSwitchEventCharacteristic.class);
28+
}
29+
30+
@Test
31+
public void doorbellWithMuteHasMuteCharacteristic() throws Exception {
32+
DoorbellAccessory accessory =
33+
mock(DoorbellAccessory.class, withSettings().extraInterfaces(AccessoryWithMute.class));
34+
when(((AccessoryWithMute) accessory).isMuted())
35+
.thenReturn(CompletableFuture.completedFuture(true));
36+
37+
DoorbellService service = new DoorbellService(accessory);
38+
39+
assertThat(service.getCharacteristics())
40+
.hasExactlyElementsOfTypes(
41+
ProgrammableSwitchEventCharacteristic.class, MuteCharacteristic.class);
42+
43+
Characteristic mute = service.getCharacteristics().get(1);
44+
JsonObject json = mute.toJson(2).join();
45+
assertThat(json.getString("type")).isEqualTo("11A");
46+
assertThat(json.getBoolean("value")).isTrue();
47+
48+
mute.setValue(JsonValue.FALSE);
49+
verify((AccessoryWithMute) accessory).setMute(false);
50+
}
51+
}

0 commit comments

Comments
 (0)