diff --git a/app/src/main/java.zip b/app/src/main/java.zip index f3d6058..c6dbf95 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 5281b9a..a8a9c5d 100644 --- a/app/src/main/java/com/santiparra/yomitrack/api/ApiService.java +++ b/app/src/main/java/com/santiparra/yomitrack/api/ApiService.java @@ -7,6 +7,7 @@ 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.CommentModel; import com.santiparra.yomitrack.model.LoginResponse; import com.santiparra.yomitrack.model.MangaPageResponse; import com.santiparra.yomitrack.model.RegisterResponse; @@ -22,6 +23,7 @@ import retrofit2.Call; import retrofit2.http.Body; import retrofit2.http.DELETE; import retrofit2.http.GET; +import retrofit2.http.HTTP; import retrofit2.http.POST; import retrofit2.http.PUT; import retrofit2.http.Path; @@ -32,6 +34,7 @@ public interface ApiService { // ---------------- Usuario ---------------- @POST("users/register") Call registerUser(@Body UserEntity user); + @POST("users/login") Call loginUser(@Body UserEntity user); @@ -83,9 +86,28 @@ public interface ApiService { @GET("api/activity/list/{userId}") Call> getActivityLog(@Path("userId") int userId); + + @GET("api/activity/comments/{activityId}") + Call> getCommentsByActivity(@Path("activityId") int activityId); + + @GET("/api/activity/like/{userId}/{activityId}") + Call checkLike( + @Path("userId") int userId, + @Path("activityId") int activityId + ); + + @POST("api/activity/like") + Call postLike(@Body JsonObject body); + + @POST("api/activity/comment") + Call postComment(@Body JsonObject body); + @POST("api/activity/add") Call postActivity(@Body Map body); + @HTTP(method = "DELETE", path = "api/activity/like/remove", hasBody = true) + Call deleteLike(@Body JsonObject body); + // ---------------- AniList API ---------------- diff --git a/app/src/main/java/com/santiparra/yomitrack/model/RecentActivityModel.java b/app/src/main/java/com/santiparra/yomitrack/model/RecentActivityModel.java index 208bfca..2a11dfa 100644 --- a/app/src/main/java/com/santiparra/yomitrack/model/RecentActivityModel.java +++ b/app/src/main/java/com/santiparra/yomitrack/model/RecentActivityModel.java @@ -1,20 +1,35 @@ package com.santiparra.yomitrack.model; +import java.util.ArrayList; +import java.util.List; + /** * Modelo de actividad reciente para mostrar acciones de usuario. */ public class RecentActivityModel { + public int activityId; // ← agregar esto public String user; public String action; public String title; public String time; public String imageUrl; + public List comments = new ArrayList<>(); - public RecentActivityModel(String user, String action, String title, String time, String imageUrl) { + public RecentActivityModel(int activityId, String user, String action, String title, String time, String imageUrl) { + this.activityId = activityId; this.user = user; this.action = action; this.title = title; this.time = time; this.imageUrl = imageUrl; } + + public void addComment(CommentModel comment) { + comments.add(comment); + } + + public int getId() { + return activityId; + } } + diff --git a/app/src/main/java/com/santiparra/yomitrack/model/adapters/recentactivity_adapter/RecentActivityAdapter.java b/app/src/main/java/com/santiparra/yomitrack/model/adapters/recentactivity_adapter/RecentActivityAdapter.java index 0548603..a9fd1cb 100644 --- a/app/src/main/java/com/santiparra/yomitrack/model/adapters/recentactivity_adapter/RecentActivityAdapter.java +++ b/app/src/main/java/com/santiparra/yomitrack/model/adapters/recentactivity_adapter/RecentActivityAdapter.java @@ -3,16 +3,17 @@ package com.santiparra.yomitrack.model.adapters.recentactivity_adapter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageButton; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.TextView; - import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; - import com.bumptech.glide.Glide; import com.santiparra.yomitrack.R; +import com.santiparra.yomitrack.model.CommentDialog; +import com.santiparra.yomitrack.model.CommentModel; import com.santiparra.yomitrack.model.RecentActivityModel; - import java.util.List; public class RecentActivityAdapter extends RecyclerView.Adapter { @@ -41,6 +42,36 @@ public class RecentActivityAdapter extends RecyclerView.Adapter { + comment.liked = !comment.liked; + commentLike.setImageResource(comment.liked ? R.drawable.ic_heart_filled : R.drawable.ic_heart); + commentLike.setColorFilter(comment.liked + ? holder.itemView.getContext().getColor(R.color.pink) + : holder.itemView.getContext().getColor(R.color.textPrimary)); + }); + + holder.commentContainer.addView(commentView); + } + } } @Override @@ -48,9 +79,12 @@ public class RecentActivityAdapter extends RecyclerView.Adapter { + isLiked = !isLiked; + likeButton.setImageResource(isLiked ? R.drawable.ic_heart_filled : R.drawable.ic_heart); + likeButton.setColorFilter(isLiked + ? itemView.getContext().getColor(R.color.pink) + : itemView.getContext().getColor(R.color.textPrimary)); + }); + + commentButton.setOnClickListener(v -> { + RecentActivityModel activity = activityList.get(getAdapterPosition()); + int activityId = activity.getId(); + int userId = this.user.getId(); + + CommentDialog dialog = new CommentDialog(itemView.getContext(), userId, activityId, () -> {}); + dialog.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 cceeaec..30c7d8f 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 @@ -19,6 +19,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.ApiResponse; +import com.santiparra.yomitrack.ui.fragments.profile.FragmentProfile; import java.util.HashMap; import java.util.Map; @@ -146,7 +147,7 @@ public class EditAnimeFragment extends Fragment { if (response.isSuccessful()) { String message = response.body() != null ? response.body().getMessage() : "Anime actualizado"; Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show(); - registrarActividad(anime.getTitle()); + registrarActividad(anime.getTitle(), anime.getImageUrl()); requireContext().getSharedPreferences("user_session", Context.MODE_PRIVATE) .edit().putBoolean("refresh_profile", true).apply(); requireActivity().getSupportFragmentManager().popBackStack(); @@ -165,14 +166,15 @@ public class EditAnimeFragment extends Fragment { } private void deleteAnime() { + registrarActividadEliminacion(anime.getTitle(), anime.getImageUrl()); + api.deleteAnime(anime.getId()).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { if (!isAdded()) return; if (response.isSuccessful()) { - String message = response.body() != null ? response.body().getMessage() : "Anime eliminado"; - Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show(); + Toast.makeText(requireContext(), "Anime eliminado", Toast.LENGTH_SHORT).show(); requireContext().getSharedPreferences("user_session", Context.MODE_PRIVATE) .edit().putBoolean("refresh_profile", true).apply(); requireActivity().getSupportFragmentManager().popBackStack(); @@ -183,35 +185,59 @@ public class EditAnimeFragment extends Fragment { @Override 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(); } }); } - private void registrarActividad(String titulo) { - int userId = requireContext() - .getSharedPreferences("user_session", Context.MODE_PRIVATE) - .getInt("user_id", -1); - + private void registrarActividad(String titulo, String imagen) { + int userId = requireContext().getSharedPreferences("user_session", Context.MODE_PRIVATE).getInt("user_id", -1); if (userId == -1) return; Map actividad = new HashMap<>(); actividad.put("userId", userId); - actividad.put("action", "editó un anime"); + actividad.put("action", "update de un anime"); actividad.put("mediaTitle", titulo); - actividad.put("imageUrl", anime.getImageUrl()); + actividad.put("imageUrl", imagen); api.postActivity(actividad).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { - Log.d("ACTIVITY_EDIT", "Actividad registrada: " + response.code()); + Log.d("ACTIVITY_DELETE", "Actividad de edicion registrada"); } @Override public void onFailure(Call call, Throwable t) { - Log.e("ACTIVITY_EDIT", "Error al registrar actividad: " + t.getMessage(), t); + Log.e("ACTIVITY_DELETE", "Error al registrar actividad: " + t.getMessage(), t); + } + }); + } + + private void registrarActividadEliminacion(String titulo, String imagen) { + int userId = requireContext().getSharedPreferences("user_session", Context.MODE_PRIVATE).getInt("user_id", -1); + if (userId == -1) return; + + Map actividad = new HashMap<>(); + actividad.put("userId", userId); + actividad.put("action", "eliminó un anime"); + actividad.put("mediaTitle", titulo); + actividad.put("imageUrl", imagen); + + api.postActivity(actividad).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + Log.d("ACTIVITY_DELETE", "Actividad de eliminación registrada"); + + + if (getParentFragment() instanceof FragmentProfile) { + ((FragmentProfile) getParentFragment()).loadActivity(); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + Log.e("ACTIVITY_DELETE", "Error al registrar actividad: " + t.getMessage(), t); } }); } 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 e253e65..cdbddd1 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 @@ -19,6 +19,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.ApiResponse; +import com.santiparra.yomitrack.ui.fragments.profile.FragmentProfile; import java.util.HashMap; import java.util.Map; @@ -141,7 +142,7 @@ public class EditMangaFragment extends Fragment { if (response.isSuccessful() && response.body() != null) { Toast.makeText(requireContext(), response.body().getMessage(), Toast.LENGTH_SHORT).show(); - registrarActividad(manga.getTitle()); + registrarActividad(manga.getTitle(), manga.getImageUrl()); requireContext().getSharedPreferences("user_session", Context.MODE_PRIVATE) .edit().putBoolean("refresh_profile", true).apply(); requireActivity().getSupportFragmentManager().popBackStack(); @@ -159,13 +160,15 @@ public class EditMangaFragment extends Fragment { } private void deleteManga() { + registrarActividadEliminacionManga(manga.getTitle(), manga.getImageUrl()); + api.deleteManga(manga.getId()).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { if (!isAdded()) return; - if (response.isSuccessful() && response.body() != null) { - Toast.makeText(requireContext(), response.body().getMessage(), Toast.LENGTH_SHORT).show(); + if (response.isSuccessful()) { + Toast.makeText(requireContext(), "Manga eliminado", Toast.LENGTH_SHORT).show(); requireContext().getSharedPreferences("user_session", Context.MODE_PRIVATE) .edit().putBoolean("refresh_profile", true).apply(); requireActivity().getSupportFragmentManager().popBackStack(); @@ -182,29 +185,55 @@ public class EditMangaFragment extends Fragment { }); } - private void registrarActividad(String titulo) { - int userId = requireContext() - .getSharedPreferences("user_session", Context.MODE_PRIVATE) - .getInt("user_id", -1); - + private void registrarActividad(String titulo, String imagen) { + int userId = requireContext().getSharedPreferences("user_session", Context.MODE_PRIVATE).getInt("user_id", -1); if (userId == -1) return; Map actividad = new HashMap<>(); actividad.put("userId", userId); - actividad.put("action", "editó un manga"); + actividad.put("action", "update de un manga"); actividad.put("mediaTitle", titulo); - actividad.put("imageUrl", manga.getImageUrl()); + actividad.put("imageUrl", imagen); api.postActivity(actividad).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { - Log.d("ACTIVITY_EDIT_MANGA", "Actividad registrada: " + response.code()); + Log.d("ACTIVITY_DELETE", "Actividad de edicion registrada"); } @Override public void onFailure(Call call, Throwable t) { - Log.e("ACTIVITY_EDIT_MANGA", "Error al registrar actividad: " + t.getMessage(), t); + Log.e("ACTIVITY_DELETE", "Error al registrar actividad: " + t.getMessage(), t); } }); } + + private void registrarActividadEliminacionManga(String titulo, String imagen) { + int userId = requireContext().getSharedPreferences("user_session", Context.MODE_PRIVATE).getInt("user_id", -1); + if (userId == -1) return; + + Map actividad = new HashMap<>(); + actividad.put("userId", userId); + actividad.put("action", "eliminó un manga"); + actividad.put("mediaTitle", titulo); + actividad.put("imageUrl", imagen); + + api.postActivity(actividad).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + Log.d("ACTIVITY_DELETE", "Actividad de eliminación registrada"); + + if (getParentFragment() instanceof FragmentProfile) { + ((FragmentProfile) getParentFragment()).loadActivity(); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + Log.e("ACTIVITY_DELETE", "Error al registrar actividad: " + t.getMessage(), t); + } + }); + } + + } diff --git a/app/src/main/java/com/santiparra/yomitrack/ui/fragments/home/FragmentHome.java b/app/src/main/java/com/santiparra/yomitrack/ui/fragments/home/FragmentHome.java index f36f5d0..509df28 100644 --- a/app/src/main/java/com/santiparra/yomitrack/ui/fragments/home/FragmentHome.java +++ b/app/src/main/java/com/santiparra/yomitrack/ui/fragments/home/FragmentHome.java @@ -76,8 +76,8 @@ public class FragmentHome extends Fragment { activityRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); fullRecentActivity.addAll(Arrays.asList( - new RecentActivityModel("Midca", "Read chapters 1 - 60 of", "Choujun! Choujou Senpai", "4 minutes ago", "https://i.imgur.com/7tZ0h8R.jpg"), - new RecentActivityModel("prtrncyon", "Scored 9/10 on", "Chainsaw Man", "12 hours ago", "https://cdn.myanimelist.net/images/manga/2/253146.jpg") + //new RecentActivityModel("Midca", "Read chapters 1 - 60 of", "Choujun! Choujou Senpai", "4 minutes ago", "https://i.imgur.com/7tZ0h8R.jpg"), + //new RecentActivityModel("prtrncyon", "Scored 9/10 on", "Chainsaw Man", "12 hours ago", "https://cdn.myanimelist.net/images/manga/2/253146.jpg") // ... más datos simulados aquí )); diff --git a/app/src/main/java/com/santiparra/yomitrack/ui/fragments/login/LoginFragment.java b/app/src/main/java/com/santiparra/yomitrack/ui/fragments/login/LoginFragment.java index d39395c..7bb56a0 100644 --- a/app/src/main/java/com/santiparra/yomitrack/ui/fragments/login/LoginFragment.java +++ b/app/src/main/java/com/santiparra/yomitrack/ui/fragments/login/LoginFragment.java @@ -80,7 +80,6 @@ public class LoginFragment extends Fragment { } }); } - private void loginAsGuest() { saveUserSession(-1, "Invitado"); goToMainActivity(); 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 a4a7179..c2c40ae 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 @@ -3,7 +3,6 @@ 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; @@ -16,14 +15,17 @@ import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import com.bumptech.glide.Glide; +import com.google.gson.JsonObject; import com.santiparra.yomitrack.R; import com.santiparra.yomitrack.api.ApiClient; import com.santiparra.yomitrack.api.ApiService; +import com.santiparra.yomitrack.model.CommentDialog; +import com.santiparra.yomitrack.model.CommentModel; import com.santiparra.yomitrack.model.UserStatsResponse; import com.santiparra.yomitrack.utils.ActivityLog; +import com.santiparra.yomitrack.utils.DateUtils; -import com.google.gson.JsonObject; - +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -151,16 +153,22 @@ public class FragmentProfile extends Fragment { 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); + 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() { + public void loadActivity() { api.getActivityLog(userId).enqueue(new Callback>() { @Override public void onResponse(Call> call, Response> response) { @@ -170,14 +178,97 @@ public class FragmentProfile extends Fragment { for (ActivityLog log : response.body()) { View card = inflater.inflate(R.layout.item_activity_card, activityContainer, false); + + LinearLayout commentsContainer = card.findViewById(R.id.commentsContainer); + + commentsContainer.setVisibility(View.GONE); + + card.setOnClickListener(v -> { + if (commentsContainer.getVisibility() == View.VISIBLE) { + commentsContainer.animate().alpha(0).setDuration(150).withEndAction(() -> { + commentsContainer.setVisibility(View.GONE); + }).start(); + } else { + commentsContainer.setAlpha(0); + commentsContainer.setVisibility(View.VISIBLE); + loadComments(log.getId(), commentsContainer); + commentsContainer.animate().alpha(1).setDuration(150).start(); + } + }); + ((TextView) card.findViewById(R.id.activityUser)).setText(username); ((TextView) card.findViewById(R.id.activityAction)).setText(log.getAction()); ((TextView) card.findViewById(R.id.activityTitle)).setText(log.getMediaTitle()); - ((TextView) card.findViewById(R.id.activityTime)).setText(log.getTimestamp()); + ((TextView) card.findViewById(R.id.activityTime)).setText(DateUtils.getRelativeTime(log.getTimestamp())); + ImageView coverImage = card.findViewById(R.id.activityCover); if (!TextUtils.isEmpty(log.getImageUrl())) { - Glide.with(requireContext()).load(log.getImageUrl()).into((ImageView) card.findViewById(R.id.activityCover)); + Glide.with(requireContext()) + .load(log.getImageUrl()) + .placeholder(R.drawable.placeholder_image) + .error(R.drawable.placeholder_image) + .into(coverImage); } + + ImageButton commentButton = card.findViewById(R.id.commentButton); + ImageButton likeButton = card.findViewById(R.id.likeButton); + + commentButton.setOnClickListener(v -> { + CommentDialog dialog = new CommentDialog(requireContext(), userId, log.getId(), () -> { + loadComments(log.getId(), card.findViewById(R.id.commentsContainer)); + }); + dialog.show(); + }); + + api.checkLike(userId, log.getId()).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful() && response.body() != null) { + final boolean[] isLiked = {response.body().get("liked").getAsBoolean()}; + actualizarCorazon(likeButton, isLiked[0]); + + likeButton.setOnClickListener(v -> { + if (isLiked[0]) { + api.deleteLike(createLikeJson(userId, log.getId())).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + isLiked[0] = false; + actualizarCorazon(likeButton, false); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + Toast.makeText(getContext(), "Error de conexión", Toast.LENGTH_SHORT).show(); + } + }); + } else { + api.postLike(createLikeJson(userId, log.getId())).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + isLiked[0] = true; + actualizarCorazon(likeButton, true); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + Toast.makeText(getContext(), "Error de conexión", Toast.LENGTH_SHORT).show(); + } + }); + } + }); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + Toast.makeText(getContext(), "Error al verificar like", Toast.LENGTH_SHORT).show(); + } + }); + activityContainer.addView(card); } } @@ -185,7 +276,7 @@ public class FragmentProfile extends Fragment { @Override public void onFailure(Call> call, Throwable t) { - Toast.makeText(getContext(), "Error al cargar actividad", Toast.LENGTH_SHORT).show(); + Toast.makeText(getContext(), "Fallo al cargar actividad", Toast.LENGTH_SHORT).show(); } }); } @@ -219,6 +310,65 @@ public class FragmentProfile extends Fragment { }); } + private void loadComments(int activityId, LinearLayout container) { + api.getCommentsByActivity(activityId).enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + if (response.isSuccessful() && response.body() != null) { + container.removeAllViews(); + LayoutInflater inflater = LayoutInflater.from(getContext()); + + for (CommentModel comment : response.body()) { + View commentView = LayoutInflater.from(getContext()) + .inflate(R.layout.item_comment, container, false); + + TextView usernameView = commentView.findViewById(R.id.commentUsername); + TextView commentText = commentView.findViewById(R.id.commentText); + TextView dateView = commentView.findViewById(R.id.commentDate); + ImageView avatar = commentView.findViewById(R.id.commentAvatar); + + usernameView.setText(comment.getUsername()); + commentText.setText(comment.getText()); + dateView.setText(DateUtils.getRelativeTime(comment.getCreatedAt())); // usa tu util + + if (!TextUtils.isEmpty(comment.getAvatarUrl())) { + Glide.with(getContext()) + .load(comment.getAvatarUrl()) + .placeholder(R.drawable.rectangle_placeholder) + .error(R.drawable.error_image) + .into(avatar); + } + + container.addView(commentView); + } + + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + Toast.makeText(getContext(), "Error al cargar comentarios", Toast.LENGTH_SHORT).show(); + } + }); + } + + private JsonObject createLikeJson(int userId, int activityId) { + JsonObject body = new JsonObject(); + body.addProperty("userId", userId); + body.addProperty("activityId", activityId); + return body; + } + + private void actualizarCorazon(ImageButton likeButton, boolean liked) { + if (liked) { + likeButton.setImageResource(R.drawable.ic_heart_filled); + likeButton.setColorFilter(requireContext().getColor(R.color.pink)); + } else { + likeButton.setImageResource(R.drawable.ic_heart_outline); + likeButton.setColorFilter(requireContext().getColor(R.color.gray)); + } + } + private void saveBiography() { bioPrefs.edit().putString(BIO_KEY, editBiography.getText().toString().trim()).apply(); Toast.makeText(getContext(), "Biografía guardada", Toast.LENGTH_SHORT).show(); diff --git a/app/src/main/java/com/santiparra/yomitrack/utils/ActivityLog.java b/app/src/main/java/com/santiparra/yomitrack/utils/ActivityLog.java index b8437eb..1cc4442 100644 --- a/app/src/main/java/com/santiparra/yomitrack/utils/ActivityLog.java +++ b/app/src/main/java/com/santiparra/yomitrack/utils/ActivityLog.java @@ -4,6 +4,8 @@ import com.google.gson.annotations.SerializedName; public class ActivityLog { + @SerializedName("id") + private int id; @SerializedName("action") private String action; @@ -13,16 +15,26 @@ public class ActivityLog { @SerializedName("timestamp") private String timestamp; - @SerializedName("imagenUrl") + @SerializedName("imageUrl") private String imageUrl; + public int getId() { + return id; + } + + public String getAction() { + return action; + } + + public String getMediaTitle() { + return mediaTitle; + } + + public String getTimestamp() { + return timestamp; + } + public String getImageUrl() { return imageUrl; } - - public String getAction() { return action; } - - public String getMediaTitle() { return mediaTitle; } - - public String getTimestamp() { return timestamp; } } diff --git a/app/src/main/res.zip b/app/src/main/res.zip index 6d43580..a262c9f 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/ic_heart.png b/app/src/main/res/drawable/ic_heart.png deleted file mode 100644 index bac47f9..0000000 Binary files a/app/src/main/res/drawable/ic_heart.png and /dev/null differ diff --git a/app/src/main/res/layout/item_activity_card.xml b/app/src/main/res/layout/item_activity_card.xml index abe24e5..0cbcb23 100644 --- a/app/src/main/res/layout/item_activity_card.xml +++ b/app/src/main/res/layout/item_activity_card.xml @@ -1,125 +1,97 @@ - - + android:layout_margin="12dp" + app:cardCornerRadius="24dp" + app:cardElevation="8dp" + app:cardBackgroundColor="@color/primary"> - - - - - + android:gravity="center_vertical"> + + - + android:layout_weight="1"> - + + + + android:text="hace 3 horas" + android:textSize="12sp" + android:textColor="@color/gray" + android:layout_marginTop="4dp" /> - - + - - - - - - - - - - - - - + app:tint="@color/gray" /> - - + + + diff --git a/app/src/main/res/layout/item_browse_card.xml b/app/src/main/res/layout/item_browse_card.xml index 5d6448f..ff89e96 100644 --- a/app/src/main/res/layout/item_browse_card.xml +++ b/app/src/main/res/layout/item_browse_card.xml @@ -11,7 +11,7 @@ android:layout_height="170dp" android:scaleType="centerCrop" android:clipToOutline="true" - android:background="@drawable/sample_cover" /> + /> #121926 #FFFFFF #808080 - #F26D50 + #F26D50 + #FF4081 #4CAF50 diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml index 6ff2984..f555780 100644 --- a/app/src/main/res/values/ids.xml +++ b/app/src/main/res/values/ids.xml @@ -52,4 +52,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aa44334..43d99d0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,6 +7,8 @@ \n Write a status... + + Anime Manga