[Android] Prevent multiple crashes when restoring settings
Nicolas Pomepuy
git at videolan.org
Wed Jul 23 11:41:54 UTC 2025
vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Thu Jul 3 13:49:37 2025 +0200| [ff75755687b663b1c0b97b48b0406343c563cf6a] | committer: Nicolas Pomepuy
Prevent multiple crashes when restoring settings
> https://code.videolan.org/videolan/vlc-android/commit/ff75755687b663b1c0b97b48b0406343c563cf6a
---
application/resources/src/main/res/values/strings.xml | 1 +
.../television/ui/preferences/PreferencesAdvanced.kt | 18 ++++++++++++------
.../vlc/gui/preferences/PreferencesAdvanced.kt | 19 ++++++++++++-------
.../vlc/gui/preferences/search/PreferenceParser.kt | 7 +++++--
4 files changed, 30 insertions(+), 15 deletions(-)
diff --git a/application/resources/src/main/res/values/strings.xml b/application/resources/src/main/res/values/strings.xml
index 315aa1d285..8ae58635a3 100644
--- a/application/resources/src/main/res/values/strings.xml
+++ b/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="confirm_replace_playlist">Are you sure you want to replace the playlist \'%1$s\'?</string>
+ <string name="invalid_settings_file">Invalid settings file</string>
<string name="confirm_delete_message">This is permanent and cannot be undone.</string>
<string name="confirm_delete_album">Delete the album \'%1$s\'?</string>
<string name="confirm_delete_several_media">Delete these %1$d media?</string>
diff --git a/application/television/src/main/java/org/videolan/television/ui/preferences/PreferencesAdvanced.kt b/application/television/src/main/java/org/videolan/television/ui/preferences/PreferencesAdvanced.kt
index 0cf7d87e57..151c5bf6e9 100644
--- a/application/television/src/main/java/org/videolan/television/ui/preferences/PreferencesAdvanced.kt
+++ b/application/television/src/main/java/org/videolan/television/ui/preferences/PreferencesAdvanced.kt
@@ -334,14 +334,20 @@ class PreferencesAdvanced : BasePreferenceFragment(), SharedPreferences.OnShared
if (requestCode == FILE_PICKER_RESULT_CODE) {
if (data.hasExtra(EXTRA_MRL)) {
launch {
- PreferenceParser.restoreSettings(
- activity, Uri.parse(
- data.getStringExtra(
- EXTRA_MRL
+ try {
+
+ PreferenceParser.restoreSettings(
+ activity, Uri.parse(
+ data.getStringExtra(
+ EXTRA_MRL
+ )
)
)
- )
- UiTools.restartDialog(activity!!, true, RESTART_CODE, this)
+ (activity as PreferencesActivity).setRestartApp()
+ } catch (e: Exception) {
+ Log.e("EqualizerSettings", "onActivityResult: ${e.message}", e)
+ Toast.makeText(activity, R.string.invalid_settings_file, Toast.LENGTH_LONG).show()
+ }
}
}
}
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesAdvanced.kt b/application/vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesAdvanced.kt
index fc027204e5..0498b5bc9f 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesAdvanced.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesAdvanced.kt
@@ -372,15 +372,20 @@ class PreferencesAdvanced : BasePreferenceFragment(), SharedPreferences.OnShared
if (requestCode == FILE_PICKER_RESULT_CODE) {
if (data.hasExtra(EXTRA_MRL)) {
lifecycleScope.launch {
- PreferenceParser.restoreSettings(
- requireActivity(), Uri.parse(
- data.getStringExtra(
- EXTRA_MRL
+ try {
+ PreferenceParser.restoreSettings(
+ requireActivity(), Uri.parse(
+ data.getStringExtra(
+ EXTRA_MRL
+ )
)
)
- )
- VLCInstance.restart()
- UiTools.restartDialog(requireActivity())
+ VLCInstance.restart()
+ UiTools.restartDialog(requireActivity())
+ } catch (e: Exception) {
+ Log.e("EqualizerSettings", "onActivityResult: ${e.message}", e)
+ UiTools.snacker(requireActivity(), getString(R.string.invalid_settings_file))
+ }
}
}
}
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/preferences/search/PreferenceParser.kt b/application/vlc-android/src/org/videolan/vlc/gui/preferences/search/PreferenceParser.kt
index 7c8b5a5965..4ed17f2797 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/preferences/search/PreferenceParser.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/preferences/search/PreferenceParser.kt
@@ -457,7 +457,7 @@ object PreferenceParser {
}
withContext(Dispatchers.Main) {
if (success)
- if (activity is FragmentActivity)
+ if (activity is FragmentActivity && !Settings.tvUI)
UiTools.snackerConfirm(activity, activity.getString(R.string.export_settings_success), confirmMessage = R.string.share, overAudioPlayer = false) {
activity.share(dst)
}
@@ -480,12 +480,15 @@ object PreferenceParser {
val adapter: JsonAdapter<SettingsBackup> = moshi.adapter(SettingsBackup::class.java)
val savedSettings = adapter.fromJson(changedPrefs)
+ if (savedSettings?.settings == null || savedSettings.version == 0) throw IllegalStateException("Invalid file")
+
+
//First create a dedicated shared preference for restoring
val restorePrefsName = activity.packageName + "_restore"
val restoringPrefs = activity.getSharedPreferences(restorePrefsName, Context.MODE_PRIVATE)
restoringPrefs.edit {
- savedSettings?.settings?.forEach { settingEntry ->
+ savedSettings.settings.forEach { settingEntry ->
when (settingEntry.type) {
SettingType.BOOLEAN -> putBoolean(settingEntry.key, settingEntry.value as Boolean)
SettingType.INT -> putInt(settingEntry.key, (settingEntry.value as Double).toInt())
More information about the Android
mailing list