Skip to content

Commit b0d65c0

Browse files
committed
Added GATT Services Exporter
1 parent 131ab06 commit b0d65c0

5 files changed

Lines changed: 96 additions & 16 deletions

File tree

sample_app/res/menu/gatt_services.xml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,19 @@
2222
android:orderInCategory="1"
2323
android:showAsAction="ifRoom"/>
2424
<item
25-
android:id="@+id/menu_connect"
25+
android:id="@+id/menu_share"
26+
android:icon="@drawable/ic_action_share"
2627
android:orderInCategory="100"
28+
android:showAsAction="ifRoom"
29+
android:title="@string/menu_share"/>
30+
<item
31+
android:id="@+id/menu_connect"
32+
android:orderInCategory="102"
2733
android:showAsAction="ifRoom|withText"
2834
android:title="@string/menu_connect"/>
2935
<item
3036
android:id="@+id/menu_disconnect"
31-
android:orderInCategory="101"
37+
android:orderInCategory="103"
3238
android:showAsAction="ifRoom|withText"
3339
android:title="@string/menu_disconnect"/>
3440

sample_app/res/values/strings.xml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,10 @@
4141
<string name="label_tx_power">TX Power:</string>
4242
<string name="label_uuid">UUID:</string>
4343
<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>
44-
<string name="exporter_email_subject">Bluetooth LE Scan Results (%s)</string>
45-
<string name="exporter_email_body">Please find attached the scan results.</string>
46-
<string name="exporter_email_picker_text">Please select your email client:</string>
44+
<string name="exporter_email_device_list_subject">Bluetooth LE Scan Results (%s)</string>
45+
<string name="exporter_email_device_services_subject" formatted="false">Bluetooth LE Device GATT Results (%s, %s)</string>
46+
<string name="exporter_email_device_list_body">Please find attached the scan results.</string>
47+
<string name="exporter_email_device_list_picker_text">Please select your email client:</string>
4748
<string name="header_ibeacon_data">iBeacon Data</string>
4849
<string name="header_raw_ad_records">Raw Ad Records</string>
4950
<string name="header_scan_record">Scan Record</string>

sample_app/src/uk/co/alt236/btlescan/activities/DeviceControlActivity.java

Lines changed: 80 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.List;
2222
import java.util.Map;
2323

24+
import uk.co.alt236.bluetoothlelib.device.BluetoothLeDevice;
2425
import uk.co.alt236.bluetoothlelib.resolvers.GattAttributeResolver;
2526
import uk.co.alt236.bluetoothlelib.util.ByteUtils;
2627
import uk.co.alt236.btlescan.R;
@@ -54,9 +55,7 @@
5455
*/
5556
public class DeviceControlActivity extends Activity {
5657
private final static String TAG = DeviceControlActivity.class.getSimpleName();
57-
58-
public static final String EXTRAS_DEVICE_NAME = "DEVICE_NAME";
59-
public static final String EXTRAS_DEVICE_ADDRESS = "DEVICE_ADDRESS";
58+
public static final String EXTRA_DEVICE = "extra_device";
6059

6160
private static final String LIST_NAME = "NAME";
6261
private static final String LIST_UUID = "UUID";
@@ -76,6 +75,8 @@ public class DeviceControlActivity extends Activity {
7675
@InjectView(R.id.data_as_array) TextView mDataAsArray;
7776

7877
private boolean mConnected = false;
78+
private String mExportString;
79+
private BluetoothLeDevice mDevice;
7980

8081
// Code to manage Service lifecycle.
8182
private final ServiceConnection mServiceConnection = new ServiceConnection() {
@@ -160,21 +161,70 @@ public boolean onChildClick(ExpandableListView parent, View v, int groupPosition
160161
}
161162
};
162163

163-
164164
private void clearUI() {
165165
mGattServicesList.setAdapter((SimpleExpandableListAdapter) null);
166166
mGattUUID.setText(R.string.no_data);
167167
mGattUUIDDesc.setText(R.string.no_data);
168168
mDataAsArray.setText(R.string.no_data);
169169
mDataAsString.setText(R.string.no_data);
170+
}
171+
172+
private void generateExportString(List<BluetoothGattService> gattServices){
173+
final String unknownServiceString = getResources().getString(R.string.unknown_service);
174+
final String unknownCharaString = getResources().getString(R.string.unknown_characteristic);
175+
final StringBuilder exportBuilder = new StringBuilder();
176+
177+
exportBuilder.append("Device Name: ");
178+
exportBuilder.append(mDeviceName);
179+
exportBuilder.append('\n');
180+
exportBuilder.append("Device Address: ");
181+
exportBuilder.append(mDeviceAddress);
182+
exportBuilder.append('\n');
183+
exportBuilder.append('\n');
184+
185+
exportBuilder.append("Services:");
186+
exportBuilder.append("--------------------------");
187+
exportBuilder.append('\n');
188+
189+
String uuid = null;
190+
for (BluetoothGattService gattService : gattServices) {
191+
uuid = gattService.getUuid().toString();
192+
193+
exportBuilder.append(GattAttributeResolver.getAttributeName(uuid, unknownServiceString));
194+
exportBuilder.append(" (");
195+
exportBuilder.append(uuid);
196+
exportBuilder.append(')');
197+
exportBuilder.append('\n');
198+
199+
final List<BluetoothGattCharacteristic> gattCharacteristics = gattService.getCharacteristics();
200+
for (final BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) {
201+
uuid = gattCharacteristic.getUuid().toString();
170202

203+
exportBuilder.append('\t');
204+
exportBuilder.append(GattAttributeResolver.getAttributeName(uuid, unknownCharaString));
205+
exportBuilder.append(" (");
206+
exportBuilder.append(uuid);
207+
exportBuilder.append(')');
208+
exportBuilder.append('\n');
209+
}
210+
211+
exportBuilder.append('\n');
212+
exportBuilder.append('\n');
213+
}
214+
215+
exportBuilder.append("--------------------------");
216+
exportBuilder.append('\n');
217+
218+
mExportString = exportBuilder.toString();
171219
}
172220

173221
// Demonstrates how to iterate through the supported GATT Services/Characteristics.
174222
// In this sample, we populate the data structure that is bound to the ExpandableListView
175223
// on the UI.
176224
private void displayGattServices(List<BluetoothGattService> gattServices) {
177225
if (gattServices == null) return;
226+
generateExportString(gattServices);
227+
178228
String uuid = null;
179229
final String unknownServiceString = getResources().getString(R.string.unknown_service);
180230
final String unknownCharaString = getResources().getString(R.string.unknown_characteristic);
@@ -203,6 +253,7 @@ private void displayGattServices(List<BluetoothGattService> gattServices) {
203253
currentCharaData.put(LIST_UUID, uuid);
204254
gattCharacteristicGroupData.add(currentCharaData);
205255
}
256+
206257
mGattCharacteristics.add(charas);
207258
gattCharacteristicData.add(gattCharacteristicGroupData);
208259
}
@@ -218,7 +269,9 @@ private void displayGattServices(List<BluetoothGattService> gattServices) {
218269
new String[] {LIST_NAME, LIST_UUID},
219270
new int[] { android.R.id.text1, android.R.id.text2 }
220271
);
272+
221273
mGattServicesList.setAdapter(gattServiceAdapter);
274+
invalidateOptionsMenu();
222275
}
223276

224277
@Override
@@ -227,8 +280,9 @@ public void onCreate(Bundle savedInstanceState) {
227280
setContentView(R.layout.activity_gatt_services);
228281

229282
final Intent intent = getIntent();
230-
mDeviceName = intent.getStringExtra(EXTRAS_DEVICE_NAME);
231-
mDeviceAddress = intent.getStringExtra(EXTRAS_DEVICE_ADDRESS);
283+
mDevice = intent.getParcelableExtra(EXTRA_DEVICE);
284+
mDeviceName = mDevice.getName();
285+
mDeviceAddress = mDevice.getAddress();
232286

233287
ButterKnife.inject(this);
234288

@@ -253,6 +307,13 @@ public boolean onCreateOptionsMenu(Menu menu) {
253307
menu.findItem(R.id.menu_connect).setVisible(true);
254308
menu.findItem(R.id.menu_disconnect).setVisible(false);
255309
}
310+
311+
if(mExportString == null){
312+
menu.findItem(R.id.menu_share).setVisible(false);
313+
} else {
314+
menu.findItem(R.id.menu_share).setVisible(true);
315+
}
316+
256317
return true;
257318
}
258319

@@ -275,6 +336,19 @@ public boolean onOptionsItemSelected(MenuItem item) {
275336
case android.R.id.home:
276337
onBackPressed();
277338
return true;
339+
case R.id.menu_share:
340+
final Intent intent = new Intent(android.content.Intent.ACTION_SEND);
341+
final String subject = getString(R.string.exporter_email_device_services_subject, mDeviceName, mDeviceAddress);
342+
343+
intent.setType("text/plain");
344+
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
345+
intent.putExtra(android.content.Intent.EXTRA_TEXT, mExportString);
346+
347+
startActivity(Intent.createChooser(
348+
intent,
349+
getString(R.string.exporter_email_device_list_picker_text)));
350+
351+
return true;
278352
}
279353
return super.onOptionsItemSelected(item);
280354
}

sample_app/src/uk/co/alt236/btlescan/activities/DeviceDetailsActivity.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
147147
case R.id.menu_connect:
148148

149149
final Intent intent = new Intent(this, DeviceControlActivity.class);
150-
intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_NAME, mDevice.getName());
151-
intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_ADDRESS, mDevice.getAddress());
150+
intent.putExtra(DeviceControlActivity.EXTRA_DEVICE, mDevice);
152151

153152
startActivity(intent);
154153

sample_app/src/uk/co/alt236/btlescan/containers/BluetoothLeDeviceStore.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,10 @@ public void shareDataAsEmail(Context context){
157157

158158
final String to = null;
159159
final String subject = context.getString(
160-
R.string.exporter_email_subject,
160+
R.string.exporter_email_device_list_subject,
161161
TimeFormatter.getIsoDateTime(timeInMillis));
162162

163-
final String message = context.getString(R.string.exporter_email_body);
163+
final String message = context.getString(R.string.exporter_email_device_list_body);
164164

165165
final Intent i = new Intent(Intent.ACTION_SEND);
166166
i.setType("plain/text");
@@ -173,7 +173,7 @@ public void shareDataAsEmail(Context context){
173173
i.putExtra(Intent.EXTRA_EMAIL, new String[] { to });
174174
i.putExtra(Intent.EXTRA_SUBJECT, subject);
175175
i.putExtra(Intent.EXTRA_TEXT, message);
176-
context.startActivity(Intent.createChooser(i, context.getString(R.string.exporter_email_picker_text)));
176+
context.startActivity(Intent.createChooser(i, context.getString(R.string.exporter_email_device_list_picker_text)));
177177

178178
} catch (IOException e) {
179179
e.printStackTrace();

0 commit comments

Comments
 (0)