| /* |
| * 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) } |
| } |
| } |
| } |
| } |