From 119d7632f63fc67f1bd3ac092b49b179c8845ee4 Mon Sep 17 00:00:00 2001
From: Nicolas Pomepuy <nicolas@videolabs.io>
Date: Fri, 21 Mar 2025 08:51:34 +0100
Subject: [PATCH 1/3] Bump android gradle plugin and kotlin versions

---
 .../org/videolan/vlc/gui/DebugLogActivity.kt  |  2 +-
 .../org/videolan/vlc/util/FilterDelegate.kt   | 37 ++++++++++---------
 .../org/videolan/vlc/viewmodels/BaseModel.kt  |  2 +-
 build.gradle                                  |  4 +-
 buildsystem/compile.sh                        |  4 +-
 buildsystem/gitlab/.gitlab-ci.yml             |  2 +-
 6 files changed, 26 insertions(+), 25 deletions(-)

diff --git a/application/vlc-android/src/org/videolan/vlc/gui/DebugLogActivity.kt b/application/vlc-android/src/org/videolan/vlc/gui/DebugLogActivity.kt
index 4d59c31475..0aeaaa37f0 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/DebugLogActivity.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/DebugLogActivity.kt
@@ -157,7 +157,7 @@ class DebugLogActivity : FragmentActivity(), DebugLogService.Client.Callback {
                 share(File(path))
             }
         } else {
-            UiTools.snacker(window.decorView.findViewById(android.R.id.content), R.string.dump_logcat_failure)
+            UiTools.snacker(this, R.string.dump_logcat_failure)
         }
     }
 
diff --git a/application/vlc-android/src/org/videolan/vlc/util/FilterDelegate.kt b/application/vlc-android/src/org/videolan/vlc/util/FilterDelegate.kt
index 8b173c9735..99a5e2f71f 100644
--- a/application/vlc-android/src/org/videolan/vlc/util/FilterDelegate.kt
+++ b/application/vlc-android/src/org/videolan/vlc/util/FilterDelegate.kt
@@ -1,15 +1,15 @@
 package org.videolan.vlc.util
 
-import androidx.lifecycle.MutableLiveData
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.withContext
 import org.videolan.medialibrary.interfaces.media.MediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.resources.AppContextProvider
+import org.videolan.tools.livedata.LiveDataset
 import org.videolan.vlc.media.MediaUtils
 import java.util.Locale
 
-open class FilterDelegate<T : MediaLibraryItem>(val dataset: MutableLiveData<out List<T>>) {
+open class FilterDelegate<T : MediaLibraryItem>(val dataset: LiveDataset<T>) {
     var sourceSet: List<T>? = null
 
     protected fun initSource() : List<T>? {
@@ -21,13 +21,14 @@ open class FilterDelegate<T : MediaLibraryItem>(val dataset: MutableLiveData<out
 
     protected open suspend fun filteringJob(charSequence: CharSequence?) : MutableList<T>? {
         if (charSequence !== null) initSource()?.let {
-            return withContext(Dispatchers.Default) { mutableListOf<T>().apply {
-                val queryStrings = charSequence.trim().toString().split(" ")
-                for (item in it) for (query in queryStrings)
-                    if (item.title.contains(query, true)) {
-                        this.add(item)
-                        break
-                    }
+            return withContext(Dispatchers.Default) {
+                mutableListOf<T>().apply {
+                    val queryStrings = charSequence.trim().toString().split(" ")
+                    for (item in it) for (query in queryStrings)
+                        if (item.title.contains(query, true)) {
+                            this.add(item)
+                            break
+                        }
                 }
             }
         }
@@ -36,17 +37,17 @@ open class FilterDelegate<T : MediaLibraryItem>(val dataset: MutableLiveData<out
 
     private fun publish(list: MutableList<T>?) {
         sourceSet?.let {
-            if (list !== null)
-                dataset.value = list
-            else {
+            list?.let {
                 dataset.value = it
+            } ?: run {
+                dataset.value = it.toMutableList()
                 sourceSet = null
             }
         }
     }
 }
 
-class PlaylistFilterDelegate(dataset: MutableLiveData<out List<MediaWrapper>>) : FilterDelegate<MediaWrapper>(dataset) {
+class PlaylistFilterDelegate(dataset: LiveDataset<MediaWrapper>) : FilterDelegate<MediaWrapper>(dataset) {
 
     override suspend fun filteringJob(charSequence: CharSequence?): MutableList<MediaWrapper>? {
         if (charSequence !== null) initSource()?.let { list ->
@@ -61,11 +62,11 @@ class PlaylistFilterDelegate(dataset: MutableLiveData<out List<MediaWrapper>>) :
                     val genre = MediaUtils.getMediaGenre(AppContextProvider.appContext, media).lowercase(Locale.getDefault())
                     for (queryString in queryStrings) {
                         if (title.contains(queryString) ||
-                                location.contains(queryString) ||
-                                artist.contains(queryString) ||
-                                albumArtist.contains(queryString) ||
-                                album.contains(queryString) ||
-                                genre.contains(queryString)) {
+                            location.contains(queryString) ||
+                            artist.contains(queryString) ||
+                            albumArtist.contains(queryString) ||
+                            album.contains(queryString) ||
+                            genre.contains(queryString)) {
                             this.add(media)
                             break
                         }
diff --git a/application/vlc-android/src/org/videolan/vlc/viewmodels/BaseModel.kt b/application/vlc-android/src/org/videolan/vlc/viewmodels/BaseModel.kt
index 8acb78d443..702bfce9b4 100644
--- a/application/vlc-android/src/org/videolan/vlc/viewmodels/BaseModel.kt
+++ b/application/vlc-android/src/org/videolan/vlc/viewmodels/BaseModel.kt
@@ -40,7 +40,7 @@ private const val TAG = "VLC/BaseModel"
 
 abstract class BaseModel<T : MediaLibraryItem>(context: Context, val coroutineContextProvider: CoroutineContextProvider) : SortableModel(context) {
 
-    private val filter by lazy(LazyThreadSafetyMode.NONE) { FilterDelegate(dataset) }
+    private val filter by lazy(LazyThreadSafetyMode.NONE) { FilterDelegate<T>(dataset) }
 
     val dataset = LiveDataset<T>()
     open val loading = MutableLiveData<Boolean>().apply { value = false }
diff --git a/build.gradle b/build.gradle
index 65f5e7485a..89b9d8d180 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,7 +1,7 @@
 // Top-level build file where you can add configuration options common to all sub-projects/modules.
 buildscript {
-    ext.android_plugin_version = '8.5.0'
-    ext.kotlin_version = '1.9.22'
+    ext.android_plugin_version = '8.9.1'
+    ext.kotlin_version = '2.1.0'
     ext.kotlinx_version = '1.7.1'
     repositories {
         flatDir dirs: "gradle/plugins"
diff --git a/buildsystem/compile.sh b/buildsystem/compile.sh
index 862110d8c6..84ff66c576 100755
--- a/buildsystem/compile.sh
+++ b/buildsystem/compile.sh
@@ -259,8 +259,8 @@ fi
 
 if [ ! -d "gradle/wrapper" ]; then
     diagnostic "Downloading gradle"
-    GRADLE_VERSION=8.7
-    GRADLE_SHA256=544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d
+    GRADLE_VERSION=8.13
+    GRADLE_SHA256=20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78
     GRADLE_URL=https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip
     wget ${GRADLE_URL} 2>/dev/null || curl -O ${GRADLE_URL} || fail "gradle: download failed"
     echo $GRADLE_SHA256 gradle-${GRADLE_VERSION}-bin.zip | sha256sum -c || fail "gradle: hash mismatch"
diff --git a/buildsystem/gitlab/.gitlab-ci.yml b/buildsystem/gitlab/.gitlab-ci.yml
index d37a889263..c9ca209362 100644
--- a/buildsystem/gitlab/.gitlab-ci.yml
+++ b/buildsystem/gitlab/.gitlab-ci.yml
@@ -1,7 +1,7 @@
 cache:
     paths:
         - .gradle/
-        - gradle-8.7/
+        - gradle-8.13/
         - gradle/
         - gradlew
 
-- 
GitLab


From ce7acc92915f3b3fdcca1aa9db90fc1f7088c337 Mon Sep 17 00:00:00 2001
From: Nicolas Pomepuy <nicolas@videolabs.io>
Date: Mon, 7 Apr 2025 10:38:19 +0200
Subject: [PATCH 2/3] Use the new gradle plugin syntax

---
 application/app/build.gradle             |  6 ++++--
 application/donations/build.gradle       |  6 ++++--
 application/live-plot-graph/build.gradle |  6 ++++--
 application/mediadb/build.gradle         |  9 +++++----
 application/moviepedia/build.gradle      |  8 +++++---
 application/resources/build.gradle       |  6 ++++--
 application/television/build.gradle      | 10 ++++++----
 application/tools/build.gradle           |  6 ++++--
 application/vlc-android/build.gradle     | 10 ++++++----
 9 files changed, 42 insertions(+), 25 deletions(-)

diff --git a/application/app/build.gradle b/application/app/build.gradle
index 212c3be4ed..12d2fb90ca 100644
--- a/application/app/build.gradle
+++ b/application/app/build.gradle
@@ -1,5 +1,7 @@
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
+plugins {
+    id 'com.android.application'
+    id 'kotlin-android'
+}
 
 android {
     compileOptions {
diff --git a/application/donations/build.gradle b/application/donations/build.gradle
index 2d7d1bf3f4..be14b36153 100644
--- a/application/donations/build.gradle
+++ b/application/donations/build.gradle
@@ -22,8 +22,10 @@
  *
  */
 
-apply plugin: 'com.android.library'
-apply plugin: 'kotlin-android'
+plugins {
+    id 'com.android.library'
+    id 'kotlin-android'
+}
 
 android {
 
diff --git a/application/live-plot-graph/build.gradle b/application/live-plot-graph/build.gradle
index 32396eec91..97d6f27eca 100644
--- a/application/live-plot-graph/build.gradle
+++ b/application/live-plot-graph/build.gradle
@@ -22,8 +22,10 @@
  *
  */
 
-apply plugin: 'com.android.library'
-apply plugin: 'kotlin-android'
+plugins {
+    id 'com.android.library'
+    id 'kotlin-android'
+}
 
 android {
 
diff --git a/application/mediadb/build.gradle b/application/mediadb/build.gradle
index 02ef2569e1..24aef03d38 100644
--- a/application/mediadb/build.gradle
+++ b/application/mediadb/build.gradle
@@ -21,10 +21,11 @@
  *
  *
  */
-
-apply plugin: 'com.android.library'
-apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-kapt'
+plugins {
+    id 'com.android.library'
+    id 'kotlin-android'
+    id 'kotlin-kapt'
+}
 
 android {
 
diff --git a/application/moviepedia/build.gradle b/application/moviepedia/build.gradle
index 5dc1408495..b21d20a62d 100644
--- a/application/moviepedia/build.gradle
+++ b/application/moviepedia/build.gradle
@@ -1,6 +1,8 @@
-apply plugin: 'com.android.library'
-apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-kapt'
+plugins {
+    id 'com.android.library'
+    id 'kotlin-android'
+    id 'kotlin-kapt'
+}
 
 android {
 
diff --git a/application/resources/build.gradle b/application/resources/build.gradle
index 344c304e50..8187d3b544 100644
--- a/application/resources/build.gradle
+++ b/application/resources/build.gradle
@@ -1,5 +1,7 @@
-apply plugin: 'com.android.library'
-apply plugin: 'kotlin-android'
+plugins {
+    id 'com.android.library'
+    id 'kotlin-android'
+}
 
 android {
 
diff --git a/application/television/build.gradle b/application/television/build.gradle
index 5b5c58c2f7..aa720bd4d5 100644
--- a/application/television/build.gradle
+++ b/application/television/build.gradle
@@ -1,7 +1,9 @@
-apply plugin: 'com.android.library'
-apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-kapt'
-apply plugin: 'kotlin-parcelize'
+plugins {
+    id 'com.android.library'
+    id 'kotlin-android'
+    id 'kotlin-kapt'
+    id 'kotlin-parcelize'
+}
 
 android {
 
diff --git a/application/tools/build.gradle b/application/tools/build.gradle
index 3ae05a583b..25f11569d4 100644
--- a/application/tools/build.gradle
+++ b/application/tools/build.gradle
@@ -1,5 +1,7 @@
-apply plugin: 'com.android.library'
-apply plugin: 'kotlin-android'
+plugins {
+    id 'com.android.library'
+    id 'kotlin-android'
+}
 
 android {
 
diff --git a/application/vlc-android/build.gradle b/application/vlc-android/build.gradle
index e37071da8a..417f0bb984 100644
--- a/application/vlc-android/build.gradle
+++ b/application/vlc-android/build.gradle
@@ -1,7 +1,9 @@
-apply plugin: 'com.android.library'
-apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-kapt'
-apply plugin: 'kotlin-parcelize'
+plugins {
+    id 'com.android.library'
+    id 'org.jetbrains.kotlin.android'
+    id 'kotlin-kapt'
+    id 'kotlin-parcelize'
+}
 
 android {
 
-- 
GitLab


From e114dd67fd50d74964fd254ca62f6f02df564afd Mon Sep 17 00:00:00 2001
From: Nicolas Pomepuy <nicolas@videolabs.io>
Date: Mon, 7 Apr 2025 13:09:25 +0200
Subject: [PATCH 3/3] Migrate to ksp

---
 application/mediadb/build.gradle     |  6 +++---
 application/moviepedia/build.gradle  |  5 +++--
 application/television/build.gradle  |  2 +-
 application/vlc-android/build.gradle | 14 +++-----------
 build.gradle                         |  6 +++++-
 5 files changed, 15 insertions(+), 18 deletions(-)

diff --git a/application/mediadb/build.gradle b/application/mediadb/build.gradle
index 24aef03d38..408de4e0ae 100644
--- a/application/mediadb/build.gradle
+++ b/application/mediadb/build.gradle
@@ -24,7 +24,7 @@
 plugins {
     id 'com.android.library'
     id 'kotlin-android'
-    id 'kotlin-kapt'
+    id 'com.google.devtools.ksp'
 }
 
 android {
@@ -73,8 +73,8 @@ dependencies {
     androidTestImplementation "androidx.test.espresso:espresso-core:$rootProject.ext.espressoVersion"
     //Room
     implementation "androidx.room:room-ktx:$rootProject.ext.roomVersion"
-    kapt ('org.xerial:sqlite-jdbc:3.36.0')
-    kapt "androidx.room:room-compiler:$rootProject.ext.roomVersion"
+    ksp ('org.xerial:sqlite-jdbc:3.36.0')
+    ksp "androidx.room:room-compiler:$rootProject.ext.roomVersion"
     implementation project(':application:tools')
     implementation project(':application:resources')
 
diff --git a/application/moviepedia/build.gradle b/application/moviepedia/build.gradle
index b21d20a62d..749c13eeec 100644
--- a/application/moviepedia/build.gradle
+++ b/application/moviepedia/build.gradle
@@ -2,6 +2,7 @@ plugins {
     id 'com.android.library'
     id 'kotlin-android'
     id 'kotlin-kapt'
+    id 'com.google.devtools.ksp'
 }
 
 android {
@@ -66,8 +67,8 @@ dependencies {
     //Room
     implementation "androidx.room:room-runtime:$rootProject.ext.roomVersion"
     // Provide proper JDBC version, see https://issuetracker.google.com/issues/174695268
-    kapt ('org.xerial:sqlite-jdbc:3.36.0')
-    kapt "androidx.room:room-compiler:$rootProject.ext.roomVersion"
+    ksp ('org.xerial:sqlite-jdbc:3.36.0')
+    ksp "androidx.room:room-compiler:$rootProject.ext.roomVersion"
 
 
     // Retrofit
diff --git a/application/television/build.gradle b/application/television/build.gradle
index aa720bd4d5..fa2a84e639 100644
--- a/application/television/build.gradle
+++ b/application/television/build.gradle
@@ -1,7 +1,7 @@
 plugins {
     id 'com.android.library'
     id 'kotlin-android'
-    id 'kotlin-kapt'
+    id 'com.google.devtools.ksp'
     id 'kotlin-parcelize'
 }
 
diff --git a/application/vlc-android/build.gradle b/application/vlc-android/build.gradle
index 417f0bb984..b49d7cd5f3 100644
--- a/application/vlc-android/build.gradle
+++ b/application/vlc-android/build.gradle
@@ -2,6 +2,7 @@ plugins {
     id 'com.android.library'
     id 'org.jetbrains.kotlin.android'
     id 'kotlin-kapt'
+    id 'com.google.devtools.ksp'
     id 'kotlin-parcelize'
 }
 
@@ -183,8 +184,8 @@ dependencies {
     api 'androidx.gridlayout:gridlayout:1.0.0'
     api "androidx.car.app:app:$rootProject.ext.carVersion"
 
-    kapt ("org.xerial:sqlite-jdbc:jdbcVersion")
-    kapt("androidx.room:room-compiler:$rootProject.ext.roomVersion")
+    ksp ("org.xerial:sqlite-jdbc:jdbcVersion")
+    ksp("androidx.room:room-compiler:$rootProject.ext.roomVersion")
 
     api "androidx.paging:paging-runtime-ktx:$rootProject.ext.pagingVersion"
 
@@ -289,12 +290,3 @@ def isBeta() {
     def versionNameLower = versionName.toLowerCase()
     return (versionNameLower.contains("beta") || versionNameLower.contains("rc") || versionNameLower.contains("alpha") || versionNameLower.contains("dev")).toString()
 }
-
-
-kapt {
-    javacOptions {
-        // Increase the max count of errors from annotation processors.
-        // Default is 100.
-        option("-Xmaxerrs", 500)
-    }
-}
diff --git a/build.gradle b/build.gradle
index 89b9d8d180..e84b88f9fb 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,7 +1,7 @@
 // Top-level build file where you can add configuration options common to all sub-projects/modules.
 buildscript {
     ext.android_plugin_version = '8.9.1'
-    ext.kotlin_version = '2.1.0'
+    ext.kotlin_version = '2.1.20'
     ext.kotlinx_version = '1.7.1'
     repositories {
         flatDir dirs: "gradle/plugins"
@@ -17,6 +17,10 @@ buildscript {
     }
 }
 
+plugins {
+    id 'com.google.devtools.ksp' version '2.1.20-1.0.32' apply false
+}
+
 allprojects {
     repositories {
         google()
-- 
GitLab