Added GATT Services Exporter
This commit is contained in:
@@ -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"/>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user