From 00953816943be0658ef94a11143a4acda9b9b71c Mon Sep 17 00:00:00 2001
From: Ryan Harg <3821-ryan_harg@users.noreply.dev.funkwhale.audio>
Date: Sun, 29 Aug 2021 13:41:50 +0000
Subject: [PATCH] #65: Upgrade exoplayer version

---
 .../java/audio/funkwhale/ffa/koin/Modules.kt  | 19 +++++-------
 .../CacheDataSourceFactoryProvider.kt         | 23 +++++++--------
 .../ffa/playback/OAuth2Datasource.kt          | 12 +++-----
 .../funkwhale/ffa/playback/PinService.kt      | 29 ++++++++++---------
 .../funkwhale/ffa/playback/PlayerService.kt   | 11 ++++---
 buildSrc/src/main/java/Versions.kt            |  4 +--
 changes/changelog.d/65.misc                   |  1 +
 7 files changed, 47 insertions(+), 52 deletions(-)
 create mode 100644 changes/changelog.d/65.misc

diff --git a/app/src/main/java/audio/funkwhale/ffa/koin/Modules.kt b/app/src/main/java/audio/funkwhale/ffa/koin/Modules.kt
index 028f7711..c4ee334b 100644
--- a/app/src/main/java/audio/funkwhale/ffa/koin/Modules.kt
+++ b/app/src/main/java/audio/funkwhale/ffa/koin/Modules.kt
@@ -1,16 +1,14 @@
 package audio.funkwhale.ffa.koin
 
 import android.content.Context
+import audio.funkwhale.ffa.R
 import audio.funkwhale.ffa.playback.CacheDataSourceFactoryProvider
 import audio.funkwhale.ffa.playback.MediaSession
 import audio.funkwhale.ffa.utils.AuthorizationServiceFactory
 import audio.funkwhale.ffa.utils.OAuth
 import com.google.android.exoplayer2.database.DatabaseProvider
 import com.google.android.exoplayer2.database.ExoDatabaseProvider
-import com.google.android.exoplayer2.offline.DefaultDownloadIndex
-import com.google.android.exoplayer2.offline.DefaultDownloaderFactory
 import com.google.android.exoplayer2.offline.DownloadManager
-import com.google.android.exoplayer2.offline.DownloaderConstructorHelper
 import com.google.android.exoplayer2.upstream.cache.Cache
 import com.google.android.exoplayer2.upstream.cache.LeastRecentlyUsedCacheEvictor
 import com.google.android.exoplayer2.upstream.cache.NoOpCacheEvictor
@@ -27,15 +25,12 @@ fun exoplayerModule(context: Context) = module {
 
   single {
     val cacheDataSourceFactoryProvider = get<CacheDataSourceFactoryProvider>()
-    DownloaderConstructorHelper(
-      get(named("exoDownloadCache")), cacheDataSourceFactoryProvider.create(context)
-    ).run {
-      DownloadManager(
-        context,
-        DefaultDownloadIndex(get(named("exoDatabase"))),
-        DefaultDownloaderFactory(this)
-      )
-    }
+
+    val exoDownloadCache = get<Cache>(named("exoDownloadCache"))
+    val exoDatabase = get<DatabaseProvider>(named("exoDatabase"))
+    val cacheDataSourceFactory = cacheDataSourceFactoryProvider.create(context)
+
+    DownloadManager(context, exoDatabase, exoDownloadCache, cacheDataSourceFactory, Runnable::run)
   }
 
   single {
diff --git a/app/src/main/java/audio/funkwhale/ffa/playback/CacheDataSourceFactoryProvider.kt b/app/src/main/java/audio/funkwhale/ffa/playback/CacheDataSourceFactoryProvider.kt
index 74132d25..8dd33ec1 100644
--- a/app/src/main/java/audio/funkwhale/ffa/playback/CacheDataSourceFactoryProvider.kt
+++ b/app/src/main/java/audio/funkwhale/ffa/playback/CacheDataSourceFactoryProvider.kt
@@ -9,7 +9,6 @@ import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory
 import com.google.android.exoplayer2.upstream.FileDataSource
 import com.google.android.exoplayer2.upstream.cache.Cache
 import com.google.android.exoplayer2.upstream.cache.CacheDataSource
-import com.google.android.exoplayer2.upstream.cache.CacheDataSourceFactory
 import com.google.android.exoplayer2.util.Util
 
 class CacheDataSourceFactoryProvider(
@@ -18,19 +17,19 @@ class CacheDataSourceFactoryProvider(
   private val exoDownloadCache: Cache
 ) {
 
-  fun create(context: Context): CacheDataSourceFactory {
+  fun create(context: Context): CacheDataSource.Factory {
 
-    val playbackCache =
-      CacheDataSourceFactory(exoCache, createDatasourceFactory(context, oAuth))
+    val playbackCache = CacheDataSource.Factory().apply {
+      setCache(exoCache)
+      setUpstreamDataSourceFactory(createDatasourceFactory(context, oAuth))
+    }
 
-    return CacheDataSourceFactory(
-      exoDownloadCache,
-      playbackCache,
-      FileDataSource.Factory(),
-      null,
-      CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR,
-      null
-    )
+    return CacheDataSource.Factory().apply {
+      setCache(exoDownloadCache)
+      setUpstreamDataSourceFactory(playbackCache)
+      setCacheReadDataSourceFactory(FileDataSource.Factory())
+      setFlags(CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR)
+    }
   }
 
   private fun createDatasourceFactory(context: Context, oAuth: OAuth): DataSource.Factory {
diff --git a/app/src/main/java/audio/funkwhale/ffa/playback/OAuth2Datasource.kt b/app/src/main/java/audio/funkwhale/ffa/playback/OAuth2Datasource.kt
index 64b5786b..e53f0ddc 100644
--- a/app/src/main/java/audio/funkwhale/ffa/playback/OAuth2Datasource.kt
+++ b/app/src/main/java/audio/funkwhale/ffa/playback/OAuth2Datasource.kt
@@ -3,11 +3,7 @@ package audio.funkwhale.ffa.playback
 import android.content.Context
 import android.net.Uri
 import audio.funkwhale.ffa.utils.OAuth
-import com.google.android.exoplayer2.upstream.DataSource
-import com.google.android.exoplayer2.upstream.DataSpec
-import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory
-import com.google.android.exoplayer2.upstream.HttpDataSource
-import com.google.android.exoplayer2.upstream.TransferListener
+import com.google.android.exoplayer2.upstream.*
 
 class OAuthDatasource(
   private val context: Context,
@@ -15,11 +11,11 @@ class OAuthDatasource(
   private val oauth: OAuth
 ) : DataSource {
 
-  override fun addTransferListener(transferListener: TransferListener?) {
+  override fun addTransferListener(transferListener: TransferListener) {
     http.addTransferListener(transferListener)
   }
 
-  override fun open(dataSpec: DataSpec?): Long {
+  override fun open(dataSpec: DataSpec): Long {
     oauth.tryRefreshAccessToken(context)
     http.apply {
       setRequestProperty("Authorization", "Bearer ${oauth.state().accessToken}")
@@ -27,7 +23,7 @@ class OAuthDatasource(
     return http.open(dataSpec)
   }
 
-  override fun read(buffer: ByteArray?, offset: Int, readLength: Int): Int {
+  override fun read(buffer: ByteArray, offset: Int, readLength: Int): Int {
     return http.read(buffer, offset, readLength)
   }
 
diff --git a/app/src/main/java/audio/funkwhale/ffa/playback/PinService.kt b/app/src/main/java/audio/funkwhale/ffa/playback/PinService.kt
index 0ef225c7..587c7c13 100644
--- a/app/src/main/java/audio/funkwhale/ffa/playback/PinService.kt
+++ b/app/src/main/java/audio/funkwhale/ffa/playback/PinService.kt
@@ -3,7 +3,7 @@ package audio.funkwhale.ffa.playback
 import android.app.Notification
 import android.content.Context
 import android.content.Intent
-import android.net.Uri
+import androidx.core.net.toUri
 import audio.funkwhale.ffa.R
 import audio.funkwhale.ffa.model.DownloadInfo
 import audio.funkwhale.ffa.model.Track
@@ -42,16 +42,12 @@ class PinService : DownloadService(AppContext.NOTIFICATION_DOWNLOADS) {
           )
         ).toByteArray()
 
-        DownloadRequest(
-          url,
-          DownloadRequest.TYPE_PROGRESSIVE,
-          Uri.parse(url),
-          Collections.emptyList(),
-          null,
-          data
-        ).also {
-          sendAddDownload(context, PinService::class.java, it, false)
-        }
+        val request = DownloadRequest.Builder(track.id.toString(), url.toUri())
+          .setData(data)
+          .setStreamKeys(Collections.emptyList())
+          .build()
+
+        sendAddDownload(context, PinService::class.java, request, false)
       }
     }
   }
@@ -83,14 +79,19 @@ class PinService : DownloadService(AppContext.NOTIFICATION_DOWNLOADS) {
     return DownloadNotificationHelper(
       this,
       AppContext.NOTIFICATION_CHANNEL_DOWNLOADS
-    ).buildProgressNotification(R.drawable.downloads, null, description, downloads)
+    ).buildProgressNotification(this, R.drawable.downloads, null, description, downloads)
   }
 
   private fun getDownloads() = downloadManager.downloadIndex.getDownloads()
 
   inner class DownloadListener : DownloadManager.Listener {
-    override fun onDownloadChanged(downloadManager: DownloadManager, download: Download) {
-      super.onDownloadChanged(downloadManager, download)
+
+    override fun onDownloadChanged(
+      downloadManager: DownloadManager,
+      download: Download,
+      finalException: Exception?
+    ) {
+      super.onDownloadChanged(downloadManager, download, finalException)
 
       EventBus.send(Event.DownloadChanged(download))
     }
diff --git a/app/src/main/java/audio/funkwhale/ffa/playback/PlayerService.kt b/app/src/main/java/audio/funkwhale/ffa/playback/PlayerService.kt
index 5032195c..3731c1b4 100644
--- a/app/src/main/java/audio/funkwhale/ffa/playback/PlayerService.kt
+++ b/app/src/main/java/audio/funkwhale/ffa/playback/PlayerService.kt
@@ -476,10 +476,13 @@ class PlayerService : Service() {
       CommandBus.send(Command.RefreshTrack(queue.current()))
     }
 
-    override fun onPositionDiscontinuity(reason: Int) {
-      super.onPositionDiscontinuity(reason)
-
-      if (reason == Player.DISCONTINUITY_REASON_PERIOD_TRANSITION) {
+    override fun onPositionDiscontinuity(
+      oldPosition: Player.PositionInfo,
+      newPosition: Player.PositionInfo,
+      reason: Int
+    ) {
+      super.onPositionDiscontinuity(oldPosition, newPosition, reason)
+      if (reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION) {
         val currentTrack = queue.current().also {
           it.log("Track finished")
         }
diff --git a/buildSrc/src/main/java/Versions.kt b/buildSrc/src/main/java/Versions.kt
index 54755774..d1f702a5 100644
--- a/buildSrc/src/main/java/Versions.kt
+++ b/buildSrc/src/main/java/Versions.kt
@@ -4,8 +4,8 @@ object Versions {
   const val unmock = "0.7.8"
   const val gradleDependencyPlugin = "0.38.0"
 
-  const val exoPlayer = "2.11.8"
-  const val exoPlayerExtensions = "2.11.4"
+  const val exoPlayer = "2.14.2"
+  const val exoPlayerExtensions = "2.14.0"
   const val fuel = "2.3.1"
   const val gson = "2.8.7"
   const val powerPreference = "2.0.0"
diff --git a/changes/changelog.d/65.misc b/changes/changelog.d/65.misc
new file mode 100644
index 00000000..dc10a30f
--- /dev/null
+++ b/changes/changelog.d/65.misc
@@ -0,0 +1 @@
+Upgrade ExoPlayer version to 2.14.2 (#65)
-- 
GitLab