From 178bfcc9e408a9363bd8a9cab860c72f549a629c Mon Sep 17 00:00:00 2001 From: Sharad Binjola Date: Fri, 12 Apr 2024 13:39:41 -0700 Subject: [PATCH] Decouple android CHIP IM APIs from CHIPController to CHIPInteractionModel --- examples/tv-casting-app/android/BUILD.gn | 3 + scripts/build/builders/android.py | 5 + .../generators/java/ChipClusters_java.jinja | 8 +- .../several_clusters/java/ChipClusters.java | 8 +- .../java/AndroidInteractionClient.cpp | 1 - src/controller/java/BUILD.gn | 130 ++++++++++++++++-- .../java/CHIPInteractionClient-JNI.cpp | 129 +++++++++++++++++ .../java/CHIPInteractionClient-JNI.h | 24 ++++ .../chip/devicecontroller/ChipClusters.java | 8 +- .../ChipDeviceController.java | 79 ++--------- .../ChipInteractionClient.java | 76 ++++++++++ 11 files changed, 382 insertions(+), 89 deletions(-) create mode 100644 src/controller/java/CHIPInteractionClient-JNI.cpp create mode 100644 src/controller/java/CHIPInteractionClient-JNI.h create mode 100644 src/controller/java/src/chip/devicecontroller/ChipInteractionClient.java diff --git a/examples/tv-casting-app/android/BUILD.gn b/examples/tv-casting-app/android/BUILD.gn index 52a3342773175b..416570417b0794 100644 --- a/examples/tv-casting-app/android/BUILD.gn +++ b/examples/tv-casting-app/android/BUILD.gn @@ -55,6 +55,7 @@ shared_library("jni") { "${chip_root}/examples/tv-casting-app/tv-casting-common", "${chip_root}/src/app/data-model:heap", "${chip_root}/src/app/server/java:jni", + "${chip_root}/src/controller/java:android_chip_im_jni", "${chip_root}/src/lib", "${chip_root}/third_party/inipp", ] @@ -72,6 +73,7 @@ android_library("java") { deps = [ ":android", "${chip_root}/src/app/server/java", + "${chip_root}/src/controller/java:android_chip_im", "${chip_root}/src/platform/android:java", "${chip_root}/third_party/android_deps:annotation", ] @@ -136,6 +138,7 @@ group("default") { ":java", ":jni", "${chip_root}/src/app/server/java", + "${chip_root}/src/controller/java:android_chip_im", "${chip_root}/src/platform/android:java", ] } diff --git a/scripts/build/builders/android.py b/scripts/build/builders/android.py index 0f7754b5553656..bd2c90c28136d6 100644 --- a/scripts/build/builders/android.py +++ b/scripts/build/builders/android.py @@ -243,6 +243,7 @@ def copyToSrcAndroid(self): jars = { "CHIPController.jar": "src/controller/java/CHIPController.jar", + "CHIPInteractionModel.jar": "src/controller/java/CHIPInteractionModel.jar", "OnboardingPayload.jar": "src/controller/java/OnboardingPayload.jar", "AndroidPlatform.jar": "src/platform/android/AndroidPlatform.jar", "libMatterJson.jar": "src/controller/java/libMatterJson.jar", @@ -489,6 +490,7 @@ def _build(self): jars = { "AndroidPlatform.jar": "third_party/connectedhomeip/src/platform/android/AndroidPlatform.jar", "CHIPAppServer.jar": "third_party/connectedhomeip/src/app/server/java/CHIPAppServer.jar", + "CHIPInteractionModel.jar": "third_party/connectedhomeip/src/controller/java/CHIPInteractionModel.jar", "TvCastingApp.jar": "TvCastingApp.jar", } @@ -606,6 +608,9 @@ def build_outputs(self): "CHIPController.jar": os.path.join( self.output_dir, "lib", "src/controller/java/CHIPController.jar" ), + "CHIPInteractionModel.jar": os.path.join( + self.output_dir, "lib", "src/controller/java/CHIPInteractionModel.jar" + ), "libMatterTlv.jar": os.path.join( self.output_dir, "lib", "src/controller/java/libMatterTlv.jar" ), diff --git a/scripts/py_matter_idl/matter_idl/generators/java/ChipClusters_java.jinja b/scripts/py_matter_idl/matter_idl/generators/java/ChipClusters_java.jinja index 6c8ad742068684..fb49e5737271b9 100644 --- a/scripts/py_matter_idl/matter_idl/generators/java/ChipClusters_java.jinja +++ b/scripts/py_matter_idl/matter_idl/generators/java/ChipClusters_java.jinja @@ -198,7 +198,7 @@ public class ChipClusters { boolean isFabricFiltered) { ReportCallbackJni jniCallback = new ReportCallbackJni(null, callback, null); ChipAttributePath path = ChipAttributePath.newInstance(endpointId, clusterId, attributeId); - ChipDeviceController.read(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, isFabricFiltered, timeoutMillis.orElse(0L).intValue(), null); + ChipInteractionClient.read(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, isFabricFiltered, timeoutMillis.orElse(0L).intValue(), null); } protected void writeAttribute( @@ -209,7 +209,7 @@ public class ChipClusters { WriteAttributesCallbackJni jniCallback = new WriteAttributesCallbackJni(callback); byte[] tlv = encodeToTlv(value); AttributeWriteRequest writeRequest = AttributeWriteRequest.newInstance(endpointId, clusterId, attributeId, tlv); - ChipDeviceController.write(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(writeRequest), timedRequestTimeoutMs, timeoutMillis.orElse(0L).intValue()); + ChipInteractionClient.write(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(writeRequest), timedRequestTimeoutMs, timeoutMillis.orElse(0L).intValue()); } protected void subscribeAttribute( @@ -219,7 +219,7 @@ public class ChipClusters { int maxInterval) { ReportCallbackJni jniCallback = new ReportCallbackJni(callback, callback, null); ChipAttributePath path = ChipAttributePath.newInstance(endpointId, clusterId, attributeId); - ChipDeviceController.subscribe(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, minInterval, maxInterval, false, true, timeoutMillis.orElse(0L).intValue(), null); + ChipInteractionClient.subscribe(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, minInterval, maxInterval, false, true, timeoutMillis.orElse(0L).intValue(), null); } protected void invoke( @@ -230,7 +230,7 @@ public class ChipClusters { InvokeCallbackJni jniCallback = new InvokeCallbackJni(callback); byte[] tlv = encodeToTlv(value); InvokeElement element = InvokeElement.newInstance(endpointId, clusterId, commandId, tlv, null); - ChipDeviceController.invoke(0, jniCallback.getCallbackHandle(), devicePtr, element, timedRequestTimeoutMs, timeoutMillis.orElse(0L).intValue()); + ChipInteractionClient.invoke(0, jniCallback.getCallbackHandle(), devicePtr, element, timedRequestTimeoutMs, timeoutMillis.orElse(0L).intValue()); } private static native byte[] encodeToTlv(BaseTLVType value); diff --git a/scripts/py_matter_idl/matter_idl/tests/outputs/several_clusters/java/ChipClusters.java b/scripts/py_matter_idl/matter_idl/tests/outputs/several_clusters/java/ChipClusters.java index 37c5c031b5c5ae..836940ab4e089f 100644 --- a/scripts/py_matter_idl/matter_idl/tests/outputs/several_clusters/java/ChipClusters.java +++ b/scripts/py_matter_idl/matter_idl/tests/outputs/several_clusters/java/ChipClusters.java @@ -121,7 +121,7 @@ protected void readAttribute( boolean isFabricFiltered) { ReportCallbackJni jniCallback = new ReportCallbackJni(null, callback, null); ChipAttributePath path = ChipAttributePath.newInstance(endpointId, clusterId, attributeId); - ChipDeviceController.read(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, isFabricFiltered, timeoutMillis.orElse(0L).intValue(), null); + ChipInteractionClient.read(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, isFabricFiltered, timeoutMillis.orElse(0L).intValue(), null); } protected void writeAttribute( @@ -132,7 +132,7 @@ protected void writeAttribute( WriteAttributesCallbackJni jniCallback = new WriteAttributesCallbackJni(callback); byte[] tlv = encodeToTlv(value); AttributeWriteRequest writeRequest = AttributeWriteRequest.newInstance(endpointId, clusterId, attributeId, tlv); - ChipDeviceController.write(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(writeRequest), timedRequestTimeoutMs, timeoutMillis.orElse(0L).intValue()); + ChipInteractionClient.write(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(writeRequest), timedRequestTimeoutMs, timeoutMillis.orElse(0L).intValue()); } protected void subscribeAttribute( @@ -142,7 +142,7 @@ protected void subscribeAttribute( int maxInterval) { ReportCallbackJni jniCallback = new ReportCallbackJni(callback, callback, null); ChipAttributePath path = ChipAttributePath.newInstance(endpointId, clusterId, attributeId); - ChipDeviceController.subscribe(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, minInterval, maxInterval, false, true, timeoutMillis.orElse(0L).intValue(), null); + ChipInteractionClient.subscribe(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, minInterval, maxInterval, false, true, timeoutMillis.orElse(0L).intValue(), null); } protected void invoke( @@ -153,7 +153,7 @@ protected void invoke( InvokeCallbackJni jniCallback = new InvokeCallbackJni(callback); byte[] tlv = encodeToTlv(value); InvokeElement element = InvokeElement.newInstance(endpointId, clusterId, commandId, tlv, null); - ChipDeviceController.invoke(0, jniCallback.getCallbackHandle(), devicePtr, element, timedRequestTimeoutMs, timeoutMillis.orElse(0L).intValue()); + ChipInteractionClient.invoke(0, jniCallback.getCallbackHandle(), devicePtr, element, timedRequestTimeoutMs, timeoutMillis.orElse(0L).intValue()); } private static native byte[] encodeToTlv(BaseTLVType value); diff --git a/src/controller/java/AndroidInteractionClient.cpp b/src/controller/java/AndroidInteractionClient.cpp index ec809570bcb1c7..cb59a7bf1718c2 100644 --- a/src/controller/java/AndroidInteractionClient.cpp +++ b/src/controller/java/AndroidInteractionClient.cpp @@ -24,7 +24,6 @@ #include "AndroidInteractionClient.h" #include "AndroidCallbacks.h" -#include "AndroidDeviceControllerWrapper.h" #include diff --git a/src/controller/java/BUILD.gn b/src/controller/java/BUILD.gn index 9342f1330a6b5f..48a7cf90b2fa34 100644 --- a/src/controller/java/BUILD.gn +++ b/src/controller/java/BUILD.gn @@ -42,6 +42,39 @@ if (!matter_enable_java_compilation) { import("${build_root}/config/android_abi.gni") } +source_set("android_chip_im_jni") { + sources = [ + "AndroidCallbacks-JNI.cpp", + "AndroidCallbacks.cpp", + "AndroidCallbacks.h", + "AndroidConnectionFailureExceptions.cpp", + "AndroidConnectionFailureExceptions.h", + "AndroidControllerExceptions.cpp", + "AndroidControllerExceptions.h", + "AndroidInteractionClient.cpp", + "AndroidInteractionClient.h", + "BaseCHIPCluster-JNI.cpp", + "CHIPAttributeTLVValueDecoder.h", + "CHIPEventTLVValueDecoder.h", + "CHIPInteractionClient-JNI.cpp", + "CHIPInteractionClient-JNI.h", + ] + + if (matter_enable_tlv_decoder_api) { + defines = [ "USE_JAVA_TLV_ENCODE_DECODE" ] + sources += [ + "CHIPTLVValueDecoder-JNI.cpp", + "zap-generated/CHIPAttributeTLVValueDecoder.cpp", + "zap-generated/CHIPEventTLVValueDecoder.cpp", + ] + } + + deps = [ + "${chip_root}/src/lib", + "${chip_root}/src/lib/support/jsontlv", + ] +} + shared_library("jni") { output_name = "libCHIPController" @@ -56,33 +89,21 @@ shared_library("jni") { check_includes = false sources = [ - "AndroidCallbacks-JNI.cpp", - "AndroidCallbacks.cpp", - "AndroidCallbacks.h", "AndroidCheckInDelegate.cpp", "AndroidCheckInDelegate.h", "AndroidClusterExceptions.cpp", "AndroidClusterExceptions.h", "AndroidCommissioningWindowOpener.cpp", "AndroidCommissioningWindowOpener.h", - "AndroidConnectionFailureExceptions.cpp", - "AndroidConnectionFailureExceptions.h", - "AndroidControllerExceptions.cpp", - "AndroidControllerExceptions.h", "AndroidCurrentFabricRemover.cpp", "AndroidCurrentFabricRemover.h", "AndroidDeviceControllerWrapper.cpp", "AndroidDeviceControllerWrapper.h", - "AndroidInteractionClient.cpp", - "AndroidInteractionClient.h", "AndroidOperationalCredentialsIssuer.cpp", "AndroidOperationalCredentialsIssuer.h", "AttestationTrustStoreBridge.cpp", "AttestationTrustStoreBridge.h", - "BaseCHIPCluster-JNI.cpp", - "CHIPAttributeTLVValueDecoder.h", "CHIPDeviceController-JNI.cpp", - "CHIPEventTLVValueDecoder.h", "DeviceAttestation-JNI.cpp", "DeviceAttestationDelegateBridge.cpp", "DeviceAttestationDelegateBridge.h", @@ -92,6 +113,7 @@ shared_library("jni") { ] deps = [ + ":android_chip_im_jni", ":controller_config", "${chip_root}/src/app/icd/client:handler", "${chip_root}/src/app/icd/client:manager", @@ -452,10 +474,92 @@ android_library("chipclusterID") { ] } +# Android CHIP IM .java files +android_library("android_chip_im") { + output_name = "CHIPInteractionModel.jar" + + sources = [ + "${chip_root}/src/controller/java/src/chip/devicecontroller/ChipClusterException.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/ChipDeviceControllerException.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/ChipInteractionClient.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/ExtendableInvokeCallback.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/ExtendableInvokeCallbackJni.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/GetConnectedDeviceCallbackJni.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/InvokeCallback.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/InvokeCallbackJni.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/ReportCallback.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/ReportCallbackJni.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/ResubscriptionAttemptCallback.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/StatusException.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/SubscriptionEstablishedCallback.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/WriteAttributesCallback.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/WriteAttributesCallbackJni.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/model/AttributeState.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/model/AttributeWriteRequest.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/model/ChipAttributePath.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/model/ChipEventPath.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/model/ChipPathId.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/model/ClusterState.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/model/DataVersionFilter.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/model/EndpointState.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/model/EventState.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/model/InvokeElement.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/model/InvokeResponseData.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/model/NoInvokeResponseData.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/model/NodeState.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/model/Status.java", + ] + + if (matter_enable_tlv_decoder_api) { + sources += [ "${chip_root}/src/controller/java/src/chip/devicecontroller/ChipTLVValueDecoder.java" ] + } + + if (matter_enable_java_generated_api) { + sources += [ + "${chip_root}/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java", + "${chip_root}/src/controller/java/generated/java/chip/devicecontroller/ChipEventStructs.java", + "${chip_root}/src/controller/java/generated/java/chip/devicecontroller/ChipStructs.java", + "${chip_root}/src/controller/java/generated/java/chip/devicecontroller/ClusterInfoMapping.java", + "${chip_root}/src/controller/java/generated/java/chip/devicecontroller/ClusterReadMapping.java", + "${chip_root}/src/controller/java/generated/java/chip/devicecontroller/ClusterWriteMapping.java", + "${chip_root}/src/controller/java/src/chip/clusterinfo/ClusterCommandCallback.java", + "${chip_root}/src/controller/java/src/chip/clusterinfo/ClusterInfo.java", + "${chip_root}/src/controller/java/src/chip/clusterinfo/CommandParameterInfo.java", + "${chip_root}/src/controller/java/src/chip/clusterinfo/CommandResponseInfo.java", + "${chip_root}/src/controller/java/src/chip/clusterinfo/DelegatedClusterCallback.java", + "${chip_root}/src/controller/java/src/chip/clusterinfo/InteractionInfo.java", + "${chip_root}/src/controller/java/src/chip/devicecontroller/ChipTLVType.java", + ] + } + + deps = [ + "${chip_root}/src/controller/java/:chipcluster", + "${chip_root}/src/controller/java/:chipclusterID", + "${chip_root}/third_party/java_deps:annotation", + ] + + if (matter_enable_java_compilation) { + deps += [ + "${chip_root}/third_party/java_deps:json", + "${chip_root}/third_party/java_deps/stub_src", + ] + } else { + deps += [ "${chip_root}/src/controller/java/:android" ] + + data_deps = [ "${chip_root}/build/chip/java:shared_cpplib" ] + } + + javac_flags = [ + "-Xlint:deprecation", + "-parameters", # Store infomation about method parameters + ] +} + android_library("java") { output_name = "CHIPController.jar" deps = [ + ":android_chip_im", ":chipcluster", ":chipclusterID", "${chip_root}/third_party/java_deps:annotation", @@ -471,6 +575,8 @@ android_library("java") { "src/chip/devicecontroller/ChipCommandType.java", "src/chip/devicecontroller/ChipDeviceController.java", "src/chip/devicecontroller/ChipDeviceControllerException.java", + "src/chip/devicecontroller/ChipDeviceControllerException.java", + "src/chip/devicecontroller/ChipInteractionClient.java", "src/chip/devicecontroller/CommissioningWindowStatus.java", "src/chip/devicecontroller/ConnectionFailureException.java", "src/chip/devicecontroller/ControllerParams.java", diff --git a/src/controller/java/CHIPInteractionClient-JNI.cpp b/src/controller/java/CHIPInteractionClient-JNI.cpp new file mode 100644 index 00000000000000..ea0a9176ced7dd --- /dev/null +++ b/src/controller/java/CHIPInteractionClient-JNI.cpp @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2024 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. + * + */ +#include "CHIPInteractionClient-JNI.h" +#include "AndroidInteractionClient.h" + +#include +#include +#include + +#define JNI_METHOD(RETURN, METHOD_NAME) \ + extern "C" JNIEXPORT RETURN JNICALL Java_chip_devicecontroller_ChipInteractionClient_##METHOD_NAME + +jint AndroidChipInteractionJNI_OnLoad(JavaVM * jvm, void * reserved) +{ + CHIP_ERROR err = CHIP_NO_ERROR; + JNIEnv * env; + + ChipLogProgress(Controller, "AndroidChipInteractionJNI_OnLoad called"); + + chip::Platform::MemoryInit(); + + // Save a reference to the JVM. Will need this to call back into Java. + chip::JniReferences::GetInstance().SetJavaVm(jvm, "chip/devicecontroller/ChipInteractionClient"); + + // Get a JNI environment object. + env = chip::JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrExit(env != nullptr, err = CHIP_JNI_ERROR_NO_ENV); + VerifyOrExit(env != nullptr, err = CHIP_JNI_ERROR_NO_ENV); + + ChipLogProgress(Controller, "Loading Java class references."); + + // Get various class references need by the API. + jclass controllerExceptionCls; + err = chip::JniReferences::GetInstance().GetLocalClassRef(env, "chip/devicecontroller/ChipDeviceControllerException", + controllerExceptionCls); + VerifyOrReturnValue(err == CHIP_NO_ERROR, JNI_ERR); + + ChipLogProgress(Controller, "Java class references loaded."); + +exit: + if (err != CHIP_NO_ERROR) + { + chip::JniReferences::GetInstance().ThrowError(env, controllerExceptionCls, err); + chip::DeviceLayer::StackUnlock unlock; + JNI_OnUnload(jvm, reserved); + } + + return (err == CHIP_NO_ERROR) ? JNI_VERSION_1_6 : JNI_ERR; +} + +void AndroidChipInteractionJNI_OnUnload(JavaVM * jvm, void * reserved) +{ + chip::DeviceLayer::StackLock lock; + ChipLogProgress(AppServer, "AndroidChipInteractionJNI_OnUnload() called"); + chip::Platform::MemoryShutdown(); +} + +JNI_METHOD(void, subscribe) +(JNIEnv * env, jobject self, jlong handle, jlong callbackHandle, jlong devicePtr, jobject attributePathList, jobject eventPathList, + jint minInterval, jint maxInterval, jboolean keepSubscriptions, jboolean isFabricFiltered, jint imTimeoutMs) +{ + CHIP_ERROR err = subscribe(env, handle, callbackHandle, devicePtr, attributePathList, eventPathList, nullptr, minInterval, + maxInterval, keepSubscriptions, isFabricFiltered, imTimeoutMs, nullptr); + if (err != CHIP_NO_ERROR) + { + ChipLogError(Controller, "JNI IM Subscribe Error: %" CHIP_ERROR_FORMAT, err.Format()); + } +} + +JNI_METHOD(void, read) +(JNIEnv * env, jobject self, jlong handle, jlong callbackHandle, jlong devicePtr, jobject attributePathList, jobject eventPathList, + jboolean isFabricFiltered, jint imTimeoutMs) +{ + CHIP_ERROR err = read(env, handle, callbackHandle, devicePtr, attributePathList, eventPathList, nullptr, isFabricFiltered, + imTimeoutMs, nullptr); + if (err != CHIP_NO_ERROR) + { + ChipLogError(Controller, "JNI IM Read Error: %" CHIP_ERROR_FORMAT, err.Format()); + } +} + +JNI_METHOD(void, write) +(JNIEnv * env, jobject self, jlong handle, jlong callbackHandle, jlong devicePtr, jobject attributeList, jint timedRequestTimeoutMs, + jint imTimeoutMs) +{ + CHIP_ERROR err = write(env, handle, callbackHandle, devicePtr, attributeList, timedRequestTimeoutMs, imTimeoutMs); + if (err != CHIP_NO_ERROR) + { + ChipLogError(Controller, "JNI IM Write Error: %" CHIP_ERROR_FORMAT, err.Format()); + } +} + +JNI_METHOD(void, invoke) +(JNIEnv * env, jobject self, jlong handle, jlong callbackHandle, jlong devicePtr, jobject invokeElement, jint timedRequestTimeoutMs, + jint imTimeoutMs) +{ + CHIP_ERROR err = invoke(env, handle, callbackHandle, devicePtr, invokeElement, timedRequestTimeoutMs, imTimeoutMs); + if (err != CHIP_NO_ERROR) + { + ChipLogError(Controller, "JNI IM Invoke Error: %" CHIP_ERROR_FORMAT, err.Format()); + } +} + +JNI_METHOD(void, extendableInvoke) +(JNIEnv * env, jobject self, jlong handle, jlong callbackHandle, jlong devicePtr, jobject invokeElementList, + jint timedRequestTimeoutMs, jint imTimeoutMs) +{ + CHIP_ERROR err = + extendableInvoke(env, handle, callbackHandle, devicePtr, invokeElementList, timedRequestTimeoutMs, imTimeoutMs); + if (err != CHIP_NO_ERROR) + { + ChipLogError(Controller, "JNI IM Batch Invoke Error: %" CHIP_ERROR_FORMAT, err.Format()); + } +} diff --git a/src/controller/java/CHIPInteractionClient-JNI.h b/src/controller/java/CHIPInteractionClient-JNI.h new file mode 100644 index 00000000000000..1944552d192b39 --- /dev/null +++ b/src/controller/java/CHIPInteractionClient-JNI.h @@ -0,0 +1,24 @@ +/* + * + * Copyright (c) 2024 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. + */ + +#pragma once +#include + +jint AndroidChipInteractionJNI_OnLoad(JavaVM * jvm, void * reserved); + +void AndroidChipInteractionJNI_OnUnload(JavaVM * jvm, void * reserved); diff --git a/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java b/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java index c55a45b77aaca8..66ae0a97ce86a6 100644 --- a/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java +++ b/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java @@ -121,7 +121,7 @@ protected void readAttribute( boolean isFabricFiltered) { ReportCallbackJni jniCallback = new ReportCallbackJni(null, callback, null); ChipAttributePath path = ChipAttributePath.newInstance(endpointId, clusterId, attributeId); - ChipDeviceController.read(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, isFabricFiltered, timeoutMillis.orElse(0L).intValue(), null); + ChipInteractionClient.read(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, isFabricFiltered, timeoutMillis.orElse(0L).intValue(), null); } protected void writeAttribute( @@ -132,7 +132,7 @@ protected void writeAttribute( WriteAttributesCallbackJni jniCallback = new WriteAttributesCallbackJni(callback); byte[] tlv = encodeToTlv(value); AttributeWriteRequest writeRequest = AttributeWriteRequest.newInstance(endpointId, clusterId, attributeId, tlv); - ChipDeviceController.write(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(writeRequest), timedRequestTimeoutMs, timeoutMillis.orElse(0L).intValue()); + ChipInteractionClient.write(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(writeRequest), timedRequestTimeoutMs, timeoutMillis.orElse(0L).intValue()); } protected void subscribeAttribute( @@ -142,7 +142,7 @@ protected void subscribeAttribute( int maxInterval) { ReportCallbackJni jniCallback = new ReportCallbackJni(callback, callback, null); ChipAttributePath path = ChipAttributePath.newInstance(endpointId, clusterId, attributeId); - ChipDeviceController.subscribe(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, minInterval, maxInterval, false, true, timeoutMillis.orElse(0L).intValue(), null); + ChipInteractionClient.subscribe(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, minInterval, maxInterval, false, true, timeoutMillis.orElse(0L).intValue(), null); } protected void invoke( @@ -153,7 +153,7 @@ protected void invoke( InvokeCallbackJni jniCallback = new InvokeCallbackJni(callback); byte[] tlv = encodeToTlv(value); InvokeElement element = InvokeElement.newInstance(endpointId, clusterId, commandId, tlv, null); - ChipDeviceController.invoke(0, jniCallback.getCallbackHandle(), devicePtr, element, timedRequestTimeoutMs, timeoutMillis.orElse(0L).intValue()); + ChipInteractionClient.invoke(0, jniCallback.getCallbackHandle(), devicePtr, element, timedRequestTimeoutMs, timeoutMillis.orElse(0L).intValue()); } private static native byte[] encodeToTlv(BaseTLVType value); diff --git a/src/controller/java/src/chip/devicecontroller/ChipDeviceController.java b/src/controller/java/src/chip/devicecontroller/ChipDeviceController.java index 3be1a69ca04b41..9c6cd6dc3ed666 100644 --- a/src/controller/java/src/chip/devicecontroller/ChipDeviceController.java +++ b/src/controller/java/src/chip/devicecontroller/ChipDeviceController.java @@ -825,7 +825,7 @@ public void subscribeToAttributePath( int imTimeoutMs) { ReportCallbackJni jniCallback = new ReportCallbackJni(subscriptionEstablishedCallback, reportCallback, null); - subscribe( + ChipInteractionClient.subscribe( deviceControllerPtr, jniCallback.getCallbackHandle(), devicePtr, @@ -863,7 +863,7 @@ public void subscribeToEventPath( int imTimeoutMs) { ReportCallbackJni jniCallback = new ReportCallbackJni(subscriptionEstablishedCallback, reportCallback, null); - subscribe( + ChipInteractionClient.subscribe( deviceControllerPtr, jniCallback.getCallbackHandle(), devicePtr, @@ -889,7 +889,7 @@ public void subscribeToEventPath( @Nullable Long eventMin) { ReportCallbackJni jniCallback = new ReportCallbackJni(subscriptionEstablishedCallback, reportCallback, null); - subscribe( + ChipInteractionClient.subscribe( deviceControllerPtr, jniCallback.getCallbackHandle(), devicePtr, @@ -923,7 +923,7 @@ public void subscribeToPath( ReportCallbackJni jniCallback = new ReportCallbackJni( subscriptionEstablishedCallback, reportCallback, resubscriptionAttemptCallback); - subscribe( + ChipInteractionClient.subscribe( deviceControllerPtr, jniCallback.getCallbackHandle(), devicePtr, @@ -975,7 +975,7 @@ public void subscribeToPath( ReportCallbackJni jniCallback = new ReportCallbackJni( subscriptionEstablishedCallback, reportCallback, resubscriptionAttemptCallback); - subscribe( + ChipInteractionClient.subscribe( deviceControllerPtr, jniCallback.getCallbackHandle(), devicePtr, @@ -1006,7 +1006,7 @@ public void subscribeToPath( ReportCallbackJni jniCallback = new ReportCallbackJni( subscriptionEstablishedCallback, reportCallback, resubscriptionAttemptCallback); - subscribe( + ChipInteractionClient.subscribe( deviceControllerPtr, jniCallback.getCallbackHandle(), devicePtr, @@ -1036,7 +1036,7 @@ public void readAttributePath( List attributePaths, int imTimeoutMs) { ReportCallbackJni jniCallback = new ReportCallbackJni(null, callback, null); - read( + ChipInteractionClient.read( deviceControllerPtr, jniCallback.getCallbackHandle(), devicePtr, @@ -1060,7 +1060,7 @@ public void readAttributePath( public void readEventPath( ReportCallback callback, long devicePtr, List eventPaths, int imTimeoutMs) { ReportCallbackJni jniCallback = new ReportCallbackJni(null, callback, null); - read( + ChipInteractionClient.read( deviceControllerPtr, jniCallback.getCallbackHandle(), devicePtr, @@ -1080,7 +1080,7 @@ public void readEventPath( int imTimeoutMs, @Nullable Long eventMin) { ReportCallbackJni jniCallback = new ReportCallbackJni(null, callback, null); - read( + ChipInteractionClient.read( deviceControllerPtr, jniCallback.getCallbackHandle(), devicePtr, @@ -1101,7 +1101,7 @@ public void readPath( boolean isFabricFiltered, int imTimeoutMs) { ReportCallbackJni jniCallback = new ReportCallbackJni(null, callback, null); - read( + ChipInteractionClient.read( deviceControllerPtr, jniCallback.getCallbackHandle(), devicePtr, @@ -1133,7 +1133,7 @@ public void readPath( boolean isFabricFiltered, int imTimeoutMs) { ReportCallbackJni jniCallback = new ReportCallbackJni(null, callback, null); - read( + ChipInteractionClient.read( deviceControllerPtr, jniCallback.getCallbackHandle(), devicePtr, @@ -1155,7 +1155,7 @@ public void readPath( int imTimeoutMs, @Nullable Long eventMin) { ReportCallbackJni jniCallback = new ReportCallbackJni(null, callback, null); - read( + ChipInteractionClient.read( deviceControllerPtr, jniCallback.getCallbackHandle(), devicePtr, @@ -1184,7 +1184,7 @@ public void write( int timedRequestTimeoutMs, int imTimeoutMs) { WriteAttributesCallbackJni jniCallback = new WriteAttributesCallbackJni(callback); - write( + ChipInteractionClient.write( deviceControllerPtr, jniCallback.getCallbackHandle(), devicePtr, @@ -1210,7 +1210,7 @@ public void invoke( int timedRequestTimeoutMs, int imTimeoutMs) { InvokeCallbackJni jniCallback = new InvokeCallbackJni(callback); - invoke( + ChipInteractionClient.invoke( deviceControllerPtr, jniCallback.getCallbackHandle(), devicePtr, @@ -1236,7 +1236,7 @@ public void extendableInvoke( int timedRequestTimeoutMs, int imTimeoutMs) { ExtendableInvokeCallbackJni jniCallback = new ExtendableInvokeCallbackJni(callback); - extendableInvoke( + ChipInteractionClient.extendableInvoke( deviceControllerPtr, jniCallback.getCallbackHandle(), devicePtr, @@ -1378,55 +1378,6 @@ public void shutdownCommissioning() { private native PaseVerifierParams computePaseVerifier( long deviceControllerPtr, long devicePtr, long setupPincode, long iterations, byte[] salt); - static native void subscribe( - long deviceControllerPtr, - long callbackHandle, - long devicePtr, - List attributePaths, - List eventPaths, - List dataVersionFilters, - int minInterval, - int maxInterval, - boolean keepSubscriptions, - boolean isFabricFiltered, - int imTimeoutMs, - @Nullable Long eventMin); - - static native void read( - long deviceControllerPtr, - long callbackHandle, - long devicePtr, - List attributePaths, - List eventPaths, - List dataVersionFilters, - boolean isFabricFiltered, - int imTimeoutMs, - @Nullable Long eventMin); - - static native void write( - long deviceControllerPtr, - long callbackHandle, - long devicePtr, - List attributeList, - int timedRequestTimeoutMs, - int imTimeoutMs); - - static native void invoke( - long deviceControllerPtr, - long callbackHandle, - long devicePtr, - InvokeElement invokeElement, - int timedRequestTimeoutMs, - int imTimeoutMs); - - static native void extendableInvoke( - long deviceControllerPtr, - long callbackHandle, - long devicePtr, - List invokeElementList, - int timedRequestTimeoutMs, - int imTimeoutMs); - private native long newDeviceController(ControllerParams params); private native void setDeviceAttestationDelegate( diff --git a/src/controller/java/src/chip/devicecontroller/ChipInteractionClient.java b/src/controller/java/src/chip/devicecontroller/ChipInteractionClient.java new file mode 100644 index 00000000000000..ecda50ca6a9a2a --- /dev/null +++ b/src/controller/java/src/chip/devicecontroller/ChipInteractionClient.java @@ -0,0 +1,76 @@ +/* + * + * Copyright (c) 2024 Project CHIP Authors + * + * 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 chip.devicecontroller; + +import chip.devicecontroller.model.AttributeWriteRequest; +import chip.devicecontroller.model.ChipAttributePath; +import chip.devicecontroller.model.ChipEventPath; +import chip.devicecontroller.model.DataVersionFilter; +import chip.devicecontroller.model.InvokeElement; +import java.util.List; +import javax.annotation.Nullable; + +public class ChipInteractionClient { + static native void subscribe( + long deviceControllerPtr, + long callbackHandle, + long devicePtr, + List attributePaths, + List eventPaths, + List dataVersionFilters, + int minInterval, + int maxInterval, + boolean keepSubscriptions, + boolean isFabricFiltered, + int imTimeoutMs, + @Nullable Long eventMin); + + static native void read( + long deviceControllerPtr, + long callbackHandle, + long devicePtr, + List attributePaths, + List eventPaths, + List dataVersionFilters, + boolean isFabricFiltered, + int imTimeoutMs, + @Nullable Long eventMin); + + static native void write( + long deviceControllerPtr, + long callbackHandle, + long devicePtr, + List attributeList, + int timedRequestTimeoutMs, + int imTimeoutMs); + + static native void invoke( + long deviceControllerPtr, + long callbackHandle, + long devicePtr, + InvokeElement invokeElement, + int timedRequestTimeoutMs, + int imTimeoutMs); + + static native void extendableInvoke( + long deviceControllerPtr, + long callbackHandle, + long devicePtr, + List invokeElementList, + int timedRequestTimeoutMs, + int imTimeoutMs); +}