diff --git a/app/src/main/java/com/example/vdcscore/models/Club.java b/app/src/main/java/com/example/vdcscore/models/Club.java index 7bf4495..d28fbdc 100644 --- a/app/src/main/java/com/example/vdcscore/models/Club.java +++ b/app/src/main/java/com/example/vdcscore/models/Club.java @@ -1,51 +1,136 @@ package com.example.vdcscore.models; +import com.google.firebase.database.PropertyName; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + public class Club { + @PropertyName("id") private String id; + + @PropertyName("nome") private String name; + + @PropertyName("logoUrl") private String logoUrl; + + @PropertyName("campo") private String stadium; - // Stats could be here or in a separate object, keeping basic info here + @PropertyName("ano fundacao") + private String foundationYear; + + @PropertyName("morada") + private String address; + + @PropertyName("presidente") + private String president; + + @PropertyName("jogadores") + private Map players; + public Club() { + // Default constructor for Firebase + players = new HashMap<>(); } - public Club(String id, String name, String logoUrl, String stadium) { + public Club(String id, String name, String logoUrl, String stadium, String foundationYear, String address, + String president) { this.id = id; this.name = name; this.logoUrl = logoUrl; this.stadium = stadium; + this.foundationYear = foundationYear; + this.address = address; + this.president = president; + this.players = new HashMap<>(); } + @PropertyName("id") public String getId() { return id; } + @PropertyName("id") public void setId(String id) { this.id = id; } + @PropertyName("nome") public String getName() { return name; } + @PropertyName("nome") public void setName(String name) { this.name = name; } + @PropertyName("logoUrl") public String getLogoUrl() { return logoUrl; } + @PropertyName("logoUrl") public void setLogoUrl(String logoUrl) { this.logoUrl = logoUrl; } + @PropertyName("campo") public String getStadium() { return stadium; } + @PropertyName("campo") public void setStadium(String stadium) { this.stadium = stadium; } + + @PropertyName("ano fundacao") + public String getFoundationYear() { + return foundationYear; + } + + @PropertyName("ano fundacao") + public void setFoundationYear(String foundationYear) { + this.foundationYear = foundationYear; + } + + @PropertyName("morada") + public String getAddress() { + return address; + } + + @PropertyName("morada") + public void setAddress(String address) { + this.address = address; + } + + @PropertyName("presidente") + public String getPresident() { + return president; + } + + @PropertyName("presidente") + public void setPresident(String president) { + this.president = president; + } + + @PropertyName("jogadores") + public Map getPlayersMap() { + return players; + } + + @PropertyName("jogadores") + public void setPlayersMap(Map players) { + this.players = players; + } + + public List getPlayersList() { + if (players == null) + return new ArrayList<>(); + return new ArrayList<>(players.values()); + } } diff --git a/app/src/main/java/com/example/vdcscore/models/Player.java b/app/src/main/java/com/example/vdcscore/models/Player.java new file mode 100644 index 0000000..eff04d3 --- /dev/null +++ b/app/src/main/java/com/example/vdcscore/models/Player.java @@ -0,0 +1,40 @@ +package com.example.vdcscore.models; + +import com.google.firebase.database.PropertyName; + +public class Player { + @PropertyName("id") + private String id; + + @PropertyName("nome") + private String nome; + + public Player() { + // Default constructor required for calls to DataSnapshot.getValue(Player.class) + } + + public Player(String id, String nome) { + this.id = id; + this.nome = nome; + } + + @PropertyName("id") + public String getId() { + return id; + } + + @PropertyName("id") + public void setId(String id) { + this.id = id; + } + + @PropertyName("nome") + public String getNome() { + return nome; + } + + @PropertyName("nome") + public void setNome(String nome) { + this.nome = nome; + } +} diff --git a/app/src/main/java/com/example/vdcscore/ui/clubs/Club.java b/app/src/main/java/com/example/vdcscore/ui/clubs/Club.java deleted file mode 100644 index 960778c..0000000 --- a/app/src/main/java/com/example/vdcscore/ui/clubs/Club.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.example.vdcscore.ui.clubs; - -public class Club { - private String name; - private String stadium; - private String logoUrl; - - public Club() { - // Default constructor required for calls to DataSnapshot.getValue(Club.class) - } - - public Club(String name, String stadium, String logoUrl) { - this.name = name; - this.stadium = stadium; - this.logoUrl = logoUrl; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getStadium() { - return stadium; - } - - public void setStadium(String stadium) { - this.stadium = stadium; - } - - public String getLogoUrl() { - return logoUrl; - } - - public void setLogoUrl(String logoUrl) { - this.logoUrl = logoUrl; - } -} diff --git a/app/src/main/java/com/example/vdcscore/ui/clubs/ClubAdapter.java b/app/src/main/java/com/example/vdcscore/ui/clubs/ClubAdapter.java index dac4be3..3ed1fad 100644 --- a/app/src/main/java/com/example/vdcscore/ui/clubs/ClubAdapter.java +++ b/app/src/main/java/com/example/vdcscore/ui/clubs/ClubAdapter.java @@ -10,15 +10,22 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.example.vdcscore.R; +import com.example.vdcscore.models.Club; import java.util.List; public class ClubAdapter extends RecyclerView.Adapter { private final List mClubs; + private final OnItemClickListener mListener; - public ClubAdapter(List clubs) { + public interface OnItemClickListener { + void onItemClick(Club club); + } + + public ClubAdapter(List clubs, OnItemClickListener listener) { mClubs = clubs; + mListener = listener; } @NonNull @@ -32,7 +39,7 @@ public class ClubAdapter extends RecyclerView.Adapter listener.onItemClick(club)); } } } 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 new file mode 100644 index 0000000..37aa261 --- /dev/null +++ b/app/src/main/java/com/example/vdcscore/ui/clubs/ClubDetailFragment.java @@ -0,0 +1,93 @@ +package com.example.vdcscore.ui.clubs; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.example.vdcscore.databinding.FragmentClubDetailBinding; +import com.example.vdcscore.models.Club; +import com.example.vdcscore.models.Player; +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; + +import java.util.ArrayList; +import java.util.List; + +public class ClubDetailFragment extends Fragment { + + private FragmentClubDetailBinding binding; + private DatabaseReference mDatabase; + private String clubId; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + clubId = getArguments().getString("clubId"); + } + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + binding = FragmentClubDetailBinding.inflate(inflater, container, false); + return binding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + binding.recyclerPlayers.setLayoutManager(new LinearLayoutManager(getContext())); + + if (clubId != null) { + mDatabase = FirebaseDatabase.getInstance().getReference().child("clubes").child(clubId); // Updated to + // 'clubes' + loadClubDetails(); + } + } + + private void loadClubDetails() { + mDatabase.addListenerForSingleValueEvent(new ValueEventListener() { + @Override + public void onDataChange(@NonNull DataSnapshot snapshot) { + Club club = snapshot.getValue(Club.class); + if (club != null) { + binding.textDetailClubName.setText(club.getName()); + binding.textDetailFoundation.setText(club.getFoundationYear()); + binding.textDetailPresident.setText(club.getPresident()); + binding.textDetailStadium.setText(club.getStadium()); + binding.textDetailAddress.setText(club.getAddress()); + + List playerList = club.getPlayersList(); + PlayerAdapter adapter = new PlayerAdapter(playerList); + binding.recyclerPlayers.setAdapter(adapter); + } + } + + @Override + public void onCancelled(@NonNull DatabaseError error) { + if (getContext() != null) { + Toast.makeText(getContext(), "Failed to load club details.", Toast.LENGTH_SHORT).show(); + } + } + }); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + } +} diff --git a/app/src/main/java/com/example/vdcscore/ui/clubs/ClubsFragment.java b/app/src/main/java/com/example/vdcscore/ui/clubs/ClubsFragment.java index 201af11..9cbd5f2 100644 --- a/app/src/main/java/com/example/vdcscore/ui/clubs/ClubsFragment.java +++ b/app/src/main/java/com/example/vdcscore/ui/clubs/ClubsFragment.java @@ -10,11 +10,13 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; +import androidx.navigation.Navigation; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.example.vdcscore.R; import com.example.vdcscore.databinding.FragmentClubsBinding; +import com.example.vdcscore.models.Club; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; @@ -35,7 +37,8 @@ public class ClubsFragment extends Fragment { binding = FragmentClubsBinding.inflate(inflater, container, false); View root = binding.getRoot(); - mDatabase = FirebaseDatabase.getInstance().getReference().child("clubs"); + mDatabase = FirebaseDatabase.getInstance().getReference().child("clubes"); // Changed to 'clubes' as per + // screenshot RecyclerView recyclerView = binding.recyclerClubs; recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); @@ -49,42 +52,37 @@ public class ClubsFragment extends Fragment { List clubs = new ArrayList<>(); for (DataSnapshot postSnapshot : snapshot.getChildren()) { Club club = postSnapshot.getValue(Club.class); - clubs.add(club); + if (club != null) { + clubs.add(club); + } } - ClubAdapter adapter = new ClubAdapter(clubs); + ClubAdapter adapter = new ClubAdapter(clubs, club -> { + Bundle bundle = new Bundle(); + bundle.putString("clubId", club.getId()); + Navigation.findNavController(root).navigate(R.id.action_nav_clubs_to_nav_club_detail, bundle); + }); recyclerView.setAdapter(adapter); progressBar.setVisibility(View.GONE); if (clubs.isEmpty()) { - // Add mock data if empty for demonstration - addMockClubsIfEmpty(); + // Keep UI empty but don't show mock data automatically to avoid confusion + // Toast.makeText(getContext(), "No clubs found.", Toast.LENGTH_SHORT).show(); } } @Override public void onCancelled(@NonNull DatabaseError error) { Log.w(TAG, "loadClubs:onCancelled", error.toException()); - Toast.makeText(getContext(), "Failed to load clubs.", Toast.LENGTH_SHORT).show(); - progressBar.setVisibility(View.GONE); + if (getContext() != null) { + Toast.makeText(getContext(), "Failed to load clubs.", Toast.LENGTH_SHORT).show(); + } + binding.progressBar.setVisibility(View.GONE); } }); return root; } - private void addMockClubsIfEmpty() { - // If database is empty, optional helper to add data? - // For now, let's keep it strictly reading from Firebase or showing empty state. - // But to ensure user sees something if they haven't set up DB yet: - List mockClubs = new ArrayList<>(); - mockClubs.add(new Club("VDC", "Campo Principal", "")); - mockClubs.add(new Club("Benfica", "Estádio da Luz", "")); - ClubAdapter adapter = new ClubAdapter(mockClubs); - binding.recyclerClubs.setAdapter(adapter); - - Toast.makeText(getContext(), "No clubs found in Firebase. Showing mock data.", Toast.LENGTH_LONG).show(); - } - @Override public void onDestroyView() { super.onDestroyView(); diff --git a/app/src/main/java/com/example/vdcscore/ui/clubs/PlayerAdapter.java b/app/src/main/java/com/example/vdcscore/ui/clubs/PlayerAdapter.java new file mode 100644 index 0000000..0132de3 --- /dev/null +++ b/app/src/main/java/com/example/vdcscore/ui/clubs/PlayerAdapter.java @@ -0,0 +1,55 @@ +package com.example.vdcscore.ui.clubs; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.vdcscore.R; +import com.example.vdcscore.models.Player; + +import java.util.List; + +public class PlayerAdapter extends RecyclerView.Adapter { + + private final List mPlayers; + + public PlayerAdapter(List players) { + mPlayers = players; + } + + @NonNull + @Override + public PlayerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.item_player, parent, false); + return new PlayerViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull PlayerViewHolder holder, int position) { + Player player = mPlayers.get(position); + holder.bind(player); + } + + @Override + public int getItemCount() { + return mPlayers.size(); + } + + static class PlayerViewHolder extends RecyclerView.ViewHolder { + private final TextView name; + + public PlayerViewHolder(@NonNull View itemView) { + super(itemView); + name = itemView.findViewById(R.id.text_player_name); + } + + public void bind(Player player) { + name.setText(player.getNome()); + } + } +} diff --git a/app/src/main/res/layout/fragment_club_detail.xml b/app/src/main/res/layout/fragment_club_detail.xml new file mode 100644 index 0000000..71c791f --- /dev/null +++ b/app/src/main/res/layout/fragment_club_detail.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_player.xml b/app/src/main/res/layout/item_player.xml new file mode 100644 index 0000000..2d07072 --- /dev/null +++ b/app/src/main/res/layout/item_player.xml @@ -0,0 +1,25 @@ + + + + + + + +