blob: 3232ed8e16a6eacdbb170562f55b4af6167ad547 [file] [log] [blame]
/*
* Copyright (c) 2022 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.
*
*/
package com.chip.casting;
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 {
private static final String TAG = NsdResolveListener.class.getSimpleName();
private final NsdManager nsdManager;
private final List<Long> deviceTypeFilter;
private final List<VideoPlayer> preCommissionedVideoPlayers;
private final SuccessCallback<DiscoveredNodeData> successCallback;
private final FailureCallback failureCallback;
private final NsdManagerServiceResolver.NsdManagerResolverAvailState nsdManagerResolverAvailState;
public NsdResolveListener(
NsdManager nsdManager,
List<Long> deviceTypeFilter,
List<VideoPlayer> preCommissionedVideoPlayers,
SuccessCallback<DiscoveredNodeData> successCallback,
FailureCallback failureCallback,
NsdManagerServiceResolver.NsdManagerResolverAvailState nsdManagerResolverAvailState) {
this.nsdManager = nsdManager;
this.deviceTypeFilter = deviceTypeFilter;
this.preCommissionedVideoPlayers = preCommissionedVideoPlayers;
if (preCommissionedVideoPlayers != null) {
for (VideoPlayer videoPlayer : preCommissionedVideoPlayers) {
Log.d(TAG, "Precommissioned video player: " + videoPlayer);
}
}
this.successCallback = successCallback;
this.failureCallback = failureCallback;
this.nsdManagerResolverAvailState = nsdManagerResolverAvailState;
}
@Override
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);
} else {
Log.d(
TAG,
"DiscoveredNodeData ignored because it did not pass the device type filter "
+ discoveredNodeData);
}
}
@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);
failureCallback.handle(
new MatterError(
3, "NsdResolveListener FAILURE_ALREADY_ACTIVE - Service: " + serviceInfo));
break;
case NsdManager.FAILURE_INTERNAL_ERROR:
Log.e(TAG, "NsdResolveListener FAILURE_INTERNAL_ERROR - Service: " + serviceInfo);
failureCallback.handle(
new MatterError(
3, "NsdResolveListener FAILURE_INTERNAL_ERROR - Service: " + serviceInfo));
break;
case NsdManager.FAILURE_MAX_LIMIT:
Log.e(TAG, "NsdResolveListener FAILURE_MAX_LIMIT - Service: " + serviceInfo);
failureCallback.handle(
new MatterError(19, "NsdResolveListener FAILURE_MAX_LIMIT - Service: " + serviceInfo));
break;
}
}
private boolean isPassingDeviceTypeFilter(DiscoveredNodeData discoveredNodeData) {
return deviceTypeFilter == null
|| deviceTypeFilter.isEmpty()
|| deviceTypeFilter.contains(discoveredNodeData.getDeviceType());
}
private void addCommissioningInfo(DiscoveredNodeData discoveredNodeData) {
if (preCommissionedVideoPlayers != null) {
for (VideoPlayer videoPlayer : preCommissionedVideoPlayers) {
if (videoPlayer.isSameAs(discoveredNodeData)) {
Log.d(
TAG,
"Matching Video Player with the following information found for DiscoveredNodeData"
+ videoPlayer);
discoveredNodeData.setConnectableVideoPlayer(videoPlayer);
return;
}
}
}
Log.d(
TAG,
"No matching VideoPlayers found from the cache for new DiscoveredNodeData: "
+ discoveredNodeData);
}
}