From a5f1189cb54a1832f0a3872a4963c6f2f1df4de0 Mon Sep 17 00:00:00 2001 From: santi Date: Wed, 21 May 2025 17:16:38 +0200 Subject: [PATCH] =?UTF-8?q?Funcionamiento=20compelto=20de=20las=20clases?= =?UTF-8?q?=20profile=20y=20de=20anime=20y=20manga=20donde=20se=20a=C3=B1a?= =?UTF-8?q?de=20y=20se=20borran=20sin=20ningun=20problema!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java.zip | Bin 54082 -> 53672 bytes .../santiparra/yomitrack/api/ApiService.java | 13 +-- .../yomitrack/model/UserStatsResponse.java | 4 +- .../fragments/addanime/AddAnimeFragment.java | 14 +-- .../fragments/addmanga/AddMangaFragment.java | 14 +-- .../fragments/anime_list/FragmentAnime.java | 19 ++-- .../editanime/EditAnimeFragment.java | 38 +++++--- .../editmanga/EditMangaFragment.java | 39 +++++--- .../fragments/manga_list/FragmentManga.java | 18 ++-- .../ui/fragments/profile/FragmentProfile.java | 84 +++++++++++++----- app/src/main/res.zip | Bin 11139511 -> 11139555 bytes app/src/main/res/drawable/progress_bar.xml | 10 +-- app/src/main/res/layout/item_stat_bar.xml | 6 +- 13 files changed, 170 insertions(+), 89 deletions(-) diff --git a/app/src/main/java.zip b/app/src/main/java.zip index bb06bcd103c6349216fc45a0b29297284f0c88cb..f3d60584c1735a2e6a3f5074ad70192210f10a8b 100644 GIT binary patch delta 23132 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 delta 23218 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 updateAnime(@Path("id") int animeId, @Body AnimeEntity anime); + Call updateAnime(@Path("id") int animeId, @Body AnimeEntity anime); @DELETE("anime/delete/{id}") - Call deleteAnime(@Path("id") int id); + Call deleteAnime(@Path("id") int id); // ---------------- Manga ---------------- @POST("manga/add") @@ -69,15 +70,15 @@ public interface ApiService { ); @PUT("manga/{id}") - Call updateManga(@Path("id") int mangaId, @Body MangaEntity manga); + Call updateManga(@Path("id") int mangaId, @Body MangaEntity manga); @DELETE("manga/delete/{id}") - Call deleteManga(@Path("id") int id); + Call deleteManga(@Path("id") int id); // ---------------- Activity ------------------- - @GET("user/{id}/stats") - Call>> getUserStats(@Path("id") int userId); + @GET("users/{id}/stats") + Call getUserStats(@Path("id") int userId); @GET("api/activity/list/{userId}") Call> getActivityLog(@Path("userId") int userId); diff --git a/app/src/main/java/com/santiparra/yomitrack/model/UserStatsResponse.java b/app/src/main/java/com/santiparra/yomitrack/model/UserStatsResponse.java index 7788821..127b353 100644 --- a/app/src/main/java/com/santiparra/yomitrack/model/UserStatsResponse.java +++ b/app/src/main/java/com/santiparra/yomitrack/model/UserStatsResponse.java @@ -5,10 +5,10 @@ import java.util.Map; public class UserStatsResponse { - @SerializedName("anime") + @SerializedName("animeStats") private Map animeStats; - @SerializedName("manga") + @SerializedName("mangaStats") private Map mangaStats; public Map getAnimeStats() { diff --git a/app/src/main/java/com/santiparra/yomitrack/ui/fragments/addanime/AddAnimeFragment.java b/app/src/main/java/com/santiparra/yomitrack/ui/fragments/addanime/AddAnimeFragment.java index 4047544..86e9a5a 100644 --- a/app/src/main/java/com/santiparra/yomitrack/ui/fragments/addanime/AddAnimeFragment.java +++ b/app/src/main/java/com/santiparra/yomitrack/ui/fragments/addanime/AddAnimeFragment.java @@ -61,8 +61,8 @@ public class AddAnimeFragment extends Fragment { searchResults.setLayoutManager(new LinearLayoutManager(getContext())); api = ApiClient.getClient().create(ApiService.class); - SharedPreferences prefs = requireContext().getSharedPreferences("app_prefs", Context.MODE_PRIVATE); - userId = prefs.getInt("current_user_id", -1); + SharedPreferences prefs = requireContext().getSharedPreferences("user_session", Context.MODE_PRIVATE); + userId = prefs.getInt("user_id", -1); setupSpinners(); setupRecycler(); @@ -125,7 +125,8 @@ public class AddAnimeFragment extends Fragment { try { score = Integer.parseInt(scoreEditText.getText().toString()); progress = Integer.parseInt(progressEditText.getText().toString()); - } catch (NumberFormatException ignored) {} + } catch (NumberFormatException ignored) { + } AnimeEntity anime = new AnimeEntity(); anime.setUserId(userId); @@ -163,9 +164,12 @@ public class AddAnimeFragment extends Fragment { api.postActivity(actividad).enqueue(new Callback<>() { @Override - public void onResponse(Call call, Response response) {} + public void onResponse(Call call, Response response) { + } + @Override - public void onFailure(Call call, Throwable t) {} + public void onFailure(Call call, Throwable t) { + } }); } } diff --git a/app/src/main/java/com/santiparra/yomitrack/ui/fragments/addmanga/AddMangaFragment.java b/app/src/main/java/com/santiparra/yomitrack/ui/fragments/addmanga/AddMangaFragment.java index 62161ed..fc38cfb 100644 --- a/app/src/main/java/com/santiparra/yomitrack/ui/fragments/addmanga/AddMangaFragment.java +++ b/app/src/main/java/com/santiparra/yomitrack/ui/fragments/addmanga/AddMangaFragment.java @@ -59,8 +59,8 @@ public class AddMangaFragment extends Fragment { searchResults.setLayoutManager(new LinearLayoutManager(getContext())); api = ApiClient.getClient().create(ApiService.class); - SharedPreferences prefs = requireContext().getSharedPreferences("app_prefs", Context.MODE_PRIVATE); - userId = prefs.getInt("current_user_id", -1); + SharedPreferences prefs = requireContext().getSharedPreferences("user_session", Context.MODE_PRIVATE); + userId = prefs.getInt("user_id", -1); setupSpinners(); setupRecycler(); @@ -123,7 +123,8 @@ public class AddMangaFragment extends Fragment { try { score = Integer.parseInt(scoreEditText.getText().toString()); progress = Integer.parseInt(progressEditText.getText().toString()); - } catch (NumberFormatException ignored) {} + } catch (NumberFormatException ignored) { + } MangaEntity manga = new MangaEntity(); manga.setUserId(userId); @@ -161,9 +162,12 @@ public class AddMangaFragment extends Fragment { api.postActivity(actividad).enqueue(new Callback<>() { @Override - public void onResponse(Call call, Response response) {} + public void onResponse(Call call, Response response) { + } + @Override - public void onFailure(Call call, Throwable t) {} + public void onFailure(Call call, Throwable t) { + } }); } } diff --git a/app/src/main/java/com/santiparra/yomitrack/ui/fragments/anime_list/FragmentAnime.java b/app/src/main/java/com/santiparra/yomitrack/ui/fragments/anime_list/FragmentAnime.java index 48e06c7..5ffd923 100644 --- a/app/src/main/java/com/santiparra/yomitrack/ui/fragments/anime_list/FragmentAnime.java +++ b/app/src/main/java/com/santiparra/yomitrack/ui/fragments/anime_list/FragmentAnime.java @@ -5,6 +5,7 @@ import android.content.SharedPreferences; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -27,6 +28,7 @@ import com.santiparra.yomitrack.api.ApiClient; import com.santiparra.yomitrack.api.ApiService; import com.santiparra.yomitrack.db.entities.AnimeEntity; import com.santiparra.yomitrack.model.AnimePageResponse; +import com.santiparra.yomitrack.model.ApiResponse; import com.santiparra.yomitrack.model.adapters.anime_adapter.AnimeAdapter; import com.santiparra.yomitrack.ui.fragments.addanime.AddAnimeFragment; import com.santiparra.yomitrack.ui.fragments.editanime.EditAnimeFragment; @@ -72,8 +74,8 @@ public class FragmentAnime extends Fragment { btnViewNormal = view.findViewById(R.id.btnViewNormal); btnViewLarge = view.findViewById(R.id.btnViewLarge); FloatingActionButton fabAdd = view.findViewById(R.id.fabAddAnime); - editSearch = view.findViewById(R.id.editSearch); + editSearch.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { @@ -155,9 +157,7 @@ public class FragmentAnime extends Fragment { recyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); } - adapter = new AnimeAdapter(animeList, viewType, - this::showEditDialog, - this::deleteAnime); + adapter = new AnimeAdapter(animeList, viewType, this::showEditDialog, this::deleteAnime); recyclerView.setAdapter(adapter); } @@ -170,13 +170,14 @@ public class FragmentAnime extends Fragment { } private void deleteAnime(AnimeEntity anime) { - api.deleteAnime(anime.getId()).enqueue(new Callback() { + api.deleteAnime(anime.getId()).enqueue(new Callback() { @Override - public void onResponse(Call call, Response response) { + public void onResponse(Call call, Response response) { if (!isAdded()) return; if (response.isSuccessful()) { - Toast.makeText(requireContext(), "Anime eliminado", Toast.LENGTH_SHORT).show(); + String msg = response.body() != null ? response.body().getMessage() : "Anime eliminado"; + Toast.makeText(requireContext(), msg, Toast.LENGTH_SHORT).show(); currentPage = 1; animeList.clear(); loadMoreAnimes(currentPage); @@ -186,7 +187,8 @@ public class FragmentAnime extends Fragment { } @Override - public void onFailure(Call call, Throwable t) { + public void onFailure(Call call, Throwable t) { + Log.e("API_RESPONSE", "Fallo al eliminar: " + t.getMessage(), t); if (isAdded()) { Toast.makeText(requireContext(), "Fallo de conexión", Toast.LENGTH_SHORT).show(); } @@ -215,6 +217,7 @@ public class FragmentAnime extends Fragment { @Override public void onFailure(Call call, Throwable t) { + Log.e("API_RESPONSE", "Error cargando más animes: " + t.getMessage(), t); isLoading = false; if (isAdded()) { Toast.makeText(requireContext(), "Error al cargar más animes", Toast.LENGTH_SHORT).show(); diff --git a/app/src/main/java/com/santiparra/yomitrack/ui/fragments/editanime/EditAnimeFragment.java b/app/src/main/java/com/santiparra/yomitrack/ui/fragments/editanime/EditAnimeFragment.java index b370cfe..60b3f09 100644 --- a/app/src/main/java/com/santiparra/yomitrack/ui/fragments/editanime/EditAnimeFragment.java +++ b/app/src/main/java/com/santiparra/yomitrack/ui/fragments/editanime/EditAnimeFragment.java @@ -3,6 +3,7 @@ package com.santiparra.yomitrack.ui.fragments.editanime; import android.app.AlertDialog; import android.content.Context; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -16,6 +17,7 @@ import com.santiparra.yomitrack.R; import com.santiparra.yomitrack.api.ApiClient; import com.santiparra.yomitrack.api.ApiService; import com.santiparra.yomitrack.db.entities.AnimeEntity; +import com.santiparra.yomitrack.model.ApiResponse; import retrofit2.Call; import retrofit2.Callback; @@ -54,10 +56,8 @@ public class EditAnimeFragment extends Fragment { api = ApiClient.getClient().create(ApiService.class); - // Llenar campos fillFields(); - // Spinner datos String[] statusArray = getResources().getStringArray(R.array.anime_status_array); String[] typeArray = getResources().getStringArray(R.array.anime_type_array); @@ -114,7 +114,7 @@ public class EditAnimeFragment extends Fragment { return; } - int score = 0, progress = 0; + int score, progress; try { score = Integer.parseInt(scoreStr); progress = Integer.parseInt(progressStr); @@ -132,12 +132,17 @@ public class EditAnimeFragment extends Fragment { anime.setStatus(status); anime.setType(type); - api.updateAnime(anime.getId(), anime).enqueue(new Callback() { + api.updateAnime(anime.getId(), anime).enqueue(new Callback() { @Override - public void onResponse(Call call, Response response) { + public void onResponse(Call call, Response response) { + Log.d("API_RESPONSE", "onResponse ejecutado: " + response.body()); + + if (!isAdded()) return; + if (response.isSuccessful()) { - Toast.makeText(requireContext(), "Anime actualizado", Toast.LENGTH_SHORT).show(); - requireContext().getSharedPreferences("user_profile", Context.MODE_PRIVATE) + String message = response.body() != null ? response.body().getMessage() : "Anime actualizado"; + Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show(); + requireContext().getSharedPreferences("user_session", Context.MODE_PRIVATE) .edit().putBoolean("refresh_profile", true).apply(); requireActivity().getSupportFragmentManager().popBackStack(); } else { @@ -146,19 +151,24 @@ public class EditAnimeFragment extends Fragment { } @Override - public void onFailure(Call call, Throwable t) { + public void onFailure(Call call, Throwable t) { + Log.e("API_RESPONSE", "onFailure ejecutado: " + t.getMessage(), t); + if (!isAdded()) return; Toast.makeText(requireContext(), "Fallo en la conexión", Toast.LENGTH_SHORT).show(); } }); } private void deleteAnime() { - api.deleteAnime(anime.getId()).enqueue(new Callback() { + api.deleteAnime(anime.getId()).enqueue(new Callback() { @Override - public void onResponse(Call call, Response response) { + public void onResponse(Call call, Response response) { + if (!isAdded()) return; + if (response.isSuccessful()) { - Toast.makeText(requireContext(), "Anime eliminado", Toast.LENGTH_SHORT).show(); - requireContext().getSharedPreferences("user_profile", Context.MODE_PRIVATE) + String message = response.body() != null ? response.body().getMessage() : "Anime eliminado"; + Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show(); + requireContext().getSharedPreferences("user_session", Context.MODE_PRIVATE) .edit().putBoolean("refresh_profile", true).apply(); requireActivity().getSupportFragmentManager().popBackStack(); } else { @@ -167,7 +177,9 @@ public class EditAnimeFragment extends Fragment { } @Override - public void onFailure(Call call, Throwable t) { + public void onFailure(Call call, Throwable t) { + Log.e("API_RESPONSE", "onFailure eliminar: " + t.getMessage(), t); + if (!isAdded()) return; Toast.makeText(requireContext(), "Fallo en la conexión", Toast.LENGTH_SHORT).show(); } }); diff --git a/app/src/main/java/com/santiparra/yomitrack/ui/fragments/editmanga/EditMangaFragment.java b/app/src/main/java/com/santiparra/yomitrack/ui/fragments/editmanga/EditMangaFragment.java index ce8caac..2ff8c45 100644 --- a/app/src/main/java/com/santiparra/yomitrack/ui/fragments/editmanga/EditMangaFragment.java +++ b/app/src/main/java/com/santiparra/yomitrack/ui/fragments/editmanga/EditMangaFragment.java @@ -3,6 +3,7 @@ package com.santiparra.yomitrack.ui.fragments.editmanga; import android.app.AlertDialog; import android.content.Context; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -16,6 +17,7 @@ import com.santiparra.yomitrack.R; import com.santiparra.yomitrack.api.ApiClient; import com.santiparra.yomitrack.api.ApiService; import com.santiparra.yomitrack.db.entities.MangaEntity; +import com.santiparra.yomitrack.model.ApiResponse; import retrofit2.Call; import retrofit2.Callback; @@ -40,8 +42,7 @@ public class EditMangaFragment extends Fragment { } @Override - public void onViewCreated(@NonNull View view, - @Nullable Bundle savedInstanceState) { + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); editTextTitle = view.findViewById(R.id.editTextMangaTitle); @@ -112,7 +113,7 @@ public class EditMangaFragment extends Fragment { return; } - int score = 0, progress = 0; + int score, progress; try { score = Integer.parseInt(scoreStr); progress = Integer.parseInt(progressStr); @@ -130,12 +131,17 @@ public class EditMangaFragment extends Fragment { manga.setStatus(status); manga.setType(type); - api.updateManga(manga.getId(), manga).enqueue(new Callback() { + api.updateManga(manga.getId(), manga).enqueue(new Callback() { @Override - public void onResponse(Call call, Response response) { + public void onResponse(Call call, Response response) { + Log.d("API_RESPONSE", "onResponse ejecutado: " + response.body()); + + if (!isAdded()) return; + if (response.isSuccessful()) { - Toast.makeText(requireContext(), "Manga actualizado", Toast.LENGTH_SHORT).show(); - requireContext().getSharedPreferences("user_profile", Context.MODE_PRIVATE) + String message = response.body() != null ? response.body().getMessage() : "Manga actualizado"; + Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show(); + requireContext().getSharedPreferences("user_session", Context.MODE_PRIVATE) .edit().putBoolean("refresh_profile", true).apply(); requireActivity().getSupportFragmentManager().popBackStack(); } else { @@ -144,19 +150,24 @@ public class EditMangaFragment extends Fragment { } @Override - public void onFailure(Call call, Throwable t) { + public void onFailure(Call call, Throwable t) { + Log.e("API_RESPONSE", "onFailure ejecutado: " + t.getMessage(), t); + if (!isAdded()) return; Toast.makeText(requireContext(), "Fallo en la conexión", Toast.LENGTH_SHORT).show(); } }); } private void deleteManga() { - api.deleteManga(manga.getId()).enqueue(new Callback() { + api.deleteManga(manga.getId()).enqueue(new Callback() { @Override - public void onResponse(Call call, Response response) { + public void onResponse(Call call, Response response) { + if (!isAdded()) return; + if (response.isSuccessful()) { - Toast.makeText(requireContext(), "Manga eliminado", Toast.LENGTH_SHORT).show(); - requireContext().getSharedPreferences("user_profile", Context.MODE_PRIVATE) + String message = response.body() != null ? response.body().getMessage() : "Manga eliminado"; + Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show(); + requireContext().getSharedPreferences("user_session", Context.MODE_PRIVATE) .edit().putBoolean("refresh_profile", true).apply(); requireActivity().getSupportFragmentManager().popBackStack(); } else { @@ -165,7 +176,9 @@ public class EditMangaFragment extends Fragment { } @Override - public void onFailure(Call call, Throwable t) { + public void onFailure(Call call, Throwable t) { + Log.e("API_RESPONSE", "onFailure eliminar: " + t.getMessage(), t); + if (!isAdded()) return; Toast.makeText(requireContext(), "Fallo en la conexión", Toast.LENGTH_SHORT).show(); } }); diff --git a/app/src/main/java/com/santiparra/yomitrack/ui/fragments/manga_list/FragmentManga.java b/app/src/main/java/com/santiparra/yomitrack/ui/fragments/manga_list/FragmentManga.java index a216738..b9e74e3 100644 --- a/app/src/main/java/com/santiparra/yomitrack/ui/fragments/manga_list/FragmentManga.java +++ b/app/src/main/java/com/santiparra/yomitrack/ui/fragments/manga_list/FragmentManga.java @@ -5,6 +5,7 @@ import android.content.SharedPreferences; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -27,6 +28,7 @@ import com.santiparra.yomitrack.api.ApiClient; import com.santiparra.yomitrack.api.ApiService; import com.santiparra.yomitrack.db.entities.MangaEntity; import com.santiparra.yomitrack.model.MangaPageResponse; +import com.santiparra.yomitrack.model.ApiResponse; import com.santiparra.yomitrack.model.adapters.manga_adapter.MangaAdapter; import com.santiparra.yomitrack.ui.fragments.addmanga.AddMangaFragment; import com.santiparra.yomitrack.ui.fragments.editmanga.EditMangaFragment; @@ -48,7 +50,7 @@ public class FragmentManga extends Fragment { private ImageButton btnViewCompact, btnViewNormal, btnViewLarge; private int currentViewType = MangaAdapter.VIEW_NORMAL; - private List mangaList = new ArrayList<>(); + private final List mangaList = new ArrayList<>(); private boolean isLoading = false; private int currentPage = 1; @@ -91,7 +93,6 @@ public class FragmentManga extends Fragment { return; } - fabAdd.setOnClickListener(v -> requireActivity().getSupportFragmentManager() .beginTransaction() .replace(R.id.frame_layout, new AddMangaFragment()) @@ -168,12 +169,14 @@ public class FragmentManga extends Fragment { } private void deleteManga(MangaEntity manga) { - api.deleteManga(manga.getId()).enqueue(new Callback() { + api.deleteManga(manga.getId()).enqueue(new Callback() { @Override - public void onResponse(Call call, Response response) { + public void onResponse(Call call, Response response) { if (!isAdded()) return; + if (response.isSuccessful()) { - Toast.makeText(requireContext(), "Manga eliminado", Toast.LENGTH_SHORT).show(); + String msg = response.body() != null ? response.body().getMessage() : "Manga eliminado"; + Toast.makeText(requireContext(), msg, Toast.LENGTH_SHORT).show(); currentPage = 1; mangaList.clear(); loadMoreMangas(currentPage); @@ -183,7 +186,8 @@ public class FragmentManga extends Fragment { } @Override - public void onFailure(Call call, Throwable t) { + public void onFailure(Call call, Throwable t) { + Log.e("API_RESPONSE", "Fallo al eliminar manga: " + t.getMessage(), t); if (isAdded()) { Toast.makeText(requireContext(), "Fallo de conexión", Toast.LENGTH_SHORT).show(); } @@ -197,6 +201,7 @@ public class FragmentManga extends Fragment { @Override public void onResponse(Call call, Response response) { if (!isAdded()) return; + if (response.isSuccessful() && response.body() != null) { List nuevos = response.body().getData(); mangaList.addAll(nuevos); @@ -209,6 +214,7 @@ public class FragmentManga extends Fragment { @Override public void onFailure(Call call, Throwable t) { + Log.e("API_RESPONSE", "Error al cargar mangas: " + t.getMessage(), t); isLoading = false; if (isAdded()) { Toast.makeText(requireContext(), "Error al cargar más mangas", Toast.LENGTH_SHORT).show(); diff --git a/app/src/main/java/com/santiparra/yomitrack/ui/fragments/profile/FragmentProfile.java b/app/src/main/java/com/santiparra/yomitrack/ui/fragments/profile/FragmentProfile.java index b3a2590..59f189f 100644 --- a/app/src/main/java/com/santiparra/yomitrack/ui/fragments/profile/FragmentProfile.java +++ b/app/src/main/java/com/santiparra/yomitrack/ui/fragments/profile/FragmentProfile.java @@ -2,24 +2,22 @@ package com.santiparra.yomitrack.ui.fragments.profile; import android.content.Context; import android.content.SharedPreferences; +import android.content.res.ColorStateList; +import android.graphics.Color; import android.os.Bundle; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.ProgressBar; -import android.widget.TextView; -import android.widget.Toast; +import android.widget.*; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; + import com.santiparra.yomitrack.R; import com.santiparra.yomitrack.api.ApiClient; import com.santiparra.yomitrack.api.ApiService; +import com.santiparra.yomitrack.model.UserStatsResponse; import com.santiparra.yomitrack.utils.ActivityLog; import org.json.JSONObject; @@ -42,11 +40,12 @@ public class FragmentProfile extends Fragment { private ApiService api; private int userId; private String username; + private View view; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_profile, container, false); + view = inflater.inflate(R.layout.fragment_profile, container, false); avatarImage = view.findViewById(R.id.avatarImage); coverImage = view.findViewById(R.id.coverImage); @@ -59,12 +58,11 @@ public class FragmentProfile extends Fragment { mangaStatsContainer = view.findViewById(R.id.mangaStatsContainer); activityContainer = view.findViewById(R.id.activityContainer); - SharedPreferences prefs = requireContext().getSharedPreferences("user_prefs", Context.MODE_PRIVATE); - userId = prefs.getInt("userId", -1); + SharedPreferences prefs = requireContext().getSharedPreferences("user_session", Context.MODE_PRIVATE); + userId = prefs.getInt("user_id", -1); username = prefs.getString("username", "Usuario"); api = ApiClient.getClient().create(ApiService.class); - usernameText.setText(username); loadStats(); @@ -76,26 +74,43 @@ public class FragmentProfile extends Fragment { return view; } - private void loadStats() { - api.getUserStats(userId).enqueue(new Callback>>() { - @Override - public void onResponse(Call>> call, Response>> response) { - if (response.isSuccessful() && response.body() != null) { - Map animeStats = response.body().get("animeStats"); - Map mangaStats = response.body().get("mangaStats"); + @Override + public void onResume() { + super.onResume(); + loadStats(); + loadActivity(); + } - populateStats(animeStatsContainer, animeStats); - populateStats(mangaStatsContainer, mangaStats); + private void loadStats() { + api.getUserStats(userId).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful() && response.body() != null) { + populateStats(animeStatsContainer, response.body().getAnimeStats()); + populateStats(mangaStatsContainer, response.body().getMangaStats()); + } else { + Toast.makeText(getContext(), "Error al obtener estadísticas", Toast.LENGTH_SHORT).show(); } } @Override - public void onFailure(Call>> call, Throwable t) {} + public void onFailure(Call call, Throwable t) { + Toast.makeText(getContext(), "Error de conexión al cargar stats", Toast.LENGTH_SHORT).show(); + } }); } private void populateStats(LinearLayout container, Map stats) { container.removeAllViews(); + + if (stats == null || stats.isEmpty()) { + TextView noData = new TextView(getContext()); + noData.setText("No hay estadísticas disponibles"); + noData.setPadding(16, 8, 16, 8); + container.addView(noData); + return; + } + int total = 0; for (int count : stats.values()) total += count; @@ -108,10 +123,32 @@ public class FragmentProfile extends Fragment { label.setText(String.format(Locale.getDefault(), "%s • %d", entry.getKey(), entry.getValue())); int progress = total > 0 ? (entry.getValue() * 100 / total) : 0; bar.setProgress(progress); + + // Usar método compatible para aplicar color de estado + int color = getColorForStatus(entry.getKey()); + bar.setProgressTintList(ColorStateList.valueOf(color)); + container.addView(statView); } } + private int getColorForStatus(String status) { + switch (status.toLowerCase(Locale.ROOT)) { + case "watching": + return requireContext().getColor(R.color.status_watching); + case "completed": + return requireContext().getColor(R.color.status_completed); + case "paused": + return requireContext().getColor(R.color.status_paused); + case "dropped": + return requireContext().getColor(R.color.status_dropped); + case "planning": + return requireContext().getColor(R.color.status_planning); + default: + return requireContext().getColor(R.color.gray); + } + } + private void loadActivity() { api.getActivityLog(userId).enqueue(new Callback>() { @Override @@ -132,7 +169,9 @@ public class FragmentProfile extends Fragment { } @Override - public void onFailure(Call> call, Throwable t) {} + public void onFailure(Call> call, Throwable t) { + Toast.makeText(getContext(), "Error al cargar actividad", Toast.LENGTH_SHORT).show(); + } }); } @@ -167,7 +206,6 @@ public class FragmentProfile extends Fragment { private void saveBiography() { String bio = editBiography.getText().toString().trim(); - // Aquí podrías guardar biografía en base de datos si se desea. Toast.makeText(getContext(), "Biografía guardada", Toast.LENGTH_SHORT).show(); } } diff --git a/app/src/main/res.zip b/app/src/main/res.zip index c0bdee5a2cfce9e2f4081bb217e407c370218db6..6d43580c3c84bee4da255b12c85a06c77b8ea01a 100644 GIT binary patch delta 4080 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 E0ItXTZU6uP delta 3983 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 - - + + - - + + - diff --git a/app/src/main/res/layout/item_stat_bar.xml b/app/src/main/res/layout/item_stat_bar.xml index 41506be..4cdcf33 100644 --- a/app/src/main/res/layout/item_stat_bar.xml +++ b/app/src/main/res/layout/item_stat_bar.xml @@ -20,8 +20,10 @@ android:id="@+id/statProgressBar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" - android:layout_height="10dp" + android:layout_height="16dp" android:max="100" android:progress="0" - android:progressDrawable="@drawable/progress_bar" /> + android:progressDrawable="@drawable/progress_bar" + android:layout_marginTop="4dp" + android:layout_marginBottom="8dp"/>