/* HvcServiceDiscoveryProfile.java Copyright (c) 2015 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.hvc.profile; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Build; import android.os.Handler; import android.os.HandlerThread; import android.support.annotation.NonNull; import org.deviceconnect.android.activity.PermissionUtility; import org.deviceconnect.android.deviceplugin.hvc.HvcDeviceService; import org.deviceconnect.android.deviceplugin.hvc.ble.BleUtils; import org.deviceconnect.android.message.MessageUtils; import org.deviceconnect.android.profile.ServiceDiscoveryProfile; import org.deviceconnect.android.profile.api.GetApi; import org.deviceconnect.android.service.DConnectServiceProvider; import org.deviceconnect.message.DConnectMessage; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** * HVC DevicePlugin, Network Service Discovery Profile. * * @author NTT DOCOMO, INC. */ public class HvcServiceDiscoveryProfile extends ServiceDiscoveryProfile { private static final int DISCOVERY_WAIT = 4000; private final HandlerThread mWorkerThread; /** * Constructor. * @param provider service provider */ public HvcServiceDiscoveryProfile(final DConnectServiceProvider provider) { super(provider); mWorkerThread = new HandlerThread(getClass().getSimpleName() + "_" + this.hashCode()); mWorkerThread.start(); addApi(new GetApi() { @Override public boolean onRequest(final Intent request, final Intent response) { // ble os available? if (!getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { // ble not available.(result=OK, service=0) setResult(response, DConnectMessage.RESULT_OK); return true; } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { appendServiceList(response); return true; } else { if (BleUtils.isBLEPermission(getContext())) { appendServiceList(response); return true; } else { PermissionUtility.requestPermissions(getContext(), new Handler(mWorkerThread.getLooper()), BleUtils.BLE_PERMISSIONS, new PermissionUtility.PermissionRequestCallback() { @Override public void onSuccess() { startSearchHvcDevice(); // Wait for discovered device cache list to be filled up. Executors.newSingleThreadScheduledExecutor().schedule(new Runnable() { @Override public void run() { appendServiceList(response); sendResponse(response); } }, DISCOVERY_WAIT, TimeUnit.MILLISECONDS); } @NonNull @Override public void onFail(final String deniedPermission) { MessageUtils.setIllegalServerStateError(response, "Bluetooth LE scan requires permissions ACCESS_COARSE_LOCATION and ACCESS_FINE_LOCATION."); sendResponse(response); } }); return false; } } } }); } @Override protected void finalize() throws Throwable { super.finalize(); mWorkerThread.quit(); } private void startSearchHvcDevice() { HvcDeviceService s = (HvcDeviceService) getContext(); s.startSearchHvcDevice(); } }