blob: 496017bb15218ca1e450d4b18e2cefafe28d7002 [file] [log] [blame]
/*
* Copyright (c) 2021 Project CHIP Authors
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.google.chip.chiptool.setuppayloadscanner
import android.net.Uri
import android.os.Bundle
import android.util.Base64
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.android.volley.Request
import com.android.volley.toolbox.JsonObjectRequest
import com.android.volley.toolbox.Volley
import com.google.chip.chiptool.R
import com.google.chip.chiptool.databinding.ChipLedgerInfoFragmentBinding
import com.google.chip.chiptool.util.FragmentUtil
import com.google.gson.Gson
/** Show the [CHIPDeviceInfo] from Ledger */
class CHIPLedgerDetailsFragment : Fragment() {
private lateinit var deviceInfo: CHIPDeviceInfo
private var _binding: ChipLedgerInfoFragmentBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = ChipLedgerInfoFragmentBinding.inflate(inflater, container, false)
deviceInfo = checkNotNull(requireArguments().getParcelable(ARG_DEVICE_INFO))
val queue = Volley.newRequestQueue(context)
// VID / PID
binding.vendorIdTv.text = "${deviceInfo.vendorId}"
binding.productIdTv.text = "${deviceInfo.productId}"
// Ledger api url
val url = Uri.parse(context!!.getString(R.string.dcl_api_root_url))
.buildUpon()
.appendPath("${deviceInfo.vendorId}")
.appendPath("${deviceInfo.productId}")
.build().toString()
Log.d(TAG, "Dcl request Url: $url")
// Ledger API call
val jsonObjectRequest = JsonObjectRequest(
Request.Method.GET, url, null,
{ response ->
Log.d(TAG, "Response from dcl $response")
// parse redirect Url
val responseJson = response.getJSONObject(context!!.getString(R.string.dcl_response_key))
val redirectUrl = responseJson.getString(context!!.getString(R.string.dcl_custom_flow_url_key))
Log.d(TAG, "Redirect Url from Ledger: $redirectUrl")
binding.commissioningFlowUrlTv.text = redirectUrl
// generate redirect payload
val gson = Gson()
val payloadJson = gson.toJson(deviceInfo)
val payloadBase64 = Base64.encodeToString(payloadJson.toByteArray(), Base64.DEFAULT)
val redirectUrlWithPayload= Uri.parse(redirectUrl)
.buildUpon()
.appendQueryParameter("payload", payloadBase64)
.appendQueryParameter("returnUrl", context!!.getString(R.string.custom_flow_return_url))
.build()
.toString()
Log.d(TAG, "Redirect Url with Payload: $redirectUrlWithPayload")
binding.redirectBtn.setOnClickListener {
FragmentUtil.getHost(this@CHIPLedgerDetailsFragment, Callback::class.java)
?.handleCustomFlowRedirectClicked(redirectUrlWithPayload)
}
// enable redirect button
binding.redirectBtn.visibility = View.VISIBLE
},
{ error ->
Log.e(TAG, "Dcl request failed: $error")
binding.commissioningFlowUrlTv.text = context!!.getString(R.string.chip_ledger_info_commissioning_flow_url_not_available)
}
)
queue.add(jsonObjectRequest)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
/** Interface for notifying the host. */
interface Callback {
/** Notifies listener of Custom flow redirect button click. */
fun handleCustomFlowRedirectClicked(redirectUrl: String)
}
companion object {
private const val TAG = "CUSTOM_FLOW"
private const val ARG_DEVICE_INFO = "device_info"
@JvmStatic
fun newInstance(deviceInfo: CHIPDeviceInfo): CHIPLedgerDetailsFragment {
return CHIPLedgerDetailsFragment().apply {
arguments = Bundle(1).apply { putParcelable(ARG_DEVICE_INFO, deviceInfo) }
}
}
}
}