/* * Copyright 2014 Google Inc. 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 org.physical_web.physicalweb; import android.content.Context; import android.webkit.URLUtil; import com.youview.tinydnssd.DiscoverResolver; import com.youview.tinydnssd.MDNSDiscover; import java.util.Map; class MdnsUrlDeviceDiscoverer extends UrlDeviceDiscoverer { private static final String TAG = MdnsUrlDeviceDiscoverer.class.getSimpleName(); private DiscoverResolver mResolver; private static final String MDNS_SERVICE_TYPE = "_physicalweb._tcp"; private enum State { STOPPED, WAITING, STARTED, } private State mState; public MdnsUrlDeviceDiscoverer(Context context) { mState = State.STOPPED; mResolver = new DiscoverResolver(context, MDNS_SERVICE_TYPE, new DiscoverResolver.Listener() { @Override public void onServicesChanged(Map<String, MDNSDiscover.Result> services) { for (MDNSDiscover.Result result : services.values()) { // access the Bluetooth MAC from the TXT record String url = result.txt.dict.get("url"); Log.d(TAG, url); String id = TAG + result.srv.fqdn + result.srv.port; String title = ""; String description = ""; if ("false".equals(result.txt.dict.get("public"))) { if (result.txt.dict.containsKey("title")) { title = result.txt.dict.get("title"); } if (result.txt.dict.containsKey("description")) { description = result.txt.dict.get("description"); } reportUrlDevice(createUrlDeviceBuilder(id, url) .setPrivate() .setTitle(title) .setDescription(description) .setDeviceType(Utils.MDNS_LOCAL_DEVICE_TYPE) .build()); } else if (URLUtil.isNetworkUrl(url)) { reportUrlDevice(createUrlDeviceBuilder(id, url) .setPrivate() .setDeviceType(Utils.MDNS_PUBLIC_DEVICE_TYPE) .build()); } } } }); } @Override public synchronized void startScanImpl() { if (mState != State.STOPPED) { return; } mState = State.WAITING; mResolver.start(); } @Override public synchronized void stopScanImpl() { if (mState != State.STARTED) { return; } mState = State.WAITING; mResolver.stop(); } }