/*
BleUtils
Copyright (c) 2015 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.heartrate.ble;
import android.Manifest;
import android.app.Activity;
import android.bluetooth.BluetoothManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.ResultReceiver;
import org.deviceconnect.android.activity.PermissionUtility;
import org.deviceconnect.android.deviceplugin.heartrate.ble.activity.BleEnableActivity;
/**
* A class containing utility methods related to BLE.
* @author NTT DOCOMO, INC.
*/
public final class BleUtils {
// 1800 Generic Access
public static final String SERVICE_GENERIC_ACCESS = "00001800-0000-1000-8000-00805f9b34fb";
public static final String CHAR_DEVICE_NAME = "00002a00-0000-1000-8000-00805f9b34fb";
public static final String CHAR_APPEARANCE = "00002a01-0000-1000-8000-00805f9b34fb";
public static final String CHAR_PERIPHERAL_PRIVACY_FLAG = "00002a02-0000-1000-8000-00805f9b34fb";
public static final String CHAR_RECONNECTION_ADDRESS = "00002a03-0000-1000-8000-00805f9b34fb";
public static final String CHAR_PERIPHERAL_PREFERRED_CONNECTION_PARAMETERS = "00002a04-0000-1000-8000-00805f9b34fb";
// 1801 Generic Attribute
public static final String SERVICE_GENERIC_ATTRIBUTE = "00001801-0000-1000-8000-00805f9b34fb";
public static final String CHAR_SERVICE_CHANGED = "00002a05-0000-1000-8000-00805f9b34fb";
// 1802 Immediate Alert
public static final String SERVICE_IMMEDIATE_ALERT = "00001802-0000-1000-8000-00805f9b34fb";
public static final String CHAR_ALERT_LEVEL = "00002a06-0000-1000-8000-00805f9b34fb";
// StickNFindではCHAR_ALERT_LEVELに0x01をWriteすると光り、0x02では音が鳴り、0x03では光って鳴る。
// 180a Device Information
public static final String SERVICE_DEVICE_INFORMATION = "0000180a-0000-1000-8000-00805f9b34fb";
public static final String CHAR_MANUFACTURER_NAME_STRING = "00002a29-0000-1000-8000-00805f9b34fb";
public static final String CHAR_MODEL_NUMBER_STRING = "00002a24-0000-1000-8000-00805f9b34fb";
public static final String CHAR_SERIAL_NUMBER_STRING = "00002a25-0000-1000-8000-00805f9b34fb";
public static final String CHAR_HARDWARE_REVISION_STRING = "00002a27-0000-1000-8000-00805f9b34fb";
public static final String CHAR_FIRMWARE_REVISION_STRING = "00002a26-0000-1000-8000-00805f9b34fb";
public static final String CHAR_SOFTWARE_REVISION_STRING = "00002a28-0000-1000-8000-00805f9b34fb";
public static final String CHAR_SYSTEM_ID = "00002a23-0000-1000-8000-00805f9b34fb";
public static final String CHAR_IEEE_11073_20601_REGULATORY_CERTIFICATION_DATA_LIST = "00002a2A-0000-1000-8000-00805f9b34fb";
public static final String CHAR_PNP_ID = "00002a50-0000-1000-8000-00805f9b34fb";
// 180F Battery Service
public static final String SERVICE_BATTERY_SERVICE = "0000180f-0000-1000-8000-00805f9b34fb";
public static final String CHAR_BATTERY_LEVEL = "00002a19-0000-1000-8000-00805f9b34fb";
// 180D Heart Reate Service
public static final String SERVICE_HEART_RATE_SERVICE = "0000180d-0000-1000-8000-00805f9b34fb";
public static final String CHAR_HEART_RATE_MEASUREMENT = "00002a37-0000-1000-8000-00805f9b34fb";
public static final String CHAR_BODY_SENSOR_LOCATION = "00002a38-0000-1000-8000-00805f9b34fb";
public static final String CHAR_HEART_RATE_CONTROL_POINT = "00002a39-0000-1000-8000-00805f9b34fb";
/**
* Defined the permission of BLE scan.
*/
public static final String[] BLE_PERMISSIONS = new String[] {
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
};
private BleUtils() {
}
/**
* Checks whether device(smart phone) supports BLE.
* @param context context of application
* @return Returns true if the device supports BLE, else
* false.
*/
public static boolean isBLESupported(final Context context) {
return Build.VERSION.SDK_INT >= 18 &&
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE);
}
/**
* Gets instance of BluetoothManager.
* @param context context of application
* @return Instance of BluetoothManager or null if the BluetoothManager does not exist.
*/
public static BluetoothManager getManager(final Context context) {
return (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
}
/**
* Checks whether permission allow by user.
* @param context context of application
* @return Returns true if permission allow, otherwise false
*/
public static boolean isBLEPermission(final Context context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return true;
} else {
boolean result = true;
for (int i = 0; i < BLE_PERMISSIONS.length; i++) {
if (context.checkSelfPermission(BLE_PERMISSIONS[i]) != PackageManager.PERMISSION_GRANTED) {
result = false;
}
}
return result;
}
}
public static void requestBluetoothEnabled(final Context context, final BleRequestCallback callback) {
Handler handler = new Handler(Looper.getMainLooper());
BleEnableActivity.requestEnableBluetooth(context, new ResultReceiver(handler) {
@Override
protected void onReceiveResult(final int resultCode, final Bundle resultData) {
if (resultCode == Activity.RESULT_OK) {
callback.onSuccess();
} else {
callback.onFail("Denied to enable a bluetooth settings.");
}
}
});
}
/**
* BLEパーミッションの許可を要求します.
* @param context コンテキスト
* @param callback BLEパーミッション許可要求結果を通知するコールバック
*/
public static void requestBLEPermission(final Context context, final BleRequestCallback callback) {
if (isBLEPermission(context)) {
callback.onSuccess();
} else {
PermissionUtility.requestPermissions(context, new Handler(Looper.getMainLooper()),
BLE_PERMISSIONS,
new PermissionUtility.PermissionRequestCallback() {
@Override
public void onSuccess() {
callback.onSuccess();
}
@Override
public void onFail(final String deniedPermission) {
callback.onFail(deniedPermission);
}
});
}
}
/**
* BLEパーミッションの許可結果を通知するコールバック.
*/
public interface BleRequestCallback {
/**
* 許可が降りた場合に呼び出されるメソッド.
*/
void onSuccess();
/**
* 許可が降りなかった場合に呼び出されるメソッド.
* @param deniedPermission 拒否内容
*/
void onFail(final String deniedPermission);
}
}