// Signature format: 4.0
package androidx.bluetooth {

  public final class AdvertiseParams {
    ctor public AdvertiseParams(optional boolean shouldIncludeDeviceAddress, optional boolean shouldIncludeDeviceName, optional boolean isConnectable, optional boolean isDiscoverable, optional int timeoutMillis, optional java.util.Map<java.lang.Integer,byte[]> manufacturerData, optional java.util.Map<java.util.UUID,byte[]> serviceData, optional java.util.List<java.util.UUID> serviceUuids);
    method public java.util.Map<java.lang.Integer,byte[]> getManufacturerData();
    method public java.util.Map<java.util.UUID,byte[]> getServiceData();
    method public java.util.List<java.util.UUID> getServiceUuids();
    method public boolean getShouldIncludeDeviceAddress();
    method public boolean getShouldIncludeDeviceName();
    method public int getTimeoutMillis();
    method public boolean isConnectable();
    method public boolean isDiscoverable();
    property public final boolean isConnectable;
    property public final boolean isDiscoverable;
    property public final java.util.Map<java.lang.Integer,byte[]> manufacturerData;
    property public final java.util.Map<java.util.UUID,byte[]> serviceData;
    property public final java.util.List<java.util.UUID> serviceUuids;
    property public final boolean shouldIncludeDeviceAddress;
    property public final boolean shouldIncludeDeviceName;
    property public final int timeoutMillis;
  }

  public final class AdvertiseResult {
    ctor public AdvertiseResult();
    field public static final int ADVERTISE_FAILED_DATA_TOO_LARGE = 102; // 0x66
    field public static final int ADVERTISE_FAILED_FEATURE_UNSUPPORTED = 103; // 0x67
    field public static final int ADVERTISE_FAILED_INTERNAL_ERROR = 104; // 0x68
    field public static final int ADVERTISE_FAILED_TOO_MANY_ADVERTISERS = 105; // 0x69
    field public static final int ADVERTISE_STARTED = 101; // 0x65
    field public static final androidx.bluetooth.AdvertiseResult.Companion Companion;
  }

  public static final class AdvertiseResult.Companion {
  }

  public final class BluetoothAddress {
    ctor public BluetoothAddress(String address, int addressType);
    method public String getAddress();
    method public int getAddressType();
    method public void setAddressType(int);
    property public final String address;
    property public final int addressType;
    field public static final int ADDRESS_TYPE_PUBLIC = 0; // 0x0
    field public static final int ADDRESS_TYPE_RANDOM_NON_RESOLVABLE = 3; // 0x3
    field public static final int ADDRESS_TYPE_RANDOM_RESOLVABLE = 2; // 0x2
    field public static final int ADDRESS_TYPE_RANDOM_STATIC = 1; // 0x1
    field public static final int ADDRESS_TYPE_UNKNOWN = 65535; // 0xffff
    field public static final androidx.bluetooth.BluetoothAddress.Companion Companion;
  }

  public static final class BluetoothAddress.Companion {
  }

  public final class BluetoothDevice {
    method @RequiresPermission(anyOf={"android.permission.BLUETOOTH", "android.permission.BLUETOOTH_CONNECT"}) public int getBondState();
    method public java.util.UUID getId();
    method @RequiresPermission(anyOf={"android.permission.BLUETOOTH", "android.permission.BLUETOOTH_CONNECT"}) public String? getName();
    property @RequiresPermission(anyOf={"android.permission.BLUETOOTH", "android.permission.BLUETOOTH_CONNECT"}) public final int bondState;
    property public final java.util.UUID id;
    property @RequiresPermission(anyOf={"android.permission.BLUETOOTH", "android.permission.BLUETOOTH_CONNECT"}) public final String? name;
  }

  public final class BluetoothLe {
    ctor public BluetoothLe(android.content.Context context);
    method @RequiresPermission("android.permission.BLUETOOTH_ADVERTISE") public kotlinx.coroutines.flow.Flow<java.lang.Integer> advertise(androidx.bluetooth.AdvertiseParams advertiseParams);
    method @RequiresPermission("android.permission.BLUETOOTH_CONNECT") public suspend <R> Object? connectGatt(androidx.bluetooth.BluetoothDevice device, kotlin.jvm.functions.Function2<? super androidx.bluetooth.BluetoothLe.GattClientScope,? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super kotlin.Result<? extends R>>);
    method public suspend <R> Object? openGattServer(java.util.List<androidx.bluetooth.GattService> services, kotlin.jvm.functions.Function2<? super androidx.bluetooth.BluetoothLe.GattServerConnectScope,? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R>);
    method @RequiresPermission("android.permission.BLUETOOTH_SCAN") public kotlinx.coroutines.flow.Flow<androidx.bluetooth.ScanResult> scan(optional java.util.List<androidx.bluetooth.ScanFilter> filters);
  }

  public static interface BluetoothLe.GattClientScope {
    method public suspend Object? awaitClose(kotlin.jvm.functions.Function0<kotlin.Unit> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
    method public androidx.bluetooth.GattService? getService(java.util.UUID uuid);
    method public java.util.List<androidx.bluetooth.GattService> getServices();
    method public suspend Object? readCharacteristic(androidx.bluetooth.GattCharacteristic characteristic, kotlin.coroutines.Continuation<? super kotlin.Result<? extends byte[]>>);
    method public kotlinx.coroutines.flow.Flow<byte[]> subscribeToCharacteristic(androidx.bluetooth.GattCharacteristic characteristic);
    method public suspend Object? writeCharacteristic(androidx.bluetooth.GattCharacteristic characteristic, byte[] value, kotlin.coroutines.Continuation<? super kotlin.Result<? extends kotlin.Unit>>);
  }

  public static final class BluetoothLe.GattServerConnectRequest {
    method public suspend Object? accept(kotlin.jvm.functions.Function2<? super androidx.bluetooth.BluetoothLe.GattServerSessionScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit>);
    method public androidx.bluetooth.BluetoothDevice getDevice();
    method public void reject();
    property public final androidx.bluetooth.BluetoothDevice device;
  }

  public static interface BluetoothLe.GattServerConnectScope {
    method public kotlinx.coroutines.flow.Flow<androidx.bluetooth.BluetoothLe.GattServerConnectRequest> getConnectRequests();
    method public void updateServices(java.util.List<androidx.bluetooth.GattService> services);
    property public abstract kotlinx.coroutines.flow.Flow<androidx.bluetooth.BluetoothLe.GattServerConnectRequest> connectRequests;
  }

  public static interface BluetoothLe.GattServerSessionScope {
    method public androidx.bluetooth.BluetoothDevice getDevice();
    method public kotlinx.coroutines.flow.Flow<androidx.bluetooth.GattServerRequest> getRequests();
    method public void notify(androidx.bluetooth.GattCharacteristic characteristic, byte[] value);
    property public abstract androidx.bluetooth.BluetoothDevice device;
    property public abstract kotlinx.coroutines.flow.Flow<androidx.bluetooth.GattServerRequest> requests;
  }

  public final class GattCharacteristic {
    ctor public GattCharacteristic(java.util.UUID uuid, int properties);
    method public int getProperties();
    method public java.util.UUID getUuid();
    property public final int properties;
    property public final java.util.UUID uuid;
    field public static final androidx.bluetooth.GattCharacteristic.Companion Companion;
    field public static final int PROPERTY_BROADCAST = 1; // 0x1
    field public static final int PROPERTY_EXTENDED_PROPS = 128; // 0x80
    field public static final int PROPERTY_INDICATE = 32; // 0x20
    field public static final int PROPERTY_NOTIFY = 16; // 0x10
    field public static final int PROPERTY_READ = 2; // 0x2
    field public static final int PROPERTY_SIGNED_WRITE = 64; // 0x40
    field public static final int PROPERTY_WRITE = 8; // 0x8
    field public static final int PROPERTY_WRITE_NO_RESPONSE = 4; // 0x4
  }

  public static final class GattCharacteristic.Companion {
  }

  public class GattServerRequest {
  }

  public static final class GattServerRequest.ReadCharacteristic extends androidx.bluetooth.GattServerRequest {
    method public androidx.bluetooth.GattCharacteristic getCharacteristic();
    method public void sendFailure();
    method public void sendResponse(byte[] value);
    property public final androidx.bluetooth.GattCharacteristic characteristic;
  }

  public static final class GattServerRequest.WriteCharacteristic extends androidx.bluetooth.GattServerRequest {
    method public androidx.bluetooth.GattCharacteristic getCharacteristic();
    method public byte[]? getValue();
    method public void sendFailure();
    method public void sendResponse(byte[]? value);
    property public final androidx.bluetooth.GattCharacteristic characteristic;
    property public final byte[]? value;
  }

  public final class GattService {
    ctor public GattService(java.util.UUID uuid, java.util.List<androidx.bluetooth.GattCharacteristic> characteristics);
    method public androidx.bluetooth.GattCharacteristic? getCharacteristic(java.util.UUID uuid);
    method public java.util.List<androidx.bluetooth.GattCharacteristic> getCharacteristics();
    method public java.util.UUID getUuid();
    property public final java.util.List<androidx.bluetooth.GattCharacteristic> characteristics;
    property public final java.util.UUID uuid;
  }

  public final class ScanFilter {
    ctor public ScanFilter(optional androidx.bluetooth.BluetoothAddress? deviceAddress, optional String? deviceName, optional int manufacturerId, optional byte[]? manufacturerData, optional byte[]? manufacturerDataMask, optional java.util.UUID? serviceDataUuid, optional byte[]? serviceData, optional byte[]? serviceDataMask, optional java.util.UUID? serviceUuid, optional java.util.UUID? serviceUuidMask);
    method public androidx.bluetooth.BluetoothAddress? getDeviceAddress();
    method public String? getDeviceName();
    method public byte[]? getManufacturerData();
    method public byte[]? getManufacturerDataMask();
    method public int getManufacturerId();
    method public byte[]? getServiceData();
    method public byte[]? getServiceDataMask();
    method public java.util.UUID? getServiceDataUuid();
    method public java.util.UUID? getServiceUuid();
    method public java.util.UUID? getServiceUuidMask();
    property public final androidx.bluetooth.BluetoothAddress? deviceAddress;
    property public final String? deviceName;
    property public final byte[]? manufacturerData;
    property public final byte[]? manufacturerDataMask;
    property public final int manufacturerId;
    property public final byte[]? serviceData;
    property public final byte[]? serviceDataMask;
    property public final java.util.UUID? serviceDataUuid;
    property public final java.util.UUID? serviceUuid;
    property public final java.util.UUID? serviceUuidMask;
    field public static final androidx.bluetooth.ScanFilter.Companion Companion;
    field public static final int MANUFACTURER_FILTER_NONE = -1; // 0xffffffff
  }

  public static final class ScanFilter.Companion {
  }

  public final class ScanResult {
    method public androidx.bluetooth.BluetoothDevice getDevice();
    method public androidx.bluetooth.BluetoothAddress getDeviceAddress();
    method public byte[]? getManufacturerSpecificData(int manufacturerId);
    method public byte[]? getServiceData(java.util.UUID serviceUuid);
    method public java.util.List<java.util.UUID> getServiceUuids();
    method public long getTimestampNanos();
    method public boolean isConnectable();
    property public final androidx.bluetooth.BluetoothDevice device;
    property public final androidx.bluetooth.BluetoothAddress deviceAddress;
    property public final java.util.List<java.util.UUID> serviceUuids;
    property public final long timestampNanos;
  }

}

