Browse Source

Equalizer import implementation

merge-requests/2298/head
Nicolas Pomepuy 1 year ago
parent
commit
3c8065ae73
  1. 1
      application/resources/src/main/res/values/strings.xml
  2. 41
      application/vlc-android/src/org/videolan/vlc/gui/EqualizerSettingsActivity.kt
  3. 6
      application/vlc-android/src/org/videolan/vlc/providers/FilePickerProvider.kt
  4. 3
      application/vlc-android/src/org/videolan/vlc/util/FileUtils.kt
  5. 17
      application/vlc-android/src/org/videolan/vlc/util/JsonUtil.kt

1
application/resources/src/main/res/values/strings.xml

@ -68,6 +68,7 @@
<string name="info">Information</string>
<string name="confirm_delete">Delete the file \'%1$s\'?</string>
<string name="equalizer_deleted">The equalizer has been deleted</string>
<string name="invalid_equalizer_file">Invalid equalizer file</string>
<string name="confirm_delete_eq">Are you sure you want to delete this preset?</string>
<string name="confirm_delete_vlc_eq">Are you sure you want to hide this preset?\nYou can restore it in the equalizer settings.</string>
<string name="confirm_replace_playlist">Are you sure you want to replace the playlist \'%1$s\'?</string>

41
application/vlc-android/src/org/videolan/vlc/gui/EqualizerSettingsActivity.kt

@ -1,6 +1,7 @@
package org.videolan.vlc.gui
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Paint
@ -29,10 +30,10 @@ import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.asLiveData
import androidx.lifecycle.lifecycleScope
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,15 +43,22 @@ import org.videolan.vlc.BuildConfig
import org.videolan.vlc.R
import org.videolan.vlc.databinding.EqualizerSettingItemBinding
import org.videolan.vlc.databinding.EqualizerSettingsActivityBinding
import org.videolan.vlc.gui.browser.EXTRA_MRL
import org.videolan.vlc.gui.browser.FilePickerActivity
import org.videolan.vlc.gui.browser.KEY_PICKER_TYPE
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.providers.PickerType
import org.videolan.vlc.repository.EqualizerRepository
import org.videolan.vlc.util.FileUtils
import org.videolan.vlc.util.JsonUtil
import java.io.File
import androidx.core.net.toUri
private const val FILE_PICKER_RESULT_CODE = 10000
/**
* Equalizer settings activity allowing to enable/disable/delete/export/import the presets
@ -113,10 +121,37 @@ class EqualizerSettingsActivity : BaseActivity() {
R.id.show_equalizer -> EqualizerFragmentDialog().show(supportFragmentManager, "equalizer")
R.id.equalizer_show_all -> model.showAll(this)
R.id.equalizer_hide_all -> model.hideAll(this)
R.id.equalizer_import -> {
val filePickerIntent = Intent(this, FilePickerActivity::class.java)
filePickerIntent.putExtra(KEY_PICKER_TYPE, PickerType.EQUALIZER.ordinal)
startActivityForResult(filePickerIntent, FILE_PICKER_RESULT_CODE)
}
}
return super.onOptionsItemSelected(item)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (data == null) return
if (requestCode == FILE_PICKER_RESULT_CODE) {
if (data.hasExtra(EXTRA_MRL)) lifecycleScope.launch {
data.getStringExtra(EXTRA_MRL)?.toUri()?.path?.let {
val equalizerString = FileUtils.getStringFromFile(it)
try {
val equalizer = JsonUtil.getEqualizerFromJson(equalizerString)
equalizer?.let {
if (it.equalizerEntry == null || it.bands == null || it.bands.isEmpty())
UiTools.snacker(this@EqualizerSettingsActivity, getString(R.string.invalid_equalizer_file))
else
model.insert(this@EqualizerSettingsActivity, it)
}
} catch (_: Exception) {
UiTools.snacker(this@EqualizerSettingsActivity, getString(R.string.invalid_equalizer_file))
}
}
}
}
}
}
class EqualizerSettingsModel(private val equalizerRepository: EqualizerRepository) : ViewModel() {
@ -170,6 +205,10 @@ class EqualizerSettingsModel(private val equalizerRepository: EqualizerRepositor
equalizerRepository.addOrUpdateEqualizerWithBands(context, it.copy(equalizerEntry = it.equalizerEntry.copy(isDisabled = true).apply { id = it.equalizerEntry.id }))
}
}
fun insert(context: Context, bands: EqualizerWithBands) = viewModelScope.launch(Dispatchers.IO) {
equalizerRepository.addOrUpdateEqualizerWithBands(context, bands)
}
}
class EqualizerSettingsModelFactory(private val context: Context, private val repository: EqualizerRepository) : ViewModelProvider.Factory {

6
application/vlc-android/src/org/videolan/vlc/providers/FilePickerProvider.kt

@ -28,7 +28,7 @@ import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.medialibrary.media.MediaLibraryItem
import org.videolan.tools.livedata.LiveDataset
import org.videolan.vlc.util.isSettings
import org.videolan.vlc.util.isSettingsOrEq
import org.videolan.vlc.util.isSoundFont
class FilePickerProvider(context: Context, dataset: LiveDataset<MediaLibraryItem>, url: String?, showDummyCategory: Boolean = false, private val pickerType:PickerType = PickerType.SUBTITLE) : FileBrowserProvider(context, dataset, url, true, showDummyCategory, Medialibrary.SORT_FILENAME, false) {
@ -42,7 +42,7 @@ class FilePickerProvider(context: Context, dataset: LiveDataset<MediaLibraryItem
}
override suspend fun findMedia(media: IMedia) = MLServiceLocator.getAbstractMediaWrapper(media)?.takeIf { mw ->
mw.type == MediaWrapper.TYPE_DIR || (pickerType == PickerType.SUBTITLE && mw.type == MediaWrapper.TYPE_SUBTITLE) || (pickerType == PickerType.SOUNDFONT && mw.uri.isSoundFont()) || (pickerType == PickerType.SETTINGS && mw.uri.isSettings())
mw.type == MediaWrapper.TYPE_DIR || (pickerType == PickerType.SUBTITLE && mw.type == MediaWrapper.TYPE_SUBTITLE) || (pickerType == PickerType.SOUNDFONT && mw.uri.isSoundFont()) || (pickerType == PickerType.SETTINGS && mw.uri.isSettingsOrEq()) || (pickerType == PickerType.EQUALIZER && mw.uri.isSettingsOrEq())
}
override fun computeHeaders(value: List<MediaLibraryItem>) {}
@ -52,5 +52,5 @@ class FilePickerProvider(context: Context, dataset: LiveDataset<MediaLibraryItem
enum class PickerType {
SUBTITLE, SOUNDFONT, SETTINGS
SUBTITLE, SOUNDFONT, SETTINGS, EQUALIZER
}

3
application/vlc-android/src/org/videolan/vlc/util/FileUtils.kt

@ -50,7 +50,6 @@ import org.videolan.vlc.VlcMigrationHelper
import org.videolan.vlc.media.MediaUtils
import java.io.*
import java.lang.Runnable
import java.util.*
import java.util.zip.CRC32
import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream
@ -612,7 +611,7 @@ fun Uri?.isSoundFont():Boolean {
return false
}
fun Uri?.isSettings():Boolean {
fun Uri?.isSettingsOrEq():Boolean {
this?.lastPathSegment?.lowercase()?.let { lastPathSegment ->
if (BuildConfig.DEBUG) Log.d("FilePicker", "Uri: $this -> ${lastPathSegment}")
if (lastPathSegment.lowercase().endsWith(".json")) return true

17
application/vlc-android/src/org/videolan/vlc/util/JsonUtil.kt

@ -27,13 +27,9 @@
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
import org.videolan.vlc.mediadb.models.EqualizerWithBands
object JsonUtil {
fun convertToJson(data: Any?): String {
@ -49,5 +45,16 @@ object JsonUtil {
val adapter = moshi.adapter<Map<K,V>>(type).nullSafe()
return adapter.toJson(data)
}
fun getEqualizerFromJson(string: String): EqualizerWithBands? {
val moshi: Moshi = Moshi.Builder().build()
val type = Types.newParameterizedType(EqualizerWithBands::class.java)
val adapter: JsonAdapter<EqualizerWithBands> = moshi.adapter(type)
adapter.fromJson(string)?.let {
return it
}
return null
}
}

Loading…
Cancel
Save