From 195ededb0478c545088e714828486f84ea10ec65 Mon Sep 17 00:00:00 2001 From: Jaehoon-You <55170115+Jaehoon-You@users.noreply.github.com> Date: Tue, 29 Aug 2023 14:16:27 +0900 Subject: [PATCH] virtual-device-app: Add cluster stub and initialize code (#28914) Signed-off-by: Jaehoon You Signed-off-by: Charles Kim --- .../device/app/core/matter/MatterApp.kt | 14 ++++- .../matter/manager/DoorLockManagerStub.kt | 61 +++++++++++++++++++ .../matter/manager/PowerSourceManagerStub.kt | 34 +++++++++++ 3 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/manager/DoorLockManagerStub.kt create mode 100644 examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/manager/PowerSourceManagerStub.kt diff --git a/examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/MatterApp.kt b/examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/MatterApp.kt index 6abe1916051d68..6c8088aa4781b3 100644 --- a/examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/MatterApp.kt +++ b/examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/MatterApp.kt @@ -10,7 +10,9 @@ import com.matter.virtual.device.app.DeviceAppCallback import com.matter.virtual.device.app.DeviceEventType import com.matter.virtual.device.app.core.common.MatterConstants import com.matter.virtual.device.app.core.common.MatterSettings +import com.matter.virtual.device.app.core.matter.manager.DoorLockManagerStub import com.matter.virtual.device.app.core.matter.manager.OnOffManagerStub +import com.matter.virtual.device.app.core.matter.manager.PowerSourceManagerStub import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject import javax.inject.Singleton @@ -22,7 +24,9 @@ class MatterApp constructor( @ApplicationContext private val context: Context, private val deviceApp: DeviceApp, - private val onOffManagerStub: OnOffManagerStub + private val onOffManagerStub: OnOffManagerStub, + private val doorLockManagerStub: DoorLockManagerStub, + private val powerSourceManagerStub: PowerSourceManagerStub ) { private var androidChipPlatform: AndroidChipPlatform? = null @@ -41,6 +45,14 @@ constructor( app.setOnOffManager(endpoint, onOffManagerStub) onOffManagerStub.initAttributeValue() } + Clusters.ClusterId_DoorLock -> { + app.setDoorLockManager(endpoint, doorLockManagerStub) + doorLockManagerStub.initAttributeValue() + } + Clusters.ClusterId_PowerSource -> { + app.setPowerSourceManager(endpoint, powerSourceManagerStub) + powerSourceManagerStub.initAttributeValue() + } } } diff --git a/examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/manager/DoorLockManagerStub.kt b/examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/manager/DoorLockManagerStub.kt new file mode 100644 index 00000000000000..11320142e1d89d --- /dev/null +++ b/examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/manager/DoorLockManagerStub.kt @@ -0,0 +1,61 @@ +package com.matter.virtual.device.app.core.matter.manager + +import com.matter.virtual.device.app.DeviceApp +import com.matter.virtual.device.app.DoorLockManager +import com.matter.virtual.device.app.core.common.MatterConstants +import javax.inject.Inject +import javax.inject.Singleton +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import timber.log.Timber + +@Singleton +class DoorLockManagerStub @Inject constructor(private val deviceApp: DeviceApp) : DoorLockManager { + + private val _lockState = MutableStateFlow(false) + val lockState: StateFlow + get() = _lockState + + override fun initAttributeValue() { + Timber.d("initAttributeValue()") + deviceApp.setLockType(MatterConstants.DEFAULT_ENDPOINT, DoorLockManager.DlLockType_kMagnetic) + deviceApp.setLockState(MatterConstants.DEFAULT_ENDPOINT, lockState.value.asLockState()) + deviceApp.setActuatorEnabled(MatterConstants.DEFAULT_ENDPOINT, true) + deviceApp.setOperatingMode( + MatterConstants.DEFAULT_ENDPOINT, + DoorLockManager.OperatingModeEnum_kNormal + ) + deviceApp.setSupportedOperatingModes( + MatterConstants.DEFAULT_ENDPOINT, + DoorLockManager.DlSupportedOperatingModes_kNormal + ) + } + + override fun handleLockStateChanged(value: Int) { + Timber.d("handleLockStateChanged():$value") + _lockState.value = value.asBooleanLockState() + } + + fun setLockState(value: Boolean) { + Timber.d("setLockState():$value") + deviceApp.setLockState(MatterConstants.DEFAULT_ENDPOINT, value.asLockState()) + } + + fun sendLockAlarmEvent() { + Timber.d("sendLockAlarmEvent()") + deviceApp.sendLockAlarmEvent(MatterConstants.DEFAULT_ENDPOINT) + } + + private fun Boolean.asLockState() = + when (this) { + true -> DoorLockManager.DlLockState_kUnlocked + false -> DoorLockManager.DlLockState_kLocked + } + + private fun Int.asBooleanLockState() = + when (this) { + DoorLockManager.DlLockState_kUnlocked -> true + DoorLockManager.DlLockState_kLocked -> false + else -> false + } +} diff --git a/examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/manager/PowerSourceManagerStub.kt b/examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/manager/PowerSourceManagerStub.kt new file mode 100644 index 00000000000000..2e8c8df705201f --- /dev/null +++ b/examples/virtual-device-app/android/App/core/matter/src/main/java/com/matter/virtual/device/app/core/matter/manager/PowerSourceManagerStub.kt @@ -0,0 +1,34 @@ +package com.matter.virtual.device.app.core.matter.manager + +import com.matter.virtual.device.app.DeviceApp +import com.matter.virtual.device.app.PowerSourceManager +import com.matter.virtual.device.app.core.common.MatterConstants +import javax.inject.Inject +import javax.inject.Singleton +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import timber.log.Timber + +@Singleton +class PowerSourceManagerStub @Inject constructor(private val deviceApp: DeviceApp) : + PowerSourceManager { + + private val _batPercent = MutableStateFlow(DEFAULT_BATTERY_STATUS) + val batPercent: StateFlow + get() = _batPercent + + override fun initAttributeValue() { + Timber.d("initAttributeValue()") + deviceApp.setBatPercentRemaining(MatterConstants.DEFAULT_ENDPOINT, DEFAULT_BATTERY_STATUS) + } + + fun setBatPercentRemaining(batteryPercentRemaining: Int) { + Timber.d("setBatPercentRemaining():$batteryPercentRemaining") + _batPercent.value = batteryPercentRemaining + deviceApp.setBatPercentRemaining(MatterConstants.DEFAULT_ENDPOINT, batteryPercentRemaining) + } + + companion object { + private const val DEFAULT_BATTERY_STATUS = 70 + } +}