diff --git a/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/MainActivity.java b/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/MainActivity.java index 03d18735edbf35..4aa983c283494a 100644 --- a/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/MainActivity.java +++ b/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/MainActivity.java @@ -27,7 +27,11 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - initJni(); + boolean ret = initJni(); + if (!ret) { + Log.e(TAG, "Failed to initialize Matter TV casting library"); + return; + } Fragment fragment = CommissionerDiscoveryFragment.newInstance(tvCastingApp); getSupportFragmentManager() @@ -71,7 +75,7 @@ public void handleDisconnect() { * AndroidChipPlatform to prepare platform, then start ChipAppServer, then call init on * TvCastingApp */ - private void initJni() { + private boolean initJni() { tvCastingApp = new TvCastingApp(); Context applicationContext = this.getApplicationContext(); @@ -84,7 +88,7 @@ private void initJni() { appParameters.setDacProvider(new DACProviderStub()); appParameters.setSetupPasscode(GlobalCastingConstants.SetupPasscode); appParameters.setDiscriminator(GlobalCastingConstants.Discriminator); - tvCastingApp.initApp(applicationContext, appParameters); + return tvCastingApp.initApp(applicationContext, appParameters); } private void showFragment(Fragment fragment, boolean showOnBack) { 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 c34bb129b2b64d..68b98fc72feb03 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 @@ -65,15 +65,32 @@ public boolean initApp(Context applicationContext, AppParameters appParameters) new ChipMdnsCallbackImpl(), new DiagnosticDataProviderImpl(applicationContext)); - chipPlatform.updateCommissionableDataProviderData( - appParameters.getSpake2pVerifierBase64(), - appParameters.getSpake2pSaltBase64(), - appParameters.getSpake2pIterationCount(), - appParameters.getSetupPasscode(), - appParameters.getDiscriminator()); + boolean ret = + chipPlatform.updateCommissionableDataProviderData( + appParameters.getSpake2pVerifierBase64(), + appParameters.getSpake2pSaltBase64(), + appParameters.getSpake2pIterationCount(), + appParameters.getSetupPasscode(), + appParameters.getDiscriminator()); + if (!ret) { + Log.e( + TAG, + "TvCastingApp.initApp failed to updateCommissionableDataProviderData on chipPlatform"); + return ret; + } + + ret = preInitJni(appParameters); + if (!ret) { + Log.e(TAG, "TvCastingApp.initApp failed in preInitJni"); + return ret; + } chipAppServer = new ChipAppServer(); - chipAppServer.startApp(); + ret = chipAppServer.startApp(); + if (!ret) { + Log.e(TAG, "TvCastingApp.initApp failed in start chipAppServer"); + return ret; + } setDACProvider(appParameters.getDacProvider()); return initJni(appParameters); @@ -81,6 +98,8 @@ public boolean initApp(Context applicationContext, AppParameters appParameters) private native void setDACProvider(DACProvider provider); + private native boolean preInitJni(AppParameters appParameters); + private native boolean initJni(AppParameters appParameters); public void discoverVideoPlayerCommissioners( 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 079c695a3bcd1d..27e3086fbbf913 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 @@ -52,6 +52,37 @@ void JNI_OnUnload(JavaVM * jvm, void * reserved) return AndroidAppServerJNI_OnUnload(jvm, reserved); } +JNI_METHOD(jboolean, preInitJni)(JNIEnv *, jobject, jobject jAppParameters) +{ + chip::DeviceLayer::StackLock lock; + ChipLogProgress(AppServer, "JNI_METHOD preInitJni called"); + + CHIP_ERROR err = CHIP_NO_ERROR; + if (jAppParameters == nullptr) + { + err = CastingServer::GetInstance()->PreInit(); + } + else + { + AppParams appParams; + err = convertJAppParametersToCppAppParams(jAppParameters, appParams); + VerifyOrExit(err == CHIP_NO_ERROR, + ChipLogError(AppServer, "Conversion of AppParameters from jobject to Cpp type failed: %" CHIP_ERROR_FORMAT, + err.Format())); + err = CastingServer::GetInstance()->PreInit(&appParams); + } + VerifyOrExit( + err == CHIP_NO_ERROR, + ChipLogError(AppServer, "Call to CastingServer::GetInstance()->PreInit() failed: %" CHIP_ERROR_FORMAT, err.Format())); +exit: + if (err != CHIP_NO_ERROR) + { + return false; + } + + return true; +} + JNI_METHOD(jboolean, initJni)(JNIEnv *, jobject, jobject jAppParameters) { chip::DeviceLayer::StackLock lock; diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.h index 9c7a4abcb9cdb7..542e31f9a98d68 100644 --- a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.h +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.h @@ -33,9 +33,9 @@ + (CastingServerBridge * _Nullable)getSharedInstance; -- (void)initApp:(AppParameters * _Nullable)appParameters - clientQueue:(dispatch_queue_t _Nonnull)clientQueue - initAppStatusHandler:(nullable void (^)(bool))initAppStatusHandler; +- (MatterError * _Nonnull)initializeApp:(AppParameters * _Nullable)appParameters + clientQueue:(dispatch_queue_t _Nonnull)clientQueue + initAppStatusHandler:(nullable void (^)(bool))initAppStatusHandler; /*! @brief Browse for on-network commissioner TVs diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.mm b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.mm index 24663fa3af419d..0b4137b1be743d 100644 --- a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.mm +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.mm @@ -108,9 +108,9 @@ - (instancetype)init return self; } -- (void)initApp:(AppParameters * _Nullable)appParameters - clientQueue:(dispatch_queue_t _Nonnull)clientQueue - initAppStatusHandler:(nullable void (^)(bool))initAppStatusHandler +- (MatterError *)initializeApp:(AppParameters * _Nullable)appParameters + clientQueue:(dispatch_queue_t _Nonnull)clientQueue + initAppStatusHandler:(nullable void (^)(bool))initAppStatusHandler { ChipLogProgress(AppServer, "CastingServerBridge().initApp() called"); @@ -128,7 +128,7 @@ - (void)initApp:(AppParameters * _Nullable)appParameters err = [ConversionUtils convertToCppAppParamsInfoFrom:_appParameters outAppParams:cppAppParams]; if (err != CHIP_NO_ERROR) { ChipLogError(AppServer, "AppParameters conversion failed: %s", ErrorStr(err)); - return; + return [[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]]; } // set fields in commissionableDataProvider @@ -156,7 +156,7 @@ - (void)initApp:(AppParameters * _Nullable)appParameters setupDiscriminator); if (err != CHIP_NO_ERROR) { ChipLogError(AppServer, "Failed to initialize CommissionableDataProvider: %s", ErrorStr(err)); - return; + return [[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]]; } if (_appParameters.deviceAttestationCredentials != nil) { @@ -219,13 +219,24 @@ - (void)initApp:(AppParameters * _Nullable)appParameters err = _serverInitParams->InitializeStaticResourcesBeforeServerInit(); if (err != CHIP_NO_ERROR) { ChipLogError(AppServer, "InitializeStaticResourcesBeforeServerInit failed: %s", ErrorStr(err)); - return; + return [[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]]; + } + + AppParams appParam; + if (appParameters == nil) { + err = CastingServer::GetInstance()->PreInit(); + } else if ((err = [ConversionUtils convertToCppAppParamsInfoFrom:appParameters outAppParams:appParam]) == CHIP_NO_ERROR) { + err = CastingServer::GetInstance()->PreInit(&appParam); + } + if (err != CHIP_NO_ERROR) { + ChipLogError(AppServer, "CastingServer PreInit failed: %s", ErrorStr(err)); + return [[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]]; } err = chip::Server::GetInstance().Init(*_serverInitParams); if (err != CHIP_NO_ERROR) { ChipLogError(AppServer, "chip::Server init failed: %s", ErrorStr(err)); - return; + return [[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]]; } _chipWorkQueue = chip::DeviceLayer::PlatformMgrImpl().GetWorkQueue(); @@ -251,6 +262,9 @@ - (void)initApp:(AppParameters * _Nullable)appParameters initAppStatusHandler(initAppStatus); }); }); + + return [[MatterError alloc] initWithCode:CHIP_NO_ERROR.AsInteger() + message:[NSString stringWithUTF8String:CHIP_NO_ERROR.AsString()]]; } - (void)discoverCommissioners:(dispatch_queue_t _Nonnull)clientQueue diff --git a/examples/tv-casting-app/darwin/TvCasting/TvCasting/TvCastingApp.swift b/examples/tv-casting-app/darwin/TvCasting/TvCasting/TvCastingApp.swift index 73c4eb17494b1a..2797e344d83f96 100644 --- a/examples/tv-casting-app/darwin/TvCasting/TvCasting/TvCastingApp.swift +++ b/examples/tv-casting-app/darwin/TvCasting/TvCasting/TvCastingApp.swift @@ -46,9 +46,10 @@ struct TvCastingApp: App { appParameters.onboardingPayload = onboardingParameters - castingServerBridge.initApp(appParameters, clientQueue: DispatchQueue.main, initAppStatusHandler: { (result: Bool) -> () in - self.Log.info("initApp result \(result)") + var err = castingServerBridge.initializeApp(appParameters, clientQueue: DispatchQueue.main, initAppStatusHandler: { (result: Bool) -> () in + self.Log.info("initializeApp result \(result)") }) + self.Log.info("initializeApp return value \(err)") } }) .onReceive(NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification)) { _ in diff --git a/examples/tv-casting-app/linux/main.cpp b/examples/tv-casting-app/linux/main.cpp index d6d674ebb2a954..75584254a6002f 100644 --- a/examples/tv-casting-app/linux/main.cpp +++ b/examples/tv-casting-app/linux/main.cpp @@ -134,6 +134,8 @@ int main(int argc, char * argv[]) SetDeviceAttestationVerifier(GetDefaultDACVerifier(testingRootStore)); } + SuccessOrExit(err = CastingServer::GetInstance()->PreInit()); + // Enter commissioning mode, open commissioning window static chip::CommonCaseDeviceServerInitParams initParams; VerifyOrDie(CHIP_NO_ERROR == initParams.InitializeStaticResourcesBeforeServerInit()); 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 227465acc8d0ba..509b2664a08ab8 100644 --- a/examples/tv-casting-app/tv-casting-common/include/CastingServer.h +++ b/examples/tv-casting-app/tv-casting-common/include/CastingServer.h @@ -53,6 +53,7 @@ class CastingServer void operator=(const CastingServer &) = delete; static CastingServer * GetInstance(); + CHIP_ERROR PreInit(AppParams * AppParams = nullptr); CHIP_ERROR Init(AppParams * AppParams = nullptr); CHIP_ERROR InitBindingHandlers(); @@ -419,6 +420,8 @@ class CastingServer static CastingServer * castingServer_; CastingServer(); + CHIP_ERROR SetRotatingDeviceIdUniqueId(chip::Optional rotatingDeviceIdUniqueId); + static void DeviceEventCallback(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg); void ReadServerClusters(chip::EndpointId endpointId); 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 206fbc2e1e3d5b..137fa9eec7db7a 100644 --- a/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp +++ b/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp @@ -36,6 +36,11 @@ CastingServer * CastingServer::GetInstance() return castingServer_; } +CHIP_ERROR CastingServer::PreInit(AppParams * AppParams) +{ + return SetRotatingDeviceIdUniqueId(AppParams != nullptr ? AppParams->GetRotatingDeviceIdUniqueId() : chip::NullOptional); +} + CHIP_ERROR CastingServer::Init(AppParams * AppParams) { if (mInited) @@ -43,12 +48,24 @@ CHIP_ERROR CastingServer::Init(AppParams * AppParams) return CHIP_NO_ERROR; } + // Initialize binding handlers + ReturnErrorOnFailure(InitBindingHandlers()); + + // Add callback to send Content casting commands after commissioning completes + ReturnErrorOnFailure(DeviceLayer::PlatformMgrImpl().AddEventHandler(DeviceEventCallback, 0)); + + mInited = true; + return CHIP_NO_ERROR; +} + +CHIP_ERROR CastingServer::SetRotatingDeviceIdUniqueId(chip::Optional rotatingDeviceIdUniqueIdOptional) +{ #if CHIP_ENABLE_ROTATING_DEVICE_ID // if this class's client provided a RotatingDeviceIdUniqueId, use that - if (AppParams != nullptr && AppParams->GetRotatingDeviceIdUniqueId().HasValue()) + if (rotatingDeviceIdUniqueIdOptional.HasValue()) { - ByteSpan rotatingDeviceIdUniqueId(AppParams->GetRotatingDeviceIdUniqueId().Value()); - chip::DeviceLayer::ConfigurationMgr().SetRotatingDeviceIdUniqueId(rotatingDeviceIdUniqueId); + ChipLogProgress(AppServer, "Setting unique ID (for generating rotating device ID) received from client app"); + return chip::DeviceLayer::ConfigurationMgr().SetRotatingDeviceIdUniqueId(rotatingDeviceIdUniqueIdOptional.Value()); } #ifdef CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID else @@ -61,18 +78,10 @@ CHIP_ERROR CastingServer::Init(AppParams * AppParams) } // ByteSpan rotatingDeviceIdUniqueIdSpan(rotatingDeviceIdUniqueId); - chip::DeviceLayer::ConfigurationMgr().SetRotatingDeviceIdUniqueId(ByteSpan(rotatingDeviceIdUniqueId)); + return chip::DeviceLayer::ConfigurationMgr().SetRotatingDeviceIdUniqueId(ByteSpan(rotatingDeviceIdUniqueId)); } #endif // CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID #endif // CHIP_ENABLE_ROTATING_DEVICE_ID - - // Initialize binding handlers - ReturnErrorOnFailure(InitBindingHandlers()); - - // Add callback to send Content casting commands after commissioning completes - ReturnErrorOnFailure(DeviceLayer::PlatformMgrImpl().AddEventHandler(DeviceEventCallback, 0)); - - mInited = true; return CHIP_NO_ERROR; }