Added GATT Services Exporter

This commit is contained in:
Alexandros Schillings
2014-04-28 17:39:31 +01:00
parent 131ab06bfb
commit b0d65c08dd
5 changed files with 96 additions and 16 deletions

View File

@@ -22,13 +22,19 @@
android:orderInCategory="1"
android:showAsAction="ifRoom"/>
<item
android:id="@+id/menu_connect"
android:id="@+id/menu_share"
android:icon="@drawable/ic_action_share"
android:orderInCategory="100"
android:showAsAction="ifRoom"
android:title="@string/menu_share"/>
<item
android:id="@+id/menu_connect"
android:orderInCategory="102"
android:showAsAction="ifRoom|withText"
android:title="@string/menu_connect"/>
<item
android:id="@+id/menu_disconnect"
android:orderInCategory="101"
android:orderInCategory="103"
android:showAsAction="ifRoom|withText"
android:title="@string/menu_disconnect"/>

View File

@@ -41,9 +41,10 @@
<string name="label_tx_power">TX Power:</string>
<string name="label_uuid">UUID:</string>
<string name="about_dialog_text">This is a sample application using the Bluetooth LE Library.\n\nGithub: https://github.com/alt236/Bluetooth-LE-Library---Android\n\nCopyright: Alexandros Schillings</string>
<string name="exporter_email_subject">Bluetooth LE Scan Results (%s)</string>
<string name="exporter_email_body">Please find attached the scan results.</string>
<string name="exporter_email_picker_text">Please select your email client:</string>
<string name="exporter_email_device_list_subject">Bluetooth LE Scan Results (%s)</string>
<string name="exporter_email_device_services_subject" formatted="false">Bluetooth LE Device GATT Results (%s, %s)</string>
<string name="exporter_email_device_list_body">Please find attached the scan results.</string>
<string name="exporter_email_device_list_picker_text">Please select your email client:</string>
<string name="header_ibeacon_data">iBeacon Data</string>
<string name="header_raw_ad_records">Raw Ad Records</string>
<string name="header_scan_record">Scan Record</string>

View File

@@ -21,6 +21,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import uk.co.alt236.bluetoothlelib.device.BluetoothLeDevice;
import uk.co.alt236.bluetoothlelib.resolvers.GattAttributeResolver;
import uk.co.alt236.bluetoothlelib.util.ByteUtils;
import uk.co.alt236.btlescan.R;
@@ -54,9 +55,7 @@ import butterknife.InjectView;
*/
public class DeviceControlActivity extends Activity {
private final static String TAG = DeviceControlActivity.class.getSimpleName();
public static final String EXTRAS_DEVICE_NAME = "DEVICE_NAME";
public static final String EXTRAS_DEVICE_ADDRESS = "DEVICE_ADDRESS";
public static final String EXTRA_DEVICE = "extra_device";
private static final String LIST_NAME = "NAME";
private static final String LIST_UUID = "UUID";
@@ -76,6 +75,8 @@ public class DeviceControlActivity extends Activity {
@InjectView(R.id.data_as_array) TextView mDataAsArray;
private boolean mConnected = false;
private String mExportString;
private BluetoothLeDevice mDevice;
// Code to manage Service lifecycle.
private final ServiceConnection mServiceConnection = new ServiceConnection() {
@@ -160,14 +161,61 @@ public class DeviceControlActivity extends Activity {
}
};
private void clearUI() {
mGattServicesList.setAdapter((SimpleExpandableListAdapter) null);
mGattUUID.setText(R.string.no_data);
mGattUUIDDesc.setText(R.string.no_data);
mDataAsArray.setText(R.string.no_data);
mDataAsString.setText(R.string.no_data);
}
private void generateExportString(List<BluetoothGattService> gattServices){
final String unknownServiceString = getResources().getString(R.string.unknown_service);
final String unknownCharaString = getResources().getString(R.string.unknown_characteristic);
final StringBuilder exportBuilder = new StringBuilder();
exportBuilder.append("Device Name: ");
exportBuilder.append(mDeviceName);
exportBuilder.append('\n');
exportBuilder.append("Device Address: ");
exportBuilder.append(mDeviceAddress);
exportBuilder.append('\n');
exportBuilder.append('\n');
exportBuilder.append("Services:");
exportBuilder.append("--------------------------");
exportBuilder.append('\n');
String uuid = null;
for (BluetoothGattService gattService : gattServices) {
uuid = gattService.getUuid().toString();
exportBuilder.append(GattAttributeResolver.getAttributeName(uuid, unknownServiceString));
exportBuilder.append(" (");
exportBuilder.append(uuid);
exportBuilder.append(')');
exportBuilder.append('\n');
final List<BluetoothGattCharacteristic> gattCharacteristics = gattService.getCharacteristics();
for (final BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) {
uuid = gattCharacteristic.getUuid().toString();
exportBuilder.append('\t');
exportBuilder.append(GattAttributeResolver.getAttributeName(uuid, unknownCharaString));
exportBuilder.append(" (");
exportBuilder.append(uuid);
exportBuilder.append(')');
exportBuilder.append('\n');
}
exportBuilder.append('\n');
exportBuilder.append('\n');
}
exportBuilder.append("--------------------------");
exportBuilder.append('\n');
mExportString = exportBuilder.toString();
}
// Demonstrates how to iterate through the supported GATT Services/Characteristics.
@@ -175,6 +223,8 @@ public class DeviceControlActivity extends Activity {
// on the UI.
private void displayGattServices(List<BluetoothGattService> gattServices) {
if (gattServices == null) return;
generateExportString(gattServices);
String uuid = null;
final String unknownServiceString = getResources().getString(R.string.unknown_service);
final String unknownCharaString = getResources().getString(R.string.unknown_characteristic);
@@ -203,6 +253,7 @@ public class DeviceControlActivity extends Activity {
currentCharaData.put(LIST_UUID, uuid);
gattCharacteristicGroupData.add(currentCharaData);
}
mGattCharacteristics.add(charas);
gattCharacteristicData.add(gattCharacteristicGroupData);
}
@@ -218,7 +269,9 @@ public class DeviceControlActivity extends Activity {
new String[] {LIST_NAME, LIST_UUID},
new int[] { android.R.id.text1, android.R.id.text2 }
);
mGattServicesList.setAdapter(gattServiceAdapter);
invalidateOptionsMenu();
}
@Override
@@ -227,8 +280,9 @@ public class DeviceControlActivity extends Activity {
setContentView(R.layout.activity_gatt_services);
final Intent intent = getIntent();
mDeviceName = intent.getStringExtra(EXTRAS_DEVICE_NAME);
mDeviceAddress = intent.getStringExtra(EXTRAS_DEVICE_ADDRESS);
mDevice = intent.getParcelableExtra(EXTRA_DEVICE);
mDeviceName = mDevice.getName();
mDeviceAddress = mDevice.getAddress();
ButterKnife.inject(this);
@@ -253,6 +307,13 @@ public class DeviceControlActivity extends Activity {
menu.findItem(R.id.menu_connect).setVisible(true);
menu.findItem(R.id.menu_disconnect).setVisible(false);
}
if(mExportString == null){
menu.findItem(R.id.menu_share).setVisible(false);
} else {
menu.findItem(R.id.menu_share).setVisible(true);
}
return true;
}
@@ -275,6 +336,19 @@ public class DeviceControlActivity extends Activity {
case android.R.id.home:
onBackPressed();
return true;
case R.id.menu_share:
final Intent intent = new Intent(android.content.Intent.ACTION_SEND);
final String subject = getString(R.string.exporter_email_device_services_subject, mDeviceName, mDeviceAddress);
intent.setType("text/plain");
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
intent.putExtra(android.content.Intent.EXTRA_TEXT, mExportString);
startActivity(Intent.createChooser(
intent,
getString(R.string.exporter_email_device_list_picker_text)));
return true;
}
return super.onOptionsItemSelected(item);
}

View File

@@ -147,8 +147,7 @@ public class DeviceDetailsActivity extends ListActivity{
case R.id.menu_connect:
final Intent intent = new Intent(this, DeviceControlActivity.class);
intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_NAME, mDevice.getName());
intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_ADDRESS, mDevice.getAddress());
intent.putExtra(DeviceControlActivity.EXTRA_DEVICE, mDevice);
startActivity(intent);

View File

@@ -157,10 +157,10 @@ public class BluetoothLeDeviceStore {
final String to = null;
final String subject = context.getString(
R.string.exporter_email_subject,
R.string.exporter_email_device_list_subject,
TimeFormatter.getIsoDateTime(timeInMillis));
final String message = context.getString(R.string.exporter_email_body);
final String message = context.getString(R.string.exporter_email_device_list_body);
final Intent i = new Intent(Intent.ACTION_SEND);
i.setType("plain/text");
@@ -173,7 +173,7 @@ public class BluetoothLeDeviceStore {
i.putExtra(Intent.EXTRA_EMAIL, new String[] { to });
i.putExtra(Intent.EXTRA_SUBJECT, subject);
i.putExtra(Intent.EXTRA_TEXT, message);
context.startActivity(Intent.createChooser(i, context.getString(R.string.exporter_email_picker_text)));
context.startActivity(Intent.createChooser(i, context.getString(R.string.exporter_email_device_list_picker_text)));
} catch (IOException e) {
e.printStackTrace();