package jp.kshoji.blemidi.util;
import android.annotation.TargetApi;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattService;
import android.bluetooth.le.ScanFilter;
import android.content.Context;
import android.os.Build;
import android.os.ParcelUuid;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import jp.kshoji.blemidi.R;
/**
* Utility for finding BLE MIDI devices
*
* @author K.Shoji
*/
public final class BleMidiDeviceUtils {
/**
* Obtains BluetoothGattService for MIDI
*
* @param context the context
* @param bluetoothGatt the gatt of device
* @return null if no service found
*/
@Nullable
public static BluetoothGattService getMidiService(@NonNull final Context context, @NonNull final BluetoothGatt bluetoothGatt) {
List<BluetoothGattService> services = bluetoothGatt.getServices();
String[] uuidStringArray = context.getResources().getStringArray(R.array.uuidListForService);
for (BluetoothGattService service : services) {
for (String uuidString : uuidStringArray) {
UUID uuid = BleUuidUtils.fromString(uuidString);
if (BleUuidUtils.matches(service.getUuid(), uuid)) {
return service;
}
}
}
return null;
}
/**
* Obtains BluetoothGattCharacteristic for MIDI Input
*
* @param context the context
* @param bluetoothGattService the gatt service of device
* @return null if no characteristic found
*/
@Nullable
public static BluetoothGattCharacteristic getMidiInputCharacteristic(@NonNull final Context context, @NonNull final BluetoothGattService bluetoothGattService) {
List<BluetoothGattCharacteristic> characteristics = bluetoothGattService.getCharacteristics();
String[] uuidStringArray = context.getResources().getStringArray(R.array.uuidListForInputCharacteristic);
for (BluetoothGattCharacteristic characteristic : characteristics) {
for (String uuidString : uuidStringArray) {
UUID uuid = BleUuidUtils.fromString(uuidString);
if (BleUuidUtils.matches(characteristic.getUuid(), uuid)) {
return characteristic;
}
}
}
return null;
}
/**
* Obtains BluetoothGattCharacteristic for MIDI Output
*
* @param context the context
* @param bluetoothGattService the gatt service of device
* @return null if no characteristic found
*/
@Nullable
public static BluetoothGattCharacteristic getMidiOutputCharacteristic(@NonNull final Context context, @NonNull final BluetoothGattService bluetoothGattService) {
List<BluetoothGattCharacteristic> characteristics = bluetoothGattService.getCharacteristics();
String[] uuidStringArray = context.getResources().getStringArray(R.array.uuidListForOutputCharacteristic);
for (BluetoothGattCharacteristic characteristic : characteristics) {
for (String uuidString : uuidStringArray) {
UUID uuid = BleUuidUtils.fromString(uuidString);
if (BleUuidUtils.matches(characteristic.getUuid(), uuid)) {
return characteristic;
}
}
}
return null;
}
/**
* Obtains list of ScanFilter for BLE MIDI
*
* @param context the context
* @return list of {@link android.bluetooth.le.ScanFilter} for BLE MIDI devices.
*/
@NonNull
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static List<ScanFilter> getBleMidiScanFilters(@NonNull final Context context) {
List<ScanFilter> scanFilters = new ArrayList<>();
String[] uuidStringArray = context.getResources().getStringArray(R.array.uuidListForService);
for (String uuidString : uuidStringArray) {
scanFilters.add(new ScanFilter.Builder().setServiceUuid(ParcelUuid.fromString(uuidString)).build());
}
return scanFilters;
}
}