diff --git a/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/ConnectionFragment.java b/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/ConnectionFragment.java index 9b7c8f880f99b9..5005e9058c2b68 100644 --- a/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/ConnectionFragment.java +++ b/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/ConnectionFragment.java @@ -121,6 +121,36 @@ private void beginCommissioning( FailureCallback onConnectionFailure, SuccessCallback onNewOrUpdatedEndpoints) { Log.d(TAG, "Running commissioning"); + + Object commissioningWindowOpened = + new MatterCallbackHandler() { + @Override + public void handle(MatterError error) { + Log.d(TAG, "handle() called on CommissioningWindowOpened event with " + error); + if (error.isNoError()) { + if (selectedCommissioner != null && selectedCommissioner.getNumIPs() > 0) { + String ipAddress = selectedCommissioner.getIpAddresses().get(0).getHostAddress(); + Log.d( + TAG, + "ConnectionFragment calling tvCastingApp.sendUserDirectedCommissioningRequest with IP: " + + ipAddress + + " port: " + + selectedCommissioner.getPort()); + + sendUdcSuccess = tvCastingApp.sendCommissioningRequest(selectedCommissioner); + updateUiOnConnectionSuccess(); + } + } else { + getActivity() + .runOnUiThread( + () -> { + commissioningWindowStatusView.setText( + "Failed to open commissioning window"); + }); + } + } + }; + Object commissioningComplete = new MatterCallbackHandler() { @Override @@ -154,6 +184,7 @@ public void handle(MatterError error) { }; CommissioningCallbacks commissioningCallbacks = new CommissioningCallbacks(); + commissioningCallbacks.setCommissioningWindowOpened(commissioningWindowOpened); commissioningCallbacks.setCommissioningComplete(commissioningComplete); commissioningCallbacks.setSessionEstablishmentStarted(sessionEstablishmentStartedCallback); commissioningCallbacks.setSessionEstablished(sessionEstablishedCallback); @@ -162,34 +193,6 @@ public void handle(MatterError error) { this.openCommissioningWindowSuccess = tvCastingApp.openBasicCommissioningWindow( GlobalCastingConstants.CommissioningWindowDurationSecs, - new MatterCallbackHandler() { - @Override - public void handle(MatterError error) { - Log.d(TAG, "handle() called on CommissioningWindowOpened event with " + error); - if (error.isNoError()) { - if (selectedCommissioner != null && selectedCommissioner.getNumIPs() > 0) { - String ipAddress = - selectedCommissioner.getIpAddresses().get(0).getHostAddress(); - Log.d( - TAG, - "ConnectionFragment calling tvCastingApp.sendUserDirectedCommissioningRequest with IP: " - + ipAddress - + " port: " - + selectedCommissioner.getPort()); - - sendUdcSuccess = tvCastingApp.sendCommissioningRequest(selectedCommissioner); - updateUiOnConnectionSuccess(); - } - } else { - getActivity() - .runOnUiThread( - () -> { - commissioningWindowStatusView.setText( - "Failed to open commissioning window"); - }); - } - } - }, commissioningCallbacks, onConnectionSuccess, onConnectionFailure, diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/CommissioningCallbacks.java b/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/CommissioningCallbacks.java index 225bb10371936e..3a30f07f49b0d3 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/CommissioningCallbacks.java +++ b/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/CommissioningCallbacks.java @@ -22,6 +22,7 @@ public class CommissioningCallbacks { private SuccessCallback sessionEstablished; private FailureCallback sessionEstablishmentStopped; private Object commissioningComplete; + private Object commissioningWindowOpened; public SuccessCallback getSessionEstablishmentStarted() { return sessionEstablishmentStarted; @@ -35,6 +36,14 @@ public SuccessCallback getSessionEstablished() { return sessionEstablished; } + public Object getCommissioningWindowOpened() { + return commissioningWindowOpened; + } + + public void setCommissioningWindowOpened(Object commissioningWindowOpened) { + this.commissioningWindowOpened = commissioningWindowOpened; + } + public void setSessionEstablished(SuccessCallback sessionEstablished) { this.sessionEstablished = sessionEstablished; } diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/TvCastingApp.java b/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/TvCastingApp.java index 357dbdc8eddc5b..14561c2a32b006 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/TvCastingApp.java +++ b/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/TvCastingApp.java @@ -181,7 +181,6 @@ public void stopVideoPlayerDiscovery() { public native boolean openBasicCommissioningWindow( int duration, - Object commissioningWindowOpenedHandler, CommissioningCallbacks commissioningCallbacks, SuccessCallback onConnectionSuccess, FailureCallback onConnectionFailure, diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/TvCastingApp-JNI.cpp b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/TvCastingApp-JNI.cpp index 94ac5ce205796f..3015bd7e6fb4b9 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/TvCastingApp-JNI.cpp +++ b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/TvCastingApp-JNI.cpp @@ -114,8 +114,8 @@ JNI_METHOD(void, setDACProvider)(JNIEnv *, jobject, jobject provider) } JNI_METHOD(jboolean, openBasicCommissioningWindow) -(JNIEnv * env, jobject, jint duration, jobject jCommissioningWindowOpenedHandler, jobject jCommissioningCallbacks, - jobject jOnConnectionSuccessHandler, jobject jOnConnectionFailureHandler, jobject jOnNewOrUpdatedEndpointHandler) +(JNIEnv * env, jobject, jint duration, jobject jCommissioningCallbacks, jobject jOnConnectionSuccessHandler, + jobject jOnConnectionFailureHandler, jobject jOnNewOrUpdatedEndpointHandler) { chip::DeviceLayer::StackLock lock; @@ -123,13 +123,22 @@ JNI_METHOD(jboolean, openBasicCommissioningWindow) CHIP_ERROR err = CHIP_NO_ERROR; - err = TvCastingAppJNIMgr().getCommissioningWindowOpenedHandler().SetUp(env, jCommissioningWindowOpenedHandler); - VerifyOrReturnValue(err == CHIP_NO_ERROR, false); - CommissioningCallbacks commissioningCallbacks; jclass jCommissioningCallbacksClass; chip::JniReferences::GetInstance().GetClassRef(env, "com/chip/casting/CommissioningCallbacks", jCommissioningCallbacksClass); + jfieldID jCommissioningWindowOpenedField = + env->GetFieldID(jCommissioningCallbacksClass, "commissioningWindowOpened", "Ljava/lang/Object;"); + jobject jCommissioningWindowOpened = env->GetObjectField(jCommissioningCallbacks, jCommissioningWindowOpenedField); + if (jCommissioningWindowOpened != nullptr) + { + err = TvCastingAppJNIMgr().getCommissioningWindowOpenedHandler().SetUp(env, jCommissioningWindowOpened); + VerifyOrReturnValue(err == CHIP_NO_ERROR, false); + commissioningCallbacks.commissioningWindowOpenedCallback = [](CHIP_ERROR err) { + TvCastingAppJNIMgr().getCommissioningWindowOpenedHandler().Handle(err); + }; + } + jfieldID jCommissioningCompleteField = env->GetFieldID(jCommissioningCallbacksClass, "commissioningComplete", "Ljava/lang/Object;"); jobject jCommissioningComplete = env->GetObjectField(jCommissioningCallbacks, jCommissioningCompleteField); @@ -189,7 +198,7 @@ JNI_METHOD(jboolean, openBasicCommissioningWindow) ChipLogError(AppServer, "OnNewOrUpdatedEndpointHandler.SetUp failed %" CHIP_ERROR_FORMAT, err.Format())); err = CastingServer::GetInstance()->OpenBasicCommissioningWindow( - [](CHIP_ERROR err) { TvCastingAppJNIMgr().getCommissioningWindowOpenedHandler().Handle(err); }, commissioningCallbacks, + commissioningCallbacks, [](TargetVideoPlayerInfo * videoPlayer) { TvCastingAppJNIMgr().getOnConnectionSuccessHandler(false).Handle(videoPlayer); }, [](CHIP_ERROR err) { TvCastingAppJNIMgr().getOnConnectionFailureHandler(false).Handle(err); }, [](TargetEndpointInfo * endpoint) { TvCastingAppJNIMgr().getOnNewOrUpdatedEndpointHandler(false).Handle(endpoint); }); diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.h index 6aa59917306b41..d677555f9710aa 100644 --- a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.h +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.h @@ -121,11 +121,10 @@ @param commissioningCallbackHandlers Optional parameter to specific handlers for callbacks during commissioning */ - (void)openBasicCommissioningWindow:(dispatch_queue_t _Nonnull)clientQueue - commissioningWindowOpenedCallback:(void (^_Nonnull)(MatterError * _Nonnull))commissioningWindowOpenedCallback - commissioningCallbackHandlers:(CommissioningCallbackHandlers * _Nullable)commissioningCallbackHandlers - onConnectionSuccessCallback:(void (^_Nonnull)(VideoPlayer * _Nonnull))onConnectionSuccessCallback - onConnectionFailureCallback:(void (^_Nonnull)(MatterError * _Nonnull))onConnectionFailureCallback - onNewOrUpdatedEndpointCallback:(void (^_Nonnull)(ContentApp * _Nonnull))onNewOrUpdatedEndpointCallback; + commissioningCallbackHandlers:(CommissioningCallbackHandlers * _Nullable)commissioningCallbackHandlers + onConnectionSuccessCallback:(void (^_Nonnull)(VideoPlayer * _Nonnull))onConnectionSuccessCallback + onConnectionFailureCallback:(void (^_Nonnull)(MatterError * _Nonnull))onConnectionFailureCallback + onNewOrUpdatedEndpointCallback:(void (^_Nonnull)(ContentApp * _Nonnull))onNewOrUpdatedEndpointCallback; /*! @brief Gets the list of VideoPlayers currently connected diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.mm b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.mm index c1d9e25020f8b0..f0936a9b4d4463 100644 --- a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.mm +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.mm @@ -600,17 +600,33 @@ - (OnboardingPayload *)getOnboardingPayload } - (void)openBasicCommissioningWindow:(dispatch_queue_t _Nonnull)clientQueue - commissioningWindowOpenedCallback:(void (^_Nonnull)(MatterError * _Nonnull))commissioningWindowOpenedCallback - commissioningCallbackHandlers:(CommissioningCallbackHandlers * _Nullable)commissioningCallbackHandlers - onConnectionSuccessCallback:(void (^_Nonnull)(VideoPlayer * _Nonnull))onConnectionSuccessCallback - onConnectionFailureCallback:(void (^_Nonnull)(MatterError * _Nonnull))onConnectionFailureCallback - onNewOrUpdatedEndpointCallback:(void (^_Nonnull)(ContentApp * _Nonnull))onNewOrUpdatedEndpointCallback + commissioningCallbackHandlers:(CommissioningCallbackHandlers * _Nullable)commissioningCallbackHandlers + onConnectionSuccessCallback:(void (^_Nonnull)(VideoPlayer * _Nonnull))onConnectionSuccessCallback + onConnectionFailureCallback:(void (^_Nonnull)(MatterError * _Nonnull))onConnectionFailureCallback + onNewOrUpdatedEndpointCallback:(void (^_Nonnull)(ContentApp * _Nonnull))onNewOrUpdatedEndpointCallback { [self dispatchOnMatterSDKQueue:@"openBasicCommissioningWindow(...)" block:^{ CommissioningCallbacks commissioningCallbacks; if (commissioningCallbackHandlers != nil) { + if (commissioningCallbackHandlers.commissioningWindowOpenedCallback != nil) { + commissioningCallbacks.commissioningWindowOpenedCallback + = [clientQueue, commissioningCallbackHandlers](CHIP_ERROR err) { + [[CastingServerBridge getSharedInstance] + dispatchOnClientQueue:clientQueue + description:@"openBasicCommissioningWindow(...) " + @"commissioningWindowOpenedCallback" + block:^{ + commissioningCallbackHandlers + .commissioningWindowOpenedCallback([[MatterError alloc] + initWithCode:err.AsInteger() + message:[NSString stringWithUTF8String: + err.AsString()]]); + }]; + }; + } + if (commissioningCallbackHandlers.commissioningCompleteCallback != nil) { commissioningCallbacks.commissioningComplete = [clientQueue, commissioningCallbackHandlers]( CHIP_ERROR err) { @@ -672,17 +688,6 @@ - (void)openBasicCommissioningWindow:(dispatch_queue_t _Nonnull)clientQueue } } CHIP_ERROR err = CastingServer::GetInstance()->OpenBasicCommissioningWindow( - [clientQueue, commissioningWindowOpenedCallback](CHIP_ERROR err) { - [[CastingServerBridge getSharedInstance] - dispatchOnClientQueue:clientQueue - description: - @"openBasicCommissioningWindow(...) commissioningWindowRequestedCallback" - block:^{ - commissioningWindowOpenedCallback([[MatterError alloc] - initWithCode:err.AsInteger() - message:[NSString stringWithUTF8String:err.AsString()]]); - }]; - }, commissioningCallbacks, [clientQueue, onConnectionSuccessCallback](TargetVideoPlayerInfo * cppTargetVideoPlayerInfo) { VideoPlayer * videoPlayer = diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CommissioningCallbackHandlers.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CommissioningCallbackHandlers.h index 736a9d0a79e334..5cb4896caff9c3 100644 --- a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CommissioningCallbackHandlers.h +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CommissioningCallbackHandlers.h @@ -25,6 +25,7 @@ - (CommissioningCallbackHandlers * _Nonnull) initWithCommissioningWindowRequestedHandler:(void (^_Nonnull)(MatterError * _Nonnull))commissioningWindowRequestedHandler + commissioningWindowOpenedCallback:(void (^_Nonnull)(MatterError * _Nonnull))commissioningWindowOpenedCallback commissioningCompleteCallback:(void (^_Nonnull)(MatterError * _Nonnull))commissioningCompleteCallback sessionEstablishmentStartedCallback:(void (^_Nullable)(void))sessionEstablishmentStartedCallback sessionEstablishedCallback:(void (^_Nullable)(void))sessionEstablishedCallback @@ -32,6 +33,8 @@ @property void (^_Nullable commissioningWindowRequestedHandler)(MatterError * _Nonnull); +@property void (^_Nullable commissioningWindowOpenedCallback)(MatterError * _Nonnull); + @property void (^_Nullable commissioningCompleteCallback)(MatterError * _Nonnull); @property void (^_Nullable sessionEstablishmentStartedCallback)(void); diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CommissioningCallbackHandlers.m b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CommissioningCallbackHandlers.m index cc1c772295fc73..c9322cef6ee96a 100644 --- a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CommissioningCallbackHandlers.m +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CommissioningCallbackHandlers.m @@ -21,6 +21,7 @@ @implementation CommissioningCallbackHandlers - (CommissioningCallbackHandlers * _Nonnull) initWithCommissioningWindowRequestedHandler:(void (^_Nonnull)(MatterError * _Nonnull))commissioningWindowRequestedHandler + commissioningWindowOpenedCallback:(void (^_Nonnull)(MatterError * _Nonnull))commissioningWindowOpenedCallback commissioningCompleteCallback:(void (^_Nonnull)(MatterError * _Nonnull))commissioningCompleteCallback sessionEstablishmentStartedCallback:(void (^_Nullable)(void))sessionEstablishmentStartedCallback sessionEstablishedCallback:(void (^_Nullable)(void))sessionEstablishedCallback @@ -29,6 +30,7 @@ @implementation CommissioningCallbackHandlers self = [super init]; if (self) { _commissioningWindowRequestedHandler = commissioningWindowRequestedHandler; + _commissioningWindowOpenedCallback = commissioningWindowOpenedCallback; _commissioningCompleteCallback = commissioningCompleteCallback; _sessionEstablishmentStartedCallback = sessionEstablishmentStartedCallback; _sessionEstablishedCallback = sessionEstablishedCallback; diff --git a/examples/tv-casting-app/darwin/TvCasting/TvCasting/CommissioningViewModel.swift b/examples/tv-casting-app/darwin/TvCasting/TvCasting/CommissioningViewModel.swift index c3e6ec58924499..e06e8b29bba8b5 100644 --- a/examples/tv-casting-app/darwin/TvCasting/TvCasting/CommissioningViewModel.swift +++ b/examples/tv-casting-app/darwin/TvCasting/TvCasting/CommissioningViewModel.swift @@ -42,21 +42,22 @@ class CommissioningViewModel: ObservableObject { if(error.code == 0) { castingServerBridge.openBasicCommissioningWindow(DispatchQueue.main, - commissioningWindowOpenedCallback: { (result: MatterError) -> () in - DispatchQueue.main.async { - self.commisisoningWindowOpened = (result.code == 0) - // Send User directed commissioning request if a commissioner with a known IP addr was selected - if(selectedCommissioner != nil && selectedCommissioner!.numIPs > 0) - { - self.sendUserDirectedCommissioningRequest(selectedCommissioner: selectedCommissioner) - } - } - }, commissioningCallbackHandlers: CommissioningCallbackHandlers( commissioningWindowRequestedHandler: { (result: MatterError) -> () in DispatchQueue.main.async { - self.Log.info("Commissioning Window opening status: \(result)") + self.Log.info("Commissioning Window Requested status: \(result)") + self.commisisoningWindowOpened = (result.code == 0) + } + }, + commissioningWindowOpenedCallback: { (result: MatterError) -> () in + self.Log.info("Commissioning Window Opened status: \(result)") + DispatchQueue.main.async { self.commisisoningWindowOpened = (result.code == 0) + // Send User directed commissioning request if a commissioner with a known IP addr was selected + if(selectedCommissioner != nil && selectedCommissioner!.numIPs > 0) + { + self.sendUserDirectedCommissioningRequest(selectedCommissioner: selectedCommissioner) + } } }, commissioningCompleteCallback: { (result: MatterError) -> () in diff --git a/examples/tv-casting-app/tv-casting-common/include/CastingServer.h b/examples/tv-casting-app/tv-casting-common/include/CastingServer.h index d1c640aadf3f69..27edd03a3a181a 100644 --- a/examples/tv-casting-app/tv-casting-common/include/CastingServer.h +++ b/examples/tv-casting-app/tv-casting-common/include/CastingServer.h @@ -63,8 +63,7 @@ class CastingServer : public AppDelegate CHIP_ERROR StopDiscoverCommissioners(); const chip::Dnssd::DiscoveredNodeData * GetDiscoveredCommissioner(int index, chip::Optional & outAssociatedConnectableVideoPlayer); - CHIP_ERROR OpenBasicCommissioningWindow(std::function commissioningWindowOpenedCallback, - CommissioningCallbacks commissioningCallbacks, + CHIP_ERROR OpenBasicCommissioningWindow(CommissioningCallbacks commissioningCallbacks, std::function onConnectionSuccess, std::function onConnectionFailure, std::function onNewOrUpdatedEndpoint); @@ -466,9 +465,7 @@ class CastingServer : public AppDelegate chip::Inet::IPAddress mTargetVideoPlayerIpAddress[chip::Dnssd::CommonResolutionData::kMaxIPAddresses]; chip::Controller::CommissionableNodeController mCommissionableNodeController; - std::function mCommissioningWindowOpenedCallback; CommissioningCallbacks mCommissioningCallbacks; - std::function mCommissioningCompleteCallback; std::function mOnNewOrUpdatedEndpoint; std::function mOnConnectionSuccessClientCallback; diff --git a/examples/tv-casting-app/tv-casting-common/include/CommissioningCallbacks.h b/examples/tv-casting-app/tv-casting-common/include/CommissioningCallbacks.h index 02a470115fc7d8..13ce0d747003c9 100644 --- a/examples/tv-casting-app/tv-casting-common/include/CommissioningCallbacks.h +++ b/examples/tv-casting-app/tv-casting-common/include/CommissioningCallbacks.h @@ -20,8 +20,9 @@ struct CommissioningCallbacks { - std::function sessionEstablishmentStarted = {}; - std::function sessionEstablished = {}; - std::function sessionEstablishmentStopped = {}; - std::function commissioningComplete = {}; + std::function commissioningWindowOpenedCallback = {}; + std::function sessionEstablishmentStarted = {}; + std::function sessionEstablished = {}; + std::function sessionEstablishmentStopped = {}; + std::function commissioningComplete = {}; }; diff --git a/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp b/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp index 802073be582dc1..e8256de1ed5a70 100644 --- a/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp +++ b/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp @@ -147,14 +147,12 @@ CHIP_ERROR CastingServer::StopDiscoverCommissioners() return mCommissionableNodeController.StopDiscoverCommissioners(); } -CHIP_ERROR CastingServer::OpenBasicCommissioningWindow(std::function commissioningWindowOpenedCallback, - CommissioningCallbacks commissioningCallbacks, +CHIP_ERROR CastingServer::OpenBasicCommissioningWindow(CommissioningCallbacks commissioningCallbacks, std::function onConnectionSuccess, std::function onConnectionFailure, std::function onNewOrUpdatedEndpoint) { VerifyOrReturnError(mInited, CHIP_ERROR_INCORRECT_STATE); - mCommissioningWindowOpenedCallback = commissioningWindowOpenedCallback; mCommissioningCallbacks = commissioningCallbacks; mOnConnectionSuccessClientCallback = onConnectionSuccess; mOnConnectionFailureClientCallback = onConnectionFailure; @@ -171,7 +169,10 @@ CHIP_ERROR CastingServer::OpenBasicCommissioningWindow(std::functionmCommissioningWindowOpenedCallback(err); + if (CastingServer::GetInstance()->mCommissioningCallbacks.commissioningWindowOpenedCallback) + { + CastingServer::GetInstance()->mCommissioningCallbacks.commissioningWindowOpenedCallback(err); + } } void CastingServer::OnCommissioningSessionStarted()