blob: 15fa522a83c2d1191f292dbbb3d421dcdb1f5a25 [file] [log] [blame]
package com.chip.casting.dnssd;
import android.net.nsd.NsdManager;
import android.net.nsd.NsdServiceInfo;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import androidx.annotation.VisibleForTesting;
import com.chip.casting.app.CastingContext;
import com.chip.casting.app.CommissionerDiscoveryFragment;
import com.chip.casting.util.GlobalCastingConstants;
import java.util.List;
public class CommissionerResolveListener implements NsdManager.ResolveListener {
private static final String TAG = CommissionerResolveListener.class.getSimpleName();
private final CastingContext castingContext;
private final List<DiscoveredNodeData> commissioners;
public CommissionerResolveListener(
CastingContext castingContext, List<DiscoveredNodeData> commissioners) {
this.castingContext = castingContext;
this.commissioners = commissioners;
}
@Override
public void onServiceResolved(NsdServiceInfo serviceInfo) {
DiscoveredNodeData commissioner = new DiscoveredNodeData(serviceInfo);
Log.d(TAG, "Commissioner resolved: " + commissioner);
if (isPassingDeviceTypeFilter(commissioner)) {
commissioners.add(commissioner);
String buttonText = getCommissionerButtonText(commissioner);
if (!buttonText.isEmpty()) {
Button commissionerButton = new Button(castingContext.getApplicationContext());
commissionerButton.setText(buttonText);
CommissionerDiscoveryFragment.Callback callback =
(CommissionerDiscoveryFragment.Callback) castingContext.getFragmentActivity();
commissionerButton.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(
TAG,
"CommissionerResolveListener.onServiceResolved.OnClickListener.onClick called for "
+ commissioner);
callback.handleCommissioningButtonClicked(commissioner);
}
});
new Handler(Looper.getMainLooper())
.post(() -> castingContext.getCommissionersLayout().addView(commissionerButton));
}
} else Log.e(TAG, "Skipped displaying " + commissioner);
}
@Override
public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
switch (errorCode) {
case NsdManager.FAILURE_ALREADY_ACTIVE:
Log.e(TAG, "FAILURE_ALREADY_ACTIVE - Service: " + serviceInfo);
castingContext
.getNsdManager()
.resolveService(
serviceInfo, new CommissionerResolveListener(castingContext, commissioners));
break;
case NsdManager.FAILURE_INTERNAL_ERROR:
Log.e(TAG, "FAILURE_INTERNAL_ERROR - Service: " + serviceInfo);
break;
case NsdManager.FAILURE_MAX_LIMIT:
Log.e(TAG, "FAILURE_MAX_LIMIT - Service: " + serviceInfo);
break;
}
}
@VisibleForTesting
public String getCommissionerButtonText(DiscoveredNodeData commissioner) {
String main = commissioner.getDeviceName() != null ? commissioner.getDeviceName() : "";
String aux =
"" + (commissioner.getProductId() > 0 ? "Product ID: " + commissioner.getProductId() : "");
aux +=
commissioner.getDeviceType() > 0
? (aux.isEmpty() ? "" : " ") + "Device Type: " + commissioner.getDeviceType()
: "";
aux +=
commissioner.getVendorId() > 0
? (aux.isEmpty() ? "" : " from ") + "Vendor ID: " + commissioner.getVendorId()
: "";
aux = aux.isEmpty() ? aux : "\n[" + aux + "]";
return main + aux;
}
private boolean isPassingDeviceTypeFilter(DiscoveredNodeData commissioner) {
return GlobalCastingConstants.CommissionerDeviceTypeFilter == null
|| GlobalCastingConstants.CommissionerDeviceTypeFilter.isEmpty()
|| GlobalCastingConstants.CommissionerDeviceTypeFilter.contains(
commissioner.getDeviceType());
}
}