From 77eb257d84d28dff2ac7d3b45d2723bb82a99775 Mon Sep 17 00:00:00 2001
From: Yahor Berdnikau <egorr.berd@gmail.com>
Date: Tue, 26 Jun 2018 21:38:28 +0200
Subject: [PATCH] Glue together old ImageLoader impl and new one.

Currently it is working in a pretty limited way.

Signed-off-by: Yahor Berdnikau <egorr.berd@gmail.com>
---
 .../activity/SubsonicTabActivity.java         | 26 ++++++++-----
 .../kotlin/org/moire/ultrasonic/app/UApp.kt   | 11 +++++-
 .../moire/ultrasonic/di/MusicServiceModule.kt |  9 ++++-
 .../subsonic/SubsonicImageLoaderProxy.kt      | 39 +++++++++++++++++++
 4 files changed, 74 insertions(+), 11 deletions(-)
 create mode 100644 ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/SubsonicImageLoaderProxy.kt

diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/activity/SubsonicTabActivity.java b/ultrasonic/src/main/java/org/moire/ultrasonic/activity/SubsonicTabActivity.java
index a92f6e41..cd7fcf46 100644
--- a/ultrasonic/src/main/java/org/moire/ultrasonic/activity/SubsonicTabActivity.java
+++ b/ultrasonic/src/main/java/org/moire/ultrasonic/activity/SubsonicTabActivity.java
@@ -39,11 +39,13 @@ import android.widget.*;
 import net.simonvt.menudrawer.MenuDrawer;
 import net.simonvt.menudrawer.Position;
 import org.moire.ultrasonic.R;
+import org.moire.ultrasonic.app.UApp;
 import org.moire.ultrasonic.domain.MusicDirectory;
 import org.moire.ultrasonic.domain.MusicDirectory.Entry;
 import org.moire.ultrasonic.domain.PlayerState;
 import org.moire.ultrasonic.domain.Share;
 import org.moire.ultrasonic.service.*;
+import org.moire.ultrasonic.subsonic.SubsonicImageLoaderProxy;
 import org.moire.ultrasonic.util.*;
 
 import java.io.File;
@@ -793,16 +795,22 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
 		if (IMAGE_LOADER != null && IMAGE_LOADER.isRunning()) IMAGE_LOADER.clear();
 	}
 
-	public synchronized ImageLoader getImageLoader()
-	{
-		if (IMAGE_LOADER == null || !IMAGE_LOADER.isRunning())
-		{
-			IMAGE_LOADER = new LegacyImageLoader(this, Util.getImageLoaderConcurrency(this));
-			IMAGE_LOADER.startImageLoader();
-		}
+    public synchronized ImageLoader getImageLoader() {
+        if (IMAGE_LOADER == null ||
+                !IMAGE_LOADER.isRunning()) {
+            LegacyImageLoader legacyImageLoader = new LegacyImageLoader(
+                    this,
+                    Util.getImageLoaderConcurrency(this)
+            );
+            IMAGE_LOADER = new SubsonicImageLoaderProxy(
+                    legacyImageLoader,
+                    ((UApp) getApplication()).getSubsonicImageLoader()
+            );
+            IMAGE_LOADER.startImageLoader();
+        }
 
-		return IMAGE_LOADER;
-	}
+        return IMAGE_LOADER;
+    }
 
 	void download(final boolean append, final boolean save, final boolean autoPlay, final boolean playNext, final boolean shuffle, final List<Entry> songs)
 	{
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/app/UApp.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/app/UApp.kt
index f8bb9d24..97fcc8bb 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/app/UApp.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/app/UApp.kt
@@ -1,10 +1,12 @@
 package org.moire.ultrasonic.app
 
 import android.app.Application
+import org.koin.android.ext.android.get
 import org.koin.android.ext.android.startKoin
 import org.moire.ultrasonic.di.baseNetworkModule
 import org.moire.ultrasonic.di.directoriesModule
 import org.moire.ultrasonic.di.musicServiceModule
+import org.moire.ultrasonic.subsonic.loader.image.SubsonicImageLoader
 import org.moire.ultrasonic.util.Util
 
 class UApp : Application() {
@@ -15,7 +17,14 @@ class UApp : Application() {
         startKoin(this, listOf(
             directoriesModule,
             baseNetworkModule,
-            musicServiceModule(sharedPreferences)
+            musicServiceModule(sharedPreferences, this)
         ))
     }
+
+    /**
+     * Temporary method to get subsonic image loader from java code.
+     */
+    fun getSubsonicImageLoader(): SubsonicImageLoader {
+        return get()
+    }
 }
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/MusicServiceModule.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/MusicServiceModule.kt
index 884b4988..7809ff1b 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/MusicServiceModule.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/MusicServiceModule.kt
@@ -1,6 +1,7 @@
 @file:JvmName("MusicServiceModule")
 package org.moire.ultrasonic.di
 
+import android.content.Context
 import android.content.SharedPreferences
 import android.util.Log
 import org.koin.dsl.module.applicationContext
@@ -14,6 +15,7 @@ import org.moire.ultrasonic.service.CachedMusicService
 import org.moire.ultrasonic.service.MusicService
 import org.moire.ultrasonic.service.OfflineMusicService
 import org.moire.ultrasonic.service.RESTMusicService
+import org.moire.ultrasonic.subsonic.loader.image.SubsonicImageLoader
 import org.moire.ultrasonic.util.Constants
 import kotlin.math.abs
 
@@ -24,7 +26,10 @@ private const val DEFAULT_SERVER_INSTANCE = 1
 private const val UNKNOWN_SERVER_URL = "not-exists"
 private const val LOG_TAG = "MusicServiceModule"
 
-fun musicServiceModule(sp: SharedPreferences) = applicationContext {
+fun musicServiceModule(
+    sp: SharedPreferences,
+    context: Context
+) = applicationContext {
     context(MUSIC_SERVICE_CONTEXT) {
         subsonicApiModule()
 
@@ -109,5 +114,7 @@ fun musicServiceModule(sp: SharedPreferences) = applicationContext {
         bean<MusicService>(name = OFFLINE_MUSIC_SERVICE) {
             return@bean OfflineMusicService(get(), get())
         }
+
+        bean { return@bean SubsonicImageLoader(context, get()) }
     }
 }
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/SubsonicImageLoaderProxy.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/SubsonicImageLoaderProxy.kt
new file mode 100644
index 00000000..5412cf53
--- /dev/null
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/SubsonicImageLoaderProxy.kt
@@ -0,0 +1,39 @@
+package org.moire.ultrasonic.subsonic
+
+import android.view.View
+import android.widget.ImageView
+import org.moire.ultrasonic.domain.MusicDirectory
+import org.moire.ultrasonic.subsonic.loader.image.SubsonicImageLoader
+import org.moire.ultrasonic.util.ImageLoader
+import org.moire.ultrasonic.util.LegacyImageLoader
+
+/**
+ * Temporary proxy between new [SubsonicImageLoader] and [ImageLoader] interface and old
+ * [LegacyImageLoader] implementation.
+ *
+ * Should be removed on [LegacyImageLoader] removal.
+ */
+class SubsonicImageLoaderProxy(
+    legacyImageLoader: LegacyImageLoader,
+    private val subsonicImageLoader: SubsonicImageLoader
+) : ImageLoader by legacyImageLoader {
+    override fun loadImage(
+        view: View?,
+        entry: MusicDirectory.Entry?,
+        large: Boolean,
+        size: Int,
+        crossFade: Boolean,
+        highQuality: Boolean
+    ) {
+        val id = entry?.coverArt
+
+        if (id != null &&
+            view != null &&
+            view is ImageView) {
+            subsonicImageLoader.loadCoverArt(
+                entityId = id,
+                view = view
+            )
+        }
+    }
+}