initial commit

This commit is contained in:
2025-11-05 21:10:42 +00:00
commit f28e89289b
68 changed files with 1748 additions and 0 deletions

1
app/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/build

41
app/build.gradle.kts Normal file
View File

@@ -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)
}

21
app/proguard-rules.pro vendored Normal file
View File

@@ -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

View File

@@ -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 <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@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());
}
}

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AmbrosioAndroid">
<activity android:name=".DetalheBebida"
android:screenOrientation="portrait"/>
<activity android:name=".InfoActivity"
android:screenOrientation="portrait"/>
<activity android:name=".ListaBebidas"
android:screenOrientation="portrait"/>
<activity android:name=".MainActivity"
android:exported="true"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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<BluetoothDevice> mPairedDevices;
private ArrayAdapter<String> 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<String>(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<String> 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();
}
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
});
}
}

View File

@@ -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);
}
});
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

View File

@@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

View File

@@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

View File

@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".DetalheBebida">
<View
android:id="@+id/background_dim"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:background="#80000000"
android:visibility="gone"/>
<ImageView
android:id="@+id/imagemBebida"
android:layout_width="match_parent"
android:layout_height="300dp"
android:src="@drawable/caipirinha"
android:padding="16dp"/>
<TextView
android:id="@+id/nomeBebida"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/gin"
android:layout_below="@+id/imagemBebida"
android:layout_centerHorizontal="true"
android:textSize="16pt"
android:padding="16dp"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/nomeBebida">
<TextView
android:id="@+id/descricaoBebida"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/info"
android:padding="16dp"/>
</ScrollView>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/floatingActionButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
tools:srcCompat="@tools:sample/avatars"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_margin="40dp"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/ambrosioButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
tools:srcCompat="@tools:sample/avatars"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_margin="40dp"/>
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="200dp"
android:layout_height="200dp"
android:visibility="gone"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
/>
</RelativeLayout>

View File

@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".InfoActivity">
<ImageView
android:src="@drawable/bar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/info"
android:textSize="14dp"
android:textColor="@color/colorPrimary"
android:background="#66000000"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:padding="8dp"/>
</ScrollView>
</RelativeLayout>

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ListaBebidas">
<ListView
android:id="@+id/listaBebidas"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_margin="8dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:src="@drawable/bar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"/>
<ImageButton
android:id="@+id/infoButton"
android:src="@drawable/info"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="#0000"
android:scaleType="fitXY"
android:layout_margin="30dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"/>
<Button
android:id="@+id/pedirBebida"
style="@style/botao"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:background="#66000000"
android:textColor="@color/colorPrimary"
android:padding="16dp"
android:textSize="24dp"
android:text="Pedir Bebida" />
<ListView
android:id="@+id/devicesListView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/pedirBebida"></ListView>
</RelativeLayout>

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:id="@+id/imagemBebida"
android:layout_width="180dp"
android:layout_height="180dp"
android:src="@drawable/gin" />
<LinearLayout
android:layout_marginTop="50dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/nomeBebida"
android:textSize="16pt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/gin"/>
<TextView
android:id="@+id/descricaoBebida"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/descricaoGin"/>
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@@ -0,0 +1,16 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.AmbrosioAndroid" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_200</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/black</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_200</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="colorPrimary">#dfa02d</color>
<color name="colorPrimaryDark">#dfa02d</color>
<color name="colorAccent">#dfa02d</color>
</resources>

View File

@@ -0,0 +1,9 @@
<resources>
<string name="app_name">Ambrosio Android</string>
<string name="pedirBebida">Pedir Bebida</string>
<string name="gin">Gin Tónico</string>
<string name="descricaoGin">O gin contém bleu bleu</string>
<string name="conectar">Conectar</string>
<string name="info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer faucibus urna erat, vitae posuere lorem cursus ac. Vivamus egestas iaculis eros, ut porttitor purus vulputate eget. Suspendisse potenti. Curabitur nisl risus, molestie ac enim at, posuere gravida orci. Proin dignissim elit varius sapien eleifend porttitor. Curabitur et semper tellus, eget varius sapien. Proin felis urna, maximus id commodo eget, facilisis accumsan tortor. Etiam imperdiet accumsan accumsan. Curabitur fringilla quam velit, sed accumsan neque sodales at. Nulla dapibus, nulla in pretium lacinia, augue tortor tempus turpis, eu blandit ligula sem tincidunt quam. Fusce ultrices ac turpis et tincidunt. In turpis diam, ornare in ipsum ac, porta posuere erat. Cras convallis tempor nulla, vel tristique erat auctor et. Sed ac sapien est. Suspendisse luctus arcu sapien, quis ullamcorper nisl mollis sit amet. Quisque elementum bibendum rhoncus.</string>
</resources>

View File

@@ -0,0 +1,20 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.AmbrosioAndroid" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
<style name="botao">
</style>
</resources>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?><!--
Sample backup rules file; uncomment and customize as necessary.
See https://developer.android.com/guide/topics/data/autobackup
for details.
Note: This file is ignored for devices older than API 31
See https://developer.android.com/about/versions/12/backup-restore
-->
<full-backup-content>
<!--
<include domain="sharedpref" path="."/>
<exclude domain="sharedpref" path="device.xml"/>
-->
</full-backup-content>

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?><!--
Sample data extraction rules file; uncomment and customize as necessary.
See https://developer.android.com/about/versions/12/backup-restore#xml-changes
for details.
-->
<data-extraction-rules>
<cloud-backup>
<!-- TODO: Use <include> and <exclude> to control what is backed up.
<include .../>
<exclude .../>
-->
</cloud-backup>
<!--
<device-transfer>
<include .../>
<exclude .../>
</device-transfer>
-->
</data-extraction-rules>

View File

@@ -0,0 +1,17 @@
package pt.epvc.ambrosioandroid;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}