diff --git a/app/src/main/java/com/example/vdcscore/ui/clubs/ClubDetailFragment.java b/app/src/main/java/com/example/vdcscore/ui/clubs/ClubDetailFragment.java index 26461df..0487531 100644 --- a/app/src/main/java/com/example/vdcscore/ui/clubs/ClubDetailFragment.java +++ b/app/src/main/java/com/example/vdcscore/ui/clubs/ClubDetailFragment.java @@ -21,6 +21,11 @@ import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.ValueEventListener; import com.example.vdcscore.ui.home.Team; import com.bumptech.glide.Glide; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import android.widget.ImageView; +import android.widget.TextView; public class ClubDetailFragment extends Fragment { @@ -147,6 +152,43 @@ public class ClubDetailFragment extends Fragment { bundle.putString("escalao", escalao); Navigation.findNavController(v).navigate(R.id.action_nav_club_detail_to_nav_club_players, bundle); }); + + // Tenta carregar estatísticas em segundo plano baseando-se no nome do clube + searchAndLinkTeamStats(club.getName()); + } + + private void searchAndLinkTeamStats(String clubName) { + if (clubName == null) return; + + DatabaseReference ref = FirebaseDatabase.getInstance().getReference("classificacoes"); + ref.addListenerForSingleValueEvent(new ValueEventListener() { + @Override + public void onDataChange(@NonNull DataSnapshot snapshot) { + if (binding == null) return; + + // Iterar sobre todos os escalões disponíveis + for (DataSnapshot escalaoSnapshot : snapshot.getChildren()) { + // Iterar sobre as equipas dentro de cada escalão + for (DataSnapshot teamSnapshot : escalaoSnapshot.getChildren()) { + Team candidate = teamSnapshot.getValue(Team.class); + if (candidate != null && candidate.getNome() != null + && candidate.getNome().equalsIgnoreCase(clubName)) { + // Sucesso! Encontrámos as estatísticas. + // Guardar escalao caso não estivesse definido + if (escalao == null) { + escalao = escalaoSnapshot.getKey(); + } + populateStats(candidate); + setupComparison(candidate); + return; // Parar de procurar + } + } + } + } + + @Override + public void onCancelled(@NonNull DatabaseError error) {} + }); } private void setupComparison(Team team1) { @@ -173,34 +215,114 @@ public class ClubDetailFragment extends Fragment { } private void showComparisonDialog(Team team1, java.util.List otherTeams) { - String[] teamNames = new String[otherTeams.size()]; - for (int i = 0; i < otherTeams.size(); i++) { - teamNames[i] = otherTeams.get(i).getNome(); - } + if (getContext() == null) return; - new androidx.appcompat.app.AlertDialog.Builder(requireContext()) - .setTitle("Selecionar Equipa para Comparar") - .setItems(teamNames, (dialog, which) -> { - Team team2 = otherTeams.get(which); - displayComparison(team1, team2); - }) - .show(); + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(requireContext()); + View dialogView = getLayoutInflater().inflate(R.layout.dialog_team_selector, null); + bottomSheetDialog.setContentView(dialogView); + + RecyclerView recyclerView = dialogView.findViewById(R.id.recycler_comparison_teams); + recyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); + + // Configurar um adapter simples e direto + recyclerView.setAdapter(new RecyclerView.Adapter() { + @NonNull + @Override + public CompareViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_comparison_selector, parent, false); + return new CompareViewHolder(v); + } + + @Override + public void onBindViewHolder(@NonNull CompareViewHolder holder, int position) { + Team currentTeam = otherTeams.get(position); + holder.nameText.setText(currentTeam.getNome()); + holder.posText.setText(currentTeam.getPosicao() > 0 ? currentTeam.getPosicao() + "º" : "-"); + + Glide.with(holder.itemView.getContext()) + .load(currentTeam.getImagem()) + .placeholder(R.mipmap.ic_launcher_round) + .into(holder.logoImage); + + holder.itemView.setOnClickListener(v -> { + bottomSheetDialog.dismiss(); + displayComparison(team1, currentTeam); + }); + } + + @Override + public int getItemCount() { + return otherTeams.size(); + } + }); + + bottomSheetDialog.show(); + } + + // ViewHolder auxiliar para o recycler local + private static class CompareViewHolder extends RecyclerView.ViewHolder { + ImageView logoImage; + TextView nameText, posText; + + public CompareViewHolder(@NonNull View itemView) { + super(itemView); + logoImage = itemView.findViewById(R.id.img_team_logo); + nameText = itemView.findViewById(R.id.text_team_name); + posText = itemView.findViewById(R.id.text_team_position); + } } private void displayComparison(Team t1, Team t2) { - binding.layoutComparison.setVisibility(View.VISIBLE); + // IMPORTANTE: Ativar a CARD (contentor) e não apenas o layout interno! + binding.cardComparison.setVisibility(View.VISIBLE); + + // Set Names binding.textCompareTeam1.setText(t1.getNome()); binding.textCompareTeam2.setText(t2.getNome()); + + // Load comparison logos dynamically + if (getContext() != null) { + Glide.with(this).load(t1.getImagem()).placeholder(R.mipmap.ic_launcher_round).into(binding.imgCompareTeam1); + Glide.with(this).load(t2.getImagem()).placeholder(R.mipmap.ic_launcher_round).into(binding.imgCompareTeam2); + } + // Bind values binding.textCompareP1.setText(String.valueOf(t1.getPontos())); binding.textCompareP2.setText(String.valueOf(t2.getPontos())); binding.textCompareG1.setText(String.valueOf(t1.getGolos_marcados())); binding.textCompareG2.setText(String.valueOf(t2.getGolos_marcados())); + + // Supporting extra items to make it richer + binding.textCompareJ1.setText(String.valueOf(t1.getJogos())); + binding.textCompareJ2.setText(String.valueOf(t2.getJogos())); + + binding.textCompareV1.setText(String.valueOf(t1.getVitorias())); + binding.textCompareV2.setText(String.valueOf(t2.getVitorias())); - // Highlight advantage - binding.textCompareP1.setTextColor(t1.getPontos() >= t2.getPontos() ? android.graphics.Color.GREEN : android.graphics.Color.RED); - binding.textCompareP2.setTextColor(t2.getPontos() >= t1.getPontos() ? android.graphics.Color.GREEN : android.graphics.Color.RED); + // Resourcing dynamic colors + int successColor = getResources().getColor(R.color.brand); + int defaultColor = getResources().getColor(R.color.text_3); + + // Applying visual highlights conditionally based on performance metrics + + // 1. Compare Pontos + binding.textCompareP1.setTextColor(t1.getPontos() > t2.getPontos() ? successColor : defaultColor); + binding.textCompareP1.setTypeface(null, t1.getPontos() > t2.getPontos() ? android.graphics.Typeface.BOLD : android.graphics.Typeface.NORMAL); + binding.textCompareP2.setTextColor(t2.getPontos() > t1.getPontos() ? successColor : defaultColor); + binding.textCompareP2.setTypeface(null, t2.getPontos() > t1.getPontos() ? android.graphics.Typeface.BOLD : android.graphics.Typeface.NORMAL); + + // 2. Compare Vitorias + binding.textCompareV1.setTextColor(t1.getVitorias() > t2.getVitorias() ? successColor : defaultColor); + binding.textCompareV1.setTypeface(null, t1.getVitorias() > t2.getVitorias() ? android.graphics.Typeface.BOLD : android.graphics.Typeface.NORMAL); + binding.textCompareV2.setTextColor(t2.getVitorias() > t1.getVitorias() ? successColor : defaultColor); + binding.textCompareV2.setTypeface(null, t2.getVitorias() > t1.getVitorias() ? android.graphics.Typeface.BOLD : android.graphics.Typeface.NORMAL); + + // 3. Compare Golos + binding.textCompareG1.setTextColor(t1.getGolos_marcados() > t2.getGolos_marcados() ? successColor : defaultColor); + binding.textCompareG1.setTypeface(null, t1.getGolos_marcados() > t2.getGolos_marcados() ? android.graphics.Typeface.BOLD : android.graphics.Typeface.NORMAL); + binding.textCompareG2.setTextColor(t2.getGolos_marcados() > t1.getGolos_marcados() ? successColor : defaultColor); + binding.textCompareG2.setTypeface(null, t2.getGolos_marcados() > t1.getGolos_marcados() ? android.graphics.Typeface.BOLD : android.graphics.Typeface.NORMAL); } @Override diff --git a/app/src/main/java/com/example/vdcscore/ui/clubs/PlayerDetailFragment.java b/app/src/main/java/com/example/vdcscore/ui/clubs/PlayerDetailFragment.java index 9ee9aee..073b785 100644 --- a/app/src/main/java/com/example/vdcscore/ui/clubs/PlayerDetailFragment.java +++ b/app/src/main/java/com/example/vdcscore/ui/clubs/PlayerDetailFragment.java @@ -13,6 +13,12 @@ import com.bumptech.glide.Glide; import com.example.vdcscore.R; import com.example.vdcscore.databinding.FragmentPlayerDetailBinding; import com.example.vdcscore.models.Player; +import com.example.vdcscore.models.TopScorer; +import com.google.firebase.database.DataSnapshot; +import com.google.firebase.database.DatabaseError; +import com.google.firebase.database.DatabaseReference; +import com.google.firebase.database.FirebaseDatabase; +import com.google.firebase.database.ValueEventListener; public class PlayerDetailFragment extends Fragment { @@ -50,10 +56,52 @@ public class PlayerDetailFragment extends Fragment { .circleCrop() .into(binding.imageDetailPlayerPhoto); } + + // Carregar golos da base de dados + fetchPlayerGoals(jogadorRecebido.getNome()); } } } + private void fetchPlayerGoals(String playerName) { + if (playerName == null || playerName.isEmpty()) { + binding.textDetailTotalGoals.setText("0"); + return; + } + + DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference("marcadores"); + + mDatabase.addListenerForSingleValueEvent(new ValueEventListener() { + @Override + public void onDataChange(@NonNull DataSnapshot snapshot) { + if (binding == null) return; + + int totalGoals = 0; + + // Iterar sobre as subcategorias (seniores, juniores, etc) + for (DataSnapshot categorySnapshot : snapshot.getChildren()) { + // Iterar sobre cada marcador individualmente + for (DataSnapshot data : categorySnapshot.getChildren()) { + TopScorer scorer = data.getValue(TopScorer.class); + if (scorer != null && scorer.getPlayerName() != null + && scorer.getPlayerName().equalsIgnoreCase(playerName)) { + totalGoals += scorer.getGoals(); + } + } + } + + binding.textDetailTotalGoals.setText(String.valueOf(totalGoals)); + } + + @Override + public void onCancelled(@NonNull DatabaseError error) { + if (binding != null) { + binding.textDetailTotalGoals.setText("Erro"); + } + } + }); + } + @Override public void onDestroyView() { super.onDestroyView(); diff --git a/app/src/main/java/com/example/vdcscore/ui/topscorers/TopScorersAdapter.java b/app/src/main/java/com/example/vdcscore/ui/topscorers/TopScorersAdapter.java index 35c3dc9..31cb991 100644 --- a/app/src/main/java/com/example/vdcscore/ui/topscorers/TopScorersAdapter.java +++ b/app/src/main/java/com/example/vdcscore/ui/topscorers/TopScorersAdapter.java @@ -37,7 +37,25 @@ public class TopScorersAdapter extends RecyclerView.Adapter top10List = scorersList.subList(0, Math.min(10, scorersList.size())); + adapter.setTopScorers(top10List); } } diff --git a/app/src/main/res/drawable/bg_bottom_sheet_curve.xml b/app/src/main/res/drawable/bg_bottom_sheet_curve.xml index 52958cd..6ab6e45 100644 --- a/app/src/main/res/drawable/bg_bottom_sheet_curve.xml +++ b/app/src/main/res/drawable/bg_bottom_sheet_curve.xml @@ -1,7 +1,7 @@ - + + android:topLeftRadius="20dp" + android:topRightRadius="20dp" /> diff --git a/app/src/main/res/drawable/bg_circle_green.xml b/app/src/main/res/drawable/bg_circle_green.xml index e103265..981ba6e 100644 --- a/app/src/main/res/drawable/bg_circle_green.xml +++ b/app/src/main/res/drawable/bg_circle_green.xml @@ -1,5 +1,5 @@ - + diff --git a/app/src/main/res/drawable/bg_circle_light_gray.xml b/app/src/main/res/drawable/bg_circle_light_gray.xml index 82cd5c8..ebf330c 100644 --- a/app/src/main/res/drawable/bg_circle_light_gray.xml +++ b/app/src/main/res/drawable/bg_circle_light_gray.xml @@ -1,5 +1,5 @@ - + diff --git a/app/src/main/res/drawable/bg_gradient.xml b/app/src/main/res/drawable/bg_gradient.xml index 3d2bd99..dae46f2 100644 --- a/app/src/main/res/drawable/bg_gradient.xml +++ b/app/src/main/res/drawable/bg_gradient.xml @@ -2,9 +2,8 @@ - diff --git a/app/src/main/res/drawable/bg_input_field.xml b/app/src/main/res/drawable/bg_input_field.xml index b0cff79..9db212a 100644 --- a/app/src/main/res/drawable/bg_input_field.xml +++ b/app/src/main/res/drawable/bg_input_field.xml @@ -1,9 +1,9 @@ - - + + + android:width="1dp" + android:color="@color/border" /> diff --git a/app/src/main/res/drawable/bg_jornada_nav.xml b/app/src/main/res/drawable/bg_jornada_nav.xml index 209487a..f886f73 100644 --- a/app/src/main/res/drawable/bg_jornada_nav.xml +++ b/app/src/main/res/drawable/bg_jornada_nav.xml @@ -1,6 +1,6 @@ - + - + diff --git a/app/src/main/res/drawable/bg_match_item.xml b/app/src/main/res/drawable/bg_match_item.xml index a81518a..19f6a12 100644 --- a/app/src/main/res/drawable/bg_match_item.xml +++ b/app/src/main/res/drawable/bg_match_item.xml @@ -1,6 +1,6 @@ - - - + + + diff --git a/app/src/main/res/drawable/bg_table_header.xml b/app/src/main/res/drawable/bg_table_header.xml index ad242a5..b7b0c33 100644 --- a/app/src/main/res/drawable/bg_table_header.xml +++ b/app/src/main/res/drawable/bg_table_header.xml @@ -1,7 +1,7 @@ - + diff --git a/app/src/main/res/drawable/button_modern.xml b/app/src/main/res/drawable/button_modern.xml index a73c25e..53a7251 100644 --- a/app/src/main/res/drawable/button_modern.xml +++ b/app/src/main/res/drawable/button_modern.xml @@ -1,11 +1,6 @@ - - + + - diff --git a/app/src/main/res/drawable/circle_decoration.xml b/app/src/main/res/drawable/circle_decoration.xml index 9f3c01d..c67725b 100644 --- a/app/src/main/res/drawable/circle_decoration.xml +++ b/app/src/main/res/drawable/circle_decoration.xml @@ -1,5 +1,5 @@ - + diff --git a/app/src/main/res/drawable/circle_edit_background.xml b/app/src/main/res/drawable/circle_edit_background.xml index 6b14fb2..2339013 100644 --- a/app/src/main/res/drawable/circle_edit_background.xml +++ b/app/src/main/res/drawable/circle_edit_background.xml @@ -1,7 +1,7 @@ - + diff --git a/app/src/main/res/drawable/custom_progress_bg.xml b/app/src/main/res/drawable/custom_progress_bg.xml index 5cfcca5..fde989e 100644 --- a/app/src/main/res/drawable/custom_progress_bg.xml +++ b/app/src/main/res/drawable/custom_progress_bg.xml @@ -3,14 +3,14 @@ - + - + diff --git a/app/src/main/res/drawable/edit_text_focused.xml b/app/src/main/res/drawable/edit_text_focused.xml index 685bf89..fa14d26 100644 --- a/app/src/main/res/drawable/edit_text_focused.xml +++ b/app/src/main/res/drawable/edit_text_focused.xml @@ -1,15 +1,14 @@ - - + + + android:width="1dp" + android:color="@color/brand" /> - diff --git a/app/src/main/res/drawable/edit_text_modern.xml b/app/src/main/res/drawable/edit_text_modern.xml index a3d2341..ae8ec84 100644 --- a/app/src/main/res/drawable/edit_text_modern.xml +++ b/app/src/main/res/drawable/edit_text_modern.xml @@ -1,15 +1,14 @@ - - + + + android:color="@color/border" /> - diff --git a/app/src/main/res/drawable/header_background.xml b/app/src/main/res/drawable/header_background.xml index 5f4258f..8938339 100644 --- a/app/src/main/res/drawable/header_background.xml +++ b/app/src/main/res/drawable/header_background.xml @@ -1,5 +1,6 @@ - + + diff --git a/app/src/main/res/drawable/ic_header_login_bg.xml b/app/src/main/res/drawable/ic_header_login_bg.xml index 7ab031f..2366e23 100644 --- a/app/src/main/res/drawable/ic_header_login_bg.xml +++ b/app/src/main/res/drawable/ic_header_login_bg.xml @@ -4,8 +4,7 @@ android:height="300dp" android:viewportWidth="412" android:viewportHeight="300"> - diff --git a/app/src/main/res/drawable/ic_header_signup_bg.xml b/app/src/main/res/drawable/ic_header_signup_bg.xml index 721b383..2366e23 100644 --- a/app/src/main/res/drawable/ic_header_signup_bg.xml +++ b/app/src/main/res/drawable/ic_header_signup_bg.xml @@ -1,11 +1,10 @@ - + android:viewportHeight="300"> + android:fillColor="#111827" + android:pathData="M0,0 L412,0 L412,220 C412,220 300,300 0,220 L0,0 Z" /> diff --git a/app/src/main/res/drawable/shape_score_bg.xml b/app/src/main/res/drawable/shape_score_bg.xml index 27ff497..7c32fe0 100644 --- a/app/src/main/res/drawable/shape_score_bg.xml +++ b/app/src/main/res/drawable/shape_score_bg.xml @@ -1,6 +1,7 @@ - + + diff --git a/app/src/main/res/drawable/side_nav_bar.xml b/app/src/main/res/drawable/side_nav_bar.xml index 6d81870..e94b27d 100644 --- a/app/src/main/res/drawable/side_nav_bar.xml +++ b/app/src/main/res/drawable/side_nav_bar.xml @@ -1,9 +1,4 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_conta.xml b/app/src/main/res/layout/activity_conta.xml index 263dcce..01a0ecf 100644 --- a/app/src/main/res/layout/activity_conta.xml +++ b/app/src/main/res/layout/activity_conta.xml @@ -6,25 +6,30 @@ android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/background_light" + android:background="@color/bg_base" tools:context=".ui.definicoes.ContaActivity"> + app:navigationIconTint="@color/text_1" /> + + @@ -38,34 +43,36 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:padding="24dp"> + android:padding="16dp"> + android:layout_marginBottom="14dp" + app:cardCornerRadius="12dp" + app:cardElevation="0dp" + app:strokeWidth="1dp" + app:strokeColor="@color/border" + app:cardBackgroundColor="@color/bg_surface"> + android:textColor="@color/text_1" + android:layout_marginBottom="16dp" /> + android:foreground="?attr/selectableItemBackgroundBorderless" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + app:tint="@color/text_3" /> @@ -99,8 +110,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" app:fabSize="mini" - app:backgroundTint="@color/secondary_color" - app:tint="@color/white" + app:backgroundTint="@color/brand" + app:tint="@color/bg_base" android:src="@android:drawable/ic_menu_edit" app:layout_constraintBottom_toBottomOf="@+id/cardImageContainer" app:layout_constraintEnd_toEndOf="@+id/cardImageContainer"/> @@ -111,15 +122,15 @@ android:id="@+id/btnChangePhoto" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="16dp" + android:layout_marginTop="12dp" + android:fontFamily="@font/font_ibm_plex_sans" android:text="Toque para alterar" - android:textColor="@color/text_secondary" - android:textSize="14sp" + android:textColor="@color/brand" + android:textSize="13sp" android:textStyle="bold" android:clickable="true" android:focusable="true" - android:padding="8dp" - android:background="?attr/selectableItemBackgroundBorderless" /> + android:padding="6dp" /> @@ -130,66 +141,56 @@ android:id="@+id/cardName" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="20dp" - app:cardCornerRadius="16dp" - app:cardElevation="2dp" - app:cardBackgroundColor="@color/surface_card" - app:strokeWidth="0dp"> + android:layout_marginBottom="14dp" + app:cardCornerRadius="12dp" + app:cardElevation="0dp" + app:strokeWidth="1dp" + app:strokeColor="@color/border" + app:cardBackgroundColor="@color/bg_surface"> + android:padding="20dp"> + android:textColor="@color/text_1" + android:layout_marginBottom="14dp" /> - + android:layout_height="48dp" + android:background="@drawable/bg_input_field" + android:inputType="textPersonName" + android:textColor="@color/text_1" + android:textColorHint="@color/text_3" + android:fontFamily="@font/font_ibm_plex_sans" + android:textSize="13sp" + android:paddingHorizontal="16dp" + android:hint="Nome de utilizador" /> - - - - -