[Android] Export equalizer to a file
Nicolas Pomepuy
git at videolan.org
Fri Jul 25 11:46:43 UTC 2025
vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Thu Jun 19 07:48:06 2025 +0200| [6546ba5b58438dae5c58bd7b962280c7a016a5ea] | committer: Nicolas Pomepuy
Export equalizer to a file
> https://code.videolan.org/videolan/vlc-android/commit/6546ba5b58438dae5c58bd7b962280c7a016a5ea
---
.../resources/src/main/res/values/strings.xml | 1 +
.../videolan/vlc/gui/EqualizerSettingsActivity.kt | 23 +++++++++-
.../src/org/videolan/vlc/util/JsonUtil.kt | 53 ++++++++++++++++++++++
3 files changed, 75 insertions(+), 2 deletions(-)
diff --git a/application/resources/src/main/res/values/strings.xml b/application/resources/src/main/res/values/strings.xml
index 3a61c00f83..29fee8a5a0 100644
--- a/application/resources/src/main/res/values/strings.xml
+++ b/application/resources/src/main/res/values/strings.xml
@@ -137,6 +137,7 @@
<string name="bookmarks">Bookmarks</string>
<string name="equalizer">Equalizer</string>
<string name="import_equalizer">Import equalizer</string>
+ <string name="equalizer_exported">Equalizer exported to %s</string>
<string name="show_all">Show all</string>
<string name="hide_all">Hide all</string>
<string name="all_albums">All albums</string>
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/EqualizerSettingsActivity.kt b/application/vlc-android/src/org/videolan/vlc/gui/EqualizerSettingsActivity.kt
index ca76a16bd5..f02e5d53c2 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/EqualizerSettingsActivity.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/EqualizerSettingsActivity.kt
@@ -7,6 +7,7 @@ import android.graphics.Paint
import android.graphics.Path
import android.graphics.Rect
import android.graphics.RectF
+import android.net.Uri
import android.os.Bundle
import android.util.Log
import android.util.TypedValue
@@ -23,6 +24,7 @@ import androidx.core.content.ContextCompat
import androidx.core.graphics.createBitmap
import androidx.databinding.BindingAdapter
import androidx.databinding.DataBindingUtil
+import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
@@ -30,6 +32,7 @@ import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.appbar.MaterialToolbar
+import com.squareup.moshi.Moshi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.videolan.resources.AndroidDevices
@@ -42,8 +45,11 @@ import org.videolan.vlc.databinding.EqualizerSettingsActivityBinding
import org.videolan.vlc.gui.dialogs.EqualizerFragmentDialog
import org.videolan.vlc.gui.helpers.SelectorViewHolder
import org.videolan.vlc.gui.helpers.UiTools
+import org.videolan.vlc.gui.helpers.hf.StoragePermissionsDelegate.Companion.getWritePermission
import org.videolan.vlc.mediadb.models.EqualizerWithBands
import org.videolan.vlc.repository.EqualizerRepository
+import org.videolan.vlc.util.JsonUtil
+import java.io.File
/**
@@ -134,8 +140,21 @@ class EqualizerSettingsModel(private val equalizerRepository: EqualizerRepositor
equalizerRepository.addOrUpdateEqualizerWithBands(context, oldEqualizer!!)
}
- fun export(context: Context, equalizer: EqualizerWithBands) = viewModelScope.launch(Dispatchers.IO) {
-//todo add export
+ fun export(context: FragmentActivity, equalizer: EqualizerWithBands) = viewModelScope.launch(Dispatchers.IO) {
+ val characterFilter = Regex("[^\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s]")
+ val fileName: String? = equalizer.equalizerEntry.name
+ .replace(characterFilter, "")
+ .lowercase()
+ .trim()
+ .replace(" ", "_")
+ .replace("/", "")
+ UiTools.snacker(context, context.getString(R.string.equalizer_exported, fileName))
+ val dst = File(AndroidDevices.EXTERNAL_PUBLIC_DIRECTORY + File.separator + fileName + ".json")
+ if (context.getWritePermission(Uri.fromFile(dst))) {
+ JsonUtil.convertToJson(equalizer).let {
+ dst.writeText(it)
+ }
+ }
}
fun showAll(context: Context) = viewModelScope.launch(Dispatchers.IO) {
diff --git a/application/vlc-android/src/org/videolan/vlc/util/JsonUtil.kt b/application/vlc-android/src/org/videolan/vlc/util/JsonUtil.kt
new file mode 100644
index 0000000000..4b2dfcbb26
--- /dev/null
+++ b/application/vlc-android/src/org/videolan/vlc/util/JsonUtil.kt
@@ -0,0 +1,53 @@
+/*
+ * ************************************************************************
+ * JsonUtil.kt
+ * *************************************************************************
+ * Copyright © 2025 VLC authors and VideoLAN
+ * Author: Nicolas POMEPUY
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ * **************************************************************************
+ *
+ *
+ */
+
+ at file:Suppress("RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")
+
+package org.videolan.vlc.util
+
+import com.squareup.moshi.JsonAdapter
+import com.squareup.moshi.JsonReader
+import com.squareup.moshi.JsonWriter
+import com.squareup.moshi.Moshi
+import com.squareup.moshi.Types
+import java.text.DateFormat
+import java.util.Date
+import java.util.Locale
+
+object JsonUtil {
+ fun convertToJson(data: Any?): String {
+ if (data == null) return "{}"
+ val moshi = Moshi.Builder().build()
+ val adapter = moshi.adapter<Any>(data::class.java)
+ return adapter.toJson(data)
+ }
+
+ inline fun <reified K, reified V> convertToJson(data: Map<K,V>?): String {
+ val moshi = Moshi.Builder().build()
+ val type = Types.newParameterizedType(MutableMap::class.java, K::class.java, V::class.java)
+ val adapter = moshi.adapter<Map<K,V>>(type).nullSafe()
+ return adapter.toJson(data)
+ }
+}
+
More information about the Android
mailing list