diff --git a/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/CommissionerDiscoveryFragment.java b/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/CommissionerDiscoveryFragment.java index ddc613658d1366..0fda34fa7a7b84 100644 --- a/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/CommissionerDiscoveryFragment.java +++ b/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/CommissionerDiscoveryFragment.java @@ -1,8 +1,6 @@ package com.chip.casting.app; import android.content.Context; -import android.net.nsd.NsdManager; -import android.net.wifi.WifiManager; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -69,8 +67,6 @@ public void onClick(View v) { manualCommissioningButton.setOnClickListener(manualCommissioningButtonOnClickListener); Context context = this.getContext(); - Context applicationContext = this.getContext().getApplicationContext(); - SuccessCallback successCallback = new SuccessCallback() { @Override @@ -112,11 +108,7 @@ public void handle(MatterError matterError) { }; tvCastingApp.discoverVideoPlayerCommissioners( - (WifiManager) context.getSystemService(Context.WIFI_SERVICE), - (NsdManager) applicationContext.getSystemService(Context.NSD_SERVICE), - DISCOVERY_DURATION_SECS, - successCallback, - failureCallback); + DISCOVERY_DURATION_SECS, successCallback, failureCallback); } @VisibleForTesting 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 85812285fe581e..a9884bfdb88eac 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 @@ -6,15 +6,6 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; -import chip.appserver.ChipAppServer; -import chip.platform.AndroidBleManager; -import chip.platform.AndroidChipPlatform; -import chip.platform.ChipMdnsCallbackImpl; -import chip.platform.DiagnosticDataProviderImpl; -import chip.platform.NsdManagerServiceBrowser; -import chip.platform.NsdManagerServiceResolver; -import chip.platform.PreferencesConfigurationManager; -import chip.platform.PreferencesKeyValueStoreManager; import com.chip.casting.AppParameters; import com.chip.casting.DACProviderStub; import com.chip.casting.DiscoveredNodeData; @@ -29,7 +20,6 @@ public class MainActivity extends AppCompatActivity private static final String TAG = MainActivity.class.getSimpleName(); - private ChipAppServer chipAppServer; private TvCastingApp tvCastingApp; @Override @@ -79,30 +69,17 @@ public void handleDisconnect() { private void initJni() { tvCastingApp = new TvCastingApp(); - tvCastingApp.setDACProvider(new DACProviderStub()); Context applicationContext = this.getApplicationContext(); - AndroidChipPlatform chipPlatform = - new AndroidChipPlatform( - new AndroidBleManager(), - new PreferencesKeyValueStoreManager(applicationContext), - new PreferencesConfigurationManager(applicationContext), - new NsdManagerServiceResolver(applicationContext), - new NsdManagerServiceBrowser(applicationContext), - new ChipMdnsCallbackImpl(), - new DiagnosticDataProviderImpl(applicationContext)); - - chipPlatform.updateCommissionableDataProviderData( - null, null, 0, GlobalCastingConstants.SetupPasscode, GlobalCastingConstants.Discriminator); - - chipAppServer = new ChipAppServer(); - chipAppServer.startApp(); AppParameters appParameters = new AppParameters(); byte[] rotatingDeviceIdUniqueId = new byte[AppParameters.MIN_ROTATING_DEVICE_ID_UNIQUE_ID_LENGTH]; new Random().nextBytes(rotatingDeviceIdUniqueId); appParameters.setRotatingDeviceIdUniqueId(rotatingDeviceIdUniqueId); - tvCastingApp.init(appParameters); + appParameters.setDacProvider(new DACProviderStub()); + appParameters.setSetupPasscode(GlobalCastingConstants.SetupPasscode); + appParameters.setDiscriminator(GlobalCastingConstants.Discriminator); + tvCastingApp.initApp(applicationContext, appParameters); } private void showFragment(Fragment fragment, boolean showOnBack) { diff --git a/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/util/GlobalCastingConstants.java b/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/util/GlobalCastingConstants.java index ef9dd8eeaa0e06..4bd6d25a08364c 100644 --- a/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/util/GlobalCastingConstants.java +++ b/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/util/GlobalCastingConstants.java @@ -1,12 +1,8 @@ package com.chip.casting.util; -import java.util.Arrays; -import java.util.List; - public class GlobalCastingConstants { public static final String CommissionerServiceType = "_matterd._udp."; public static final int CommissioningWindowDurationSecs = 3 * 60; - public static int SetupPasscode = 20202021; - public static int Discriminator = 0xF00; - public static List CommissionerDeviceTypeFilter = Arrays.asList(35L); // Video player = 35 + public static final int SetupPasscode = 20202021; + public static final int Discriminator = 0xF00; } diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/AppParameters.java b/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/AppParameters.java index ffca2ac246dd40..a98f9d8bbd4f86 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/AppParameters.java +++ b/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/AppParameters.java @@ -19,8 +19,14 @@ public class AppParameters { public static final int MIN_ROTATING_DEVICE_ID_UNIQUE_ID_LENGTH = 16; + private static final int TEST_SETUP_PASSCODE = 20202021; + private static final int TEST_DISCRIMINATOR = 0xF00; + private DACProvider TEST_DAC_PROVIDER = new DACProviderStub(); private byte[] rotatingDeviceIdUniqueId; + private DACProvider dacProvider = TEST_DAC_PROVIDER; + private int setupPasscode = TEST_SETUP_PASSCODE; + private int discriminator = TEST_DISCRIMINATOR; public void setRotatingDeviceIdUniqueId(byte[] rotatingDeviceIdUniqueId) { this.rotatingDeviceIdUniqueId = rotatingDeviceIdUniqueId; @@ -29,4 +35,28 @@ public void setRotatingDeviceIdUniqueId(byte[] rotatingDeviceIdUniqueId) { public byte[] getRotatingDeviceIdUniqueId() { return rotatingDeviceIdUniqueId; } + + public DACProvider getDacProvider() { + return dacProvider; + } + + public void setDacProvider(DACProvider dacProvider) { + this.dacProvider = dacProvider; + } + + public int getSetupPasscode() { + return setupPasscode; + } + + public void setSetupPasscode(int setupPasscode) { + this.setupPasscode = setupPasscode; + } + + public int getDiscriminator() { + return discriminator; + } + + public void setDiscriminator(int discriminator) { + this.discriminator = discriminator; + } } diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/NsdDiscoveryListener.java b/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/NsdDiscoveryListener.java index 5a0f48550634f0..e58f639965bf4f 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/NsdDiscoveryListener.java +++ b/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/NsdDiscoveryListener.java @@ -20,6 +20,7 @@ import android.net.nsd.NsdManager; import android.net.nsd.NsdServiceInfo; import android.util.Log; +import chip.platform.NsdManagerServiceResolver; import java.util.List; public class NsdDiscoveryListener implements NsdManager.DiscoveryListener { @@ -31,6 +32,7 @@ public class NsdDiscoveryListener implements NsdManager.DiscoveryListener { private final List preCommissionedVideoPlayers; private final SuccessCallback successCallback; private final FailureCallback failureCallback; + private final NsdManagerServiceResolver.NsdManagerResolverAvailState nsdManagerResolverAvailState; public NsdDiscoveryListener( NsdManager nsdManager, @@ -38,13 +40,15 @@ public NsdDiscoveryListener( List deviceTypeFilter, List preCommissionedVideoPlayers, SuccessCallback successCallback, - FailureCallback failureCallback) { + FailureCallback failureCallback, + NsdManagerServiceResolver.NsdManagerResolverAvailState nsdManagerResolverAvailState) { this.nsdManager = nsdManager; this.targetServiceType = targetServiceType; this.deviceTypeFilter = deviceTypeFilter; this.preCommissionedVideoPlayers = preCommissionedVideoPlayers; this.successCallback = successCallback; this.failureCallback = failureCallback; + this.nsdManagerResolverAvailState = nsdManagerResolverAvailState; } @Override @@ -56,6 +60,9 @@ public void onDiscoveryStarted(String regType) { public void onServiceFound(NsdServiceInfo service) { Log.d(TAG, "Service discovery success. " + service); if (service.getServiceType().equals(targetServiceType)) { + if (nsdManagerResolverAvailState != null) { + nsdManagerResolverAvailState.acquireResolver(); + } nsdManager.resolveService( service, new NsdResolveListener( @@ -63,7 +70,8 @@ public void onServiceFound(NsdServiceInfo service) { deviceTypeFilter, preCommissionedVideoPlayers, successCallback, - failureCallback)); + failureCallback, + nsdManagerResolverAvailState)); } else { Log.d(TAG, "Ignoring discovered service: " + service.toString()); } @@ -79,6 +87,9 @@ public void onServiceLost(NsdServiceInfo service) { @Override public void onDiscoveryStopped(String serviceType) { Log.i(TAG, "Discovery stopped: " + serviceType); + if (nsdManagerResolverAvailState != null) { + nsdManagerResolverAvailState.signalFree(); + } } @Override @@ -93,6 +104,9 @@ public void onStartDiscoveryFailed(String serviceType, int errorCode) { @Override public void onStopDiscoveryFailed(String serviceType, int errorCode) { Log.e(TAG, "Discovery failed to stop: Error code:" + errorCode); + if (nsdManagerResolverAvailState != null) { + nsdManagerResolverAvailState.signalFree(); + } failureCallback.handle( new MatterError( 3, "NsdDiscoveryListener Discovery failed to stop: Nsd Error code:" + errorCode)); diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/NsdResolveListener.java b/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/NsdResolveListener.java index 55de0226489427..3232ed8e16a6ea 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/NsdResolveListener.java +++ b/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/NsdResolveListener.java @@ -20,6 +20,7 @@ import android.net.nsd.NsdManager; import android.net.nsd.NsdServiceInfo; import android.util.Log; +import chip.platform.NsdManagerServiceResolver; import java.util.List; public class NsdResolveListener implements NsdManager.ResolveListener { @@ -31,13 +32,15 @@ public class NsdResolveListener implements NsdManager.ResolveListener { private final List preCommissionedVideoPlayers; private final SuccessCallback successCallback; private final FailureCallback failureCallback; + private final NsdManagerServiceResolver.NsdManagerResolverAvailState nsdManagerResolverAvailState; public NsdResolveListener( NsdManager nsdManager, List deviceTypeFilter, List preCommissionedVideoPlayers, SuccessCallback successCallback, - FailureCallback failureCallback) { + FailureCallback failureCallback, + NsdManagerServiceResolver.NsdManagerResolverAvailState nsdManagerResolverAvailState) { this.nsdManager = nsdManager; this.deviceTypeFilter = deviceTypeFilter; this.preCommissionedVideoPlayers = preCommissionedVideoPlayers; @@ -48,6 +51,7 @@ public NsdResolveListener( } this.successCallback = successCallback; this.failureCallback = failureCallback; + this.nsdManagerResolverAvailState = nsdManagerResolverAvailState; } @Override @@ -55,6 +59,10 @@ public void onServiceResolved(NsdServiceInfo serviceInfo) { DiscoveredNodeData discoveredNodeData = new DiscoveredNodeData(serviceInfo); Log.d(TAG, "DiscoveredNodeData resolved: " + discoveredNodeData); + if (nsdManagerResolverAvailState != null) { + nsdManagerResolverAvailState.signalFree(); + } + if (isPassingDeviceTypeFilter(discoveredNodeData)) { addCommissioningInfo(discoveredNodeData); successCallback.handle(discoveredNodeData); @@ -68,6 +76,10 @@ public void onServiceResolved(NsdServiceInfo serviceInfo) { @Override public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) { + if (nsdManagerResolverAvailState != null) { + nsdManagerResolverAvailState.signalFree(); + } + switch (errorCode) { case NsdManager.FAILURE_ALREADY_ACTIVE: Log.e(TAG, "NsdResolveListener FAILURE_ALREADY_ACTIVE - Service: " + serviceInfo); 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 65cd2cbcec1902..b099483a8f2856 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 @@ -17,10 +17,19 @@ */ package com.chip.casting; +import android.content.Context; import android.net.nsd.NsdManager; import android.net.wifi.WifiManager; import android.util.Log; -import java.util.ArrayList; +import chip.appserver.ChipAppServer; +import chip.platform.AndroidBleManager; +import chip.platform.AndroidChipPlatform; +import chip.platform.ChipMdnsCallbackImpl; +import chip.platform.DiagnosticDataProviderImpl; +import chip.platform.NsdManagerServiceBrowser; +import chip.platform.NsdManagerServiceResolver; +import chip.platform.PreferencesConfigurationManager; +import chip.platform.PreferencesKeyValueStoreManager; import java.util.Arrays; import java.util.List; import java.util.concurrent.Executors; @@ -28,38 +37,71 @@ public class TvCastingApp { private static final String TAG = TvCastingApp.class.getSimpleName(); + private static final String DISCOVERY_TARGET_SERVICE_TYPE = "_matterd._udp."; + private static final List DISCOVERY_TARGET_DEVICE_TYPE_FILTER = + Arrays.asList(35L); // Video player = 35; + + private Context applicationContext; + private ChipAppServer chipAppServer; + private NsdManagerServiceResolver.NsdManagerResolverAvailState nsdManagerResolverAvailState; + + public boolean initApp(Context applicationContext, AppParameters appParameters) { + this.applicationContext = applicationContext; + nsdManagerResolverAvailState = new NsdManagerServiceResolver.NsdManagerResolverAvailState(); + NsdManagerServiceResolver nsdManagerServiceResolver = + new NsdManagerServiceResolver(applicationContext, nsdManagerResolverAvailState); + + AndroidChipPlatform chipPlatform = + new AndroidChipPlatform( + new AndroidBleManager(), + new PreferencesKeyValueStoreManager(applicationContext), + new PreferencesConfigurationManager(applicationContext), + nsdManagerServiceResolver, + new NsdManagerServiceBrowser(applicationContext), + new ChipMdnsCallbackImpl(), + new DiagnosticDataProviderImpl(applicationContext)); + + chipPlatform.updateCommissionableDataProviderData( + null, null, 0, appParameters.getSetupPasscode(), appParameters.getDiscriminator()); + + chipAppServer = new ChipAppServer(); + chipAppServer.startApp(); + + setDACProvider(appParameters.getDacProvider()); + return initJni(appParameters); + } - private final String TARGET_SERVICE_TYPE = "_matterd._udp."; - private final List DEVICE_TYPE_FILTER = Arrays.asList(35L); // Video player = 35; - - public native boolean init(AppParameters appParameters); + private native void setDACProvider(DACProvider provider); - public native void setDACProvider(DACProvider provider); + private native boolean initJni(AppParameters appParameters); public void discoverVideoPlayerCommissioners( - WifiManager wifiManager, - NsdManager nsdManager, long discoveryDurationSeconds, SuccessCallback discoverySuccessCallback, FailureCallback discoveryFailureCallback) { Log.d(TAG, "TvCastingApp.discoverVideoPlayerCommissioners called"); + + List preCommissionedVideoPlayers = readCachedVideoPlayers(); + + WifiManager wifiManager = + (WifiManager) applicationContext.getSystemService(Context.WIFI_SERVICE); WifiManager.MulticastLock multicastLock = wifiManager.createMulticastLock("multicastLock"); multicastLock.setReferenceCounted(true); multicastLock.acquire(); - List preCommissionedVideoPlayers = readCachedVideoPlayers(); - + NsdManager nsdManager = (NsdManager) applicationContext.getSystemService(Context.NSD_SERVICE); NsdDiscoveryListener nsdDiscoveryListener = new NsdDiscoveryListener( nsdManager, - TARGET_SERVICE_TYPE, - DEVICE_TYPE_FILTER, + DISCOVERY_TARGET_SERVICE_TYPE, + DISCOVERY_TARGET_DEVICE_TYPE_FILTER, preCommissionedVideoPlayers, discoverySuccessCallback, - discoveryFailureCallback); + discoveryFailureCallback, + nsdManagerResolverAvailState); nsdManager.discoverServices( - TARGET_SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, nsdDiscoveryListener); + DISCOVERY_TARGET_SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, nsdDiscoveryListener); Executors.newSingleThreadScheduledExecutor() .schedule( @@ -85,7 +127,8 @@ public native boolean openBasicCommissioningWindow( public native boolean sendCommissioningRequest(DiscoveredNodeData commissioner); - public native boolean sendUserDirectedCommissioningRequest(String address, int port); + /** @Deprecated Use sendCommissioningRequest(DiscoveredNodeData) instead */ + private native boolean sendUserDirectedCommissioningRequest(String address, int port); public native List readCachedVideoPlayers(); @@ -268,7 +311,7 @@ public native boolean targetNavigator_subscribeToCurrentTarget( public native boolean targetNavigator_subscribeToTargetList( ContentApp contentApp, - SuccessCallback> readSuccessHandler, + SuccessCallback readSuccessHandler, FailureCallback readFailureHandler, int minInterval, int maxInterval, diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/MatterCallbackHandler-JNI.h b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/MatterCallbackHandler-JNI.h index 3261aa60874ad2..b37b9ec12ec431 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/MatterCallbackHandler-JNI.h +++ b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/MatterCallbackHandler-JNI.h @@ -181,7 +181,7 @@ class TargetListSuccessHandlerJNI : public SuccessHandlerJNI { public: - TargetListSuccessHandlerJNI() : SuccessHandlerJNI("(Ljava/util/ArrayList;)V") {} + TargetListSuccessHandlerJNI() : SuccessHandlerJNI("(Ljava/lang/Object;)V") {} jobject ConvertToJObject(chip::app::Clusters::TargetNavigator::Attributes::TargetList::TypeInfo::DecodableArgType responseData); }; 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 04c1196fcd57fe..c58df8f2cc4f91 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,10 +52,10 @@ void JNI_OnUnload(JavaVM * jvm, void * reserved) return AndroidAppServerJNI_OnUnload(jvm, reserved); } -JNI_METHOD(jboolean, init)(JNIEnv *, jobject, jobject jAppParameters) +JNI_METHOD(jboolean, initJni)(JNIEnv *, jobject, jobject jAppParameters) { chip::DeviceLayer::StackLock lock; - ChipLogProgress(AppServer, "JNI_METHOD init called"); + ChipLogProgress(AppServer, "JNI_METHOD initJni called"); CHIP_ERROR err = CHIP_NO_ERROR; if (jAppParameters == nullptr) diff --git a/examples/tv-casting-app/android/BUILD.gn b/examples/tv-casting-app/android/BUILD.gn index 0e29821f42e7a6..033ff3aff14e53 100644 --- a/examples/tv-casting-app/android/BUILD.gn +++ b/examples/tv-casting-app/android/BUILD.gn @@ -53,6 +53,8 @@ android_library("java") { deps = [ ":android", + "${chip_root}/src/app/server/java", + "${chip_root}/src/platform/android:java", "${chip_root}/third_party/android_deps:annotation", ] diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.h index 08383339df0d6a..8c8f8c83e71849 100644 --- a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.h +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.h @@ -480,7 +480,7 @@ @param requestSentHandler Handler to call on sending the request */ - (void)mediaPlayback_seek:(ContentApp * _Nonnull)contentApp - position:(uint8_t)position + position:(uint64_t)position responseCallback:(void (^_Nonnull)(bool))responseCallback clientQueue:(dispatch_queue_t _Nonnull)clientQueue requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler; diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.mm b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.mm index d9e36da0211121..9ba421b54723ce 100644 --- a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.mm +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.mm @@ -124,6 +124,8 @@ - (instancetype)init _subscriptionEstablishedCallbacks = [NSMutableDictionary dictionary]; _subscriptionReadSuccessCallbacks = [NSMutableDictionary dictionary]; _subscriptionReadFailureCallbacks = [NSMutableDictionary dictionary]; + _readSuccessCallbacks = [NSMutableDictionary dictionary]; + _readFailureCallbacks = [NSMutableDictionary dictionary]; chip::DeviceLayer::PlatformMgrImpl().StartEventLoopTask(); } @@ -139,9 +141,14 @@ - (void)initApp:(AppParameters * _Nullable)appParameters dispatch_async(_chipWorkQueue, ^{ bool initAppStatus = true; + CHIP_ERROR err = CHIP_NO_ERROR; AppParams appParams; + if (appParameters == nil) { + err = CastingServer::GetInstance()->Init(); + } else if ((err = [ConversionUtils convertToCppAppParamsInfoFrom:appParameters outAppParams:appParams]) == CHIP_NO_ERROR) { + err = CastingServer::GetInstance()->Init(&appParams); + } - CHIP_ERROR err = CastingServer::GetInstance()->Init(); if (err != CHIP_NO_ERROR) { ChipLogError(AppServer, "CastingServerBridge().initApp() failed: %" CHIP_ERROR_FORMAT, err.Format()); initAppStatus = false; @@ -151,8 +158,6 @@ - (void)initApp:(AppParameters * _Nullable)appParameters initAppStatusHandler(initAppStatus); }); }); - - CastingServer::GetInstance()->Init(); } - (void)discoverCommissioners:(dispatch_queue_t _Nonnull)clientQueue @@ -870,7 +875,7 @@ - (void)mediaPlayback_next:(ContentApp * _Nonnull)contentApp } - (void)mediaPlayback_seek:(ContentApp * _Nonnull)contentApp - position:(uint8_t)position + position:(uint64_t)position responseCallback:(void (^_Nonnull)(bool))responseCallback clientQueue:(dispatch_queue_t _Nonnull)clientQueue requestSentHandler:(void (^_Nonnull)(bool))requestSentHandler @@ -1571,7 +1576,7 @@ - (void)applicationBasic_subscribeVendorName:(ContentApp * _Nonnull)contentApp chip::app::Clusters::ApplicationBasic::Attributes::VendorName::TypeInfo::DecodableArgType vendorName) { void (^callback)(NSString * _Nonnull) = [[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks objectForKey:@"applicationBasic_subscribeVendorName"]; - callback([NSString stringWithUTF8String:vendorName.data()]); + callback(vendorName.data() != nil ? [NSString stringWithUTF8String:vendorName.data()] : nil); }, [](void * context, CHIP_ERROR err) { void (^callback)(MatterError *) = [[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks @@ -1800,13 +1805,13 @@ - (void)applicationBasic_readVendorName:(ContentApp * _Nonnull)contentApp &endpoint, nullptr, [](void * context, chip::app::Clusters::ApplicationBasic::Attributes::VendorName::TypeInfo::DecodableArgType vendorName) { - void (^callback)(NSString * _Nonnull) = [[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks - objectForKey:@"applicationBasic_readVendorName"]; + void (^callback)(NSString * _Nonnull) = + [[CastingServerBridge getSharedInstance].readSuccessCallbacks objectForKey:@"applicationBasic_readVendorName"]; callback([NSString stringWithUTF8String:vendorName.data()]); }, [](void * context, CHIP_ERROR err) { - void (^callback)(MatterError *) = [[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks - objectForKey:@"applicationBasic_readVendorName"]; + void (^callback)(MatterError *) = + [[CastingServerBridge getSharedInstance].readFailureCallbacks objectForKey:@"applicationBasic_readVendorName"]; callback([[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]]); }); dispatch_async(clientQueue, ^{ @@ -1835,13 +1840,13 @@ - (void)applicationBasic_readVendorID:(ContentApp * _Nonnull)contentApp CHIP_ERROR err = CastingServer::GetInstance()->ApplicationBasic_ReadVendorID( &endpoint, nullptr, [](void * context, chip::app::Clusters::ApplicationBasic::Attributes::VendorID::TypeInfo::DecodableArgType vendorID) { - void (^callback)(NSNumber * _Nonnull) = [[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks - objectForKey:@"applicationBasic_readVendorID"]; + void (^callback)(NSNumber * _Nonnull) = + [[CastingServerBridge getSharedInstance].readSuccessCallbacks objectForKey:@"applicationBasic_readVendorID"]; callback(@(vendorID)); }, [](void * context, CHIP_ERROR err) { - void (^callback)(MatterError *) = [[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks - objectForKey:@"applicationBasic_readVendorID"]; + void (^callback)(MatterError *) = + [[CastingServerBridge getSharedInstance].readFailureCallbacks objectForKey:@"applicationBasic_readVendorID"]; callback([[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]]); }); dispatch_async(clientQueue, ^{ @@ -1872,12 +1877,12 @@ - (void)applicationBasic_readApplicationName:(ContentApp * _Nonnull)contentApp &endpoint, nullptr, [](void * context, chip::app::Clusters::ApplicationBasic::Attributes::ApplicationName::TypeInfo::DecodableArgType applicationName) { - void (^callback)(NSString * _Nonnull) = [[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks + void (^callback)(NSString * _Nonnull) = [[CastingServerBridge getSharedInstance].readSuccessCallbacks objectForKey:@"applicationBasic_readApplicationName"]; callback([NSString stringWithUTF8String:applicationName.data()]); }, [](void * context, CHIP_ERROR err) { - void (^callback)(MatterError *) = [[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks + void (^callback)(MatterError *) = [[CastingServerBridge getSharedInstance].readFailureCallbacks objectForKey:@"applicationBasic_readApplicationName"]; callback([[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]]); }); @@ -1907,13 +1912,13 @@ - (void)applicationBasic_readProductID:(ContentApp * _Nonnull)contentApp CHIP_ERROR err = CastingServer::GetInstance()->ApplicationBasic_ReadProductID( &endpoint, nullptr, [](void * context, chip::app::Clusters::ApplicationBasic::Attributes::ProductID::TypeInfo::DecodableArgType productID) { - void (^callback)(uint16_t) = [[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks - objectForKey:@"applicationBasic_readProductID"]; + void (^callback)(uint16_t) = + [[CastingServerBridge getSharedInstance].readSuccessCallbacks objectForKey:@"applicationBasic_readProductID"]; callback(productID); }, [](void * context, CHIP_ERROR err) { - void (^callback)(MatterError *) = [[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks - objectForKey:@"applicationBasic_readProductID"]; + void (^callback)(MatterError *) = + [[CastingServerBridge getSharedInstance].readFailureCallbacks objectForKey:@"applicationBasic_readProductID"]; callback([[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]]); }); dispatch_async(clientQueue, ^{ @@ -1945,12 +1950,12 @@ - (void)applicationBasic_readApplicationVersion:(ContentApp * _Nonnull)contentAp [](void * context, chip::app::Clusters::ApplicationBasic::Attributes::ApplicationVersion::TypeInfo::DecodableArgType applicationVersion) { - void (^callback)(NSString * _Nonnull) = [[CastingServerBridge getSharedInstance].subscriptionReadSuccessCallbacks + void (^callback)(NSString * _Nonnull) = [[CastingServerBridge getSharedInstance].readSuccessCallbacks objectForKey:@"applicationBasic_readApplicationVersion"]; callback([NSString stringWithUTF8String:applicationVersion.data()]); }, [](void * context, CHIP_ERROR err) { - void (^callback)(MatterError *) = [[CastingServerBridge getSharedInstance].subscriptionReadFailureCallbacks + void (^callback)(MatterError *) = [[CastingServerBridge getSharedInstance].readFailureCallbacks objectForKey:@"applicationBasic_readApplicationVersion"]; callback([[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]]); });