18
18
19
19
package com.google.chip.chiptool.setuppayloadscanner
20
20
21
+ import android.content.Intent
22
+ import android.net.Uri
21
23
import android.os.Bundle
24
+ import android.text.Editable
25
+ import android.text.TextWatcher
26
+ import android.util.Log
22
27
import android.view.LayoutInflater
23
28
import android.view.View
24
29
import android.view.ViewGroup
@@ -27,6 +32,10 @@ import androidx.fragment.app.Fragment
27
32
import com.google.chip.chiptool.R
28
33
import com.google.chip.chiptool.databinding.ChipDeviceInfoFragmentBinding
29
34
import com.google.chip.chiptool.util.FragmentUtil
35
+ import java.net.URLEncoder
36
+ import matter.onboardingpayload.OnboardingPayload
37
+ import matter.onboardingpayload.OnboardingPayloadException
38
+ import matter.onboardingpayload.QRCodeOnboardingPayloadGenerator
30
39
31
40
/* * Show the [CHIPDeviceInfo]. */
32
41
class CHIPDeviceDetailsFragment : Fragment () {
@@ -35,6 +44,8 @@ class CHIPDeviceDetailsFragment : Fragment() {
35
44
private val binding
36
45
get() = _binding !!
37
46
47
+ private lateinit var onBoardingPayload: OnboardingPayload
48
+
38
49
override fun onCreateView (
39
50
inflater : LayoutInflater ,
40
51
container : ViewGroup ? ,
@@ -43,17 +54,13 @@ class CHIPDeviceDetailsFragment : Fragment() {
43
54
_binding = ChipDeviceInfoFragmentBinding .inflate(inflater, container, false )
44
55
deviceInfo = checkNotNull(requireArguments().getParcelable(ARG_DEVICE_INFO ))
45
56
46
- binding.versionTv.text = " ${deviceInfo.version} "
47
- binding.vendorIdTv.text = " ${deviceInfo.vendorId} "
48
- binding.productIdTv.text = " ${deviceInfo.productId} "
49
- binding.setupCodeTv.text = " ${deviceInfo.setupPinCode} "
50
- binding.discriminatorTv.text = " ${deviceInfo.discriminator} "
51
- binding.discoveryCapabilitiesTv.text =
52
- requireContext()
53
- .getString(
54
- R .string.chip_device_info_discovery_capabilities_text,
55
- deviceInfo.discoveryCapabilities
56
- )
57
+ binding.versionEd.setText(deviceInfo.version.toString())
58
+ binding.vendorIdEd.setText(deviceInfo.vendorId.toString())
59
+ binding.productIdEd.setText(deviceInfo.productId.toString())
60
+ binding.setupCodeEd.setText(deviceInfo.setupPinCode.toString())
61
+ binding.discriminatorEd.setText(deviceInfo.discriminator.toString())
62
+ binding.serialNumberEd.setText(deviceInfo.serialNumber)
63
+ binding.discoveryCapabilitiesTv.text = " ${deviceInfo.discoveryCapabilities} "
57
64
58
65
if (deviceInfo.optionalQrCodeInfoMap.isEmpty()) {
59
66
binding.vendorTagsLabelTv.visibility = View .GONE
@@ -70,7 +77,7 @@ class CHIPDeviceDetailsFragment : Fragment() {
70
77
}
71
78
}
72
79
73
- binding.commissioningFlowTv.text = " ${ deviceInfo.commissioningFlow} "
80
+ binding.commissioningFlowEd.setText( deviceInfo.commissioningFlow.toString())
74
81
75
82
// commissioningFlow = 2 (Custom), read device info from Ledger
76
83
if (deviceInfo.commissioningFlow == 2 ) {
@@ -81,9 +88,74 @@ class CHIPDeviceDetailsFragment : Fragment() {
81
88
}
82
89
}
83
90
91
+ onBoardingPayload = deviceInfo.toSetupPayload()
92
+ binding.qrCodeTv.text =
93
+ QRCodeOnboardingPayloadGenerator (onBoardingPayload)
94
+ .payloadBase38RepresentationWithAutoTLVBuffer()
95
+
96
+ setDiscoveryCapabilitiesEditTextListener()
97
+ setQRCodeButtonListener()
98
+
84
99
return binding.root
85
100
}
86
101
102
+ private fun setDiscoveryCapabilitiesEditTextListener () {
103
+ binding.discoveryCapabilitiesEd.setText(onBoardingPayload.getRendezvousInformation().toString())
104
+ binding.discoveryCapabilitiesEd.addTextChangedListener(
105
+ object : TextWatcher {
106
+ override fun onTextChanged (value : CharSequence? , p1 : Int , p2 : Int , p3 : Int ) {
107
+ if (value.isNullOrEmpty()) {
108
+ return
109
+ }
110
+ onBoardingPayload.setRendezvousInformation(value.toString().toLong())
111
+ binding.discoveryCapabilitiesTv.text = " ${onBoardingPayload.discoveryCapabilities} "
112
+ }
113
+
114
+ override fun afterTextChanged (p0 : Editable ? ) {
115
+ // no_op
116
+ }
117
+
118
+ override fun beforeTextChanged (p0 : CharSequence? , p1 : Int , p2 : Int , p3 : Int ) {
119
+ // no_op
120
+ }
121
+ }
122
+ )
123
+ }
124
+
125
+ private fun setQRCodeButtonListener () {
126
+ binding.showQRCodeBtn.setOnClickListener {
127
+ onBoardingPayload.apply {
128
+ version = binding.versionEd.text.toString().toInt()
129
+ vendorId = binding.vendorIdEd.text.toString().toInt()
130
+ productId = binding.productIdEd.text.toString().toInt()
131
+ commissioningFlow = binding.commissioningFlowEd.text.toString().toInt()
132
+ setupPinCode = binding.setupCodeEd.text.toString().toLong()
133
+ discriminator = binding.discriminatorEd.text.toString().toInt()
134
+ val serialNumber = binding.serialNumberEd.text.toString()
135
+ try {
136
+ removeSerialNumber()
137
+ } catch (e: OnboardingPayloadException ) {
138
+ Log .d(TAG , " Serial Number not set!" , e)
139
+ }
140
+ if (serialNumber.isNotEmpty()) {
141
+ addSerialNumber(binding.serialNumberEd.text.toString())
142
+ }
143
+ }
144
+ val qrCode =
145
+ QRCodeOnboardingPayloadGenerator (onBoardingPayload)
146
+ .payloadBase38RepresentationWithAutoTLVBuffer()
147
+ Log .d(TAG , " QR Code : $qrCode " )
148
+ binding.qrCodeTv.text = qrCode
149
+ }
150
+
151
+ binding.showQRCodeUriBtn.setOnClickListener {
152
+ val qrCodeEncode = URLEncoder .encode(binding.qrCodeTv.text.toString(), " UTF-8" )
153
+ val qrCodeUri = getString(R .string.chip_device_info_qrcode_uri, qrCodeEncode)
154
+ val intent = Intent (Intent .ACTION_VIEW , Uri .parse(qrCodeUri))
155
+ startActivity(intent)
156
+ }
157
+ }
158
+
87
159
override fun onDestroyView () {
88
160
super .onDestroyView()
89
161
_binding = null
@@ -96,6 +168,7 @@ class CHIPDeviceDetailsFragment : Fragment() {
96
168
}
97
169
98
170
companion object {
171
+ private const val TAG = " CHIPDeviceDetailsFragment"
99
172
private const val ARG_DEVICE_INFO = " device_info"
100
173
101
174
@JvmStatic
0 commit comments