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" /> +