diff --git a/app/src/main/java.zip b/app/src/main/java.zip index bb06bcd..f3d6058 100644 Binary files a/app/src/main/java.zip and b/app/src/main/java.zip differ diff --git a/app/src/main/java/com/santiparra/yomitrack/api/ApiService.java b/app/src/main/java/com/santiparra/yomitrack/api/ApiService.java index c143d55..782cf3f 100644 --- a/app/src/main/java/com/santiparra/yomitrack/api/ApiService.java +++ b/app/src/main/java/com/santiparra/yomitrack/api/ApiService.java @@ -5,6 +5,7 @@ import com.santiparra.yomitrack.db.entities.MangaEntity; import com.santiparra.yomitrack.db.entities.UserEntity; import com.santiparra.yomitrack.model.AniListMedia; import com.santiparra.yomitrack.model.AnimePageResponse; +import com.santiparra.yomitrack.model.ApiResponse; import com.santiparra.yomitrack.model.LoginResponse; import com.santiparra.yomitrack.model.MangaPageResponse; import com.santiparra.yomitrack.model.RegisterResponse; @@ -49,10 +50,10 @@ public interface ApiService { ); @PUT("anime/{id}") - Call 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 c0bdee5..6d43580 100644 Binary files a/app/src/main/res.zip and b/app/src/main/res.zip differ diff --git a/app/src/main/res/drawable/progress_bar.xml b/app/src/main/res/drawable/progress_bar.xml index ca9bc83..3cc0b0b 100644 --- a/app/src/main/res/drawable/progress_bar.xml +++ b/app/src/main/res/drawable/progress_bar.xml @@ -1,20 +1,18 @@ - - - + + - - + + - 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"/>