Skip to content
This repository has been archived by the owner on Jan 4, 2023. It is now read-only.

Commit

Permalink
Implementing discovery filter by UUIDs (java) and fixing a bug with d…
Browse files Browse the repository at this point in the history
…iscovery filter by UUIDs (c++)

Signed-off-by: Vlad Kolotov <vkolotov@gmail.com>
  • Loading branch information
vkolotov authored and petreeftime committed Oct 14, 2017
1 parent bbe7933 commit ac6d308
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 7 deletions.
10 changes: 7 additions & 3 deletions java/BluetoothAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -258,8 +258,12 @@ public BluetoothDevice find(String name, String address) {
* @param rssi a rssi value
* @param pathloss a pathloss value
*/
public void setDiscoveryFilter(List<Integer> uuids, int rssi, int pathloss, TransportType transportType) {
setDiscoveryFilter(uuids, rssi, pathloss, transportType.ordinal());
public void setDiscoveryFilter(List<UUID> uuids, int rssi, int pathloss, TransportType transportType) {
List<String> uuidsFmt = new ArrayList<>(uuids.size());
for (UUID uuid : uuids) {
uuidsFmt.add(uuid.toString());
}
setDiscoveryFilter(uuidsFmt, rssi, pathloss, transportType.ordinal());
}

/** This method sets RSSI device discovery filter for the caller. When this method is called
Expand All @@ -280,7 +284,7 @@ public String getInterfaceName() {

private native void delete();

private native void setDiscoveryFilter(List<Integer> uuids, int rssi, int pathloss, int transportType);
private native void setDiscoveryFilter(List<String> uuids, int rssi, int pathloss, int transportType);

private BluetoothAdapter(long instance)
{
Expand Down
15 changes: 14 additions & 1 deletion java/jni/BluetoothAdapter.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -792,8 +792,21 @@ void Java_tinyb_BluetoothAdapter_setDiscoveryFilter(JNIEnv *env, jobject obj, jo
try {
BluetoothAdapter *obj_adapter = getInstance<BluetoothAdapter>(env, obj);

jclass cList = env->FindClass("java/util/List");

jmethodID mSize = env->GetMethodID(cList, "size", "()I");
jmethodID mGet = env->GetMethodID(cList, "get", "(I)Ljava/lang/Object;");

jint size = env->CallIntMethod(uuids, mSize);
std::vector<BluetoothUUID> native_uuids;
native_uuids.reserve(0);

for (jint i = 0; i < size; i++) {
jstring strObj = (jstring) env->CallObjectMethod(uuids, mGet, i);
const char * chr = env->GetStringUTFChars(strObj, NULL);
BluetoothUUID uuid(chr);
native_uuids.push_back(uuid);
env->ReleaseStringUTFChars(strObj, chr);
}

TransportType t_type = from_int_to_transport_type((int) transportType);

Expand Down
6 changes: 3 additions & 3 deletions src/BluetoothAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -221,12 +221,12 @@ bool BluetoothAdapter::set_discovery_filter (std::vector<BluetoothUUID> uuids,

if (uuids.size() > 0)
{
GVariantBuilder *builder = g_variant_builder_new(G_VARIANT_TYPE("a(s)"));
GVariantBuilder *builder = g_variant_builder_new(G_VARIANT_TYPE("as"));

for (std::vector<BluetoothUUID>::iterator i = uuids.begin(); i != uuids.end(); ++i)
g_variant_builder_add(builder, "(s)", (*i).get_string().c_str());
g_variant_builder_add(builder, "s", (*i).get_string().c_str());

GVariant *uuids_variant = g_variant_new("a(s)", builder);
GVariant *uuids_variant = g_variant_new("as", builder);
g_variant_builder_unref(builder);
g_variant_dict_insert_value(&dict, "UUIDs", uuids_variant);
}
Expand Down

0 comments on commit ac6d308

Please sign in to comment.