From a33741ba06a7ff484011b599a1731bb30a30ec42 Mon Sep 17 00:00:00 2001 From: 230409 <230409@epvc.pt> Date: Tue, 10 Mar 2026 17:12:51 +0000 Subject: [PATCH] ... --- .../pap_teste/ClientDashboardActivity.java | 24 ++-- .../ExplorarRestaurantesActivity.java | 40 ++++++- .../example/pap_teste/FavoritosActivity.java | 17 ++- .../pap_teste/FoodCategoryAdapter.java | 16 ++- .../pap_teste/NovaReservaActivity.java | 42 ++++++- .../pap_teste/ProfileDashboardActivity.java | 65 +++++++++-- .../res/layout/activity_client_dashboard.xml | 31 +---- .../layout/activity_explorar_restaurantes.xml | 21 ++-- .../main/res/layout/activity_favoritos.xml | 21 ++-- .../main/res/layout/activity_nova_reserva.xml | 106 ++++++++++++++++-- .../res/layout/activity_profile_dashboard.xml | 38 ++++++- 11 files changed, 328 insertions(+), 93 deletions(-) diff --git a/app/src/main/java/com/example/pap_teste/ClientDashboardActivity.java b/app/src/main/java/com/example/pap_teste/ClientDashboardActivity.java index 05a7c11..d4ff8a9 100644 --- a/app/src/main/java/com/example/pap_teste/ClientDashboardActivity.java +++ b/app/src/main/java/com/example/pap_teste/ClientDashboardActivity.java @@ -42,10 +42,13 @@ public class ClientDashboardActivity extends AppCompatActivity { profileLauncher = registerForActivityResult( new androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult(), result -> { - if (result.getResultCode() == RESULT_OK) { - android.widget.Toast.makeText(this, - "Perfil atualizado. Reinicie para ver mudanças.", - android.widget.Toast.LENGTH_SHORT).show(); + if (result.getResultCode() == RESULT_OK && result.getData() != null) { + String updatedName = result.getData() + .getStringExtra(MainActivity.EXTRA_DISPLAY_NAME); + if (updatedName != null) { + displayName = updatedName; + updateGreeting(); + } } }); @@ -64,10 +67,14 @@ public class ClientDashboardActivity extends AppCompatActivity { cats.add(new FoodCategory("Carnes", R.drawable.cat_carnes)); cats.add(new FoodCategory("Massas", R.drawable.cat_massas)); cats.add(new FoodCategory("Sushi", R.drawable.cat_sushi)); - cats.add(new FoodCategory("Pizzas", R.drawable.ic_launcher_background)); - cats.add(new FoodCategory("Sobremesas", R.drawable.ic_launcher_background)); + cats.add(new FoodCategory("Pizzas", R.drawable.cat_pizzas)); + cats.add(new FoodCategory("Sobremesas", R.drawable.cat_sobremesas)); - FoodCategoryAdapter adapter = new FoodCategoryAdapter(cats); + FoodCategoryAdapter adapter = new FoodCategoryAdapter(cats, category -> { + Intent intent = new Intent(this, ExplorarRestaurantesActivity.class); + intent.putExtra("category_filter", category.getName()); + startActivity(intent); + }); rv.setAdapter(adapter); } @@ -92,8 +99,5 @@ public class ClientDashboardActivity extends AppCompatActivity { findViewById(R.id.btnNovaReserva) .setOnClickListener(v -> startActivity(new Intent(this, NovaReservaActivity.class))); - - findViewById(R.id.btnExplorar).setOnClickListener( - v -> startActivity(new Intent(this, ExplorarRestaurantesActivity.class))); } } diff --git a/app/src/main/java/com/example/pap_teste/ExplorarRestaurantesActivity.java b/app/src/main/java/com/example/pap_teste/ExplorarRestaurantesActivity.java index e142baa..ee44498 100644 --- a/app/src/main/java/com/example/pap_teste/ExplorarRestaurantesActivity.java +++ b/app/src/main/java/com/example/pap_teste/ExplorarRestaurantesActivity.java @@ -27,10 +27,40 @@ public class ExplorarRestaurantesActivity extends AppCompatActivity { if (back != null) { back.setOnClickListener(v -> finish()); } + + setupRestaurantList(); + } + + private void setupRestaurantList() { + String filter = getIntent().getStringExtra("category_filter"); + android.widget.TextView txtTitle = findViewById(R.id.txtTituloExplorar); + if (filter != null && txtTitle != null) { + txtTitle.setText("Explorar: " + filter); + } + + androidx.recyclerview.widget.RecyclerView rv = findViewById(R.id.rvRestaurants); + java.util.List allRestaurants = new java.util.ArrayList<>(); + allRestaurants.add(new com.example.pap_teste.models.Restaurant("Sabor & Arte", "Tradicional", true)); + allRestaurants.add(new com.example.pap_teste.models.Restaurant("Pizzeria Bella", "Pizzas", false)); + allRestaurants.add(new com.example.pap_teste.models.Restaurant("Sushi Zen", "Sushi", false)); + allRestaurants.add(new com.example.pap_teste.models.Restaurant("O Chuveiro", "Frutos do Mar", true)); + allRestaurants.add(new com.example.pap_teste.models.Restaurant("Hamburgueria Real", "Carnes", false)); + allRestaurants.add(new com.example.pap_teste.models.Restaurant("Churrascaria Gaúcha", "Carnes", false)); + allRestaurants.add(new com.example.pap_teste.models.Restaurant("Sushi House", "Sushi", false)); + allRestaurants.add(new com.example.pap_teste.models.Restaurant("Doce Momento", "Sobremesas", false)); + + java.util.List filteredList = new java.util.ArrayList<>(); + if (filter != null) { + for (com.example.pap_teste.models.Restaurant r : allRestaurants) { + if (r.getCategory().equalsIgnoreCase(filter)) { + filteredList.add(r); + } + } + } else { + filteredList.addAll(allRestaurants); + } + + RestaurantAdapter adapter = new RestaurantAdapter(filteredList); + rv.setAdapter(adapter); } } - - - - - diff --git a/app/src/main/java/com/example/pap_teste/FavoritosActivity.java b/app/src/main/java/com/example/pap_teste/FavoritosActivity.java index 346bd22..4990ef4 100644 --- a/app/src/main/java/com/example/pap_teste/FavoritosActivity.java +++ b/app/src/main/java/com/example/pap_teste/FavoritosActivity.java @@ -27,10 +27,17 @@ public class FavoritosActivity extends AppCompatActivity { if (back != null) { back.setOnClickListener(v -> finish()); } + + setupFavoritesList(); + } + + private void setupFavoritesList() { + androidx.recyclerview.widget.RecyclerView rv = findViewById(R.id.rvFavoritos); + java.util.List list = new java.util.ArrayList<>(); + list.add(new com.example.pap_teste.models.Restaurant("Sabor & Arte", "Tradicional", true)); + list.add(new com.example.pap_teste.models.Restaurant("O Chuveiro", "Mariscos", true)); + + RestaurantAdapter adapter = new RestaurantAdapter(list); + rv.setAdapter(adapter); } } - - - - - diff --git a/app/src/main/java/com/example/pap_teste/FoodCategoryAdapter.java b/app/src/main/java/com/example/pap_teste/FoodCategoryAdapter.java index 29acfc0..ffe3887 100644 --- a/app/src/main/java/com/example/pap_teste/FoodCategoryAdapter.java +++ b/app/src/main/java/com/example/pap_teste/FoodCategoryAdapter.java @@ -15,10 +15,16 @@ import java.util.List; public class FoodCategoryAdapter extends RecyclerView.Adapter { - private final List categories; + public interface OnCategoryClickListener { + void onCategoryClick(FoodCategory category); + } - public FoodCategoryAdapter(List categories) { + private final List categories; + private final OnCategoryClickListener listener; + + public FoodCategoryAdapter(List categories, OnCategoryClickListener listener) { this.categories = categories; + this.listener = listener; } @NonNull @@ -35,6 +41,12 @@ public class FoodCategoryAdapter extends RecyclerView.Adapter { + if (listener != null) { + listener.onCategoryClick(category); + } + }); } @Override diff --git a/app/src/main/java/com/example/pap_teste/NovaReservaActivity.java b/app/src/main/java/com/example/pap_teste/NovaReservaActivity.java index 25ff8bc..a6a30f8 100644 --- a/app/src/main/java/com/example/pap_teste/NovaReservaActivity.java +++ b/app/src/main/java/com/example/pap_teste/NovaReservaActivity.java @@ -1,6 +1,7 @@ package com.example.pap_teste; import android.os.Bundle; +import androidx.recyclerview.widget.RecyclerView; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; @@ -27,10 +28,41 @@ public class NovaReservaActivity extends AppCompatActivity { if (back != null) { back.setOnClickListener(v -> finish()); } + + setupReservationOptions(); + } + + private void setupReservationOptions() { + // Dates + RecyclerView rvDates = findViewById(R.id.rvDates); + java.util.List dates = new java.util.ArrayList<>(); + dates.add("Hoje"); + dates.add("Amanhã"); + dates.add("Quarta, 12 Mar"); + dates.add("Quinta, 13 Mar"); + dates.add("Sexta, 14 Mar"); + rvDates.setAdapter(new ReservationOptionAdapter(dates)); + + // Times + RecyclerView rvTimes = findViewById(R.id.rvTimes); + java.util.List times = new java.util.ArrayList<>(); + times.add("12:00"); + times.add("13:00"); + times.add("19:00"); + times.add("20:00"); + times.add("21:00"); + times.add("22:00"); + rvTimes.setAdapter(new ReservationOptionAdapter(times)); + + // Party Size + RecyclerView rvParty = findViewById(R.id.rvPartySize); + java.util.List party = new java.util.ArrayList<>(); + party.add("1 pessoa"); + party.add("2 pessoas"); + party.add("3 pessoas"); + party.add("4 pessoas"); + party.add("5 pessoas"); + party.add("6+ pessoas"); + rvParty.setAdapter(new ReservationOptionAdapter(party)); } } - - - - - diff --git a/app/src/main/java/com/example/pap_teste/ProfileDashboardActivity.java b/app/src/main/java/com/example/pap_teste/ProfileDashboardActivity.java index 55f3d28..ac32dad 100644 --- a/app/src/main/java/com/example/pap_teste/ProfileDashboardActivity.java +++ b/app/src/main/java/com/example/pap_teste/ProfileDashboardActivity.java @@ -1,5 +1,6 @@ package com.example.pap_teste; +import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.widget.Button; @@ -20,9 +21,10 @@ import java.util.Map; public class ProfileDashboardActivity extends AppCompatActivity { - private EditText inputName; + private EditText inputName, inputPhone, inputEmailEdit; private String email, documentId; private DatabaseReference databaseReference; + private androidx.activity.result.ActivityResultLauncher imagePickerLauncher; @Override protected void onCreate(Bundle savedInstanceState) { @@ -45,9 +47,36 @@ public class ProfileDashboardActivity extends AppCompatActivity { databaseReference = FirebaseDatabase.getInstance().getReference().child("users"); inputName = findViewById(R.id.inputProfileName); + inputPhone = findViewById(R.id.inputProfilePhone); + inputEmailEdit = findViewById(R.id.inputProfileEmail); + if (currentName != null) { inputName.setText(currentName); } + if (email != null) { + inputEmailEdit.setText(email); + } + + fetchAdditionalProfileData(); + + imagePickerLauncher = registerForActivityResult( + new androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getResultCode() == RESULT_OK && result.getData() != null) { + android.net.Uri imageUri = result.getData().getData(); + if (imageUri != null) { + Toast.makeText(this, "Foto selecionada (Simulação: Seria feito o upload)", + Toast.LENGTH_SHORT).show(); + // In a real app, you'd upload this to Firebase Storage. + } + } + }); + + findViewById(R.id.cardProfileBig).setOnClickListener(v -> { + Intent intent = new Intent(Intent.ACTION_PICK); + intent.setType("image/*"); + imagePickerLauncher.launch(intent); + }); Button btnSave = findViewById(R.id.btnSaveProfile); Button btnBack = findViewById(R.id.btnVoltar); @@ -55,17 +84,32 @@ public class ProfileDashboardActivity extends AppCompatActivity { Button btnRes = findViewById(R.id.btnMinhasReservas); btnBack.setOnClickListener(v -> finish()); - btnSave.setOnClickListener(v -> saveProfile()); btnFavs.setOnClickListener(v -> { - Toast.makeText(this, "A abrir Favoritos...", Toast.LENGTH_SHORT).show(); - // startActivity(new Intent(this, FavoritosActivity.class)); + startActivity(new Intent(this, FavoritosActivity.class)); }); btnRes.setOnClickListener(v -> { - Toast.makeText(this, "A abrir Reservas...", Toast.LENGTH_SHORT).show(); - // startActivity(new Intent(this, DetalhesReservasActivity.class)); + startActivity(new Intent(this, DetalhesReservasActivity.class)); + }); + } + + private void fetchAdditionalProfileData() { + if (documentId == null) + return; + databaseReference.child(documentId).get().addOnSuccessListener(snapshot -> { + if (snapshot.exists()) { + String phone = snapshot.child("ownerPhone").getValue(String.class); + if (phone == null) + phone = snapshot.child("phone").getValue(String.class); + if (phone != null) + inputPhone.setText(phone); + + String dbEmail = snapshot.child("email").getValue(String.class); + if (dbEmail != null) + inputEmailEdit.setText(dbEmail); + } }); } @@ -74,6 +118,9 @@ public class ProfileDashboardActivity extends AppCompatActivity { return; String newName = inputName.getText().toString().trim(); + String newPhone = inputPhone.getText().toString().trim(); + String newEmail = inputEmailEdit.getText().toString().trim(); + if (TextUtils.isEmpty(newName)) { Toast.makeText(this, "Indique um nome.", Toast.LENGTH_SHORT).show(); return; @@ -81,11 +128,15 @@ public class ProfileDashboardActivity extends AppCompatActivity { Map updates = new HashMap<>(); updates.put("displayName", newName); + updates.put("phone", newPhone); + updates.put("email", newEmail); databaseReference.child(documentId).updateChildren(updates) .addOnSuccessListener(aVoid -> { Toast.makeText(this, "Perfil atualizado!", Toast.LENGTH_SHORT).show(); - setResult(RESULT_OK); + Intent resultIntent = new Intent(); + resultIntent.putExtra(MainActivity.EXTRA_DISPLAY_NAME, newName); + setResult(RESULT_OK, resultIntent); finish(); }) .addOnFailureListener( diff --git a/app/src/main/res/layout/activity_client_dashboard.xml b/app/src/main/res/layout/activity_client_dashboard.xml index 1ed9aac..ca1ffd3 100644 --- a/app/src/main/res/layout/activity_client_dashboard.xml +++ b/app/src/main/res/layout/activity_client_dashboard.xml @@ -208,14 +208,12 @@ android:layout_height="wrap_content" android:layout_marginHorizontal="16dp" android:layout_marginTop="12dp" - android:columnCount="2" - android:rowCount="1"> + android:columnCount="1"> @@ -231,30 +229,7 @@ android:layout_height="wrap_content" android:text="Reservar" android:textColor="#000" - android:textStyle="bold" /> - - - - - - diff --git a/app/src/main/res/layout/activity_explorar_restaurantes.xml b/app/src/main/res/layout/activity_explorar_restaurantes.xml index 2a467d6..f4a6263 100644 --- a/app/src/main/res/layout/activity_explorar_restaurantes.xml +++ b/app/src/main/res/layout/activity_explorar_restaurantes.xml @@ -32,18 +32,19 @@ app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="32dp" /> - + app:layout_constraintTop_toBottomOf="@id/txtTituloExplorar" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + tools:listitem="@layout/item_restaurant" /> diff --git a/app/src/main/res/layout/activity_favoritos.xml b/app/src/main/res/layout/activity_favoritos.xml index 53b4989..56b0586 100644 --- a/app/src/main/res/layout/activity_favoritos.xml +++ b/app/src/main/res/layout/activity_favoritos.xml @@ -32,18 +32,19 @@ app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="32dp" /> - + app:layout_constraintTop_toBottomOf="@id/txtTituloFavoritos" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + tools:listitem="@layout/item_restaurant" /> diff --git a/app/src/main/res/layout/activity_nova_reserva.xml b/app/src/main/res/layout/activity_nova_reserva.xml index 962dd8f..ab0c2c1 100644 --- a/app/src/main/res/layout/activity_nova_reserva.xml +++ b/app/src/main/res/layout/activity_nova_reserva.xml @@ -32,18 +32,104 @@ app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="32dp" /> - + app:layout_constraintTop_toBottomOf="@id/txtTituloNovaReserva"> + + + + + + + + + + + + + + + + + + +