From 490e29f758073af38d399d5b9fb766fa40ae94f5 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Wed, 26 Oct 2022 13:47:28 -0400 Subject: [PATCH] Remember scroll position for internal settings. --- .../app/internal/InternalSettingsFragment.kt | 27 ++++++++++++++++++- .../securesms/keyvalue/InternalValues.java | 9 +++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt index af5a454a5b..a816baa35b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt @@ -4,9 +4,12 @@ import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.content.DialogInterface +import android.os.Bundle +import android.view.View import android.widget.Toast import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController +import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.signal.core.util.AppUtil import org.signal.core.util.concurrent.SignalExecutors @@ -51,13 +54,35 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter private lateinit var viewModel: InternalSettingsViewModel + private var scrollToPosition: Int = 0 + private val layoutManager: LinearLayoutManager? + get() = recyclerView?.layoutManager as? LinearLayoutManager + + override fun onPause() { + super.onPause() + val firstVisiblePosition: Int? = layoutManager?.findFirstVisibleItemPosition() + if (firstVisiblePosition != null) { + SignalStore.internalValues().lastScrollPosition = firstVisiblePosition + } + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + scrollToPosition = SignalStore.internalValues().lastScrollPosition + } + override fun bindAdapter(adapter: MappingAdapter) { val repository = InternalSettingsRepository(requireContext()) val factory = InternalSettingsViewModel.Factory(repository) viewModel = ViewModelProvider(this, factory)[InternalSettingsViewModel::class.java] viewModel.state.observe(viewLifecycleOwner) { - adapter.submitList(getConfiguration(it).toMappingModelList()) + adapter.submitList(getConfiguration(it).toMappingModelList()) { + if (scrollToPosition != 0) { + layoutManager?.scrollToPositionWithOffset(scrollToPosition, 0) + scrollToPosition = 0 + } + } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java index e27614a07a..63dc509698 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java @@ -27,6 +27,7 @@ public final class InternalValues extends SignalStoreValues { public static final String SHAKE_TO_REPORT = "internal.shake_to_report"; public static final String DISABLE_STORAGE_SERVICE = "internal.disable_storage_service"; public static final String FORCE_WEBSOCKET_MODE = "internal.force_websocket_mode"; + public static final String LAST_SCROLL_POSITION = "internal.last_scroll_position"; InternalValues(KeyValueStore store) { super(store); @@ -176,4 +177,12 @@ public final class InternalValues extends SignalStoreValues { return false; } } + + public void setLastScrollPosition(int position) { + putInteger(LAST_SCROLL_POSITION, position); + } + + public int getLastScrollPosition() { + return getInteger(LAST_SCROLL_POSITION, 0); + } }