Skip to content

Commit 7b4df1c

Browse files
[Android] Support group message (#29244)
* Implement Android Group message * Add Android if_nameindex * Add groupsetting API * remove test code * Restyled by whitespace * Restyled by google-java-format * Restyled by clang-format * Implement Group Setting UI * restyle kotlin * Fix kotlin static code analysis * Modify from comments. * Restyled by whitespace * Restyled by google-java-format * Restyled by clang-format * kotlin restyle * Modify return value * Update group id in commandpath * Update kotlin codestyle * Restyled by google-java-format * Restyled by clang-format * Update from comments * Modify write path in group session --------- Co-authored-by: Restyled.io <commits@restyled.io>
1 parent f299acb commit 7b4df1c

32 files changed

+2347
-27
lines changed

examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/CHIPToolActivity.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import com.google.chip.chiptool.setuppayloadscanner.BarcodeFragment
3939
import com.google.chip.chiptool.setuppayloadscanner.CHIPDeviceDetailsFragment
4040
import com.google.chip.chiptool.setuppayloadscanner.CHIPDeviceInfo
4141
import com.google.chip.chiptool.setuppayloadscanner.CHIPLedgerDetailsFragment
42+
import com.google.chip.chiptool.util.DeviceIdUtil
4243
import org.json.JSONObject
4344

4445
class CHIPToolActivity :
@@ -94,11 +95,12 @@ class CHIPToolActivity :
9495
}
9596
}
9697

97-
override fun onCommissioningComplete(code: Int) {
98+
override fun onCommissioningComplete(code: Int, nodeId: Long) {
9899
runOnUiThread {
99100
Toast.makeText(this, getString(R.string.commissioning_completed, code), Toast.LENGTH_SHORT)
100101
.show()
101102
}
103+
DeviceIdUtil.setCommissionedNodeId(this, nodeId)
102104
ChipClient.getDeviceController(this).close()
103105
showFragment(SelectActionFragment.newInstance(), false)
104106
}

examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/SelectActionFragment.kt

+6
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import androidx.core.content.ContextCompat
3030
import androidx.fragment.app.Fragment
3131
import com.google.chip.chiptool.attestation.AttestationTestFragment
3232
import com.google.chip.chiptool.clusterclient.*
33+
import com.google.chip.chiptool.clusterclient.GroupSettingFragment
3334
import com.google.chip.chiptool.clusterclient.clusterinteraction.ClusterInteractionFragment
3435
import com.google.chip.chiptool.databinding.SelectActionFragmentBinding
3536
import com.google.chip.chiptool.provisioning.ProvisionNetworkType
@@ -71,6 +72,7 @@ class SelectActionFragment : Fragment() {
7172
binding.provisionCustomFlowBtn.setOnClickListener { handleProvisionCustomFlowClicked() }
7273
binding.wildcardBtn.setOnClickListener { handleWildcardClicked() }
7374
binding.unpairDeviceBtn.setOnClickListener { handleUnpairDeviceClicked() }
75+
binding.groupSettingBtn.setOnClickListener { handleGroupSettingClicked() }
7476

7577
return binding.root
7678
}
@@ -233,6 +235,10 @@ class SelectActionFragment : Fragment() {
233235
showFragment(BarcodeFragment.newInstance(), false)
234236
}
235237

238+
private fun handleGroupSettingClicked() {
239+
showFragment(GroupSettingFragment.newInstance())
240+
}
241+
236242
companion object {
237243

238244
@JvmStatic fun newInstance() = SelectActionFragment()

examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/AddressUpdateFragment.kt

+63-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package com.google.chip.chiptool.clusterclient
22

3+
import android.content.Context
34
import android.os.Bundle
5+
import android.util.Log
46
import android.view.LayoutInflater
57
import android.view.View
68
import android.view.ViewGroup
9+
import android.widget.AdapterView
10+
import android.widget.ArrayAdapter
711
import androidx.fragment.app.Fragment
812
import chip.devicecontroller.ChipDeviceController
913
import com.google.chip.chiptool.ChipClient
@@ -41,13 +45,70 @@ class AddressUpdateFragment : Fragment() {
4145
super.onViewCreated(view, savedInstanceState)
4246

4347
val compressedFabricId = deviceController.compressedFabricId
44-
binding.fabricIdEd.setText(compressedFabricId.toULong().toString(16).padStart(16, '0'))
45-
binding.deviceIdEd.setText(DeviceIdUtil.getLastDeviceId(requireContext()).toString())
48+
binding.fabricIdEd.setText(compressedFabricId.toULong().toString().padStart(16, '0'))
49+
binding.deviceIdEd.setText(DeviceIdUtil.getLastDeviceId(requireContext()).toString(16))
4650
binding.epIdEd.setText(endpointId.toString())
51+
52+
updateDeviceIdSpinner()
53+
}
54+
55+
fun updateDeviceIdSpinner() {
56+
val deviceIdList = DeviceIdUtil.getCommissionedNodeId(requireContext())
57+
binding.deviceIdSpinner.adapter =
58+
ArrayAdapter(requireContext(), android.R.layout.simple_spinner_dropdown_item, deviceIdList)
59+
binding.deviceIdSpinner.onItemSelectedListener =
60+
object : AdapterView.OnItemSelectedListener {
61+
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
62+
binding.deviceIdEd.setText(deviceIdList[position].toULong(16).toString())
63+
}
64+
65+
override fun onNothingSelected(parent: AdapterView<*>?) {
66+
Log.d(TAG, "onNothingSelected")
67+
}
68+
}
4769
}
4870

4971
override fun onDestroyView() {
5072
super.onDestroyView()
5173
_binding = null
5274
}
75+
76+
suspend fun getDevicePointer(context: Context): Long {
77+
return if (isGroupId()) {
78+
deviceController.getGroupDevicePointer(getGroupId().toInt())
79+
} else {
80+
ChipClient.getConnectedDevicePointer(context, getNodeId().toLong())
81+
}
82+
}
83+
84+
fun isGroupId(): Boolean {
85+
return isGroupNodeId(getNodeId())
86+
}
87+
88+
fun getGroupId(): UInt {
89+
return getGroupIdFromNodeId(getNodeId())
90+
}
91+
92+
fun getNodeId(): ULong {
93+
return binding.deviceIdEd.text.toString().toULong()
94+
}
95+
96+
companion object {
97+
private const val TAG = "AddressUpdateFragment"
98+
// Refer from NodeId.h (src/lib/core/NodeId.h)
99+
private const val MIN_GROUP_NODE_ID = 0xFFFF_FFFF_FFFF_0000UL
100+
private const val MASK_GROUP_ID = 0x0000_0000_0000_FFFFUL
101+
102+
fun isGroupNodeId(nodeId: ULong): Boolean {
103+
return nodeId >= MIN_GROUP_NODE_ID
104+
}
105+
106+
fun getNodeIdFromGroupId(groupId: UInt): ULong {
107+
return groupId.toULong() or MIN_GROUP_NODE_ID
108+
}
109+
110+
fun getGroupIdFromNodeId(nodeId: ULong): UInt {
111+
return (nodeId and MASK_GROUP_ID).toUInt()
112+
}
113+
}
53114
}

0 commit comments

Comments
 (0)