commit f28e89289b2b5718dfc5d5b1463895c29704022a Author: joaomiranda Date: Wed Nov 5 21:10:42 2025 +0000 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..1b4940e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +Ambrosio Android \ No newline at end of file diff --git a/.idea/AndroidProjectSystem.xml b/.idea/AndroidProjectSystem.xml new file mode 100644 index 0000000..4a53bee --- /dev/null +++ b/.idea/AndroidProjectSystem.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b86273d --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..b268ef3 --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..639c779 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..74dd639 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..16660f1 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..21472f0 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,41 @@ +plugins { + alias(libs.plugins.android.application) +} + +android { + namespace = "pt.epvc.ambrosioandroid" + compileSdk = 36 + + defaultConfig { + applicationId = "pt.epvc.ambrosioandroid" + minSdk = 24 + targetSdk = 36 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } +} + +dependencies { + + implementation(libs.appcompat) + implementation(libs.material) + testImplementation(libs.junit) + androidTestImplementation(libs.ext.junit) + androidTestImplementation(libs.espresso.core) +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/pt/epvc/ambrosioandroid/ExampleInstrumentedTest.java b/app/src/androidTest/java/pt/epvc/ambrosioandroid/ExampleInstrumentedTest.java new file mode 100644 index 0000000..66a1118 --- /dev/null +++ b/app/src/androidTest/java/pt/epvc/ambrosioandroid/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package pt.epvc.ambrosioandroid; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("pt.epvc.ambrosioandroid", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..e32a382 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/pt/epvc/ambrosioandroid/Bebida.java b/app/src/main/java/pt/epvc/ambrosioandroid/Bebida.java new file mode 100644 index 0000000..1f4688d --- /dev/null +++ b/app/src/main/java/pt/epvc/ambrosioandroid/Bebida.java @@ -0,0 +1,31 @@ +package pt.epvc.ambrosioandroid; + +public class Bebida { + private String nomeBebida; + private String descricaoBebida; + private int imagemBebida; + + public void setDescricaoBebida(String descricaoBebida) { + this.descricaoBebida = descricaoBebida; + } + + public void setNomeBebida(String nomeBebida) { + this.nomeBebida = nomeBebida; + } + + public void setImagemBebida(int imagemBebida) { + this.imagemBebida = imagemBebida; + } + + public int getImagemBebida() { + return imagemBebida; + } + + public String getDescricaoBebida() { + return descricaoBebida; + } + + public String getNomeBebida() { + return nomeBebida; + } +} diff --git a/app/src/main/java/pt/epvc/ambrosioandroid/CustomAdapter.java b/app/src/main/java/pt/epvc/ambrosioandroid/CustomAdapter.java new file mode 100644 index 0000000..e8e4e0e --- /dev/null +++ b/app/src/main/java/pt/epvc/ambrosioandroid/CustomAdapter.java @@ -0,0 +1,53 @@ +package pt.epvc.ambrosioandroid; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +public class CustomAdapter extends BaseAdapter { + + String nomeBebida[]; + String descricaoBebida[]; + int imagemBebida[]; + LayoutInflater inflater; + + public CustomAdapter(Context context, String nomeBebida[], String descricaoBebida[], int imagemBebida[]){ + this.nomeBebida = nomeBebida; + this.descricaoBebida = descricaoBebida; + this.imagemBebida = imagemBebida; + inflater = LayoutInflater.from(context); + } + + @Override + public int getCount() { + return imagemBebida.length; + } + + @Override + public Object getItem(int position) { + return null; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + convertView = inflater.inflate(R.layout.list_item, null); + TextView nomeBebidaTxt = (TextView) convertView.findViewById(R.id.nomeBebida); + TextView descricaoBebidaTxt = (TextView) convertView.findViewById(R.id.descricaoBebida); + ImageView imagemBebidaImg = (ImageView) convertView.findViewById(R.id.imagemBebida); + + nomeBebidaTxt.setText(this.nomeBebida[position]); + descricaoBebidaTxt.setText(this.descricaoBebida[position]); + imagemBebidaImg.setImageResource(this.imagemBebida[position]); + + return convertView; + } +} diff --git a/app/src/main/java/pt/epvc/ambrosioandroid/DetalheBebida.java b/app/src/main/java/pt/epvc/ambrosioandroid/DetalheBebida.java new file mode 100644 index 0000000..6887025 --- /dev/null +++ b/app/src/main/java/pt/epvc/ambrosioandroid/DetalheBebida.java @@ -0,0 +1,465 @@ +package pt.epvc.ambrosioandroid; + +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothSocket; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.os.SystemClock; +import android.speech.RecognizerIntent; +import android.util.Log; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Locale; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; + +public class DetalheBebida extends AppCompatActivity { + + private TextView tv_Speech_to_text; + private static final int REQUEST_CODE_SPEECH_INPUT = 1; + private FloatingActionButton ambrosioButton; + private String nomeBebida; + private Bebida bebidas [] = new Bebida[8]; + private ImageView imagemBebida; + private TextView descricaoBebida; + private TextView nomeBebidaTextView; + private String comando; + private BluetoothAdapter mBTAdapter; + private Set mPairedDevices; + private ArrayAdapter mBTArrayAdapter; + private ListView mDevicesListView; + private Handler mHandler; // Our main handler that will receive callback notifications + private ConnectedThread mConnectedThread; // bluetooth background worker thread to send and receive data + private BluetoothSocket mBTSocket = null; // bi-directional client-to-client data path + 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 final static int MESSAGE_READ = 2; // used in bluetooth handler to identify message update + private final static int CONNECTING_STATUS = 3; // used in bluetooth handler to identify message status + private View background; + private ProgressBar progressBar; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_bebida); + + ambrosioButton = findViewById(R.id.ambrosioButton); + + background = (View) findViewById(R.id.background_dim); + progressBar = (ProgressBar)findViewById(R.id.progressBar); + + //mBTArrayAdapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1); + mBTAdapter = BluetoothAdapter.getDefaultAdapter(); // get a handle on the bluetooth radio + + /*mDevicesListView = (ListView)findViewById(R.id.devicesListView); + mDevicesListView.setAdapter(mBTArrayAdapter); // assign model to view + mDevicesListView.setOnItemClickListener(mDeviceClickListener);*/ + + mHandler = new Handler(){ + public void handleMessage(android.os.Message msg){ + if(msg.what == MESSAGE_READ){ + String readMessage = null; + try { + readMessage = new String((byte[]) msg.obj, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + //mReadBuffer.setText(readMessage); + } + + if(msg.what == CONNECTING_STATUS){ + if(msg.arg1 == 1) { + progressBar.setVisibility(View.INVISIBLE); + background.setVisibility(View.INVISIBLE); + //Toast.makeText(Bebida.this, "Connected to Device: " + (String)(msg.obj), Toast.LENGTH_SHORT).show(); + //mBluetoothStatus.setText("Connected to Device: " + (String)(msg.obj)); + } + else { + progressBar.setVisibility(View.INVISIBLE); + background.setVisibility(View.INVISIBLE); + Toast.makeText(DetalheBebida.this, "Conexão falhou", Toast.LENGTH_SHORT).show(); + //mBluetoothStatus.setText("Connection Failed"); + } + } + } + }; + + ligarBluetooth(); + /*if (mBTArrayAdapter == null) { + // Device does not support Bluetooth + //mBluetoothStatus.setText("Status: Bluetooth not found"); + Toast.makeText(Bebida.this,"Bluetooth device not found!",Toast.LENGTH_SHORT).show(); + } + else{ + ligarBluetooth(); + }*/ + + nomeBebida = getIntent().getExtras().getString("nomeBebida"); + + FloatingActionButton floatingActionButton = (FloatingActionButton)findViewById(R.id.floatingActionButton); + + ambrosioButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + Intent intent + = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); + intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, + RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); + intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, + Locale.getDefault()); + intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speak to text"); + + try { + startActivityForResult(intent, REQUEST_CODE_SPEECH_INPUT); + } + catch (Exception e) { + Toast + .makeText(DetalheBebida.this, " " + e.getMessage(), + Toast.LENGTH_SHORT) + .show(); + } + + } + }); + + floatingActionButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + switch (nomeBebida){ + case "Cosmopolitan": comando = "1";break; + case "Tropical": comando = "2";break; + case "Cinderela": comando = "3";break; + case "San Francisco": comando = "4";break; + case "Ugly Kid": comando = "5";break; + case "Bela Ragazza": comando = "6";break; + case "Tango": comando = "7";break; + case "Pneu": comando = "8";break; + } + Toast.makeText(DetalheBebida.this, "A sair " + nomeBebida, Toast.LENGTH_SHORT).show(); + try { + mConnectedThread.enviarComando(comando); + } + catch (Exception e){ + Toast.makeText(DetalheBebida.this, "Ligue a máquina", Toast.LENGTH_SHORT).show(); + } + } + }); + + bebidas[0] = new Bebida(); + bebidas[0].setNomeBebida("Cosmopolitan"); + bebidas[0].setDescricaoBebida("Ingredientes:\n" + + " - Groselha\n" + + " - Sumo de Limão\n" + + " - Sumo de Laranja\n" + + " - Água de Côco\n\n"); + bebidas[0].setImagemBebida(R.drawable.cosmopolitan); + + bebidas[1] = new Bebida(); + bebidas[1].setNomeBebida("Tropical"); + bebidas[1].setDescricaoBebida("Ingredientes:\n" + + " - Sumo de Limão\n" + + " - Sumo de Laranja\n" + + " - Água com Gás\n\n"); + bebidas[1].setImagemBebida(R.drawable.tropical); + + bebidas[2] = new Bebida(); + bebidas[2].setNomeBebida("Cinderela"); + bebidas[2].setDescricaoBebida("Ingredientes:\n" + + " - Sumo de Limão\n" + + " - Sumo de Laranja\n" + + " - Sumo de Ananás\n\n"); + bebidas[2].setImagemBebida(R.drawable.cinderela); + + bebidas[3] = new Bebida(); + bebidas[3].setNomeBebida("San Francisco"); + bebidas[3].setDescricaoBebida("Ingredientes:\n" + + " - Sumo de Limão\n" + + " - Sumo de Ananás\n" + + " - Sumo de Laranja\n" + + " - Sumo de Pêra\n\n"); + bebidas[3].setImagemBebida(R.drawable.sanfrancisco); + + bebidas[4] = new Bebida(); + bebidas[4].setNomeBebida("Ugly Kid"); + bebidas[4].setDescricaoBebida("Ingredientes:\n" + + " - Sumo de Laranja\n" + + " - Sumo de Limão\n" + + " - Groselha\n\n"); + bebidas[4].setImagemBebida(R.drawable.ugly); + + bebidas[5] = new Bebida(); + bebidas[5].setNomeBebida("Bela Ragazza"); + bebidas[5].setDescricaoBebida("Ingredientes:\n" + + " - Sumo de Limão\n" + + " - Café\n" + + " - Coca-Cola\n\n"); + bebidas[5].setImagemBebida(R.drawable.ragazza); + + bebidas[6] = new Bebida(); + bebidas[6].setNomeBebida("Tango"); + bebidas[6].setDescricaoBebida("Ingredientes:\n" + + " - 7 Up\n" + + " - Groselha\n\n"); + bebidas[6].setImagemBebida(R.drawable.tango); + + bebidas[7] = new Bebida(); + bebidas[7].setNomeBebida("Pneu"); + bebidas[7].setDescricaoBebida("Ingredientes:\n" + + " - Água com Gás\n" + + " - Sumo de Limão\n\n"); + bebidas[7].setImagemBebida(R.drawable.pneu); + + imagemBebida = (ImageView)findViewById(R.id.imagemBebida); + descricaoBebida = (TextView)findViewById(R.id.descricaoBebida); + nomeBebidaTextView = (TextView)findViewById(R.id.nomeBebida); + + + //Toast.makeText(this, nomeBebida,Toast.LENGTH_SHORT).show(); + + for (Bebida bebida : bebidas){ + if (bebida.getNomeBebida().equals(nomeBebida)){ + descricaoBebida.setText(bebida.getDescricaoBebida()); + imagemBebida.setImageResource(bebida.getImagemBebida()); + nomeBebidaTextView.setText(bebida.getNomeBebida()); + } + } + + } + public void ligarBluetooth(){ + mBTAdapter = BluetoothAdapter.getDefaultAdapter(); + if (!mBTAdapter.isEnabled()) { + Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); + startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); + //mBluetoothStatus.setText("Bluetooth enabled"); + Toast.makeText(DetalheBebida.this,"Bluetooth turned on",Toast.LENGTH_SHORT).show(); + + } + else{ + Toast.makeText(DetalheBebida.this,"Bluetooth is already on", Toast.LENGTH_SHORT).show(); + } + //listarAparelhos(); + if(!mBTAdapter.isEnabled()) { + Toast.makeText(getBaseContext(), "Bluetooth not on", Toast.LENGTH_SHORT).show(); + return; + } + progressBar.setVisibility(View.VISIBLE); + background.setVisibility(View.VISIBLE); + Toast.makeText(DetalheBebida.this, "A conectar...", Toast.LENGTH_SHORT).show(); + //mBluetoothStatus.setText("Connecting..."); + // Get the device MAC address, which is the last 17 chars in the View + //String info = ((TextView) v).getText().toString(); + final String address = "98:D3:61:FD:4B:D6"; + final String name = "HC-05"; + + // Spawn a new thread to avoid blocking the GUI one + new Thread() + { + public void run() { + boolean fail = false; + + BluetoothDevice device = mBTAdapter.getRemoteDevice(address); + Log.d("teste","tentou ligar"); + try { + mBTSocket = createBluetoothSocket(device); + Log.d("teste","criou socket"); + } catch (IOException e) { + fail = true; + Toast.makeText(getBaseContext(), "Socket creation failed", Toast.LENGTH_SHORT).show(); + } + // Establish the Bluetooth socket connection. + try { + Log.d("teste","tentou conectar ao socket"); + mBTSocket.connect(); + Log.d("teste","ligou ao socket"); + } catch (IOException e) { + try { + fail = true; + mBTSocket.close(); + mHandler.obtainMessage(CONNECTING_STATUS, -1, -1) + .sendToTarget(); + } catch (IOException e2) { + //insert code to deal with this + Toast.makeText(getBaseContext(), "Socket creation failed", Toast.LENGTH_SHORT).show(); + } + } + if(fail == false) { + mConnectedThread = new ConnectedThread(mBTSocket); + mConnectedThread.start(); + + mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name) + .sendToTarget(); + } + } + }.start(); + } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data){ + // Check which request we're responding to + if (requestCode == REQUEST_CODE_SPEECH_INPUT) { + if (resultCode == RESULT_OK && data != null) { + ArrayList result = data.getStringArrayListExtra( + RecognizerIntent.EXTRA_RESULTS); + String bebida = ""; + if(Objects.requireNonNull(result).get(0).toLowerCase().contains("ambrósio")){ + if (Objects.requireNonNull(result).get(0).toLowerCase().contains("cosmopolitan")){ + comando = "1"; + bebida = "Cosmopolitan"; + } + else if (Objects.requireNonNull(result).get(0).toLowerCase().contains("cosmopolitan")){ + comando = "1"; + bebida = "Cosmopolitan"; + } + else if (Objects.requireNonNull(result).get(0).toLowerCase().contains("tropical")){ + comando = "2"; + bebida = "Tropical"; + } + else if (Objects.requireNonNull(result).get(0).toLowerCase().contains("cinderela")){ + comando = "3"; + bebida = "Cinderela"; + } + else if (Objects.requireNonNull(result).get(0).toLowerCase().contains("são francisco")){ + comando = "4"; + bebida = "San Francisco"; + } + else if (Objects.requireNonNull(result).get(0).toLowerCase().contains("ugly kid")){ + comando = "5"; + bebida = "Ugly Kid"; + } + else if (Objects.requireNonNull(result).get(0).toLowerCase().contains("bela ragazza")){ + comando = "6"; + bebida = "Bela Ragazza"; + } + else if (Objects.requireNonNull(result).get(0).toLowerCase().contains("tango")){ + comando = "7"; + bebida = "Tango"; + } + else if (Objects.requireNonNull(result).get(0).toLowerCase().contains("pneu")){ + comando = "8"; + bebida = "Pneu"; + } + Toast.makeText(this, "A tirar um " + bebida, Toast.LENGTH_SHORT).show(); + //mConnectedThread.enviarComando(comando); + } + } + } + if (requestCode == REQUEST_ENABLE_BT) { + // Make sure the request was successful + if (resultCode == RESULT_OK) { + // The user picked a contact. + // The Intent's data Uri identifies which contact was selected. + //mBluetoothStatus.setText("Enabled"); + Toast.makeText(this, "Enabled", Toast.LENGTH_SHORT).show(); + } + else + Toast.makeText(this, "Disabled", Toast.LENGTH_SHORT).show(); + //mBluetoothStatus.setText("Disabled"); + } + } + /*public void listarAparelhos(){ + mPairedDevices = mBTAdapter.getBondedDevices(); + if(mBTAdapter.isEnabled()) { + // put it's one to the adapter + for (BluetoothDevice device : mPairedDevices) + mBTArrayAdapter.add(device.getName() + "\n" + device.getAddress()); + + Toast.makeText(getApplicationContext(), "Show Paired Devices", Toast.LENGTH_SHORT).show(); + } + else + Toast.makeText(getApplicationContext(), "Bluetooth not on", Toast.LENGTH_SHORT).show(); + }*/ + + + private AdapterView.OnItemClickListener mDeviceClickListener = new AdapterView.OnItemClickListener() { + public void onItemClick(AdapterView av, View v, int arg2, long arg3) { + + + } + }; + private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException { + return device.createRfcommSocketToServiceRecord(BTMODULEUUID); + //creates secure outgoing connection with BT device using UUID + } + private class ConnectedThread extends Thread { + private final BluetoothSocket mmSocket; + private final InputStream mmInStream; + private final OutputStream mmOutStream; + + public ConnectedThread(BluetoothSocket socket) { + mmSocket = socket; + InputStream tmpIn = null; + OutputStream tmpOut = null; + + // Get the input and output streams, using temp objects because + // member streams are final + try { + tmpIn = socket.getInputStream(); + tmpOut = socket.getOutputStream(); + } catch (IOException e) { + } + + mmInStream = tmpIn; + mmOutStream = tmpOut; + } + + public void run() { + byte[] buffer = new byte[1024]; // buffer store for the stream + int bytes; // bytes returned from read() + // Keep listening to the InputStream until an exception occurs + while (true) { + try { + // Read from the InputStream + bytes = mmInStream.available(); + if (bytes != 0) { + SystemClock.sleep(100); //pause and wait for rest of data. Adjust this depending on your sending speed. + bytes = mmInStream.available(); // how many bytes are ready to be read? + bytes = mmInStream.read(buffer, 0, bytes); // record how many bytes we actually read + mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer) + .sendToTarget(); // Send the obtained bytes to the UI activity + } + } catch (IOException e) { + e.printStackTrace(); + + break; + } + } + } + public void enviarComando(String input){ + byte[] bytes = input.getBytes(); //converts entered String into bytes + try { + mmOutStream.write(bytes); + } catch (IOException e) { } + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + try { + mBTSocket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/app/src/main/java/pt/epvc/ambrosioandroid/InfoActivity.java b/app/src/main/java/pt/epvc/ambrosioandroid/InfoActivity.java new file mode 100644 index 0000000..adf4398 --- /dev/null +++ b/app/src/main/java/pt/epvc/ambrosioandroid/InfoActivity.java @@ -0,0 +1,14 @@ +package pt.epvc.ambrosioandroid; + +import android.os.Bundle; + +import androidx.appcompat.app.AppCompatActivity; + +public class InfoActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_info); + } +} diff --git a/app/src/main/java/pt/epvc/ambrosioandroid/ListaBebidas.java b/app/src/main/java/pt/epvc/ambrosioandroid/ListaBebidas.java new file mode 100644 index 0000000..6037c0f --- /dev/null +++ b/app/src/main/java/pt/epvc/ambrosioandroid/ListaBebidas.java @@ -0,0 +1,52 @@ +package pt.epvc.ambrosioandroid; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ListView; + +import androidx.appcompat.app.AppCompatActivity; + +public class ListaBebidas extends AppCompatActivity { + + String nomeBebida[] = { + "Cosmopolitan", + "Tropical", + "Cinderela", + "San Francisco", + "Ugly Kid", + "Bela Ragazza", + "Tango", + "Pneu"}; + String descricaoBebida[] = { + "Cocktail refrescante inspirado em sabores tropicais", + "O Tropical é um cocktail fresco à base de citrinos", + "Uma bebida elegante com sabores cítricos e tropicais", + "Um sabor que faz viajar até San Francisco", + "Um cocktail com cores de verão", + "Com base em cafeína, este cocktail é capaz de despertar qualquer um", + "Na sua versão sem álcool", + "Simplesmente água e sumo de limão"}; + int imagemBebida[] = {R.drawable.cosmopolitan, R.drawable.tropical, R.drawable.cinderela,R.drawable.sanfrancisco, R.drawable.ugly, R.drawable.ragazza, R.drawable.tango, R.drawable.pneu}; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_lista_bebidas); + + ListView listView = (ListView) findViewById(R.id.listaBebidas); + CustomAdapter customAdapter = new CustomAdapter(this, nomeBebida, descricaoBebida, imagemBebida); + listView.setAdapter(customAdapter); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + //Toast.makeText(ListaBebidas.this, String.valueOf(position), Toast.LENGTH_SHORT).show(); + String nomeBebida = ListaBebidas.this.nomeBebida[position]; + Intent intent = new Intent(ListaBebidas.this, DetalheBebida.class); + intent.putExtra("nomeBebida",nomeBebida); + startActivity(intent); + } + }); + } +} diff --git a/app/src/main/java/pt/epvc/ambrosioandroid/MainActivity.java b/app/src/main/java/pt/epvc/ambrosioandroid/MainActivity.java new file mode 100644 index 0000000..af20ec7 --- /dev/null +++ b/app/src/main/java/pt/epvc/ambrosioandroid/MainActivity.java @@ -0,0 +1,41 @@ +package pt.epvc.ambrosioandroid; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.ImageButton; + +import androidx.appcompat.app.AppCompatActivity; + +public class MainActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + + Button pedirBebida = (Button)findViewById(R.id.pedirBebida); + pedirBebida.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(MainActivity.this,ListaBebidas.class); + startActivity(intent); + } + }); + + ImageButton info = (ImageButton)findViewById(R.id.infoButton); + info.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(MainActivity.this,InfoActivity.class); + startActivity(intent); + } + }); + } + +} diff --git a/app/src/main/res/drawable/bar.jpg b/app/src/main/res/drawable/bar.jpg new file mode 100644 index 0000000..e376c83 Binary files /dev/null and b/app/src/main/res/drawable/bar.jpg differ diff --git a/app/src/main/res/drawable/caipirinha.png b/app/src/main/res/drawable/caipirinha.png new file mode 100644 index 0000000..26a568b Binary files /dev/null and b/app/src/main/res/drawable/caipirinha.png differ diff --git a/app/src/main/res/drawable/cinderela.png b/app/src/main/res/drawable/cinderela.png new file mode 100644 index 0000000..3f1a2b1 Binary files /dev/null and b/app/src/main/res/drawable/cinderela.png differ diff --git a/app/src/main/res/drawable/cola.png b/app/src/main/res/drawable/cola.png new file mode 100644 index 0000000..87fa6ab Binary files /dev/null and b/app/src/main/res/drawable/cola.png differ diff --git a/app/src/main/res/drawable/cosmopolitan.png b/app/src/main/res/drawable/cosmopolitan.png new file mode 100644 index 0000000..07359e4 Binary files /dev/null and b/app/src/main/res/drawable/cosmopolitan.png differ diff --git a/app/src/main/res/drawable/gin.jpg b/app/src/main/res/drawable/gin.jpg new file mode 100644 index 0000000..10637d1 Binary files /dev/null and b/app/src/main/res/drawable/gin.jpg differ diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/info.png b/app/src/main/res/drawable/info.png new file mode 100644 index 0000000..48d3488 Binary files /dev/null and b/app/src/main/res/drawable/info.png differ diff --git a/app/src/main/res/drawable/pneu.png b/app/src/main/res/drawable/pneu.png new file mode 100644 index 0000000..f5e8d28 Binary files /dev/null and b/app/src/main/res/drawable/pneu.png differ diff --git a/app/src/main/res/drawable/ragazza.png b/app/src/main/res/drawable/ragazza.png new file mode 100644 index 0000000..79c61ad Binary files /dev/null and b/app/src/main/res/drawable/ragazza.png differ diff --git a/app/src/main/res/drawable/sanfrancisco.png b/app/src/main/res/drawable/sanfrancisco.png new file mode 100644 index 0000000..848c3d0 Binary files /dev/null and b/app/src/main/res/drawable/sanfrancisco.png differ diff --git a/app/src/main/res/drawable/tango.png b/app/src/main/res/drawable/tango.png new file mode 100644 index 0000000..71cca42 Binary files /dev/null and b/app/src/main/res/drawable/tango.png differ diff --git a/app/src/main/res/drawable/tropical.png b/app/src/main/res/drawable/tropical.png new file mode 100644 index 0000000..ba4f389 Binary files /dev/null and b/app/src/main/res/drawable/tropical.png differ diff --git a/app/src/main/res/drawable/ugly.png b/app/src/main/res/drawable/ugly.png new file mode 100644 index 0000000..ee0ce72 Binary files /dev/null and b/app/src/main/res/drawable/ugly.png differ diff --git a/app/src/main/res/layout/activity_bebida.xml b/app/src/main/res/layout/activity_bebida.xml new file mode 100644 index 0000000..aebb7e3 --- /dev/null +++ b/app/src/main/res/layout/activity_bebida.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_info.xml b/app/src/main/res/layout/activity_info.xml new file mode 100644 index 0000000..6e131e3 --- /dev/null +++ b/app/src/main/res/layout/activity_info.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_lista_bebidas.xml b/app/src/main/res/layout/activity_lista_bebidas.xml new file mode 100644 index 0000000..d3c54c3 --- /dev/null +++ b/app/src/main/res/layout/activity_lista_bebidas.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..72f3e51 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,48 @@ + + + + + + + + +