From 977c4618ef7c1a2fbf9ac2eabfa7b6784dd64450 Mon Sep 17 00:00:00 2001 From: Josia Pietsch Date: Fri, 2 Aug 2024 01:52:52 +0200 Subject: [PATCH] fix: update SettingsFragmentActions when preferences change --- .../actions/SettingsFragmentActions.kt | 28 ++++++++++++++----- .../SettingsFragmentActionsRecycler.kt | 18 ++++++++++-- .../launcher/SettingsFragmentLauncher.kt | 16 +++-------- app/src/main/res/layout/settings_actions.xml | 2 +- 4 files changed, 41 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/de/jrpie/android/launcher/settings/actions/SettingsFragmentActions.kt b/app/src/main/java/de/jrpie/android/launcher/settings/actions/SettingsFragmentActions.kt index 907b84d..62b4758 100644 --- a/app/src/main/java/de/jrpie/android/launcher/settings/actions/SettingsFragmentActions.kt +++ b/app/src/main/java/de/jrpie/android/launcher/settings/actions/SettingsFragmentActions.kt @@ -2,6 +2,8 @@ package de.jrpie.android.launcher.settings.actions import android.content.ActivityNotFoundException import android.content.Intent +import android.content.SharedPreferences +import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.net.Uri import android.os.Bundle import android.view.LayoutInflater @@ -10,9 +12,9 @@ import android.view.ViewGroup import android.widget.Toast import androidx.fragment.app.Fragment import de.jrpie.android.launcher.* +import de.jrpie.android.launcher.databinding.SettingsActionsBinding import de.jrpie.android.launcher.list.ListActivity import de.jrpie.android.launcher.settings.intendedSettingsPause -import de.jrpie.android.launcher.databinding.SettingsActionsBinding /** @@ -25,35 +27,42 @@ import de.jrpie.android.launcher.databinding.SettingsActionsBinding class SettingsFragmentActions : Fragment(), UIObject { - private lateinit var binding: SettingsActionsBinding + private var binding: SettingsActionsBinding? = null + + private val sharedPreferencesListener = + OnSharedPreferenceChangeListener { _, _ -> + binding?.let { it.settingsActionsRviewFragment.getFragment().actionViewAdapter?.updateActions() } + } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { + getPreferences(requireContext()).registerOnSharedPreferenceChangeListener(sharedPreferencesListener) binding = SettingsActionsBinding.inflate(inflater, container, false) - return binding.root + return binding!!.root } override fun onStart() { super.onStart() super.onStart() + } override fun applyTheme() { - setButtonColor(binding.settingsActionsButtonViewApps, vibrantColor) - setButtonColor(binding.settingsActionsButtonInstallApps, vibrantColor) + setButtonColor(binding!!.settingsActionsButtonViewApps, vibrantColor) + setButtonColor(binding!!.settingsActionsButtonInstallApps, vibrantColor) } override fun setOnClicks() { // App management buttons - binding.settingsActionsButtonViewApps.setOnClickListener{ + binding!!.settingsActionsButtonViewApps.setOnClickListener{ val intent = Intent(this.context, ListActivity::class.java) intent.putExtra("intention", ListActivity.ListActivityIntention.VIEW.toString()) intendedSettingsPause = true startActivity(intent) } - binding.settingsActionsButtonInstallApps.setOnClickListener{ + binding!!.settingsActionsButtonInstallApps.setOnClickListener{ try { val rateIntent = Intent( Intent.ACTION_VIEW, @@ -67,4 +76,9 @@ class SettingsFragmentActions : Fragment(), UIObject { } } } + + override fun onDestroy() { + super.onDestroy() + getPreferences(requireContext()).unregisterOnSharedPreferenceChangeListener(sharedPreferencesListener) + } } diff --git a/app/src/main/java/de/jrpie/android/launcher/settings/actions/SettingsFragmentActionsRecycler.kt b/app/src/main/java/de/jrpie/android/launcher/settings/actions/SettingsFragmentActionsRecycler.kt index f575f0b..0685a87 100644 --- a/app/src/main/java/de/jrpie/android/launcher/settings/actions/SettingsFragmentActionsRecycler.kt +++ b/app/src/main/java/de/jrpie/android/launcher/settings/actions/SettingsFragmentActionsRecycler.kt @@ -28,6 +28,7 @@ import java.lang.Exception class SettingsFragmentActionsRecycler : Fragment(), UIObject { private lateinit var binding: SettingsActionsRecyclerBinding + public var actionViewAdapter: ActionsRecyclerAdapter? = null override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -41,7 +42,7 @@ class SettingsFragmentActionsRecycler : Fragment(), UIObject { // set up the list / recycler val actionViewManager = LinearLayoutManager(context) - val actionViewAdapter = ActionsRecyclerAdapter( requireActivity() ) + actionViewAdapter = ActionsRecyclerAdapter( requireActivity() ) binding.settingsActionsRview.apply { // improve performance (since content changes don't change the layout size) @@ -57,7 +58,7 @@ class SettingsFragmentActionsRecycler : Fragment(), UIObject { class ActionsRecyclerAdapter(val activity: Activity): RecyclerView.Adapter() { - private val gesturesList: List + private val gesturesList: ArrayList inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener { @@ -123,7 +124,18 @@ class ActionsRecyclerAdapter(val activity: Activity): val edgeActions = getPreferences(activity).getBoolean(PREF_EDGE_ACTIONS_ENABLED, false) gesturesList = Gesture.values().filter { (doubleActions || !it.isDoubleVariant()) - && (edgeActions || !it.isEdgeVariant())} + && (edgeActions || !it.isEdgeVariant())} as ArrayList + } + + public fun updateActions() { + val doubleActions = getPreferences(activity).getBoolean(PREF_DOUBLE_ACTIONS_ENABLED, false) + val edgeActions = getPreferences(activity).getBoolean(PREF_EDGE_ACTIONS_ENABLED, false) + this.gesturesList.clear() + gesturesList.addAll(Gesture.values().filter { + (doubleActions || !it.isDoubleVariant()) + && (edgeActions || !it.isEdgeVariant())}) + + notifyDataSetChanged() } /* */ diff --git a/app/src/main/java/de/jrpie/android/launcher/settings/launcher/SettingsFragmentLauncher.kt b/app/src/main/java/de/jrpie/android/launcher/settings/launcher/SettingsFragmentLauncher.kt index d2ebba8..7382ae9 100644 --- a/app/src/main/java/de/jrpie/android/launcher/settings/launcher/SettingsFragmentLauncher.kt +++ b/app/src/main/java/de/jrpie/android/launcher/settings/launcher/SettingsFragmentLauncher.kt @@ -102,16 +102,8 @@ class SettingsFragmentLauncher : Fragment(), UIObject { } bindSwitchToPref(binding.settingsLauncherSwitchAutoLaunch, PREF_SEARCH_AUTO_LAUNCH, false) {} bindSwitchToPref(binding.settingsLauncherSwitchAutoKeyboard, PREF_SEARCH_AUTO_KEYBOARD, true) {} - bindSwitchToPref(binding.settingsLauncherSwitchEnableDouble, PREF_DOUBLE_ACTIONS_ENABLED, false) { - //intendedSettingsPause = true - // TODO fixme: This causes the app to crash on some devices. - //activity?.recreate() - } - bindSwitchToPref(binding.settingsLauncherSwitchEnableEdge, PREF_EDGE_ACTIONS_ENABLED, false) { - //intendedSettingsPause = true - // TODO fixme - //activity?.recreate() - } + bindSwitchToPref(binding.settingsLauncherSwitchEnableDouble, PREF_DOUBLE_ACTIONS_ENABLED, false) {} + bindSwitchToPref(binding.settingsLauncherSwitchEnableEdge, PREF_EDGE_ACTIONS_ENABLED, false) {} binding.settingsSeekbarSensitivity.setOnSeekBarChangeListener( object : SeekBar.OnSeekBarChangeListener { @@ -151,13 +143,13 @@ class SettingsFragmentLauncher : Fragment(), UIObject { // Load values into the theme spinner val staticThemeAdapter = ArrayAdapter.createFromResource( - activity!!, R.array.settings_launcher_theme_spinner_items, + requireActivity(), R.array.settings_launcher_theme_spinner_items, android.R.layout.simple_spinner_item ) staticThemeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) binding.settingsLauncherThemeSpinner.adapter = staticThemeAdapter - val themeInt = when (getSavedTheme(activity!!)) { + val themeInt = when (getSavedTheme(requireActivity())) { "finn" -> 0 "dark" -> 1 else -> 0 diff --git a/app/src/main/res/layout/settings_actions.xml b/app/src/main/res/layout/settings_actions.xml index 09875b3..ca291f1 100644 --- a/app/src/main/res/layout/settings_actions.xml +++ b/app/src/main/res/layout/settings_actions.xml @@ -8,7 +8,7 @@ android:paddingTop="16sp" android:paddingRight="32sp"> -