From eb89a9a4c5aedb04b0bb386f8d03e9c46a3cb016 Mon Sep 17 00:00:00 2001 From: joonhaengHeo <85541460+joonhaengHeo@users.noreply.github.com> Date: Tue, 6 Jun 2023 00:30:23 +0900 Subject: [PATCH] [Android] Modify to use onboardingpayload library in CHIPTool (#26941) * Modify to use onboardingpayload library * restyle * Fix Android tv-app build error * Modify android app test data * restyle * Fix build error --- BUILD.gn | 2 +- .../google/chip/chiptool/CHIPToolActivity.kt | 14 +-- .../setuppayloadscanner/BarcodeFragment.kt | 25 ++--- .../setuppayloadscanner/CHIPDeviceInfo.kt | 11 +- .../setuppayloadscanner/QrCodeInfo.kt | 4 +- .../tv/server/fragments/QrCodeFragment.java | 19 ++-- examples/tv-app/android/BUILD.gn | 2 +- scripts/build/builders/android.py | 14 +-- .../dry_run_android-arm64-chip-tool.txt | 4 +- .../java/OnboardingPayloadParser-JNI.cpp | 105 ++++++++++++------ .../ManualOnboardingPayloadParser.kt | 1 + .../onboardingpayload/OnboardingPayload.kt | 13 ++- 12 files changed, 128 insertions(+), 86 deletions(-) diff --git a/BUILD.gn b/BUILD.gn index dfe6cbbf4850f3..6cc0d55261ff2b 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -179,8 +179,8 @@ if (current_toolchain != "${dir_pw_toolchain}/default:default") { deps += [ "${chip_root}/src/app/server/java", "${chip_root}/src/controller/java", + "${chip_root}/src/controller/java:onboarding_payload", "${chip_root}/src/platform/android:java", - "${chip_root}/src/setup_payload/java", ] } diff --git a/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/CHIPToolActivity.kt b/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/CHIPToolActivity.kt index 7797aef19fa233..59c75e2a976a59 100644 --- a/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/CHIPToolActivity.kt +++ b/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/CHIPToolActivity.kt @@ -28,9 +28,9 @@ import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment -import chip.setuppayload.SetupPayload -import chip.setuppayload.SetupPayloadParser -import chip.setuppayload.SetupPayloadParser.UnrecognizedQrCodeException +import chip.onboardingpayload.OnboardingPayload +import chip.onboardingpayload.OnboardingPayloadParser +import chip.onboardingpayload.UnrecognizedQrCodeException import com.google.chip.chiptool.provisioning.AddressCommissioningFragment import com.google.chip.chiptool.provisioning.DeviceProvisioningFragment import com.google.chip.chiptool.provisioning.EnterNetworkFragment @@ -151,10 +151,10 @@ class CHIPToolActivity : val uri = records[0].toUri() if (!uri?.scheme.equals("mt", true)) return - lateinit var setupPayload: SetupPayload + lateinit var setupPayload: OnboardingPayload try { setupPayload = - SetupPayloadParser().parseQrCode(uri.toString().toUpperCase()) + OnboardingPayloadParser().parseQrCode(uri.toString().toUpperCase()) } catch (ex: UnrecognizedQrCodeException) { Log.e(TAG, "Unrecognized QR Code", ex) Toast.makeText(this, "Unrecognized QR Code", Toast.LENGTH_SHORT).show() @@ -208,10 +208,10 @@ class CHIPToolActivity : val payload = JSONObject(payloadString) // parse payload from JSON - val setupPayload = SetupPayload() + val setupPayload = OnboardingPayload() // set defaults setupPayload.discoveryCapabilities = setOf() - setupPayload.optionalQRCodeInfo = mapOf() + setupPayload.optionalQRCodeInfo = HashMap() // read from payload setupPayload.version = payload.getInt("version") diff --git a/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/setuppayloadscanner/BarcodeFragment.kt b/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/setuppayloadscanner/BarcodeFragment.kt index e591fd64ebd948..0e911d3233d278 100644 --- a/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/setuppayloadscanner/BarcodeFragment.kt +++ b/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/setuppayloadscanner/BarcodeFragment.kt @@ -36,11 +36,10 @@ import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat.checkSelfPermission import androidx.fragment.app.Fragment -import chip.setuppayload.SetupPayload -import chip.setuppayload.SetupPayloadParser -import chip.setuppayload.SetupPayloadParser.SetupPayloadException -import chip.setuppayload.SetupPayloadParser.InvalidEntryCodeFormatException -import chip.setuppayload.SetupPayloadParser.UnrecognizedQrCodeException +import chip.onboardingpayload.OnboardingPayload +import chip.onboardingpayload.OnboardingPayloadException +import chip.onboardingpayload.OnboardingPayloadParser +import chip.onboardingpayload.UnrecognizedQrCodeException import com.google.chip.chiptool.R import com.google.chip.chiptool.SelectActionFragment import com.google.chip.chiptool.databinding.BarcodeFragmentBinding @@ -182,14 +181,12 @@ class BarcodeFragment : Fragment() { } private fun handleInputQrCode(qrCode: String) { - lateinit var payload: SetupPayload - var isShortDiscriminator = false + lateinit var payload: OnboardingPayload try { - payload = SetupPayloadParser().parseQrCode(qrCode) - } catch (ex: SetupPayloadException) { + payload = OnboardingPayloadParser().parseQrCode(qrCode) + } catch (ex: OnboardingPayloadException) { try { - payload = SetupPayloadParser().parseManualEntryCode(qrCode) - isShortDiscriminator = true + payload = OnboardingPayloadParser().parseManualPairingCode(qrCode) } catch (ex: Exception) { Log.e(TAG, "Unrecognized Manual Pairing Code", ex) Toast.makeText(requireContext(), "Unrecognized Manual Pairing Code", Toast.LENGTH_SHORT).show() @@ -199,14 +196,14 @@ class BarcodeFragment : Fragment() { Toast.makeText(requireContext(), "Unrecognized QR Code", Toast.LENGTH_SHORT).show() } FragmentUtil.getHost(this@BarcodeFragment, Callback::class.java) - ?.onCHIPDeviceInfoReceived(CHIPDeviceInfo.fromSetupPayload(payload, isShortDiscriminator)) + ?.onCHIPDeviceInfoReceived(CHIPDeviceInfo.fromSetupPayload(payload)) } private fun handleScannedQrCode(barcode: Barcode) { Handler(Looper.getMainLooper()).post { - lateinit var payload: SetupPayload + lateinit var payload: OnboardingPayload try { - payload = SetupPayloadParser().parseQrCode(barcode.displayValue) + payload = barcode.displayValue?.let { OnboardingPayloadParser().parseQrCode(it) } ?: return@post } catch (ex: UnrecognizedQrCodeException) { Log.e(TAG, "Unrecognized QR Code", ex) Toast.makeText(requireContext(), "Unrecognized QR Code", Toast.LENGTH_SHORT).show() diff --git a/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/setuppayloadscanner/CHIPDeviceInfo.kt b/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/setuppayloadscanner/CHIPDeviceInfo.kt index d4a76221365080..fc57a96c222ab5 100644 --- a/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/setuppayloadscanner/CHIPDeviceInfo.kt +++ b/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/setuppayloadscanner/CHIPDeviceInfo.kt @@ -19,8 +19,8 @@ package com.google.chip.chiptool.setuppayloadscanner import android.os.Parcelable -import chip.setuppayload.DiscoveryCapability -import chip.setuppayload.SetupPayload +import chip.onboardingpayload.DiscoveryCapability +import chip.onboardingpayload.OnboardingPayload import kotlinx.parcelize.Parcelize /** Class to hold the CHIP device information. */ @@ -36,16 +36,15 @@ data class CHIPDeviceInfo( val discoveryCapabilities: Set = setOf(), val isShortDiscriminator: Boolean = false, val ipAddress: String? = null, - ) : Parcelable { companion object { - fun fromSetupPayload(setupPayload: SetupPayload, isShortDiscriminator: Boolean = false): CHIPDeviceInfo { + fun fromSetupPayload(setupPayload: OnboardingPayload): CHIPDeviceInfo { return CHIPDeviceInfo( setupPayload.version, setupPayload.vendorId, setupPayload.productId, - setupPayload.discriminator, + setupPayload.getLongDiscriminatorValue(), setupPayload.setupPinCode, setupPayload.commissioningFlow, setupPayload.optionalQRCodeInfo.mapValues { (_, info) -> @@ -57,7 +56,7 @@ data class CHIPDeviceInfo( ) }, setupPayload.discoveryCapabilities, - isShortDiscriminator + setupPayload.hasShortDiscriminator ) } } diff --git a/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/setuppayloadscanner/QrCodeInfo.kt b/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/setuppayloadscanner/QrCodeInfo.kt index 5ad27868b95ea0..c9b2367ee998ba 100644 --- a/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/setuppayloadscanner/QrCodeInfo.kt +++ b/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/setuppayloadscanner/QrCodeInfo.kt @@ -1,13 +1,13 @@ package com.google.chip.chiptool.setuppayloadscanner import android.os.Parcelable -import chip.setuppayload.OptionalQRCodeInfo.OptionalQRCodeInfoType +import chip.onboardingpayload.OptionalQRCodeInfo.OptionalQRCodeInfoType import kotlinx.parcelize.Parcelize @Parcelize data class QrCodeInfo( val tag: Int, val type: OptionalQRCodeInfoType, - val data: String, + val data: String?, val intDataValue: Int ) : Parcelable diff --git a/examples/tv-app/android/App/platform-app/src/main/java/com/matter/tv/server/fragments/QrCodeFragment.java b/examples/tv-app/android/App/platform-app/src/main/java/com/matter/tv/server/fragments/QrCodeFragment.java index 04b17bd322e955..abd660bb8a57f1 100644 --- a/examples/tv-app/android/App/platform-app/src/main/java/com/matter/tv/server/fragments/QrCodeFragment.java +++ b/examples/tv-app/android/App/platform-app/src/main/java/com/matter/tv/server/fragments/QrCodeFragment.java @@ -9,9 +9,10 @@ import android.widget.SeekBar; import android.widget.TextView; import androidx.fragment.app.Fragment; -import chip.setuppayload.DiscoveryCapability; -import chip.setuppayload.SetupPayload; -import chip.setuppayload.SetupPayloadParser; +import chip.onboardingpayload.DiscoveryCapability; +import chip.onboardingpayload.OnboardingPayload; +import chip.onboardingpayload.OnboardingPayloadException; +import chip.onboardingpayload.OnboardingPayloadParser; import com.matter.tv.server.QRUtils; import com.matter.tv.server.R; import com.matter.tv.server.service.MatterServant; @@ -58,24 +59,24 @@ public void onResume() { // TODO: Get these parameters from PreferencesConfigurationManager HashSet discoveryCapabilities = new HashSet<>(); discoveryCapabilities.add(DiscoveryCapability.ON_NETWORK); - SetupPayload payload = - new SetupPayload(0, 9050, 65279, 0, discoveryCapabilities, 3840, 20202021); + OnboardingPayload payload = + new OnboardingPayload(0, 9050, 65279, 0, discoveryCapabilities, 3840, 20202021); - SetupPayloadParser parser = new SetupPayloadParser(); + OnboardingPayloadParser parser = new OnboardingPayloadParser(); try { String qrCode = parser.getQrCodeFromPayload(payload); mQrCodeTxt.setText(qrCode); Bitmap qrCodeBitmap = QRUtils.createQRCodeBitmap(qrCode, 800, 800); mQrCodeImg.setImageBitmap(qrCodeBitmap); - } catch (SetupPayloadParser.SetupPayloadException e) { + } catch (OnboardingPayloadException e) { e.printStackTrace(); } try { - String manualPairingCode = parser.getManualEntryCodeFromPayload(payload); + String manualPairingCode = parser.getManualPairingCodeFromPayload(payload); mManualPairingCodeTxt.setText("ManualPairingCode:" + manualPairingCode); - } catch (SetupPayloadParser.SetupPayloadException e) { + } catch (OnboardingPayloadException e) { e.printStackTrace(); } diff --git a/examples/tv-app/android/BUILD.gn b/examples/tv-app/android/BUILD.gn index b414dd4d593746..115d5dfb2a4cf0 100644 --- a/examples/tv-app/android/BUILD.gn +++ b/examples/tv-app/android/BUILD.gn @@ -164,7 +164,7 @@ group("default") { ":java", ":jni", "${chip_root}/src/app/server/java", + "${chip_root}/src/controller/java:onboarding_payload", "${chip_root}/src/platform/android:java", - "${chip_root}/src/setup_payload/java", ] } diff --git a/scripts/build/builders/android.py b/scripts/build/builders/android.py index 9fd778eac6c46a..11a29bc3bdaf9a 100644 --- a/scripts/build/builders/android.py +++ b/scripts/build/builders/android.py @@ -210,7 +210,7 @@ def copyToSrcAndroid(self): # If we unify the JNI libraries, libc++_shared.so may not be needed anymore, which could # be another path of resolving this inconsistency. for libName in [ - "libSetupPayloadParser.so", + "libOnboardingPayload.so", "libCHIPController.so", "libc++_shared.so", ]: @@ -226,7 +226,7 @@ def copyToSrcAndroid(self): jars = { "CHIPController.jar": "src/controller/java/CHIPController.jar", - "SetupPayloadParser.jar": "src/setup_payload/java/SetupPayloadParser.jar", + "OnboardingPayload.jar": "src/controller/java/OnboardingPayload.jar", "AndroidPlatform.jar": "src/platform/android/AndroidPlatform.jar", "libCHIPTlv.jar": "src/controller/java/libCHIPTlv.jar", } @@ -478,11 +478,11 @@ def _build(self): self.root, "examples/", self.app.ExampleName(), "android/App/app/libs" ) - libs = ["libSetupPayloadParser.so", + libs = ["libOnboardingPayload.so", "libc++_shared.so", "libTvApp.so"] jars = { - "SetupPayloadParser.jar": "third_party/connectedhomeip/src/setup_payload/java/SetupPayloadParser.jar", + "OnboardingPayload.jar": "third_party/connectedhomeip/src/controller/java/OnboardingPayload.jar", "AndroidPlatform.jar": "third_party/connectedhomeip/src/platform/android/AndroidPlatform.jar", "CHIPAppServer.jar": "third_party/connectedhomeip/src/app/server/java/CHIPAppServer.jar", "TvApp.jar": "TvApp.jar", @@ -535,12 +535,12 @@ def build_outputs(self): "AndroidPlatform.jar": os.path.join( self.output_dir, "lib", "src/platform/android/AndroidPlatform.jar" ), - "SetupPayloadParser.jar": os.path.join( + "OnboardingPayload.jar": os.path.join( self.output_dir, "lib", - "src/setup_payload/java/SetupPayloadParser.jar", + "src/controller/java/OnboardingPayload.jar", ), - "jni/%s/libSetupPayloadParser.so" + "jni/%s/libOnboardingPayload.so" % self.board.AbiName(): os.path.join( self.output_dir, "lib", diff --git a/scripts/build/testdata/dry_run_android-arm64-chip-tool.txt b/scripts/build/testdata/dry_run_android-arm64-chip-tool.txt index ebd98f24bf2ac8..6adfec53c647bf 100644 --- a/scripts/build/testdata/dry_run_android-arm64-chip-tool.txt +++ b/scripts/build/testdata/dry_run_android-arm64-chip-tool.txt @@ -19,7 +19,7 @@ ninja -C {out}/android-arm64-chip-tool # Prepare Native libs android-arm64-chip-tool mkdir -p {root}/examples/android/CHIPTool/app/libs/jniLibs/arm64-v8a -cp {out}/android-arm64-chip-tool/lib/jni/arm64-v8a/libSetupPayloadParser.so {root}/examples/android/CHIPTool/app/libs/jniLibs/arm64-v8a/libSetupPayloadParser.so +cp {out}/android-arm64-chip-tool/lib/jni/arm64-v8a/libOnboardingPayload.so {root}/examples/android/CHIPTool/app/libs/jniLibs/arm64-v8a/libOnboardingPayload.so cp {out}/android-arm64-chip-tool/lib/jni/arm64-v8a/libCHIPController.so {root}/examples/android/CHIPTool/app/libs/jniLibs/arm64-v8a/libCHIPController.so @@ -27,7 +27,7 @@ cp {out}/android-arm64-chip-tool/lib/jni/arm64-v8a/libc++_shared.so {root}/examp cp {out}/android-arm64-chip-tool/lib/src/controller/java/CHIPController.jar {root}/examples/android/CHIPTool/app/libs/CHIPController.jar -cp {out}/android-arm64-chip-tool/lib/src/setup_payload/java/SetupPayloadParser.jar {root}/examples/android/CHIPTool/app/libs/SetupPayloadParser.jar +cp {out}/android-arm64-chip-tool/lib/src/controller/java/OnboardingPayload.jar {root}/examples/android/CHIPTool/app/libs/OnboardingPayload.jar cp {out}/android-arm64-chip-tool/lib/src/platform/android/AndroidPlatform.jar {root}/examples/android/CHIPTool/app/libs/AndroidPlatform.jar diff --git a/src/controller/java/OnboardingPayloadParser-JNI.cpp b/src/controller/java/OnboardingPayloadParser-JNI.cpp index cea62189fd0850..1c484eca5142a5 100644 --- a/src/controller/java/OnboardingPayloadParser-JNI.cpp +++ b/src/controller/java/OnboardingPayloadParser-JNI.cpp @@ -22,13 +22,15 @@ using namespace chip; #define SETUP_PAYLOAD_PARSER_JNI_ERROR_METHOD_NOT_FOUND _SETUP_PAYLOAD_PARSER_JNI_ERROR(2) #define SETUP_PAYLOAD_PARSER_JNI_ERROR_FIELD_NOT_FOUND _SETUP_PAYLOAD_PARSER_JNI_ERROR(3) -#define JNI_METHOD(RETURN, METHOD_NAME) extern "C" JNIEXPORT RETURN JNICALL Java_chip_setuppayload_SetupPayloadParser_##METHOD_NAME +#define JNI_METHOD(RETURN, METHOD_NAME) \ + extern "C" JNIEXPORT RETURN JNICALL Java_chip_onboardingpayload_OnboardingPayloadParser_##METHOD_NAME static jobject TransformSetupPayload(JNIEnv * env, SetupPayload & payload); static jobject CreateCapabilitiesHashSet(JNIEnv * env, RendezvousInformationFlags flags); static void TransformSetupPayloadFromJobject(JNIEnv * env, jobject jPayload, SetupPayload & payload); static void CreateCapabilitiesFromHashSet(JNIEnv * env, jobject discoveryCapabilitiesObj, RendezvousInformationFlags & flags); static CHIP_ERROR ThrowUnrecognizedQRCodeException(JNIEnv * env, jstring qrCodeObj); +static CHIP_ERROR ThrowOnboardingPayloadException(JNIEnv * env, CHIP_ERROR errToThrow); jint JNI_OnLoad(JavaVM * jvm, void * reserved) { @@ -50,8 +52,11 @@ JNI_METHOD(jobject, fetchPayloadFromQrCode)(JNIEnv * env, jobject self, jstring if (skipPayloadValidation == JNI_FALSE && !payload.isValidQRCodePayload()) { - jclass exceptionCls = env->FindClass("chip/setuppayload/SetupPayloadParser$SetupPayloadException"); - JniReferences::GetInstance().ThrowError(env, exceptionCls, CHIP_ERROR_INVALID_ARGUMENT); + ThrowOnboardingPayloadException(env, err); + if (err != CHIP_NO_ERROR) + { + ChipLogError(SetupPayload, "Error throwing OnboardingPayloadException: %" CHIP_ERROR_FORMAT, err.Format()); + } return nullptr; } @@ -70,7 +75,7 @@ JNI_METHOD(jobject, fetchPayloadFromQrCode)(JNIEnv * env, jobject self, jstring jobject TransformSetupPayload(JNIEnv * env, SetupPayload & payload) { - jclass setupPayloadClass = env->FindClass("chip/setuppayload/SetupPayload"); + jclass setupPayloadClass = env->FindClass("chip/onboardingpayload/OnboardingPayload"); jmethodID setupConstr = env->GetMethodID(setupPayloadClass, "", "()V"); jobject setupPayload = env->NewObject(setupPayloadClass, setupConstr); @@ -106,50 +111,51 @@ jobject TransformSetupPayload(JNIEnv * env, SetupPayload & payload) CreateCapabilitiesHashSet(env, payload.rendezvousInformation.ValueOr(RendezvousInformationFlag::kNone))); jmethodID addOptionalInfoMid = - env->GetMethodID(setupPayloadClass, "addOptionalQRCodeInfo", "(Lchip/setuppayload/OptionalQRCodeInfo;)V"); + env->GetMethodID(setupPayloadClass, "addOptionalQRCodeInfo", "(Lchip/onboardingpayload/OptionalQRCodeInfo;)V"); std::vector optional_info = payload.getAllOptionalVendorData(); for (OptionalQRCodeInfo & info : optional_info) { - jclass optionalInfoClass = env->FindClass("chip/setuppayload/OptionalQRCodeInfo"); + jclass optionalInfoClass = env->FindClass("chip/onboardingpayload/OptionalQRCodeInfo"); jobject optionalInfo = env->AllocObject(optionalInfoClass); jfieldID tag = env->GetFieldID(optionalInfoClass, "tag", "I"); - jfieldID type = env->GetFieldID(optionalInfoClass, "type", "Lchip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;"); - jfieldID data = env->GetFieldID(optionalInfoClass, "data", "Ljava/lang/String;"); + jfieldID type = + env->GetFieldID(optionalInfoClass, "type", "Lchip/onboardingpayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;"); + jfieldID data = env->GetFieldID(optionalInfoClass, "data", "Ljava/lang/String;"); jfieldID int32 = env->GetFieldID(optionalInfoClass, "int32", "I"); env->SetIntField(optionalInfo, tag, info.tag); - jclass enumClass = env->FindClass("chip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType"); + jclass enumClass = env->FindClass("chip/onboardingpayload/OptionalQRCodeInfo$OptionalQRCodeInfoType"); jfieldID enumType = nullptr; switch (info.type) { case optionalQRCodeInfoTypeString: - enumType = - env->GetStaticFieldID(enumClass, "TYPE_STRING", "Lchip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;"); + enumType = env->GetStaticFieldID(enumClass, "TYPE_STRING", + "Lchip/onboardingpayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;"); break; case optionalQRCodeInfoTypeInt32: - enumType = - env->GetStaticFieldID(enumClass, "TYPE_INT32", "Lchip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;"); + enumType = env->GetStaticFieldID(enumClass, "TYPE_INT32", + "Lchip/onboardingpayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;"); break; case optionalQRCodeInfoTypeInt64: - enumType = - env->GetStaticFieldID(enumClass, "TYPE_INT64", "Lchip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;"); + enumType = env->GetStaticFieldID(enumClass, "TYPE_INT64", + "Lchip/onboardingpayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;"); break; case optionalQRCodeInfoTypeUInt32: - enumType = - env->GetStaticFieldID(enumClass, "TYPE_UINT32", "Lchip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;"); + enumType = env->GetStaticFieldID(enumClass, "TYPE_UINT32", + "Lchip/onboardingpayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;"); break; case optionalQRCodeInfoTypeUInt64: - enumType = - env->GetStaticFieldID(enumClass, "TYPE_UINT64", "Lchip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;"); + enumType = env->GetStaticFieldID(enumClass, "TYPE_UINT64", + "Lchip/onboardingpayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;"); break; case optionalQRCodeInfoTypeUnknown: default: // Optional Type variable has to set any value. - enumType = - env->GetStaticFieldID(enumClass, "TYPE_UNKNOWN", "Lchip/setuppayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;"); + enumType = env->GetStaticFieldID(enumClass, "TYPE_UNKNOWN", + "Lchip/onboardingpayload/OptionalQRCodeInfo$OptionalQRCodeInfoType;"); break; } @@ -175,24 +181,25 @@ jobject CreateCapabilitiesHashSet(JNIEnv * env, RendezvousInformationFlags flags jobject capabilitiesHashSet = env->NewObject(hashSetClass, hashSetConstructor); jmethodID hashSetAddMethod = env->GetMethodID(hashSetClass, "add", "(Ljava/lang/Object;)Z"); - jclass capabilityEnum = env->FindClass("chip/setuppayload/DiscoveryCapability"); + jclass capabilityEnum = env->FindClass("chip/onboardingpayload/DiscoveryCapability"); if (flags.Has(chip::RendezvousInformationFlag::kBLE)) { - jfieldID bleCapability = env->GetStaticFieldID(capabilityEnum, "BLE", "Lchip/setuppayload/DiscoveryCapability;"); + jfieldID bleCapability = env->GetStaticFieldID(capabilityEnum, "BLE", "Lchip/onboardingpayload/DiscoveryCapability;"); jobject enumObj = env->GetStaticObjectField(capabilityEnum, bleCapability); env->CallBooleanMethod(capabilitiesHashSet, hashSetAddMethod, enumObj); } if (flags.Has(chip::RendezvousInformationFlag::kSoftAP)) { - jfieldID softApCapability = env->GetStaticFieldID(capabilityEnum, "SOFT_AP", "Lchip/setuppayload/DiscoveryCapability;"); - jobject enumObj = env->GetStaticObjectField(capabilityEnum, softApCapability); + jfieldID softApCapability = + env->GetStaticFieldID(capabilityEnum, "SOFT_AP", "Lchip/onboardingpayload/DiscoveryCapability;"); + jobject enumObj = env->GetStaticObjectField(capabilityEnum, softApCapability); env->CallBooleanMethod(capabilitiesHashSet, hashSetAddMethod, enumObj); } if (flags.Has(chip::RendezvousInformationFlag::kOnNetwork)) { jfieldID onNetworkCapability = - env->GetStaticFieldID(capabilityEnum, "ON_NETWORK", "Lchip/setuppayload/DiscoveryCapability;"); + env->GetStaticFieldID(capabilityEnum, "ON_NETWORK", "Lchip/onboardingpayload/DiscoveryCapability;"); jobject enumObj = env->GetStaticObjectField(capabilityEnum, onNetworkCapability); env->CallBooleanMethod(capabilitiesHashSet, hashSetAddMethod, enumObj); } @@ -210,8 +217,11 @@ JNI_METHOD(jstring, getQrCodeFromPayload)(JNIEnv * env, jobject self, jobject se err = QRCodeSetupPayloadGenerator(payload).payloadBase38Representation(qrString); if (err != CHIP_NO_ERROR) { - jclass exceptionCls = env->FindClass("chip/setuppayload/SetupPayloadParser$SetupPayloadException"); - JniReferences::GetInstance().ThrowError(env, exceptionCls, err); + ThrowOnboardingPayloadException(env, err); + if (err != CHIP_NO_ERROR) + { + ChipLogError(SetupPayload, "Error throwing OnboardingPayloadException: %" CHIP_ERROR_FORMAT, err.Format()); + } return nullptr; } @@ -220,7 +230,7 @@ JNI_METHOD(jstring, getQrCodeFromPayload)(JNIEnv * env, jobject self, jobject se void TransformSetupPayloadFromJobject(JNIEnv * env, jobject jPayload, SetupPayload & payload) { - jclass setupPayloadClass = env->FindClass("chip/setuppayload/SetupPayload"); + jclass setupPayloadClass = env->FindClass("chip/onboardingpayload/OnboardingPayload"); jfieldID version = env->GetFieldID(setupPayloadClass, "version", "I"); jfieldID vendorId = env->GetFieldID(setupPayloadClass, "vendorId", "I"); @@ -257,9 +267,9 @@ void CreateCapabilitiesFromHashSet(JNIEnv * env, jobject discoveryCapabilitiesOb jmethodID hashSetContainsMethod = env->GetMethodID(hashSetClass, "contains", "(Ljava/lang/Object;)Z"); jboolean contains; - jclass capabilityEnum = env->FindClass("chip/setuppayload/DiscoveryCapability"); + jclass capabilityEnum = env->FindClass("chip/onboardingpayload/DiscoveryCapability"); - jfieldID bleCapability = env->GetStaticFieldID(capabilityEnum, "BLE", "Lchip/setuppayload/DiscoveryCapability;"); + jfieldID bleCapability = env->GetStaticFieldID(capabilityEnum, "BLE", "Lchip/onboardingpayload/DiscoveryCapability;"); jobject bleObj = env->GetStaticObjectField(capabilityEnum, bleCapability); contains = env->CallBooleanMethod(discoveryCapabilitiesObj, hashSetContainsMethod, bleObj); if (contains) @@ -267,7 +277,7 @@ void CreateCapabilitiesFromHashSet(JNIEnv * env, jobject discoveryCapabilitiesOb flags.Set(chip::RendezvousInformationFlag::kBLE); } - jfieldID softApCapability = env->GetStaticFieldID(capabilityEnum, "SOFT_AP", "Lchip/setuppayload/DiscoveryCapability;"); + jfieldID softApCapability = env->GetStaticFieldID(capabilityEnum, "SOFT_AP", "Lchip/onboardingpayload/DiscoveryCapability;"); jobject softApObj = env->GetStaticObjectField(capabilityEnum, softApCapability); contains = env->CallBooleanMethod(discoveryCapabilitiesObj, hashSetContainsMethod, softApObj); if (contains) @@ -275,9 +285,10 @@ void CreateCapabilitiesFromHashSet(JNIEnv * env, jobject discoveryCapabilitiesOb flags.Set(chip::RendezvousInformationFlag::kSoftAP); } - jfieldID onNetworkCapability = env->GetStaticFieldID(capabilityEnum, "ON_NETWORK", "Lchip/setuppayload/DiscoveryCapability;"); - jobject onNetworkObj = env->GetStaticObjectField(capabilityEnum, onNetworkCapability); - contains = env->CallBooleanMethod(discoveryCapabilitiesObj, hashSetContainsMethod, onNetworkObj); + jfieldID onNetworkCapability = + env->GetStaticFieldID(capabilityEnum, "ON_NETWORK", "Lchip/onboardingpayload/DiscoveryCapability;"); + jobject onNetworkObj = env->GetStaticObjectField(capabilityEnum, onNetworkCapability); + contains = env->CallBooleanMethod(discoveryCapabilitiesObj, hashSetContainsMethod, onNetworkObj); if (contains) { flags.Set(chip::RendezvousInformationFlag::kOnNetwork); @@ -292,7 +303,7 @@ CHIP_ERROR ThrowUnrecognizedQRCodeException(JNIEnv * env, jstring qrCodeObj) env->ExceptionClear(); - exceptionCls = env->FindClass("chip/setuppayload/SetupPayloadParser$UnrecognizedQrCodeException"); + exceptionCls = env->FindClass("chip/onboardingpayload/UnrecognizedQrCodeException"); VerifyOrReturnError(exceptionCls != NULL, SETUP_PAYLOAD_PARSER_JNI_ERROR_TYPE_NOT_FOUND); exceptionConstructor = env->GetMethodID(exceptionCls, "", "(Ljava/lang/String;)V"); VerifyOrReturnError(exceptionConstructor != NULL, SETUP_PAYLOAD_PARSER_JNI_ERROR_METHOD_NOT_FOUND); @@ -302,3 +313,25 @@ CHIP_ERROR ThrowUnrecognizedQRCodeException(JNIEnv * env, jstring qrCodeObj) env->Throw(exception); return CHIP_NO_ERROR; } + +CHIP_ERROR ThrowOnboardingPayloadException(JNIEnv * env, CHIP_ERROR errToThrow) +{ + jclass exceptionCls = nullptr; + jmethodID exceptionConstructor = nullptr; + jthrowable exception = nullptr; + + env->ExceptionClear(); + + exceptionCls = env->FindClass("chip/onboardingpayload/OnboardingPayloadException"); + VerifyOrReturnError(exceptionCls != NULL, SETUP_PAYLOAD_PARSER_JNI_ERROR_TYPE_NOT_FOUND); + exceptionConstructor = env->GetMethodID(exceptionCls, "", "(Ljava/lang/String;)V"); + VerifyOrReturnError(exceptionConstructor != NULL, SETUP_PAYLOAD_PARSER_JNI_ERROR_METHOD_NOT_FOUND); + + jstring jerrStr = env->NewStringUTF(ErrorStr(errToThrow)); + + exception = (jthrowable) env->NewObject(exceptionCls, exceptionConstructor, jerrStr); + VerifyOrReturnError(exception != NULL, SETUP_PAYLOAD_PARSER_JNI_ERROR_EXCEPTION_THROWN); + + env->Throw(exception); + return CHIP_NO_ERROR; +} diff --git a/src/controller/java/src/chip/onboardingpayload/ManualOnboardingPayloadParser.kt b/src/controller/java/src/chip/onboardingpayload/ManualOnboardingPayloadParser.kt index ec866ad9df5d9e..0f925a973bfde4 100644 --- a/src/controller/java/src/chip/onboardingpayload/ManualOnboardingPayloadParser.kt +++ b/src/controller/java/src/chip/onboardingpayload/ManualOnboardingPayloadParser.kt @@ -97,6 +97,7 @@ class ManualOnboardingPayloadParser(decimalRepresentation: String) { outPayload.setupPinCode = setUpPINCode require(kManualSetupDiscriminatorFieldLengthInBits <= 8) { "Won't fit in UInt8" } outPayload.discriminator = discriminator + outPayload.hasShortDiscriminator = true } companion object { diff --git a/src/controller/java/src/chip/onboardingpayload/OnboardingPayload.kt b/src/controller/java/src/chip/onboardingpayload/OnboardingPayload.kt index 660d0a47d1ffdb..a8432a36d474aa 100644 --- a/src/controller/java/src/chip/onboardingpayload/OnboardingPayload.kt +++ b/src/controller/java/src/chip/onboardingpayload/OnboardingPayload.kt @@ -847,7 +847,14 @@ class OnboardingPayload( return discriminator } return longToShortValue(discriminator) - } + } + + fun getLongDiscriminatorValue(): Int { + if (hasShortDiscriminator) { + return shortToLongValue(discriminator) + } + return discriminator + } private fun checkPayloadCommonConstraints(): Boolean { if (version != 0) { @@ -885,6 +892,10 @@ class OnboardingPayload( private fun longToShortValue(longValue: Int): Int { return (longValue shr (kDiscriminatorLongBits - kDiscriminatorShortBits)) } + + private fun shortToLongValue(shortValue: Int): Int { + return (shortValue shl (kDiscriminatorLongBits - kDiscriminatorShortBits)) + } } }