From d69cdc31de4c0337a4d96bf39c4c42454ee14d4c Mon Sep 17 00:00:00 2001
From: joonhaengHeo <85541460+joonhaengHeo@users.noreply.github.com>
Date: Thu, 25 May 2023 22:54:20 +0900
Subject: [PATCH] [Android] Add cluster Btn in chiptool (Opcred,
administratorCommissioning) (#26782)
* Add MultiAdmin test application btn
* remove wildcard import
---
.../clusterclient/MultiAdminClientFragment.kt | 35 ++++++++++++++--
.../clusterclient/OpCredClientFragment.kt | 35 +++++++++++++++-
.../layout/multi_admin_client_fragment.xml | 35 +++++++++++++++-
.../res/layout/op_cred_client_fragment.xml | 41 ++++++++++++++++++-
.../app/src/main/res/values/strings.xml | 6 +++
5 files changed, 145 insertions(+), 7 deletions(-)
diff --git a/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/MultiAdminClientFragment.kt b/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/MultiAdminClientFragment.kt
index ffff2139f7d2d9..ed7ba6f4f692f0 100644
--- a/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/MultiAdminClientFragment.kt
+++ b/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/MultiAdminClientFragment.kt
@@ -8,10 +8,14 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import chip.devicecontroller.ChipDeviceController
-import chip.devicecontroller.ClusterIDMapping
+import chip.devicecontroller.ClusterIDMapping.AdministratorCommissioning
import chip.devicecontroller.InvokeCallback
import chip.devicecontroller.OpenCommissioningCallback
+import chip.devicecontroller.ReportCallback
+import chip.devicecontroller.model.ChipAttributePath
+import chip.devicecontroller.model.ChipEventPath
import chip.devicecontroller.model.InvokeElement
+import chip.devicecontroller.model.NodeState
import chip.tlv.AnonymousTag
import chip.tlv.TlvWriter
import com.google.chip.chiptool.ChipClient
@@ -47,6 +51,9 @@ class MultiAdminClientFragment : Fragment() {
binding.basicCommissioningMethodBtn.setOnClickListener { scope.launch { sendBasicCommissioningCommandClick() } }
binding.enhancedCommissioningMethodBtn.setOnClickListener { scope.launch { sendEnhancedCommissioningCommandClick() } }
binding.revokeBtn.setOnClickListener { scope.launch { sendRevokeCommandClick() } }
+ binding.readWindowStatusBtn.setOnClickListener { scope.launch { readAdministratorCommissioningClusterAttributeClick(AdministratorCommissioning.Attribute.WindowStatus) } }
+ binding.readAdminFabricIndexBtn.setOnClickListener { scope.launch { readAdministratorCommissioningClusterAttributeClick(AdministratorCommissioning.Attribute.AdminFabricIndex) } }
+ binding.readAdminVendorIdBtn.setOnClickListener { scope.launch { readAdministratorCommissioningClusterAttributeClick(AdministratorCommissioning.Attribute.AdminVendorId) } }
return binding.root
}
@@ -137,9 +144,9 @@ class MultiAdminClientFragment : Fragment() {
val tlvWriter = TlvWriter()
tlvWriter.startStructure(AnonymousTag)
tlvWriter.endStructure()
- val invokeElement = InvokeElement.newInstance(0
- , ClusterIDMapping.AdministratorCommissioning.ID
- , ClusterIDMapping.AdministratorCommissioning.Command.RevokeCommissioning.id
+ val invokeElement = InvokeElement.newInstance(ADMINISTRATOR_COMMISSIONING_CLUSTER_ENDPOINT_ID
+ , AdministratorCommissioning.ID
+ , AdministratorCommissioning.Command.RevokeCommissioning.id
, tlvWriter.getEncoded(), null)
deviceController.invoke(object: InvokeCallback {
@@ -156,6 +163,25 @@ class MultiAdminClientFragment : Fragment() {
}, getConnectedDevicePointer(), invokeElement, timedInvokeTimeout, 0)
}
+ private suspend fun readAdministratorCommissioningClusterAttributeClick(attribute: AdministratorCommissioning.Attribute) {
+ val endpointId = ADMINISTRATOR_COMMISSIONING_CLUSTER_ENDPOINT_ID
+ val clusterId = AdministratorCommissioning.ID
+ val attributeId = attribute.id
+ val attributeName = attribute.name
+ val attributePath = ChipAttributePath.newInstance(endpointId, clusterId, attributeId)
+ deviceController.readAttributePath(object: ReportCallback {
+ override fun onReport(nodeState: NodeState?) {
+ val value = nodeState?.getEndpointState(endpointId)?.getClusterState(clusterId)?.getAttributeState(attributeId)?.value ?: "null"
+ Log.i(TAG,"read $attributeName: $value")
+ showMessage("read $attributeName: $value")
+ }
+
+ override fun onError(attributePath: ChipAttributePath?, eventPath: ChipEventPath?, e: Exception) {
+ showMessage("read $attributeName - error : ${e?.message}")
+ }
+ }, getConnectedDevicePointer(), listOf(attributePath), 0)
+ }
+
private suspend fun getConnectedDevicePointer(): Long {
return ChipClient.getConnectedDevicePointer(requireContext(), addressUpdateFragment.deviceId)
}
@@ -168,6 +194,7 @@ class MultiAdminClientFragment : Fragment() {
companion object {
private const val TAG = "MultiAdminClientFragment"
+ private const val ADMINISTRATOR_COMMISSIONING_CLUSTER_ENDPOINT_ID = 0
fun newInstance(): MultiAdminClientFragment = MultiAdminClientFragment()
}
}
diff --git a/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/OpCredClientFragment.kt b/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/OpCredClientFragment.kt
index 15fe990b6a6c4e..02dc9912c5597f 100644
--- a/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/OpCredClientFragment.kt
+++ b/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/OpCredClientFragment.kt
@@ -15,11 +15,16 @@ import com.google.chip.chiptool.databinding.OpCredClientFragmentBinding
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
-import chip.devicecontroller.ClusterIDMapping.*
+import chip.devicecontroller.ClusterIDMapping.OperationalCredentials
+import chip.devicecontroller.InvokeCallback
import chip.devicecontroller.ReportCallback
import chip.devicecontroller.model.ChipAttributePath
import chip.devicecontroller.model.ChipEventPath
+import chip.devicecontroller.model.InvokeElement
import chip.devicecontroller.model.NodeState
+import chip.tlv.AnonymousTag
+import chip.tlv.ContextSpecificTag
+import chip.tlv.TlvWriter
class OpCredClientFragment : Fragment() {
private val deviceController: ChipDeviceController
@@ -47,6 +52,8 @@ class OpCredClientFragment : Fragment() {
binding.readSupportedFabricBtn.setOnClickListener { scope.launch { readClusterAttribute(OperationalCredentials.Attribute.SupportedFabrics) } }
binding.readCommissionedFabricBtn.setOnClickListener { scope.launch { readClusterAttribute(OperationalCredentials.Attribute.CommissionedFabrics) } }
+ binding.readFabricsBtn.setOnClickListener { scope.launch { readClusterAttribute(OperationalCredentials.Attribute.Fabrics) } }
+ binding.removeFabricsBtn.setOnClickListener { scope.launch { sendRemoveFabricsBtnClick(binding.fabricIndexEd.text.toString().toUInt()) } }
return binding.root
}
@@ -99,6 +106,32 @@ class OpCredClientFragment : Fragment() {
}, devicePtr, listOf(ChipAttributePath.newInstance(endpointId, clusterId, attributeId)), null, false, 0 /* imTimeoutMs */)
}
+ private suspend fun sendRemoveFabricsBtnClick(fabricIndex: UInt) {
+ val devicePtr = ChipClient.getConnectedDevicePointer(requireContext(), addressUpdateFragment.deviceId)
+ // TODO : Need to be implement poj-to-tlv
+ val tlvWriter = TlvWriter()
+ tlvWriter.startStructure(AnonymousTag)
+ tlvWriter.put(ContextSpecificTag(OperationalCredentials.RemoveFabricCommandField.FabricIndex.id), fabricIndex)
+ tlvWriter.endStructure()
+ val invokeElement = InvokeElement.newInstance(addressUpdateFragment.endpointId
+ , OperationalCredentials.ID
+ , OperationalCredentials.Command.RemoveFabric.id
+ , tlvWriter.getEncoded(), null)
+
+ deviceController.invoke(object: InvokeCallback {
+ override fun onError(ex: Exception?) {
+ showMessage("RemoveFabric failure $ex")
+ Log.e(TAG, "RemoveFabric failure", ex)
+ }
+
+ override fun onResponse(invokeElement: InvokeElement?, successCode: Long) {
+ Log.e(TAG, "onResponse : $invokeElement, Code : $successCode")
+ showMessage("RemoveFabric success")
+ }
+
+ }, devicePtr, invokeElement, 0, 0)
+ }
+
private fun showMessage(msg: String) {
requireActivity().runOnUiThread {
binding.opCredClusterCommandStatus.text = msg
diff --git a/examples/android/CHIPTool/app/src/main/res/layout/multi_admin_client_fragment.xml b/examples/android/CHIPTool/app/src/main/res/layout/multi_admin_client_fragment.xml
index 95e5458f8164b0..7066cf892626f7 100644
--- a/examples/android/CHIPTool/app/src/main/res/layout/multi_admin_client_fragment.xml
+++ b/examples/android/CHIPTool/app/src/main/res/layout/multi_admin_client_fragment.xml
@@ -80,12 +80,45 @@
app:layout_constraintEnd_toEndOf="parent"
android:text="@string/revoke_btn_text" />
+
+
+
+
+
+
+
+
+
+
+
+
Enter Setup PIN Code
Enhanced Commissioning Method
Revoke
+ Read Window Status
+ Read Admin FabricIndex
+ Read Admin VID
Operational Credentials cluster
Read Supported Fabric count
Read Commissioned Fabric count
+ Read Fabrics
+ Remove Fabrics
+ FabricIndex
Basic cluster
Write