From 234f90f34719974102a511a0d806b77bbc8b4777 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Wed, 8 Jan 2025 14:28:24 +0100 Subject: [PATCH] fix: crash when instances refreshed during instance selection (out of bounds) --- .../java/com/github/libretube/ui/activities/WelcomeActivity.kt | 3 ++- .../java/com/github/libretube/ui/adapters/InstancesAdapter.kt | 3 ++- .../com/github/libretube/ui/preferences/InstanceSettings.kt | 3 +++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/github/libretube/ui/activities/WelcomeActivity.kt b/app/src/main/java/com/github/libretube/ui/activities/WelcomeActivity.kt index f0d9d98b9..0f8f5f2fd 100644 --- a/app/src/main/java/com/github/libretube/ui/activities/WelcomeActivity.kt +++ b/app/src/main/java/com/github/libretube/ui/activities/WelcomeActivity.kt @@ -18,6 +18,7 @@ import com.github.libretube.ui.adapters.InstancesAdapter import com.github.libretube.ui.base.BaseActivity import com.github.libretube.ui.models.WelcomeModel import com.github.libretube.ui.preferences.BackupRestoreSettings +import com.google.common.collect.ImmutableList import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -49,7 +50,7 @@ class WelcomeActivity : BaseActivity() { // ALl the binding values are optional due to two different possible layouts (normal, landscape) viewModel.instances.observe(this) { instances -> binding.instancesRecycler.layoutManager = LinearLayoutManager(this@WelcomeActivity) - binding.instancesRecycler.adapter = InstancesAdapter(instances, viewModel.selectedInstanceIndex.value) { index -> + binding.instancesRecycler.adapter = InstancesAdapter(ImmutableList.copyOf(instances), viewModel.selectedInstanceIndex.value) { index -> viewModel.selectedInstanceIndex.value = index binding.okay.alpha = 1f } diff --git a/app/src/main/java/com/github/libretube/ui/adapters/InstancesAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/InstancesAdapter.kt index f2a424e7c..ead0c865f 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/InstancesAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/InstancesAdapter.kt @@ -8,9 +8,10 @@ import com.github.libretube.R import com.github.libretube.api.obj.PipedInstance import com.github.libretube.databinding.InstanceRowBinding import com.github.libretube.ui.viewholders.InstancesViewHolder +import com.google.common.collect.ImmutableList class InstancesAdapter( - private val instances: List, + private val instances: ImmutableList, initialSelectionApiIndex: Int?, private val onSelectInstance: (index: Int) -> Unit ) : RecyclerView.Adapter() { diff --git a/app/src/main/java/com/github/libretube/ui/preferences/InstanceSettings.kt b/app/src/main/java/com/github/libretube/ui/preferences/InstanceSettings.kt index 7ea02f59e..c7c09ae4c 100644 --- a/app/src/main/java/com/github/libretube/ui/preferences/InstanceSettings.kt +++ b/app/src/main/java/com/github/libretube/ui/preferences/InstanceSettings.kt @@ -26,6 +26,7 @@ import com.github.libretube.ui.dialogs.DeleteAccountDialog import com.github.libretube.ui.dialogs.LoginDialog import com.github.libretube.ui.dialogs.LogoutDialog import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.common.collect.ImmutableList import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -184,6 +185,8 @@ class InstanceSettings : BasePreferenceFragment() { val layoutInflater = LayoutInflater.from(context) val binding = SimpleOptionsRecyclerBinding.inflate(layoutInflater) binding.optionsRecycler.layoutManager = LinearLayoutManager(context) + + val instances = ImmutableList.copyOf(this.instances) binding.optionsRecycler.adapter = InstancesAdapter(instances, selectedIndex) { selectedInstance = instances[it].apiUrl }