diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index b268ef3..ca16a99 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -4,6 +4,7 @@ diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/java/pt/epvc/lazzycofee/MainActivity.java b/app/src/main/java/pt/epvc/lazzycofee/MainActivity.java index dc54ac7..75c5ff0 100644 --- a/app/src/main/java/pt/epvc/lazzycofee/MainActivity.java +++ b/app/src/main/java/pt/epvc/lazzycofee/MainActivity.java @@ -6,6 +6,7 @@ import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.Intent; import android.content.pm.PackageManager; +import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.os.SystemClock; @@ -43,6 +44,7 @@ public class MainActivity extends AppCompatActivity { private static final UUID BTMODULEUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); private final static int REQUEST_ENABLE_BT = 1; // used to identify adding bluetooth names private boolean bluetoothDenied = false; + private TextView tvStatus; @Override @@ -55,6 +57,8 @@ public class MainActivity extends AppCompatActivity { v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + tvStatus = findViewById(R.id.tvStatus); + updateStatus("Desligado", Color.parseColor("#F44336")); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN}, @@ -70,33 +74,48 @@ public class MainActivity extends AppCompatActivity { } } - public void cafeCurto(View view) { - Toast.makeText(this, "Café Curto", Toast.LENGTH_SHORT).show(); + private void updateStatus(String status, int color) { + runOnUiThread(() -> { + if (tvStatus != null) { + tvStatus.setText("● " + status); + tvStatus.setTextColor(color); + } + }); + } + public void cafeCurto(View view) { if (mConnectedThread != null) { + Toast.makeText(this, "Café Curto", Toast.LENGTH_SHORT).show(); mConnectedThread.enviarComando("1"); + } else { + ligarBluetooth(); + Toast.makeText(this, "A tentar ligar à máquina...", Toast.LENGTH_SHORT).show(); } } public void CafeMedio(View view) { - Toast.makeText(this, "Café Médio", Toast.LENGTH_SHORT).show(); - if (mConnectedThread != null) { + Toast.makeText(this, "Café Médio", Toast.LENGTH_SHORT).show(); mConnectedThread.enviarComando("2"); + } else { + ligarBluetooth(); + Toast.makeText(this, "A tentar ligar à máquina...", Toast.LENGTH_SHORT).show(); } } public void cafeLongo(View view) { - - Toast.makeText(this, "Café Longo", Toast.LENGTH_SHORT).show(); - if (mConnectedThread != null) { + Toast.makeText(this, "Café Longo", Toast.LENGTH_SHORT).show(); mConnectedThread.enviarComando("3"); + } else { + ligarBluetooth(); + Toast.makeText(this, "A tentar ligar à máquina...", Toast.LENGTH_SHORT).show(); } } public void ligarBluetooth() { if (mBTAdapter == null) { + updateStatus("Sem Bluetooth", Color.parseColor("#F44336")); runOnUiThread(() -> Toast.makeText(MainActivity.this, "Dispositivo não suporta Bluetooth", Toast.LENGTH_LONG).show() ); @@ -109,6 +128,7 @@ public class MainActivity extends AppCompatActivity { } else{ + updateStatus("A ligar...", Color.parseColor("#FFC107")); final String address = "98:D3:21:FC:7F:DF"; new Thread() { public void run() { @@ -121,6 +141,7 @@ public class MainActivity extends AppCompatActivity { } catch (IOException e) { fail = true; Log.d("bluetooth","Socket creation failed"); + updateStatus("Falha ao ligar", Color.parseColor("#F44336")); } try { if (ActivityCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { @@ -133,13 +154,17 @@ public class MainActivity extends AppCompatActivity { try { fail = true; mBTSocket.close(); + updateStatus("Desligado", Color.parseColor("#F44336")); } catch (IOException e2) { Log.d("bluetooth","Socket creation failed"); } } if (fail == false) { + updateStatus("Ligado", Color.parseColor("#4CAF50")); mConnectedThread = new ConnectedThread(mBTSocket); mConnectedThread.start(); + } else { + reconnect(); } } }.start(); @@ -175,16 +200,34 @@ public class MainActivity extends AppCompatActivity { } private class ConnectedThread extends Thread { private final OutputStream mmOutStream; + private final InputStream mmInStream; public ConnectedThread(BluetoothSocket socket) { OutputStream tmpOut = null; + InputStream tmpIn = null; try { tmpOut = socket.getOutputStream(); + tmpIn = socket.getInputStream(); } catch (IOException e) { - Log.e("Bluetooth", "Erro ao obter OutputStream", e); + Log.e("Bluetooth", "Erro ao obter Streams", e); } mmOutStream = tmpOut; + mmInStream = tmpIn; + } + + public void run() { + byte[] buffer = new byte[1024]; + while (!Thread.currentThread().isInterrupted()) { + try { + int bytes = mmInStream.read(buffer); + if (bytes == -1) break; + } catch (IOException e) { + Log.e("Bluetooth", "Conexão perdida", e); + break; + } + } + reconnect(); } public void enviarComando(String input){ @@ -192,19 +235,34 @@ public class MainActivity extends AppCompatActivity { try { mmOutStream.write(bytes); } catch (IOException e) { - Log.e("Bluetooth", "Erro ao obter OutputStream", e); + Log.e("Bluetooth", "Erro ao enviar", e); + reconnect(); } } } + + private void reconnect() { + runOnUiThread(() -> { + desligarBluetooth(); + updateStatus("A tentar reconectar...", Color.parseColor("#FFC107")); + new Handler(getMainLooper()).postDelayed(() -> { + if (!bluetoothDenied) { + ligarBluetooth(); + } + }, 3000); + }); + } private void desligarBluetooth() { try { if (mConnectedThread != null) { mConnectedThread.interrupt(); + mConnectedThread = null; } if (mBTSocket != null) { mBTSocket.close(); mBTSocket = null; } + updateStatus("Desligado", Color.parseColor("#F44336")); } catch (IOException e) { Log.e("Bluetooth", "Erro ao desligar", e); } diff --git a/app/src/main/res/drawable/cafecurto.png b/app/src/main/res/drawable/cafecurto.png index e86476b..b0a58ac 100644 Binary files a/app/src/main/res/drawable/cafecurto.png and b/app/src/main/res/drawable/cafecurto.png differ diff --git a/app/src/main/res/drawable/cafelongo.png b/app/src/main/res/drawable/cafelongo.png index fdf173b..dc131d0 100644 Binary files a/app/src/main/res/drawable/cafelongo.png and b/app/src/main/res/drawable/cafelongo.png differ diff --git a/app/src/main/res/drawable/cafemedio.png b/app/src/main/res/drawable/cafemedio.png index dc7101c..ea07bb8 100644 Binary files a/app/src/main/res/drawable/cafemedio.png and b/app/src/main/res/drawable/cafemedio.png differ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 3506222..65b2347 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,65 +1,241 @@ - + android:background="#16100c" + tools:context=".MainActivity"> + - - + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - - - + + + + + + + + - + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + app:cardBackgroundColor="#211812" + app:cardCornerRadius="16dp" + app:cardElevation="8dp" + app:rippleColor="#D4AF37" + app:strokeColor="#3A2D23" + app:strokeWidth="1dp"> + + + + + + + + + + + + - - +