From c69fbcfa68dbacae3020a6d21cea471bf6839f48 Mon Sep 17 00:00:00 2001 From: antonio Date: Wed, 2 Aug 2023 10:49:21 +0200 Subject: [PATCH] feat: centralized star/unstar handling and added offline support --- .../tempo/interfaces/StarCallback.java | 9 ++ .../tempo/repository/FavoriteRepository.java | 140 ++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 app/src/main/java/com/cappielloantonio/tempo/interfaces/StarCallback.java create mode 100644 app/src/main/java/com/cappielloantonio/tempo/repository/FavoriteRepository.java diff --git a/app/src/main/java/com/cappielloantonio/tempo/interfaces/StarCallback.java b/app/src/main/java/com/cappielloantonio/tempo/interfaces/StarCallback.java new file mode 100644 index 00000000..a5bb1776 --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/tempo/interfaces/StarCallback.java @@ -0,0 +1,9 @@ +package com.cappielloantonio.tempo.interfaces; + +import androidx.annotation.Keep; + +@Keep +public interface StarCallback { + default void onError() {} + default void onSuccess() {} +} diff --git a/app/src/main/java/com/cappielloantonio/tempo/repository/FavoriteRepository.java b/app/src/main/java/com/cappielloantonio/tempo/repository/FavoriteRepository.java new file mode 100644 index 00000000..2510d77a --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/tempo/repository/FavoriteRepository.java @@ -0,0 +1,140 @@ +package com.cappielloantonio.tempo.repository; + +import androidx.annotation.NonNull; + +import com.cappielloantonio.tempo.App; +import com.cappielloantonio.tempo.database.AppDatabase; +import com.cappielloantonio.tempo.database.dao.FavoriteDao; +import com.cappielloantonio.tempo.interfaces.StarCallback; +import com.cappielloantonio.tempo.model.Favorite; +import com.cappielloantonio.tempo.subsonic.base.ApiResponse; + +import java.util.ArrayList; +import java.util.List; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class FavoriteRepository { + private final FavoriteDao favoriteDao = AppDatabase.getInstance().favoriteDao(); + + public void star(String id, String albumId, String artistId, StarCallback starCallback) { + App.getSubsonicClientInstance(false) + .getMediaAnnotationClient() + .star(id, albumId, artistId) + .enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + if (response.isSuccessful()) { + starCallback.onSuccess(); + } else { + starCallback.onError(); + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + starCallback.onError(); + } + }); + } + + public void unstar(String id, String albumId, String artistId, StarCallback starCallback) { + App.getSubsonicClientInstance(false) + .getMediaAnnotationClient() + .unstar(id, albumId, artistId) + .enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + if (response.isSuccessful()) { + starCallback.onSuccess(); + } else { + starCallback.onError(); + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + starCallback.onError(); + } + }); + } + + public List getFavorites() { + List favorites = new ArrayList<>(); + + GetAllThreadSafe getAllThreadSafe = new GetAllThreadSafe(favoriteDao); + Thread thread = new Thread(getAllThreadSafe); + thread.start(); + + try { + thread.join(); + favorites = getAllThreadSafe.getFavorites(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + return favorites; + } + + private static class GetAllThreadSafe implements Runnable { + private final FavoriteDao favoriteDao; + private List favorites = new ArrayList<>(); + + public GetAllThreadSafe(FavoriteDao favoriteDao) { + this.favoriteDao = favoriteDao; + } + + @Override + public void run() { + favorites = favoriteDao.getAll(); + } + + public List getFavorites() { + return favorites; + } + } + + public void starLater(String id, String albumId, String artistId, boolean toStar) { + InsertThreadSafe insert = new InsertThreadSafe(favoriteDao, new Favorite(System.currentTimeMillis(), id, albumId, artistId, toStar)); + Thread thread = new Thread(insert); + thread.start(); + } + + private static class InsertThreadSafe implements Runnable { + private final FavoriteDao favoriteDao; + private final Favorite favorite; + + public InsertThreadSafe(FavoriteDao favoriteDao, Favorite favorite) { + this.favoriteDao = favoriteDao; + this.favorite = favorite; + } + + @Override + public void run() { + favoriteDao.insert(favorite); + } + } + + public void delete(Favorite favorite) { + DeleteThreadSafe delete = new DeleteThreadSafe(favoriteDao, favorite); + Thread thread = new Thread(delete); + thread.start(); + } + + private static class DeleteThreadSafe implements Runnable { + private final FavoriteDao favoriteDao; + private final Favorite favorite; + + public DeleteThreadSafe(FavoriteDao favoriteDao, Favorite favorite) { + this.favoriteDao = favoriteDao; + this.favorite = favorite; + } + + @Override + public void run() { + favoriteDao.delete(favorite); + } + } +}