From 340385aa859817bb10def6e756d5ef65aaab35fc Mon Sep 17 00:00:00 2001 From: CappielloAntonio Date: Mon, 23 Aug 2021 23:00:56 +0200 Subject: [PATCH] TEST - Added a first form of cache for retrofit --- .../java/com/cappielloantonio/play/App.java | 2 +- .../play/subsonic/Subsonic.java | 23 +++++++++------- .../albumsonglist/AlbumSongListClient.java | 20 +++++++++++--- .../subsonic/api/browsing/BrowsingClient.java | 20 +++++++++++--- .../MediaAnnotationClient.java | 20 +++++++++++--- .../MediaLibraryScanningClient.java | 20 +++++++++++--- .../mediaretrieval/MediaRetrievalClient.java | 20 +++++++++++--- .../subsonic/api/playlist/PlaylistClient.java | 20 +++++++++++--- .../api/searching/SearchingClient.java | 20 +++++++++++--- .../subsonic/api/system/SystemClient.java | 20 +++++++++++--- .../play/subsonic/utils/CacheUtil.java | 27 +++++++++++++++++++ 11 files changed, 178 insertions(+), 34 deletions(-) create mode 100644 app/src/main/java/com/cappielloantonio/play/subsonic/utils/CacheUtil.java diff --git a/app/src/main/java/com/cappielloantonio/play/App.java b/app/src/main/java/com/cappielloantonio/play/App.java index 20a90f4e..17fe0a6d 100644 --- a/app/src/main/java/com/cappielloantonio/play/App.java +++ b/app/src/main/java/com/cappielloantonio/play/App.java @@ -54,6 +54,6 @@ public class App extends Application { preferences.setUsername(username); preferences.setAuthentication(password, token, salt); - return new Subsonic(preferences); + return new Subsonic(context, preferences); } } diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/Subsonic.java b/app/src/main/java/com/cappielloantonio/play/subsonic/Subsonic.java index 69f5fa5f..1ab21b11 100644 --- a/app/src/main/java/com/cappielloantonio/play/subsonic/Subsonic.java +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/Subsonic.java @@ -1,5 +1,7 @@ package com.cappielloantonio.play.subsonic; +import android.content.Context; + import com.cappielloantonio.play.subsonic.api.albumsonglist.AlbumSongListClient; import com.cappielloantonio.play.subsonic.api.browsing.BrowsingClient; import com.cappielloantonio.play.subsonic.api.mediaannotation.MediaAnnotationClient; @@ -16,6 +18,8 @@ import java.util.Map; public class Subsonic { private static final Version API_MAX_VERSION = Version.of("1.15.0"); + private final Context context; + private Version apiVersion = API_MAX_VERSION; private SubsonicPreferences preferences; @@ -28,7 +32,8 @@ public class Subsonic { private MediaAnnotationClient mediaAnnotationClient; private MediaLibraryScanningClient mediaLibraryScanningClient; - public Subsonic(SubsonicPreferences preferences) { + public Subsonic(Context context, SubsonicPreferences preferences) { + this.context = context; this.preferences = preferences; } @@ -38,56 +43,56 @@ public class Subsonic { public SystemClient getSystemClient() { if (systemClient == null) { - systemClient = new SystemClient(this); + systemClient = new SystemClient(context, this); } return systemClient; } public BrowsingClient getBrowsingClient() { if (browsingClient == null) { - browsingClient = new BrowsingClient(this); + browsingClient = new BrowsingClient(context, this); } return browsingClient; } public MediaRetrievalClient getMediaRetrievalClient() { if (mediaRetrievalClient == null) { - mediaRetrievalClient = new MediaRetrievalClient(this); + mediaRetrievalClient = new MediaRetrievalClient(context, this); } return mediaRetrievalClient; } public PlaylistClient getPlaylistClient() { if (playlistClient == null) { - playlistClient = new PlaylistClient(this); + playlistClient = new PlaylistClient(context, this); } return playlistClient; } public SearchingClient getSearchingClient() { if (searchingClient == null) { - searchingClient = new SearchingClient(this); + searchingClient = new SearchingClient(context, this); } return searchingClient; } public AlbumSongListClient getAlbumSongListClient() { if (albumSongListClient == null) { - albumSongListClient = new AlbumSongListClient(this); + albumSongListClient = new AlbumSongListClient(context, this); } return albumSongListClient; } public MediaAnnotationClient getMediaAnnotationClient() { if (mediaAnnotationClient == null) { - mediaAnnotationClient = new MediaAnnotationClient(this); + mediaAnnotationClient = new MediaAnnotationClient(context, this); } return mediaAnnotationClient; } public MediaLibraryScanningClient getMediaLibraryScanningClient() { if (mediaLibraryScanningClient == null) { - mediaLibraryScanningClient = new MediaLibraryScanningClient(this); + mediaLibraryScanningClient = new MediaLibraryScanningClient(context, this); } return mediaLibraryScanningClient; } diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/api/albumsonglist/AlbumSongListClient.java b/app/src/main/java/com/cappielloantonio/play/subsonic/api/albumsonglist/AlbumSongListClient.java index cf4b0ef1..fc62a644 100644 --- a/app/src/main/java/com/cappielloantonio/play/subsonic/api/albumsonglist/AlbumSongListClient.java +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/api/albumsonglist/AlbumSongListClient.java @@ -1,11 +1,15 @@ package com.cappielloantonio.play.subsonic.api.albumsonglist; +import android.content.Context; import android.util.Log; +import com.cappielloantonio.play.App; import com.cappielloantonio.play.subsonic.Subsonic; import com.cappielloantonio.play.subsonic.models.SubsonicResponse; +import com.cappielloantonio.play.subsonic.utils.CacheUtil; import com.tickaroo.tikxml.retrofit.TikXmlConverterFactory; +import okhttp3.Cache; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Call; @@ -14,11 +18,13 @@ import retrofit2.Retrofit; public class AlbumSongListClient { private static final String TAG = "BrowsingClient"; - private Subsonic subsonic; + private final Context context; + private final Subsonic subsonic; private Retrofit retrofit; - private AlbumSongListService albumSongListService; + private final AlbumSongListService albumSongListService; - public AlbumSongListClient(Subsonic subsonic) { + public AlbumSongListClient(Context context, Subsonic subsonic) { + this.context = context; this.subsonic = subsonic; this.retrofit = new Retrofit.Builder() @@ -68,6 +74,9 @@ public class AlbumSongListClient { private OkHttpClient getOkHttpClient() { return new OkHttpClient.Builder() .addInterceptor(getHttpLoggingInterceptor()) + .addInterceptor(CacheUtil.offlineInterceptor) + .addNetworkInterceptor(CacheUtil.onlineInterceptor) + .cache(getCache()) .build(); } @@ -77,4 +86,9 @@ public class AlbumSongListClient { return loggingInterceptor; } + + private Cache getCache() { + int cacheSize = 10 * 1024 * 1024; + return new Cache(context.getCacheDir(), cacheSize); + } } diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/api/browsing/BrowsingClient.java b/app/src/main/java/com/cappielloantonio/play/subsonic/api/browsing/BrowsingClient.java index 4f0986ca..64893813 100644 --- a/app/src/main/java/com/cappielloantonio/play/subsonic/api/browsing/BrowsingClient.java +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/api/browsing/BrowsingClient.java @@ -1,11 +1,15 @@ package com.cappielloantonio.play.subsonic.api.browsing; +import android.content.Context; import android.util.Log; +import com.cappielloantonio.play.App; import com.cappielloantonio.play.subsonic.Subsonic; import com.cappielloantonio.play.subsonic.models.SubsonicResponse; +import com.cappielloantonio.play.subsonic.utils.CacheUtil; import com.tickaroo.tikxml.retrofit.TikXmlConverterFactory; +import okhttp3.Cache; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Call; @@ -14,11 +18,13 @@ import retrofit2.Retrofit; public class BrowsingClient { private static final String TAG = "BrowsingClient"; - private Subsonic subsonic; + private final Context context; + private final Subsonic subsonic; private Retrofit retrofit; - private BrowsingService browsingService; + private final BrowsingService browsingService; - public BrowsingClient(Subsonic subsonic) { + public BrowsingClient(Context context, Subsonic subsonic) { + this.context = context; this.subsonic = subsonic; this.retrofit = new Retrofit.Builder() @@ -118,6 +124,9 @@ public class BrowsingClient { private OkHttpClient getOkHttpClient() { return new OkHttpClient.Builder() .addInterceptor(getHttpLoggingInterceptor()) + .addInterceptor(CacheUtil.offlineInterceptor) + .addNetworkInterceptor(CacheUtil.onlineInterceptor) + .cache(getCache()) .build(); } @@ -127,4 +136,9 @@ public class BrowsingClient { return loggingInterceptor; } + + private Cache getCache() { + int cacheSize = 10 * 1024 * 1024; + return new Cache(context.getCacheDir(), cacheSize); + } } diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/api/mediaannotation/MediaAnnotationClient.java b/app/src/main/java/com/cappielloantonio/play/subsonic/api/mediaannotation/MediaAnnotationClient.java index 970dc885..323f3082 100644 --- a/app/src/main/java/com/cappielloantonio/play/subsonic/api/mediaannotation/MediaAnnotationClient.java +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/api/mediaannotation/MediaAnnotationClient.java @@ -1,11 +1,15 @@ package com.cappielloantonio.play.subsonic.api.mediaannotation; +import android.content.Context; import android.util.Log; +import com.cappielloantonio.play.App; import com.cappielloantonio.play.subsonic.Subsonic; import com.cappielloantonio.play.subsonic.models.SubsonicResponse; +import com.cappielloantonio.play.subsonic.utils.CacheUtil; import com.tickaroo.tikxml.retrofit.TikXmlConverterFactory; +import okhttp3.Cache; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Call; @@ -14,11 +18,13 @@ import retrofit2.Retrofit; public class MediaAnnotationClient { private static final String TAG = "BrowsingClient"; - private Subsonic subsonic; + private final Context context; + private final Subsonic subsonic; private Retrofit retrofit; - private MediaAnnotationService mediaAnnotationService; + private final MediaAnnotationService mediaAnnotationService; - public MediaAnnotationClient(Subsonic subsonic) { + public MediaAnnotationClient(Context context, Subsonic subsonic) { + this.context = context; this.subsonic = subsonic; this.retrofit = new Retrofit.Builder() @@ -53,6 +59,9 @@ public class MediaAnnotationClient { private OkHttpClient getOkHttpClient() { return new OkHttpClient.Builder() .addInterceptor(getHttpLoggingInterceptor()) + .addInterceptor(CacheUtil.offlineInterceptor) + .addNetworkInterceptor(CacheUtil.onlineInterceptor) + .cache(getCache()) .build(); } @@ -62,4 +71,9 @@ public class MediaAnnotationClient { return loggingInterceptor; } + + private Cache getCache() { + int cacheSize = 10 * 1024 * 1024; + return new Cache(context.getCacheDir(), cacheSize); + } } diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/api/medialibraryscanning/MediaLibraryScanningClient.java b/app/src/main/java/com/cappielloantonio/play/subsonic/api/medialibraryscanning/MediaLibraryScanningClient.java index d9c69826..92aa9cb6 100644 --- a/app/src/main/java/com/cappielloantonio/play/subsonic/api/medialibraryscanning/MediaLibraryScanningClient.java +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/api/medialibraryscanning/MediaLibraryScanningClient.java @@ -1,12 +1,16 @@ package com.cappielloantonio.play.subsonic.api.medialibraryscanning; +import android.content.Context; import android.util.Log; +import com.cappielloantonio.play.App; import com.cappielloantonio.play.subsonic.Subsonic; import com.cappielloantonio.play.subsonic.api.system.SystemService; import com.cappielloantonio.play.subsonic.models.SubsonicResponse; +import com.cappielloantonio.play.subsonic.utils.CacheUtil; import com.tickaroo.tikxml.retrofit.TikXmlConverterFactory; +import okhttp3.Cache; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Call; @@ -15,11 +19,13 @@ import retrofit2.Retrofit; public class MediaLibraryScanningClient { private static final String TAG = "SystemClient"; - private Subsonic subsonic; + private final Context context; + private final Subsonic subsonic; private Retrofit retrofit; - private MediaLibraryScanningService mediaLibraryScanningService; + private final MediaLibraryScanningService mediaLibraryScanningService; - public MediaLibraryScanningClient(Subsonic subsonic) { + public MediaLibraryScanningClient(Context context, Subsonic subsonic) { + this.context = context; this.subsonic = subsonic; this.retrofit = new Retrofit.Builder() @@ -44,6 +50,9 @@ public class MediaLibraryScanningClient { private OkHttpClient getOkHttpClient() { return new OkHttpClient.Builder() .addInterceptor(getHttpLoggingInterceptor()) + .addInterceptor(CacheUtil.offlineInterceptor) + .addNetworkInterceptor(CacheUtil.onlineInterceptor) + .cache(getCache()) .build(); } @@ -53,4 +62,9 @@ public class MediaLibraryScanningClient { return loggingInterceptor; } + + private Cache getCache() { + int cacheSize = 10 * 1024 * 1024; + return new Cache(context.getCacheDir(), cacheSize); + } } diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/api/mediaretrieval/MediaRetrievalClient.java b/app/src/main/java/com/cappielloantonio/play/subsonic/api/mediaretrieval/MediaRetrievalClient.java index 0d24f97f..b238e7e6 100644 --- a/app/src/main/java/com/cappielloantonio/play/subsonic/api/mediaretrieval/MediaRetrievalClient.java +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/api/mediaretrieval/MediaRetrievalClient.java @@ -1,11 +1,15 @@ package com.cappielloantonio.play.subsonic.api.mediaretrieval; +import android.content.Context; import android.util.Log; +import com.cappielloantonio.play.App; import com.cappielloantonio.play.subsonic.Subsonic; import com.cappielloantonio.play.subsonic.models.SubsonicResponse; +import com.cappielloantonio.play.subsonic.utils.CacheUtil; import com.tickaroo.tikxml.retrofit.TikXmlConverterFactory; +import okhttp3.Cache; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Call; @@ -14,11 +18,13 @@ import retrofit2.Retrofit; public class MediaRetrievalClient { private static final String TAG = "BrowsingClient"; - private Subsonic subsonic; + private final Context context; + private final Subsonic subsonic; private Retrofit retrofit; - private MediaRetrievalService mediaRetrievalService; + private final MediaRetrievalService mediaRetrievalService; - public MediaRetrievalClient(Subsonic subsonic) { + public MediaRetrievalClient(Context context, Subsonic subsonic) { + this.context = context; this.subsonic = subsonic; this.retrofit = new Retrofit.Builder() @@ -43,6 +49,9 @@ public class MediaRetrievalClient { private OkHttpClient getOkHttpClient() { return new OkHttpClient.Builder() .addInterceptor(getHttpLoggingInterceptor()) + .addInterceptor(CacheUtil.offlineInterceptor) + .addNetworkInterceptor(CacheUtil.onlineInterceptor) + .cache(getCache()) .build(); } @@ -52,4 +61,9 @@ public class MediaRetrievalClient { return loggingInterceptor; } + + private Cache getCache() { + int cacheSize = 10 * 1024 * 1024; + return new Cache(context.getCacheDir(), cacheSize); + } } diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/api/playlist/PlaylistClient.java b/app/src/main/java/com/cappielloantonio/play/subsonic/api/playlist/PlaylistClient.java index ea33b535..f25add4c 100644 --- a/app/src/main/java/com/cappielloantonio/play/subsonic/api/playlist/PlaylistClient.java +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/api/playlist/PlaylistClient.java @@ -1,13 +1,17 @@ package com.cappielloantonio.play.subsonic.api.playlist; +import android.content.Context; import android.util.Log; +import com.cappielloantonio.play.App; import com.cappielloantonio.play.subsonic.Subsonic; import com.cappielloantonio.play.subsonic.models.SubsonicResponse; +import com.cappielloantonio.play.subsonic.utils.CacheUtil; import com.tickaroo.tikxml.retrofit.TikXmlConverterFactory; import java.util.ArrayList; +import okhttp3.Cache; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Call; @@ -16,11 +20,13 @@ import retrofit2.Retrofit; public class PlaylistClient { private static final String TAG = "BrowsingClient"; - private Subsonic subsonic; + private final Context context; + private final Subsonic subsonic; private Retrofit retrofit; - private PlaylistService playlistService; + private final PlaylistService playlistService; - public PlaylistClient(Subsonic subsonic) { + public PlaylistClient(Context context, Subsonic subsonic) { + this.context = context; this.subsonic = subsonic; this.retrofit = new Retrofit.Builder() @@ -60,6 +66,9 @@ public class PlaylistClient { private OkHttpClient getOkHttpClient() { return new OkHttpClient.Builder() .addInterceptor(getHttpLoggingInterceptor()) + .addInterceptor(CacheUtil.offlineInterceptor) + .addNetworkInterceptor(CacheUtil.onlineInterceptor) + .cache(getCache()) .build(); } @@ -69,4 +78,9 @@ public class PlaylistClient { return loggingInterceptor; } + + private Cache getCache() { + int cacheSize = 10 * 1024 * 1024; + return new Cache(context.getCacheDir(), cacheSize); + } } diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/api/searching/SearchingClient.java b/app/src/main/java/com/cappielloantonio/play/subsonic/api/searching/SearchingClient.java index 11695ac1..1e92d958 100644 --- a/app/src/main/java/com/cappielloantonio/play/subsonic/api/searching/SearchingClient.java +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/api/searching/SearchingClient.java @@ -1,11 +1,15 @@ package com.cappielloantonio.play.subsonic.api.searching; +import android.content.Context; import android.util.Log; +import com.cappielloantonio.play.App; import com.cappielloantonio.play.subsonic.Subsonic; import com.cappielloantonio.play.subsonic.models.SubsonicResponse; +import com.cappielloantonio.play.subsonic.utils.CacheUtil; import com.tickaroo.tikxml.retrofit.TikXmlConverterFactory; +import okhttp3.Cache; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Call; @@ -14,11 +18,13 @@ import retrofit2.Retrofit; public class SearchingClient { private static final String TAG = "BrowsingClient"; - private Subsonic subsonic; + private final Context context; + private final Subsonic subsonic; private Retrofit retrofit; - private SearchingService searchingService; + private final SearchingService searchingService; - public SearchingClient(Subsonic subsonic) { + public SearchingClient(Context context, Subsonic subsonic) { + this.context = context; this.subsonic = subsonic; this.retrofit = new Retrofit.Builder() @@ -43,6 +49,9 @@ public class SearchingClient { private OkHttpClient getOkHttpClient() { return new OkHttpClient.Builder() .addInterceptor(getHttpLoggingInterceptor()) + .addInterceptor(CacheUtil.offlineInterceptor) + .addNetworkInterceptor(CacheUtil.onlineInterceptor) + .cache(getCache()) .build(); } @@ -52,4 +61,9 @@ public class SearchingClient { return loggingInterceptor; } + + private Cache getCache() { + int cacheSize = 10 * 1024 * 1024; + return new Cache(context.getCacheDir(), cacheSize); + } } diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/api/system/SystemClient.java b/app/src/main/java/com/cappielloantonio/play/subsonic/api/system/SystemClient.java index f173b26e..3ef679fa 100644 --- a/app/src/main/java/com/cappielloantonio/play/subsonic/api/system/SystemClient.java +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/api/system/SystemClient.java @@ -1,11 +1,15 @@ package com.cappielloantonio.play.subsonic.api.system; +import android.content.Context; import android.util.Log; +import com.cappielloantonio.play.App; import com.cappielloantonio.play.subsonic.Subsonic; import com.cappielloantonio.play.subsonic.models.SubsonicResponse; +import com.cappielloantonio.play.subsonic.utils.CacheUtil; import com.tickaroo.tikxml.retrofit.TikXmlConverterFactory; +import okhttp3.Cache; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Call; @@ -14,11 +18,13 @@ import retrofit2.Retrofit; public class SystemClient { private static final String TAG = "SystemClient"; - private Subsonic subsonic; + private final Context context; + private final Subsonic subsonic; private Retrofit retrofit; - private SystemService systemService; + private final SystemService systemService; - public SystemClient(Subsonic subsonic) { + public SystemClient(Context context, Subsonic subsonic) { + this.context = context; this.subsonic = subsonic; this.retrofit = new Retrofit.Builder() @@ -43,6 +49,9 @@ public class SystemClient { private OkHttpClient getOkHttpClient() { return new OkHttpClient.Builder() .addInterceptor(getHttpLoggingInterceptor()) + .addInterceptor(CacheUtil.offlineInterceptor) + .addNetworkInterceptor(CacheUtil.onlineInterceptor) + .cache(getCache()) .build(); } @@ -52,4 +61,9 @@ public class SystemClient { return loggingInterceptor; } + + private Cache getCache() { + int cacheSize = 10 * 1024 * 1024; + return new Cache(context.getCacheDir(), cacheSize); + } } diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/utils/CacheUtil.java b/app/src/main/java/com/cappielloantonio/play/subsonic/utils/CacheUtil.java new file mode 100644 index 00000000..a60e6633 --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/utils/CacheUtil.java @@ -0,0 +1,27 @@ +package com.cappielloantonio.play.subsonic.utils; + +import okhttp3.Interceptor; +import okhttp3.Request; + +public class CacheUtil { + public static Interceptor onlineInterceptor = chain -> { + okhttp3.Response response = chain.proceed(chain.request()); + int maxAge = 60; + return response.newBuilder() + .header("Cache-Control", "public, max-age=" + maxAge) + .removeHeader("Pragma") + .build(); + }; + + public static Interceptor offlineInterceptor = chain -> { + Request request = chain.request(); + if (!false) { + int maxStale = 60 * 60 * 24 * 30; + request = request.newBuilder() + .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale) + .removeHeader("Pragma") + .build(); + } + return chain.proceed(request); + }; +}