This commit is contained in:
2026-05-04 10:09:34 +01:00
parent 6f16f635e5
commit 5226b032b0
4 changed files with 382 additions and 68 deletions

View File

@@ -38,15 +38,14 @@ public class ClientDashboardActivity extends AppCompatActivity {
private ImageView imgProfile;
private EditText etSearch;
private ChipGroup chipGroupCategories;
private RecyclerView rvFeatured, rvMainRestaurants;
private RecyclerView rvFeatured, rvTopRated, rvPizzas, rvSushi, rvCarnes, rvMassas, rvSobremesas;
private ProgressBar progressBar;
private View layoutFeatured, layoutAllRestaurants;
private View layoutFeatured, layoutTopRated, layoutPizzas, layoutSushi, layoutCarnes, layoutMassas, layoutSobremesas;
private List<Restaurant> allRestaurants = new ArrayList<>();
private List<Restaurant> filteredRestaurants = new ArrayList<>();
private RestaurantAdapter mainAdapter;
private FeaturedRestaurantAdapter featuredAdapter;
private FeaturedRestaurantAdapter featuredAdapter, topRatedAdapter, pizzasAdapter, sushiAdapter, carnesAdapter, massasAdapter, sobremesasAdapter;
private final String[] CATEGORIES = { "Tudo", "Carnes", "Massas", "Sushi", "Pizzas", "Sobremesas" };
private String currentCategoryFilter = "Tudo";
@@ -83,30 +82,53 @@ public class ClientDashboardActivity extends AppCompatActivity {
etSearch = findViewById(R.id.etSearch);
chipGroupCategories = findViewById(R.id.chipGroupCategories);
rvFeatured = findViewById(R.id.rvFeatured);
rvMainRestaurants = findViewById(R.id.rvMainRestaurants);
rvTopRated = findViewById(R.id.rvTopRated);
rvPizzas = findViewById(R.id.rvPizzas);
rvSushi = findViewById(R.id.rvSushi);
rvCarnes = findViewById(R.id.rvCarnes);
rvMassas = findViewById(R.id.rvMassas);
rvSobremesas = findViewById(R.id.rvSobremesas);
progressBar = findViewById(R.id.progressBar);
layoutFeatured = findViewById(R.id.layoutFeatured);
layoutAllRestaurants = findViewById(R.id.layoutAllRestaurants);
layoutTopRated = findViewById(R.id.layoutTopRated);
layoutPizzas = findViewById(R.id.layoutPizzas);
layoutSushi = findViewById(R.id.layoutSushi);
layoutCarnes = findViewById(R.id.layoutCarnes);
layoutMassas = findViewById(R.id.layoutMassas);
layoutSobremesas = findViewById(R.id.layoutSobremesas);
rvFeatured.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
rvMainRestaurants.setLayoutManager(new LinearLayoutManager(this));
rvTopRated.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
rvPizzas.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
rvSushi.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
rvCarnes.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
rvMassas.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
rvSobremesas.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
// Click listener for restaurants to open booking flow
RestaurantAdapter.OnRestaurantClickListener clickListener = restaurant -> {
Intent intent = new Intent(this, ExplorarRestaurantesActivity.class);
// Reusing existing activity for details if needed, or pass data to
// NovaReservaActivity
// We pass the filter so it can maybe open directly or we just pass restaurant
// email
intent.putExtra("category_filter", restaurant.getCategory());
startActivity(intent);
};
featuredAdapter = new FeaturedRestaurantAdapter(new ArrayList<>(), clickListener);
mainAdapter = new RestaurantAdapter(filteredRestaurants, clickListener);
topRatedAdapter = new FeaturedRestaurantAdapter(new ArrayList<>(), clickListener);
pizzasAdapter = new FeaturedRestaurantAdapter(new ArrayList<>(), clickListener);
sushiAdapter = new FeaturedRestaurantAdapter(new ArrayList<>(), clickListener);
carnesAdapter = new FeaturedRestaurantAdapter(new ArrayList<>(), clickListener);
massasAdapter = new FeaturedRestaurantAdapter(new ArrayList<>(), clickListener);
sobremesasAdapter = new FeaturedRestaurantAdapter(new ArrayList<>(), clickListener);
rvFeatured.setAdapter(featuredAdapter);
rvMainRestaurants.setAdapter(mainAdapter);
rvTopRated.setAdapter(topRatedAdapter);
rvPizzas.setAdapter(pizzasAdapter);
rvSushi.setAdapter(sushiAdapter);
rvCarnes.setAdapter(carnesAdapter);
rvMassas.setAdapter(massasAdapter);
rvSobremesas.setAdapter(sobremesasAdapter);
// Click listener for profile picture in the header
findViewById(R.id.cardProfile).setOnClickListener(v -> {
@@ -163,7 +185,12 @@ public class ClientDashboardActivity extends AppCompatActivity {
private void fetchRestaurants() {
progressBar.setVisibility(View.VISIBLE);
layoutFeatured.setVisibility(View.GONE);
layoutAllRestaurants.setVisibility(View.GONE);
layoutTopRated.setVisibility(View.GONE);
layoutPizzas.setVisibility(View.GONE);
layoutSushi.setVisibility(View.GONE);
layoutCarnes.setVisibility(View.GONE);
layoutMassas.setVisibility(View.GONE);
layoutSobremesas.setVisibility(View.GONE);
DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference("Restaurantes");
usersRef.addListenerForSingleValueEvent(new ValueEventListener() {
@@ -281,24 +308,73 @@ public class ClientDashboardActivity extends AppCompatActivity {
}
}
mainAdapter.notifyDataSetChanged();
// Update featured (just the first 3 for demo, or based on a specific logic)
// Listas por categorias
List<Restaurant> featuredList = new ArrayList<>();
for (int i = 0; i < Math.min(3, filteredRestaurants.size()); i++) {
featuredList.add(filteredRestaurants.get(i));
List<Restaurant> topRatedList = new ArrayList<>();
List<Restaurant> pizzasList = new ArrayList<>();
List<Restaurant> sushiList = new ArrayList<>();
List<Restaurant> carnesList = new ArrayList<>();
List<Restaurant> massasList = new ArrayList<>();
List<Restaurant> sobremesasList = new ArrayList<>();
// Preencher Destaques e Melhores
for (int i = 0; i < filteredRestaurants.size(); i++) {
Restaurant r = filteredRestaurants.get(i);
// Destaques (3 primeiros aleatórios/ordem atual)
if (featuredList.size() < 3) {
featuredList.add(r);
}
featuredAdapter = new FeaturedRestaurantAdapter(featuredList,
mainAdapter instanceof RestaurantAdapter ? restaurant -> {
// Melhor Avaliados (>= 3.0 estrelas)
if (r.getRatingAvg() != null && r.getRatingAvg() >= 3.0) {
topRatedList.add(r);
}
// Distribuir pelas categorias baseadas na String
String cat = r.getCategory() != null ? r.getCategory().toLowerCase() : "";
if (cat.contains("pizza")) {
pizzasList.add(r);
} else if (cat.contains("sushi")) {
sushiList.add(r);
} else if (cat.contains("carne")) {
carnesList.add(r);
} else if (cat.contains("massa")) {
massasList.add(r);
} else if (cat.contains("sobremesa")) {
sobremesasList.add(r);
}
}
RestaurantAdapter.OnRestaurantClickListener clickListener = restaurant -> {
Intent intent = new Intent(this, ExplorarRestaurantesActivity.class);
intent.putExtra("category_filter", restaurant.getCategory());
startActivity(intent);
} : null);
};
featuredAdapter = new FeaturedRestaurantAdapter(featuredList, clickListener);
topRatedAdapter = new FeaturedRestaurantAdapter(topRatedList, clickListener);
pizzasAdapter = new FeaturedRestaurantAdapter(pizzasList, clickListener);
sushiAdapter = new FeaturedRestaurantAdapter(sushiList, clickListener);
carnesAdapter = new FeaturedRestaurantAdapter(carnesList, clickListener);
massasAdapter = new FeaturedRestaurantAdapter(massasList, clickListener);
sobremesasAdapter = new FeaturedRestaurantAdapter(sobremesasList, clickListener);
rvFeatured.setAdapter(featuredAdapter);
rvTopRated.setAdapter(topRatedAdapter);
rvPizzas.setAdapter(pizzasAdapter);
rvSushi.setAdapter(sushiAdapter);
rvCarnes.setAdapter(carnesAdapter);
rvMassas.setAdapter(massasAdapter);
rvSobremesas.setAdapter(sobremesasAdapter);
layoutFeatured.setVisibility(featuredList.isEmpty() ? View.GONE : View.VISIBLE);
layoutAllRestaurants.setVisibility(filteredRestaurants.isEmpty() ? View.GONE : View.VISIBLE);
layoutTopRated.setVisibility(topRatedList.isEmpty() ? View.GONE : View.VISIBLE);
layoutPizzas.setVisibility(pizzasList.isEmpty() ? View.GONE : View.VISIBLE);
layoutSushi.setVisibility(sushiList.isEmpty() ? View.GONE : View.VISIBLE);
layoutCarnes.setVisibility(carnesList.isEmpty() ? View.GONE : View.VISIBLE);
layoutMassas.setVisibility(massasList.isEmpty() ? View.GONE : View.VISIBLE);
layoutSobremesas.setVisibility(sobremesasList.isEmpty() ? View.GONE : View.VISIBLE);
}
private String normalizeString(String str) {

View File

@@ -118,8 +118,8 @@ public class DetalhesReservasActivity extends AppCompatActivity {
btnConfirmar.setOnClickListener(v -> {
com.example.pap_teste.models.Reserva item = reservas.get(selectedIndex);
if ("Pendente".equals(item.getEstado())) {
atualizarEstadoSelecionado("Confirmada");
} else if ("Confirmada".equals(item.getEstado())) {
mostrarMesasDisponiveis();
} else if (item.getEstado() != null && item.getEstado().startsWith("Confirmada")) {
atualizarEstadoSelecionado("Concluída");
}
});
@@ -134,6 +134,80 @@ public class DetalhesReservasActivity extends AppCompatActivity {
}
}
private void mostrarMesasDisponiveis() {
if (selectedIndex < 0 || selectedIndex >= reservas.size()) {
Toast.makeText(this, "Selecione uma reserva.", Toast.LENGTH_SHORT).show();
return;
}
com.example.pap_teste.models.Reserva item = reservas.get(selectedIndex);
com.google.firebase.database.DatabaseReference mesasRef = com.google.firebase.database.FirebaseDatabase.getInstance().getReference("Mesas");
mesasRef.orderByChild("restauranteEmail").equalTo(restaurantEmail).addListenerForSingleValueEvent(new com.google.firebase.database.ValueEventListener() {
@Override
public void onDataChange(@androidx.annotation.NonNull com.google.firebase.database.DataSnapshot snapshot) {
List<com.example.pap_teste.models.Mesa> mesasLivres = new ArrayList<>();
for (com.google.firebase.database.DataSnapshot ds : snapshot.getChildren()) {
com.example.pap_teste.models.Mesa m = ds.getValue(com.example.pap_teste.models.Mesa.class);
if (m != null && m.getEstado() != null && m.getEstado().equalsIgnoreCase("Livre")) {
// Verifica se a mesa tem capacidade suficiente para a reserva
if (m.getCapacidade() >= item.getPessoas()) {
m.setId(ds.getKey());
mesasLivres.add(m);
}
}
}
if (mesasLivres.isEmpty()) {
new androidx.appcompat.app.AlertDialog.Builder(DetalhesReservasActivity.this)
.setTitle("Sem mesas disponíveis")
.setMessage("Não há mesas livres ou com capacidade suficiente para esta reserva. Deseja confirmar a reserva mesmo assim (sem atribuir mesa)?")
.setPositiveButton("Sim, aceitar", (dialog, which) -> atualizarEstadoSelecionado("Confirmada"))
.setNegativeButton("Cancelar", null)
.show();
return;
}
String[] mesaOptions = new String[mesasLivres.size()];
for (int i = 0; i < mesasLivres.size(); i++) {
com.example.pap_teste.models.Mesa m = mesasLivres.get(i);
mesaOptions[i] = String.format("Mesa %d (%d lugares)", m.getNumero(), m.getCapacidade());
}
new androidx.appcompat.app.AlertDialog.Builder(DetalhesReservasActivity.this)
.setTitle("Atribuir Mesa")
.setItems(mesaOptions, (dialog, which) -> {
com.example.pap_teste.models.Mesa selecionada = mesasLivres.get(which);
confirmarReservaComMesa(item, selecionada);
})
.setNegativeButton("Avançar sem mesa", (dialog, which) -> atualizarEstadoSelecionado("Confirmada"))
.setNeutralButton("Cancelar", null)
.show();
}
@Override
public void onCancelled(@androidx.annotation.NonNull com.google.firebase.database.DatabaseError error) {
Toast.makeText(DetalhesReservasActivity.this, "Erro ao carregar mesas.", Toast.LENGTH_SHORT).show();
}
});
}
private void confirmarReservaComMesa(com.example.pap_teste.models.Reserva reserva, com.example.pap_teste.models.Mesa mesa) {
String novoEstado = "Confirmada (Mesa " + mesa.getNumero() + ")";
databaseReference.child(reserva.getId()).child("estado").setValue(novoEstado).addOnCompleteListener(task -> {
if (task.isSuccessful()) {
com.google.firebase.database.FirebaseDatabase.getInstance().getReference("Mesas").child(mesa.getId()).child("estado").setValue("Reservada")
.addOnCompleteListener(t2 -> {
Toast.makeText(this, "Reserva aceite e mesa atribuída com sucesso.", Toast.LENGTH_SHORT).show();
txtMensagem.setText(String.format("Reserva de %s confirmada na Mesa %d.", reserva.getClienteEmail(), mesa.getNumero()));
reserva.setEstado(novoEstado);
mostrarDetalhe(reserva);
});
} else {
Toast.makeText(this, "Erro ao confirmar reserva.", Toast.LENGTH_SHORT).show();
}
});
}
private void showRecusarDialog() {
if (selectedIndex < 0)
return;
@@ -218,29 +292,27 @@ public class DetalhesReservasActivity extends AppCompatActivity {
return;
}
switch (item.getEstado()) {
case "Pendente":
if (item.getEstado() == null) return;
if (item.getEstado().equals("Pendente")) {
btnConfirmar.setText("Confirmar");
btnConfirmar.setVisibility(android.view.View.VISIBLE);
btnRecusar.setVisibility(android.view.View.VISIBLE);
btnApagar.setVisibility(android.view.View.GONE);
break;
case "Confirmada":
} else if (item.getEstado().startsWith("Confirmada")) {
btnConfirmar.setText("Concluir");
btnConfirmar.setVisibility(android.view.View.VISIBLE);
btnRecusar.setVisibility(android.view.View.VISIBLE); // Still allow refusal
btnApagar.setVisibility(android.view.View.GONE);
break;
case "Concluída":
} else if (item.getEstado().equals("Concluída")) {
btnConfirmar.setVisibility(android.view.View.GONE);
btnRecusar.setVisibility(android.view.View.GONE);
btnApagar.setVisibility(android.view.View.VISIBLE);
break;
default: // Recusada or Cancelada
} else {
// Recusada or Cancelada
btnConfirmar.setVisibility(android.view.View.GONE);
btnRecusar.setVisibility(android.view.View.GONE);
btnApagar.setVisibility(android.view.View.VISIBLE); // Allow deleting refused ones as well
break;
btnApagar.setVisibility(android.view.View.VISIBLE);
}
}

View File

@@ -106,17 +106,20 @@ public class ListaEsperaActivity extends AppCompatActivity {
for (DataSnapshot ds : snapshot.getChildren()) {
com.example.pap_teste.models.Mesa m = ds.getValue(com.example.pap_teste.models.Mesa.class);
if (m != null && m.getEstado() != null && m.getEstado().equalsIgnoreCase("Livre")) {
// Opcional: Filtra pela capacidade da mesa
if (m.getCapacidade() >= item.getPessoas()) {
m.setId(ds.getKey());
mesasLivres.add(m);
}
}
}
if (mesasLivres.isEmpty()) {
new androidx.appcompat.app.AlertDialog.Builder(ListaEsperaActivity.this)
.setTitle("Sem mesas disponíveis")
.setMessage("Não há mesas livres registadas. Deseja confirmar a reserva mesmo assim (sem lugar reservado)?")
.setPositiveButton("Sim", (dialog, which) -> atualizarEstadoSelecionado("Confirmada"))
.setNegativeButton("Não", null)
.setMessage("Não há mesas livres registadas ou com capacidade suficiente para a reserva. Deseja confirmar a reserva mesmo assim (sem mesa atribuída)?")
.setPositiveButton("Sim, aceitar", (dialog, which) -> atualizarEstadoSelecionado("Confirmada"))
.setNegativeButton("Cancelar", null)
.show();
return;
}
@@ -133,7 +136,8 @@ public class ListaEsperaActivity extends AppCompatActivity {
com.example.pap_teste.models.Mesa selecionada = mesasLivres.get(which);
confirmarReservaComMesa(item, selecionada);
})
.setNegativeButton("Cancelar", null)
.setNegativeButton("Avançar sem mesa", (dialog, which) -> atualizarEstadoSelecionado("Confirmada"))
.setNeutralButton("Cancelar", null)
.show();
}

View File

@@ -8,7 +8,7 @@
android:background="@color/colorBackground"
tools:context=".ClientDashboardActivity">
<ScrollView
<androidx.core.widget.NestedScrollView
android:id="@+id/clientScroll"
android:layout_width="0dp"
android:layout_height="0dp"
@@ -156,7 +156,7 @@
android:visibility="visible"
android:indeterminateTint="@color/colorPrimary" />
<!-- Featured Carousel -->
<!-- Featured / Destaques -->
<LinearLayout
android:id="@+id/layoutFeatured"
android:layout_width="match_parent"
@@ -169,7 +169,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:text="Restaurantes Populares"
android:text="Destaques"
android:textColor="@color/colorTextPrimary"
android:textSize="20sp"
android:textStyle="bold"
@@ -188,9 +188,9 @@
tools:listitem="@layout/item_restaurant_featured" />
</LinearLayout>
<!-- Main Restaurant Grid/List -->
<!-- Melhor Avaliados -->
<LinearLayout
android:id="@+id/layoutAllRestaurants"
android:id="@+id/layoutTopRated"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
@@ -198,29 +198,191 @@
android:layout_marginTop="32dp">
<TextView
android:id="@+id/txtListTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:text="Todos os Restaurantes"
android:text="Melhor Avaliados"
android:textColor="@color/colorTextPrimary"
android:textSize="20sp"
android:textStyle="bold"
android:fontFamily="sans-serif" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvMainRestaurants"
android:id="@+id/rvTopRated"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:clipToPadding="false"
android:paddingBottom="16dp"
android:paddingStart="24dp"
android:paddingEnd="8dp"
android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_restaurant" />
tools:listitem="@layout/item_restaurant_featured" />
</LinearLayout>
<!-- Pizzas -->
<LinearLayout
android:id="@+id/layoutPizzas"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone"
android:layout_marginTop="32dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:text="Pizzas"
android:textColor="@color/colorTextPrimary"
android:textSize="20sp"
android:textStyle="bold"
android:fontFamily="sans-serif" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvPizzas"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:clipToPadding="false"
android:paddingStart="24dp"
android:paddingEnd="8dp"
android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_restaurant_featured" />
</LinearLayout>
<!-- Sushi -->
<LinearLayout
android:id="@+id/layoutSushi"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone"
android:layout_marginTop="32dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:text="Sushi"
android:textColor="@color/colorTextPrimary"
android:textSize="20sp"
android:textStyle="bold"
android:fontFamily="sans-serif" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvSushi"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:clipToPadding="false"
android:paddingStart="24dp"
android:paddingEnd="8dp"
android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_restaurant_featured" />
</LinearLayout>
<!-- Carnes -->
<LinearLayout
android:id="@+id/layoutCarnes"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone"
android:layout_marginTop="32dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:text="Carnes"
android:textColor="@color/colorTextPrimary"
android:textSize="20sp"
android:textStyle="bold"
android:fontFamily="sans-serif" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvCarnes"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:clipToPadding="false"
android:paddingStart="24dp"
android:paddingEnd="8dp"
android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_restaurant_featured" />
</LinearLayout>
<!-- Massas -->
<LinearLayout
android:id="@+id/layoutMassas"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone"
android:layout_marginTop="32dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:text="Massas"
android:textColor="@color/colorTextPrimary"
android:textSize="20sp"
android:textStyle="bold"
android:fontFamily="sans-serif" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvMassas"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:clipToPadding="false"
android:paddingStart="24dp"
android:paddingEnd="8dp"
android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_restaurant_featured" />
</LinearLayout>
<!-- Sobremesas -->
<LinearLayout
android:id="@+id/layoutSobremesas"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone"
android:layout_marginTop="32dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:text="Sobremesas"
android:textColor="@color/colorTextPrimary"
android:textSize="20sp"
android:textStyle="bold"
android:fontFamily="sans-serif" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvSobremesas"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:clipToPadding="false"
android:paddingStart="24dp"
android:paddingEnd="8dp"
android:paddingBottom="16dp"
android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_restaurant_featured" />
</LinearLayout>
</LinearLayout>
</ScrollView>
</androidx.core.widget.NestedScrollView>
<!-- Bottom Navigation Bar -->
<com.google.android.material.bottomnavigation.BottomNavigationView