From 5fd7fb1807747f8e2fc3274387182faa76e18e6d 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 +-
 4 files changed, 23 insertions(+), 22 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 7004c21385..5b49c5a958 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"
-- 
GitLab


From 1015cada0c8ed324f186d274e56a72a77a5347d7 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 6c34da619b554acddc4a4c131e2a811b91eac5c0 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 5b49c5a958..75a381fbf7 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