diff --git a/app/src/main/java/com/example/vdcscore/MainActivity.java b/app/src/main/java/com/example/vdcscore/MainActivity.java index 3ce2585..c6dd9f0 100644 --- a/app/src/main/java/com/example/vdcscore/MainActivity.java +++ b/app/src/main/java/com/example/vdcscore/MainActivity.java @@ -119,34 +119,13 @@ public class MainActivity extends AppCompatActivity { } private void loadProfileImageInNavHeader(String imageUrl, ImageView imageView) { - new Thread(() -> { - InputStream input = null; - try { - java.net.URL url = new java.net.URL(imageUrl); - java.net.HttpURLConnection connection = (java.net.HttpURLConnection) url.openConnection(); - connection.setDoInput(true); - connection.connect(); - input = connection.getInputStream(); - Bitmap bitmap = BitmapFactory.decodeStream(input); - runOnUiThread(() -> { - if (bitmap != null && imageView != null) { - imageView.setImageBitmap(bitmap); - imageView.setScaleType(android.widget.ImageView.ScaleType.CENTER_CROP); - } - }); - } catch (Exception e) { - // Se falhar, tentar carregar do Storage - runOnUiThread(() -> loadProfileImageFromStorage(imageView)); - } finally { - if (input != null) { - try { - input.close(); - } catch (Exception e) { - // Ignorar erro ao fechar - } - } - } - }).start(); + if (imageUrl == null || imageView == null) return; + Glide.with(this) + .load(imageUrl) + .placeholder(R.mipmap.ic_launcher_round) + .error(R.mipmap.ic_launcher) + .circleCrop() + .into(imageView); } private void loadProfileImageFromStorage(ImageView imageView) { 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 80dc043..30ea1f4 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 @@ -62,49 +62,55 @@ public class ClubsFragment extends Fragment { } private void loadClubsData(RecyclerView recyclerView, ProgressBar progressBar) { - progressBar.setVisibility(View.VISIBLE); - mDatabase = FirebaseDatabase.getInstance().getReference().child("clubes"); + if (progressBar != null) progressBar.setVisibility(View.VISIBLE); - // Remove previous listener to avoid duplicate data or leaks - if (mValueEventListener != null) { + // Remove previous listener from the PREVIOUS path + if (mDatabase != null && mValueEventListener != null) { mDatabase.removeEventListener(mValueEventListener); } + mDatabase = FirebaseDatabase.getInstance().getReference().child("clubes"); + mValueEventListener = new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { + if (binding == null) return; + List clubs = new ArrayList<>(); for (DataSnapshot postSnapshot : snapshot.getChildren()) { if (postSnapshot.child("jogadores").child(currentEscalao).exists()) { - Club club = postSnapshot.getValue(Club.class); - if (club != null) { - clubs.add(club); + try { + Club club = postSnapshot.getValue(Club.class); + if (club != null) { + clubs.add(club); + } + } catch (Exception e) { + e.printStackTrace(); } } } ClubAdapter adapter = new ClubAdapter(clubs, club -> { + if (binding == null) return; Bundle bundle = new Bundle(); bundle.putSerializable("clube_selecionado", club); bundle.putString("escalao", currentEscalao); androidx.navigation.fragment.NavHostFragment.findNavController(ClubsFragment.this) .navigate(R.id.action_nav_clubs_to_nav_club_detail, bundle); }); - recyclerView.setAdapter(adapter); - progressBar.setVisibility(View.GONE); - - if (clubs.isEmpty()) { - // Keep UI empty but don't show mock data automatically to avoid confusion - // Toast.makeText(getContext(), "No clubs found.", Toast.LENGTH_SHORT).show(); + + if (recyclerView != null) { + recyclerView.setAdapter(adapter); + } + if (progressBar != null) { + progressBar.setVisibility(View.GONE); } } @Override public void onCancelled(@NonNull DatabaseError error) { Log.w(TAG, "loadClubs:onCancelled", error.toException()); - if (getContext() != null) { + if (getContext() != null && binding != null) { Toast.makeText(getContext(), "Failed to load clubs.", Toast.LENGTH_SHORT).show(); - } - if (binding != null) { binding.progressBar.setVisibility(View.GONE); } } diff --git a/app/src/main/java/com/example/vdcscore/ui/definicoes/ContaActivity.java b/app/src/main/java/com/example/vdcscore/ui/definicoes/ContaActivity.java index 400d1f4..dda42fa 100644 --- a/app/src/main/java/com/example/vdcscore/ui/definicoes/ContaActivity.java +++ b/app/src/main/java/com/example/vdcscore/ui/definicoes/ContaActivity.java @@ -193,32 +193,13 @@ public class ContaActivity extends AppCompatActivity { } private void loadProfileImage(String imageUrl) { - new Thread(() -> { - InputStream input = null; - try { - java.net.URL url = new java.net.URL(imageUrl); - java.net.HttpURLConnection connection = (java.net.HttpURLConnection) url.openConnection(); - connection.setDoInput(true); - connection.connect(); - input = connection.getInputStream(); - Bitmap bitmap = BitmapFactory.decodeStream(input); - runOnUiThread(() -> { - if (bitmap != null && imageProfile != null) { - imageProfile.setImageBitmap(bitmap); - } - }); - } catch (Exception e) { - runOnUiThread(() -> loadProfileImageFromStorage()); - } finally { - if (input != null) { - try { - input.close(); - } catch (Exception e) { - // Ignorar erro ao fechar - } - } - } - }).start(); + if (imageUrl == null || imageProfile == null) return; + Glide.with(this) + .load(imageUrl) + .placeholder(R.mipmap.ic_launcher_round) + .error(R.mipmap.ic_launcher) + .circleCrop() + .into(imageProfile); } private void loadProfileImageFromStorage() { diff --git a/app/src/main/java/com/example/vdcscore/ui/gallery/GalleryFragment.java b/app/src/main/java/com/example/vdcscore/ui/gallery/GalleryFragment.java index 24a6874..bc3e02d 100644 --- a/app/src/main/java/com/example/vdcscore/ui/gallery/GalleryFragment.java +++ b/app/src/main/java/com/example/vdcscore/ui/gallery/GalleryFragment.java @@ -50,6 +50,7 @@ public class GalleryFragment extends Fragment { mDatabase.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { + if (binding == null) return; List matchdays = new ArrayList<>(); for (DataSnapshot postSnapshot : snapshot.getChildren()) { Matchday matchday = new Matchday(); diff --git a/app/src/main/java/com/example/vdcscore/ui/home/HomeFragment.java b/app/src/main/java/com/example/vdcscore/ui/home/HomeFragment.java index 563130b..51eca7d 100644 --- a/app/src/main/java/com/example/vdcscore/ui/home/HomeFragment.java +++ b/app/src/main/java/com/example/vdcscore/ui/home/HomeFragment.java @@ -61,45 +61,49 @@ public class HomeFragment extends Fragment { } private void fetchStandings() { - mDatabase = FirebaseDatabase.getInstance().getReference("classificacoes").child(currentEscalao); - - // Remove previous listener to avoid duplicate data or leaks - if (mValueEventListener != null) { + // Remove previous listener from the PREVIOUS path + if (mDatabase != null && mValueEventListener != null) { mDatabase.removeEventListener(mValueEventListener); } + mDatabase = FirebaseDatabase.getInstance().getReference("classificacoes").child(currentEscalao); + mValueEventListener = new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { + if (binding == null) return; + List teams = new ArrayList<>(); for (DataSnapshot postSnapshot : snapshot.getChildren()) { - Team team = postSnapshot.getValue(Team.class); - if (team != null) { - // If ID is missing, set it from the key (although team_id comes from json usually) - if (team.getTeam_id() == null) { - team.setTeam_id(postSnapshot.getKey()); + try { + Team team = postSnapshot.getValue(Team.class); + if (team != null) { + if (team.getTeam_id() == null) { + team.setTeam_id(postSnapshot.getKey()); + } + teams.add(team); } - teams.add(team); + } catch (Exception e) { + e.printStackTrace(); } } - // Sort properly (JSON might already be sorted by "posicao", but we sort by points and GD just in case) - Collections.sort(teams, new Comparator() { - @Override - public int compare(Team t1, Team t2) { - if (t1.getPontos() != t2.getPontos()) { - return t2.getPontos() - t1.getPontos(); // Descending points - } - return t2.getDiferenca_golos() - t1.getDiferenca_golos(); // Descending GD + // Sort properly + Collections.sort(teams, (t1, t2) -> { + if (t1.getPontos() != t2.getPontos()) { + return t2.getPontos() - t1.getPontos(); } + return t2.getDiferenca_golos() - t1.getDiferenca_golos(); }); - adapter.setTeams(teams); + if (adapter != null) { + adapter.setTeams(teams); + } } @Override public void onCancelled(@NonNull DatabaseError error) { - if (getContext() != null) { + if (getContext() != null && binding != null) { Toast.makeText(getContext(), "Erro ao carregar classificação: " + error.getMessage(), Toast.LENGTH_SHORT).show(); } diff --git a/app/src/main/java/com/example/vdcscore/ui/home/StandingsAdapter.java b/app/src/main/java/com/example/vdcscore/ui/home/StandingsAdapter.java index 4075ae1..e7c8bab 100644 --- a/app/src/main/java/com/example/vdcscore/ui/home/StandingsAdapter.java +++ b/app/src/main/java/com/example/vdcscore/ui/home/StandingsAdapter.java @@ -39,6 +39,7 @@ public class StandingsAdapter extends RecyclerView.Adapter { + if (binding == null) return; GameAdapter adapter = new GameAdapter(games, game -> { gameViewModel.selectGame(game); Navigation.findNavController(root).navigate(R.id.action_nav_live_games_to_nav_live_game_detail);