Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
ArrayList<String> deviceNames =
new
ArrayList<>();
final
ArrayList<BluetoothDevice> devices =
new
ArrayList<>();
if
(pairedDevices.size() >
0
) {
for
(BluetoothDevice device : pairedDevices) {
deviceNames.add(device.getName() +
"\n"
+ device.getAddress());
devices.add(device);
}
}
else
{
Toast.makeText(
this
,
"No paired devices found"
, Toast.LENGTH_SHORT).show();
return
;
}
AlertDialog.Builder builder =
new
AlertDialog.Builder(
this
);
builder.setTitle(
"Select Bluetooth Device"
);
builder.setItems(deviceNames.toArray(
new
CharSequence[deviceNames.size()]),
new
DialogInterface.OnClickListener() {
@Override
public
void
onClick(DialogInterface dialog,
int
which) {
BluetoothDevice device = devices.get(which);
if
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
if
(ContextCompat.checkSelfPermission(MainActivity.
this
, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.
this
,
new
String[]{Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN}, REQUEST_PERMISSIONS);
return
;
}
}
ConnectThread connectThread =
new
ConnectThread(device);
connectThread.start();
}
});
builder.show();
}
@Override
protected
void
onActivityResult(
int
requestCode,
int
resultCode, Intent data) {
if
(requestCode == REQUEST_ENABLE_BT) {
if
(resultCode == RESULT_OK) {
showPairedDevices();
}
else
{
Toast.makeText(
this
,
"Bluetooth is required to run this application"
, Toast.LENGTH_LONG).show();
finish();
}
}
super
.onActivityResult(requestCode, resultCode, data);
}
private
class
ConnectThread
extends
Thread {
private
final
BluetoothDevice device;
public
ConnectThread(BluetoothDevice device) {
BluetoothSocket tmp =
null
;
this
.device = device;
if
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
if
(ContextCompat.checkSelfPermission(MainActivity.
this
, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.
this
,
new
String[]{Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN}, REQUEST_PERMISSIONS);
return
;
}
}
try
{
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
}
catch
(IOException e) {
Log.e(TAG,
"Socket's create() method failed"
, e);
}
bluetoothSocket = tmp;
}
public
void
run() {
if
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
if
(ContextCompat.checkSelfPermission(MainActivity.
this
, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.
this
,
new
String[]{Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN}, REQUEST_PERMISSIONS);
return
;
}
}
bluetoothAdapter.cancelDiscovery();
try
{
bluetoothSocket.connect();
manageConnectedSocket();
}
catch
(IOException e) {
try
{
bluetoothSocket.close();
}
catch
(IOException closeException) {
Log.e(TAG,
"Could not close the client socket"
, closeException);
}
runOnUiThread(
new
Runnable() {
@Override
public
void
run() {
Toast.makeText(MainActivity.
this
,
"Unable to connect to device. Please try again."
, Toast.LENGTH_LONG).show();
}
});
}
}
}
private
void
manageConnectedSocket() {
try
{
inputStream = bluetoothSocket.getInputStream();
final
byte
[] buffer =
new
byte
[
1024
];
int
bytes;
while
(
true
) {
try
{
bytes = inputStream.read(buffer);
String readMessage =
new
String(buffer,
0
, bytes).trim();
if
(readMessage.isEmpty()) {
continue
;
}
Log.d(TAG,
"Received message: "
+ readMessage);
Message msg = handler.obtainMessage();
Bundle bundle =
new
Bundle();
bundle.putString(
"posture"
, readMessage);
msg.setData(bundle);
handler.sendMessage(msg);
}
catch
(IOException e) {
Log.e(TAG,
"Error occurred when reading input stream"
, e);
runOnUiThread(() ->
Toast.makeText(MainActivity.
this
,
"Error occurred during communication. Please try again."
, Toast.LENGTH_LONG).show());
break
;
}
}
}
catch
(IOException e) {
Log.e(TAG,
"Error occurred when creating input stream"
, e);
runOnUiThread(() ->
Toast.makeText(MainActivity.
this
,
"Error occurred during communication setup. Please try again."
, Toast.LENGTH_LONG).show());
}
}
private
void
showStretchingImages(String posture) {
int
[] stretchImages = getStretchImagesForPosture(posture);
if
(stretchImages ==
null
) {
return
;
}
new
CountDownTimer(
270000
,
30000
) {
int
index =
0
;
@Override
public
void
onTick(
long
millisUntilFinished) {
if
(index < stretchImages.length) {
stretchImageView.setImageResource(stretchImages[index]);
index++;
}
}
@Override
public
void
onFinish() {
}
}.start();
}
private
int
[] getStretchImagesForPosture(String posture) {
int
[] images =
null
;
switch
(posture) {
case
"GOOD"
:
images =
new
int
[]{R.drawable.p1, R.drawable.w1, R.drawable.w2, R.drawable.w3, R.drawable.w4,
R.drawable.w5, R.drawable.w6, R.drawable.w7, R.drawable.w8};
break
;
case
"SLIGHT"
:
images =
new
int
[]{R.drawable.p2, R.drawable.w9, R.drawable.w10, R.drawable.w11, R.drawable.w12,
R.drawable.w13, R.drawable.w14, R.drawable.w15, R.drawable.w16};
break
;
case
"BAD"
:
images =
new
int
[]{R.drawable.p3, R.drawable.w17, R.drawable.w18, R.drawable.w19, R.drawable.w20,
R.drawable.w21, R.drawable.w22, R.drawable.w23, R.drawable.w24};
break
;
}
return
images;
}
}