Skip to content

Commit 219c529

Browse files
committed
Update from comments
1 parent 358ced0 commit 219c529

File tree

9 files changed

+248
-161
lines changed

9 files changed

+248
-161
lines changed

src/controller/java/AndroidCallbacks-JNI.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ JNI_METHOD(void, GetConnectedDeviceCallbackJni, deleteCallback)(JNIEnv * env, jo
3939
JNI_METHOD(jlong, ReportCallbackJni, newCallback)
4040
(JNIEnv * env, jobject self, jobject subscriptionEstablishedCallbackJava, jobject resubscriptionAttemptCallbackJava)
4141
{
42-
return newReportCallback(env, self, subscriptionEstablishedCallbackJava, resubscriptionAttemptCallbackJava);
42+
return newReportCallback(env, self, subscriptionEstablishedCallbackJava, resubscriptionAttemptCallbackJava, "()Lchip/devicecontroller/model/NodeState;");
4343
}
4444

4545
JNI_METHOD(void, ReportCallbackJni, deleteCallback)(JNIEnv * env, jobject self, jlong callbackHandle)

src/controller/java/AndroidCallbacks.cpp

+45-34
Original file line numberDiff line numberDiff line change
@@ -127,19 +127,27 @@ void GetConnectedDeviceCallback::OnDeviceConnectionFailureFn(void * context,
127127

128128
CHIP_ERROR CreateOptional(chip::Optional<uint8_t> value, jobject & outObj)
129129
{
130-
jobject jOptionalValue = nullptr;
131-
jobject jValue = nullptr;
132-
if (value.HasValue()) {
133-
ReturnLogErrorOnFailure(JniReferences::GetInstance().CreateBoxedObject<jint>("java/lang/Integer", "(I)V", static_cast<jint>(value.Value()), jValue));
134-
}
135-
ReturnLogErrorOnFailure(JniReferences::GetInstance().CreateOptional(jValue, jOptionalValue));
130+
131+
136132

137133
return CHIP_NO_ERROR;
138134
}
135+
jobject GetNodeStateObj(JNIEnv * env, const char* nodeStateClassSignature, jobject wrapperCallback)
136+
{
137+
jmethodID getNodeStateMethod;
138+
CHIP_ERROR err = JniReferences::GetInstance().FindMethod(env, wrapperCallback, "getNodeState", nodeStateClassSignature, &getNodeStateMethod);
139+
VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr, ChipLogError(Controller, "Could not find getNodeState method"));
140+
141+
DeviceLayer::StackUnlock unlock;
142+
jobject ret = env->CallObjectMethod(wrapperCallback, getNodeStateMethod);
143+
VerifyOrReturnValue(!env->ExceptionCheck(), nullptr, env->ExceptionDescribe());
144+
145+
return ret;
146+
}
139147

140148
ReportCallback::ReportCallback(jobject wrapperCallback, jobject subscriptionEstablishedCallback,
141-
jobject resubscriptionAttemptCallback) :
142-
mClusterCacheAdapter(*this, Optional<EventNumber>::Missing(), false /*cacheData*/)
149+
jobject resubscriptionAttemptCallback, const char * nodeStateClassSignature) :
150+
mClusterCacheAdapter(*this, Optional<EventNumber>::Missing(), false /*cacheData*/), mNodeStateClassSignature(nodeStateClassSignature)
143151
{
144152
JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
145153
VerifyOrReturn(env != nullptr, ChipLogError(Controller, "Could not get JNIEnv for current thread"));
@@ -271,25 +279,26 @@ void ReportCallback::OnAttributeData(const app::ConcreteDataAttributePath & aPat
271279
ChipLogError(Controller, "mReportCallbackRef is not valid in %s", __func__));
272280
jobject wrapperCallback = mWrapperCallbackRef.ObjectRef();
273281

282+
jobject nodeState = GetNodeStateObj(env, mNodeStateClassSignature, wrapperCallback);
274283
if (aStatus.IsFailure())
275284
{
276285
ChipLogError(Controller, "Receive bad status %s", ErrorStr(aStatus.ToChipError()));
277286
// Add Attribute Status to wrapperCallback
278287
jmethodID addAttributeStatusMethod = nullptr;
279-
err = JniReferences::GetInstance().FindMethod(env, wrapperCallback, "addAttributeStatus",
280-
"(IJJILjava/util/Optional;)V", &addAttributeStatusMethod);
288+
err = JniReferences::GetInstance().FindMethod(env, nodeState, "addAttributeStatus",
289+
"(IJJILjava/lang/Integer;)V", &addAttributeStatusMethod);
281290
VerifyOrReturn(
282291
err == CHIP_NO_ERROR,
283292
ChipLogError(Controller, "Could not find addAttributeStatus method with error %" CHIP_ERROR_FORMAT, err.Format()));
284293

285-
jobject jClusterStateOptional = nullptr;
286-
err = CreateOptional(aStatus.mClusterStatus, jClusterStateOptional);
287-
VerifyOrReturn(
288-
err == CHIP_NO_ERROR,
289-
ChipLogError(Controller, "Could not CreateOptional with error %" CHIP_ERROR_FORMAT, err.Format()));
294+
jobject jClusterState = nullptr;
295+
if (aStatus.mClusterStatus.HasValue()) {
296+
err = JniReferences::GetInstance().CreateBoxedObject<jint>("java/lang/Integer", "(I)V", static_cast<jint>(aStatus.mClusterStatus.Value()), jClusterState);
297+
VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(Controller, "Could not CreateBoxedObject with error %" CHIP_ERROR_FORMAT, err.Format()));
298+
}
290299

291-
env->CallVoidMethod(wrapperCallback, addAttributeStatusMethod, static_cast<jint>(aPath.mEndpointId),
292-
static_cast<jlong>(aPath.mClusterId), static_cast<jlong>(aPath.mAttributeId), static_cast<jint>(aStatus.mStatus), jClusterStateOptional);
300+
env->CallVoidMethod(nodeState, addAttributeStatusMethod, static_cast<jint>(aPath.mEndpointId),
301+
static_cast<jlong>(aPath.mClusterId), static_cast<jlong>(aPath.mAttributeId), static_cast<jint>(aStatus.mStatus), jClusterState);
293302
VerifyOrReturn(!env->ExceptionCheck(), env->ExceptionDescribe());
294303
return;
295304
}
@@ -340,11 +349,11 @@ void ReportCallback::OnAttributeData(const app::ConcreteDataAttributePath & aPat
340349

341350
// Add AttributeState to wrapperCallback
342351
jmethodID addAttributeMethod;
343-
err = JniReferences::GetInstance().FindMethod(env, wrapperCallback, "addAttribute",
352+
err = JniReferences::GetInstance().FindMethod(env, nodeState, "addAttribute",
344353
"(IJJLjava/lang/Object;[BLjava/lang/String;)V", &addAttributeMethod);
345354
VerifyOrReturn(err == CHIP_NO_ERROR,
346355
ChipLogError(Controller, "Could not find addAttribute method with error %s", ErrorStr(err)));
347-
env->CallVoidMethod(wrapperCallback, addAttributeMethod, static_cast<jint>(aPath.mEndpointId),
356+
env->CallVoidMethod(nodeState, addAttributeMethod, static_cast<jint>(aPath.mEndpointId),
348357
static_cast<jlong>(aPath.mClusterId), static_cast<jlong>(aPath.mAttributeId), value,
349358
jniByteArray.jniValue(), jsonString.jniValue());
350359
VerifyOrReturn(!env->ExceptionCheck(), env->ExceptionDescribe());
@@ -381,13 +390,14 @@ void ReportCallback::UpdateClusterDataVersion()
381390
VerifyOrReturn(mWrapperCallbackRef.HasValidObjectRef(),
382391
ChipLogError(Controller, "mReportCallbackRef is not valid in %s", __func__));
383392
jobject wrapperCallback = mWrapperCallbackRef.ObjectRef();
393+
jobject nodeState = GetNodeStateObj(env, mNodeStateClassSignature, wrapperCallback);
384394

385395
// SetDataVersion to NodeState
386396
jmethodID setDataVersionMethod;
387397
CHIP_ERROR err =
388-
JniReferences::GetInstance().FindMethod(env, wrapperCallback, "setDataVersion", "(IJJ)V", &setDataVersionMethod);
398+
JniReferences::GetInstance().FindMethod(env, nodeState, "setDataVersion", "(IJJ)V", &setDataVersionMethod);
389399
VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(Controller, "Could not find setDataVersion method"));
390-
env->CallVoidMethod(wrapperCallback, setDataVersionMethod, static_cast<jint>(lastConcreteClusterPath.mEndpointId),
400+
env->CallVoidMethod(nodeState, setDataVersionMethod, static_cast<jint>(lastConcreteClusterPath.mEndpointId),
391401
static_cast<jlong>(lastConcreteClusterPath.mClusterId), static_cast<jlong>(committedDataVersion.Value()));
392402
VerifyOrReturn(!env->ExceptionCheck(), env->ExceptionDescribe());
393403
}
@@ -401,26 +411,27 @@ void ReportCallback::OnEventData(const app::EventHeader & aEventHeader, TLV::TLV
401411
VerifyOrReturn(mWrapperCallbackRef.HasValidObjectRef(),
402412
ChipLogError(Controller, "mReportCallbackRef is not valid in %s", __func__));
403413
jobject wrapperCallback = mWrapperCallbackRef.ObjectRef();
414+
jobject nodeState = GetNodeStateObj(env, mNodeStateClassSignature, wrapperCallback);
404415
if (apStatus != nullptr && apStatus->IsFailure())
405416
{
406417
ChipLogError(Controller, "Receive bad status %s", ErrorStr(apStatus->ToChipError()));
407418
// Add Event Status to NodeState
408419
jmethodID addEventStatusMethod;
409-
err = JniReferences::GetInstance().FindMethod(env, wrapperCallback, "addEventStatus",
410-
"(IJJILjava/util/Optional;)V", &addEventStatusMethod);
420+
err = JniReferences::GetInstance().FindMethod(env, nodeState, "addEventStatus",
421+
"(IJJILjava/lang/Integer;)V", &addEventStatusMethod);
411422
VerifyOrReturn(
412423
err == CHIP_NO_ERROR,
413424
ChipLogError(Controller, "Could not find addEventStatus method with error %" CHIP_ERROR_FORMAT, err.Format()));
414425

415-
jobject jClusterStateOptional = nullptr;
416-
err = CreateOptional(apStatus->mClusterStatus, jClusterStateOptional);
417-
VerifyOrReturn(
418-
err == CHIP_NO_ERROR,
419-
ChipLogError(Controller, "Could not CreateOptional with error %" CHIP_ERROR_FORMAT, err.Format()));
426+
jobject jClusterState = nullptr;
427+
if (apStatus->mClusterStatus.HasValue()) {
428+
err = JniReferences::GetInstance().CreateBoxedObject<jint>("java/lang/Integer", "(I)V", static_cast<jint>(apStatus->mClusterStatus.Value()), jClusterState);
429+
VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(Controller, "Could not CreateBoxedObject with error %" CHIP_ERROR_FORMAT, err.Format()));
430+
}
420431

421-
env->CallVoidMethod(wrapperCallback, addEventStatusMethod, static_cast<jint>(aEventHeader.mPath.mEndpointId),
432+
env->CallVoidMethod(nodeState, addEventStatusMethod, static_cast<jint>(aEventHeader.mPath.mEndpointId),
422433
static_cast<jlong>(aEventHeader.mPath.mClusterId), static_cast<jlong>(aEventHeader.mPath.mEventId),
423-
static_cast<jint>(apStatus->mStatus), jClusterStateOptional);
434+
static_cast<jint>(apStatus->mStatus), jClusterState);
424435
VerifyOrReturn(!env->ExceptionCheck(), env->ExceptionDescribe());
425436
return;
426437
}
@@ -489,11 +500,11 @@ void ReportCallback::OnEventData(const app::EventHeader & aEventHeader, TLV::TLV
489500
UtfString jsonString(env, json.c_str());
490501

491502
jmethodID addEventMethod;
492-
err = JniReferences::GetInstance().FindMethod(env, wrapperCallback, "addEvent",
503+
err = JniReferences::GetInstance().FindMethod(env, nodeState, "addEvent",
493504
"(IJJJIIJLjava/lang/Object;[BLjava/lang/String;)V", &addEventMethod);
494505
VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(Controller, "Could not find addEvent method with error %s", ErrorStr(err));
495506
aEventHeader.LogPath());
496-
env->CallVoidMethod(wrapperCallback, addEventMethod, static_cast<jint>(aEventHeader.mPath.mEndpointId),
507+
env->CallVoidMethod(nodeState, addEventMethod, static_cast<jint>(aEventHeader.mPath.mEndpointId),
497508
static_cast<jlong>(aEventHeader.mPath.mClusterId), static_cast<jlong>(aEventHeader.mPath.mEventId),
498509
eventNumber, priorityLevel, timestampType, timestampValue, value, jniByteArray.jniValue(),
499510
jsonString.jniValue());
@@ -900,11 +911,11 @@ void deleteConnectedDeviceCallback(JNIEnv * env, jobject self, jlong callbackHan
900911
}
901912

902913
jlong newReportCallback(JNIEnv * env, jobject self, jobject subscriptionEstablishedCallbackJava,
903-
jobject resubscriptionAttemptCallbackJava)
914+
jobject resubscriptionAttemptCallbackJava, const char * nodeStateClassSignature)
904915
{
905916
chip::DeviceLayer::StackLock lock;
906917
ReportCallback * reportCallback =
907-
chip::Platform::New<ReportCallback>(self, subscriptionEstablishedCallbackJava, resubscriptionAttemptCallbackJava);
918+
chip::Platform::New<ReportCallback>(self, subscriptionEstablishedCallbackJava, resubscriptionAttemptCallbackJava, nodeStateClassSignature);
908919
return reinterpret_cast<jlong>(reportCallback);
909920
}
910921

src/controller/java/AndroidCallbacks.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ struct GetConnectedDeviceCallback
5555
struct ReportCallback : public app::ClusterStateCache::Callback
5656
{
5757
/** Subscription established callback can be nullptr. */
58-
ReportCallback(jobject wrapperCallback, jobject subscriptionEstablishedCallback, jobject resubscriptionAttemptCallback);
58+
ReportCallback(jobject wrapperCallback, jobject subscriptionEstablishedCallback, jobject resubscriptionAttemptCallback, const char * nodeStateClassSignature);
5959
~ReportCallback();
6060

6161
void OnReportBegin() override;
@@ -91,6 +91,8 @@ struct ReportCallback : public app::ClusterStateCache::Callback
9191
JniGlobalReference mWrapperCallbackRef;
9292
JniGlobalReference mSubscriptionEstablishedCallbackRef;
9393
JniGlobalReference mResubscriptionAttemptCallbackRef;
94+
95+
const char * mNodeStateClassSignature;
9496
};
9597

9698
struct WriteAttributesCallback : public app::WriteClient::Callback
@@ -140,7 +142,7 @@ struct InvokeCallback : public app::CommandSender::Callback
140142
jlong newConnectedDeviceCallback(JNIEnv * env, jobject self, jobject callback);
141143
void deleteConnectedDeviceCallback(JNIEnv * env, jobject self, jlong callbackHandle);
142144
jlong newReportCallback(JNIEnv * env, jobject self, jobject subscriptionEstablishedCallbackJava,
143-
jobject resubscriptionAttemptCallbackJava);
145+
jobject resubscriptionAttemptCallbackJava, const char * nodeStateClassSignature);
144146
void deleteReportCallback(JNIEnv * env, jobject self, jlong callbackHandle);
145147
jlong newWriteAttributesCallback(JNIEnv * env, jobject self);
146148
void deleteWriteAttributesCallback(JNIEnv * env, jobject self, jlong callbackHandle);

src/controller/java/MatterCallbacks-JNI.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ JNI_METHOD(void, GetConnectedDeviceCallbackJni, deleteCallback)(JNIEnv * env, jo
3939
JNI_METHOD(jlong, ReportCallbackJni, newCallback)
4040
(JNIEnv * env, jobject self, jobject subscriptionEstablishedCallbackJava, jobject resubscriptionAttemptCallbackJava)
4141
{
42-
return newReportCallback(env, self, subscriptionEstablishedCallbackJava, resubscriptionAttemptCallbackJava);
42+
return newReportCallback(env, self, subscriptionEstablishedCallbackJava, resubscriptionAttemptCallbackJava, "()Lmatter/controller/model/NodeState;");
4343
}
4444

4545
JNI_METHOD(void, ReportCallbackJni, deleteCallback)(JNIEnv * env, jobject self, jlong callbackHandle)

src/controller/java/src/chip/devicecontroller/ReportCallbackJni.java

+9-49
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,14 @@
2626

2727
/** JNI wrapper callback class for {@link ReportCallback}. */
2828
public class ReportCallbackJni {
29-
@Nullable private SubscriptionEstablishedCallback wrappedSubscriptionEstablishedCallback;
30-
@Nullable private ResubscriptionAttemptCallback wrappedResubscriptionAttemptCallback;
29+
@Nullable
30+
private SubscriptionEstablishedCallback wrappedSubscriptionEstablishedCallback;
31+
@Nullable
32+
private ResubscriptionAttemptCallback wrappedResubscriptionAttemptCallback;
3133
private ReportCallback wrappedReportCallback;
3234
private long callbackHandle;
33-
@Nullable private NodeState nodeState;
35+
@Nullable
36+
private NodeState nodeState;
3437

3538
public ReportCallbackJni(
3639
@Nullable SubscriptionEstablishedCallback subscriptionEstablishedCallback,
@@ -39,8 +42,7 @@ public ReportCallbackJni(
3942
this.wrappedSubscriptionEstablishedCallback = subscriptionEstablishedCallback;
4043
this.wrappedReportCallback = reportCallback;
4144
this.wrappedResubscriptionAttemptCallback = resubscriptionAttemptCallback;
42-
this.callbackHandle =
43-
newCallback(subscriptionEstablishedCallback, resubscriptionAttemptCallback);
45+
this.callbackHandle = newCallback(subscriptionEstablishedCallback, resubscriptionAttemptCallback);
4446
}
4547

4648
long getCallbackHandle() {
@@ -65,50 +67,8 @@ private void onReportEnd() {
6567
nodeState = null;
6668
}
6769

68-
private void setDataVersion(int endpointId, long clusterId, long dataVersion) {
69-
if (nodeState != null) {
70-
nodeState.setDataVersion(endpointId, clusterId, dataVersion);
71-
}
72-
}
73-
74-
private void addAttribute(
75-
int endpointId,
76-
long clusterId,
77-
long attributeId,
78-
Object valueObject,
79-
byte[] tlv,
80-
String jsonString) {
81-
if (nodeState != null) {
82-
nodeState.addAttribute(
83-
endpointId, clusterId, attributeId, new AttributeState(valueObject, tlv, jsonString));
84-
}
85-
}
86-
87-
private void addEvent(
88-
int endpointId,
89-
long clusterId,
90-
long eventId,
91-
long eventNumber,
92-
int priorityLevel,
93-
int timestampType,
94-
long timestampValue,
95-
Object valueObject,
96-
byte[] tlv,
97-
String jsonString) {
98-
if (nodeState != null) {
99-
nodeState.addEvent(
100-
endpointId,
101-
clusterId,
102-
eventId,
103-
new EventState(
104-
eventNumber,
105-
priorityLevel,
106-
timestampType,
107-
timestampValue,
108-
valueObject,
109-
tlv,
110-
jsonString));
111-
}
70+
private NodeState getNodeState() {
71+
return nodeState;
11272
}
11373

11474
private void onError(

0 commit comments

Comments
 (0)