diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/SettingsFragment.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/SettingsFragment.kt index d6456b43d4..be9c956e7a 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/SettingsFragment.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/SettingsFragment.kt @@ -6,6 +6,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter +import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController @@ -20,6 +21,7 @@ import com.simprints.infra.config.store.models.GeneralConfiguration import com.simprints.infra.config.store.models.GeneralConfiguration.Modality.FINGERPRINT import com.simprints.infra.uibase.viewbinding.viewBinding import dagger.hilt.android.AndroidEntryPoint +import com.simprints.infra.resources.R as IDR @AndroidEntryPoint internal class SettingsFragment : PreferenceFragmentCompat() { @@ -64,20 +66,16 @@ internal class SettingsFragment : PreferenceFragmentCompat() { SettingsPasswordDialogFragment.registerForResult( fragmentManager = childFragmentManager, lifecycleOwner = this, - onSuccess = { + onSuccess = { action -> viewModel.unlockSettings() - createLanguageSelectionDialog().show() + when (action) { + ACTION_LANGUAGE -> createLanguageSelectionDialog().show() + ACTION_CONFIG_UPDATE -> updateConfiguration() + } }, ) getLanguagePreference()?.setOnPreferenceClickListener { - val password = viewModel.settingsLocked.value?.getNullablePassword() - if (password != null) { - SettingsPasswordDialogFragment.newInstance( - passwordToMatch = password, - ).show(childFragmentManager, SettingsPasswordDialogFragment.TAG) - } else { - createLanguageSelectionDialog().show() - } + showPasswordIfRequired(ACTION_LANGUAGE) { createLanguageSelectionDialog().show() } true } @@ -91,12 +89,27 @@ internal class SettingsFragment : PreferenceFragmentCompat() { true } + getUpdateConfig()?.setOnPreferenceClickListener { + showPasswordIfRequired(ACTION_CONFIG_UPDATE) { updateConfiguration() } + true + } + getAboutPreference()?.setOnPreferenceClickListener { findNavController().navigate(R.id.action_settingsFragment_to_aboutFragment) true } } + private fun showPasswordIfRequired(action: String, cb: () -> Unit) { + val password = viewModel.settingsLocked.value?.getNullablePassword() + if (password != null) { + SettingsPasswordDialogFragment.newInstance( + passwordToMatch = password, + action = action, + ).show(childFragmentManager, SettingsPasswordDialogFragment.TAG) + } else cb() + } + private fun createLanguageSelectionDialog(): AlertDialog { val languagesOptions = viewModel.generalConfiguration.value?.languageOptions.orEmpty() val languagesCodeToName = computeAvailableLanguageCodeAndName(languagesOptions) @@ -138,6 +151,13 @@ internal class SettingsFragment : PreferenceFragmentCompat() { activity?.overridePendingTransition(0, 0) } + private fun updateConfiguration() { + viewModel.scheduleConfigUpdate() + Toast.makeText( + requireContext(), IDR.string.dashboard_preference_update_config_scheduled, Toast.LENGTH_SHORT + ).show() + } + private fun getLanguagePreference(): Preference? = findPreference(getString(R.string.preference_select_language_key)) @@ -147,6 +167,15 @@ internal class SettingsFragment : PreferenceFragmentCompat() { private fun getSyncInfoPreference(): Preference? = findPreference(getString(R.string.preference_sync_info_key)) + private fun getUpdateConfig(): Preference? = + findPreference(getString(R.string.preference_update_config_key)) + private fun getAboutPreference(): Preference? = findPreference(getString(R.string.preference_app_details_key)) + + companion object { + + private const val ACTION_LANGUAGE = "language" + private const val ACTION_CONFIG_UPDATE = "configUpdate" + } } diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/SettingsViewModel.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/SettingsViewModel.kt index 4f4774977f..331b77be0a 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/SettingsViewModel.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/SettingsViewModel.kt @@ -9,6 +9,7 @@ import com.simprints.infra.config.store.models.SettingsPasswordConfig import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.logging.LoggingConstants import com.simprints.infra.logging.Simber +import com.simprints.infra.sync.SyncOrchestrator import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import javax.inject.Inject @@ -16,6 +17,7 @@ import javax.inject.Inject @HiltViewModel internal class SettingsViewModel @Inject constructor( private val configManager: ConfigManager, + private val syncOrchestrator: SyncOrchestrator, ) : ViewModel() { val generalConfiguration: LiveData @@ -53,4 +55,8 @@ internal class SettingsViewModel @Inject constructor( fun unlockSettings() { _settingsLocked.postValue(SettingsPasswordConfig.Unlocked) } + + fun scheduleConfigUpdate() { + syncOrchestrator.startDeviceSync() + } } diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/password/SettingsPasswordDialogFragment.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/password/SettingsPasswordDialogFragment.kt index aba4fbe19e..bfe127ea03 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/password/SettingsPasswordDialogFragment.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/password/SettingsPasswordDialogFragment.kt @@ -43,7 +43,14 @@ class SettingsPasswordDialogFragment : DialogFragment() { val passwordToMatch = arguments?.getString(ARG_PASSWORD).orEmpty() if (text?.length == passwordToMatch.length) { if (text.toString() == passwordToMatch) { - parentFragmentManager.setFragmentResult(RESULT_KEY, bundleOf(RESULT_SUCCESS to true)) + parentFragmentManager.setFragmentResult( + RESULT_KEY, + bundleOf( + RESULT_SUCCESS to true, + // Pass-through the action argument to resolve action on call side + ARG_ACTION to arguments?.getString(ARG_ACTION), + ) + ) dismiss() } else { passwordInputField.text = null @@ -57,16 +64,19 @@ class SettingsPasswordDialogFragment : DialogFragment() { private const val ARG_TITLE = "titleRes" private const val ARG_PASSWORD = "toMatch" + private const val ARG_ACTION = "action" private const val RESULT_KEY = "$TAG-result" private const val RESULT_SUCCESS = "success" fun newInstance( - title: Int = IDR.string.dashboard_password_lock_title_default, passwordToMatch: String, + title: Int = IDR.string.dashboard_password_lock_title_default, + action: String? = null, ): DialogFragment = SettingsPasswordDialogFragment().also { it.arguments = bundleOf( ARG_TITLE to title, + ARG_ACTION to action, ARG_PASSWORD to passwordToMatch, ) } @@ -74,10 +84,10 @@ class SettingsPasswordDialogFragment : DialogFragment() { fun registerForResult( fragmentManager: FragmentManager, lifecycleOwner: LifecycleOwner, - onSuccess: () -> Unit, + onSuccess: (String?) -> Unit, ) { fragmentManager.setFragmentResultListener(RESULT_KEY, lifecycleOwner) { key, result -> - if (result.getBoolean(RESULT_SUCCESS)) onSuccess() + if (result.getBoolean(RESULT_SUCCESS)) onSuccess(result.getString(ARG_ACTION)) } } } diff --git a/feature/dashboard/src/main/res/values/ids.xml b/feature/dashboard/src/main/res/values/ids.xml index 8bab4ce838..6ab8e37fb3 100644 --- a/feature/dashboard/src/main/res/values/ids.xml +++ b/feature/dashboard/src/main/res/values/ids.xml @@ -10,6 +10,7 @@ select_language_preference_key select_fingers_preference_key sync_info_preference_key + preference_update_config_key app_details_key app_details_preference_key diff --git a/feature/dashboard/src/main/res/xml/preference_general.xml b/feature/dashboard/src/main/res/xml/preference_general.xml index 89e059f9fd..e4d4e6c5d1 100644 --- a/feature/dashboard/src/main/res/xml/preference_general.xml +++ b/feature/dashboard/src/main/res/xml/preference_general.xml @@ -18,6 +18,11 @@ android:key="@string/preference_sync_info_key" android:summary="@string/dashboard_preference_summary_sync_information" android:title="@string/dashboard_preference_sync_information_title" /> + + Select modules App Version Sync Information + Update configuration Scanner Version Device ID View the fingers that will be scanned Further details on sync + Refresh device and project configuration Copied to clipboard + Configuration update started