From a7bcab013af751e83737f1f1c03733ac0aa8e287 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Wed, 5 Feb 2025 11:09:39 +0100 Subject: [PATCH] fix lifecycle Signed-off-by: alperozturk --- .../android/ui/dialog/TermsOfServiceDialog.kt | 84 +++++++++++-------- 1 file changed, 48 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/TermsOfServiceDialog.kt b/app/src/main/java/com/owncloud/android/ui/dialog/TermsOfServiceDialog.kt index d3333c28ae0f..52a3b2b7729b 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/TermsOfServiceDialog.kt +++ b/app/src/main/java/com/owncloud/android/ui/dialog/TermsOfServiceDialog.kt @@ -14,6 +14,7 @@ import android.widget.AdapterView import android.widget.ArrayAdapter import androidx.core.app.ActivityCompat.finishAffinity import androidx.fragment.app.DialogFragment +import androidx.lifecycle.lifecycleScope import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.nextcloud.android.lib.resources.tos.GetTermsRemoteOperation import com.nextcloud.android.lib.resources.tos.SignTermRemoteOperation @@ -29,9 +30,9 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.utils.DisplayUtils import com.owncloud.android.utils.theme.ViewThemeUtils -import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import javax.inject.Inject class TermsOfServiceDialog : DialogFragment(), Injectable { @@ -50,52 +51,56 @@ class TermsOfServiceDialog : DialogFragment(), Injectable { lateinit var terms: List lateinit var languages: Map - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - fetchTerms() - } - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { binding = DialogShowTosBinding.inflate(requireActivity().layoutInflater) - return createDialogBuilder().create() } + override fun onStart() { + super.onStart() + fetchTerms() + } + private fun updateDialog() { binding.message.setHtmlContent(terms[0].renderedBody) - val arrayAdapter: ArrayAdapter = ArrayAdapter( + val arrayAdapter: ArrayAdapter = ArrayAdapter( binding.root.context, android.R.layout.simple_spinner_item - ) + ).apply { + for ((_, _, languageCode) in terms) { + add(languages[languageCode]) + } - for ((_, _, languageCode) in terms) { - arrayAdapter.add(languages[languageCode]) + setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) } - arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + setupLanguageDropdown(arrayAdapter) + } - binding.languageDropdown.adapter = arrayAdapter - binding.languageDropdown.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected(adapterView: AdapterView<*>?, view: View, position: Int, l: Long) { - binding.message - .setHtmlContent(terms[position].renderedBody) - } + private fun setupLanguageDropdown(arrayAdapter: ArrayAdapter) { + binding.languageDropdown.run { + adapter = arrayAdapter + onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(adapterView: AdapterView<*>?, view: View, position: Int, l: Long) { + binding.message + .setHtmlContent(terms[position].renderedBody) + } - override fun onNothingSelected(adapterView: AdapterView<*>?) = Unit - } + override fun onNothingSelected(adapterView: AdapterView<*>?) = Unit + } - if (terms.size == 1) { - binding.languageDropdown.visibility = View.GONE + if (terms.size == 1) { + visibility = View.GONE + } } } + @Suppress("DEPRECATION") private fun fetchTerms() { - CoroutineScope(Dispatchers.IO).launch { - //viewLifecycleOwner.lifecycleScope.launch { + lifecycleScope.launch(Dispatchers.IO) { try { - client = clientFactory.createNextcloudClient(accountManager.getUser()) + client = clientFactory.createNextcloudClient(accountManager.user) val result = GetTermsRemoteOperation().execute(client) if (result.isSuccess && @@ -105,8 +110,7 @@ class TermsOfServiceDialog : DialogFragment(), Injectable { languages = result.resultData.languages terms = result.resultData.terms - CoroutineScope(Dispatchers.Main).launch { - // withContext(Dispatchers.Main) { + withContext(Dispatchers.Main) { updateDialog() } } @@ -125,17 +129,25 @@ class TermsOfServiceDialog : DialogFragment(), Injectable { } .setPositiveButton(R.string.terms_of_services_agree) { dialog, _ -> dialog.dismiss() - Thread { - val id = binding.languageDropdown.selectedItemPosition - val signResult: RemoteOperationResult = - SignTermRemoteOperation(terms.get(id).id).execute(client) - if (!signResult.isSuccess) { - DisplayUtils.showSnackMessage(view, R.string.sign_tos_failed) - } - }.start() + agreeToS() } } + private fun agreeToS() { + lifecycleScope.launch(Dispatchers.IO) { + val id = binding.languageDropdown.selectedItemPosition + val signResult: RemoteOperationResult = + SignTermRemoteOperation(terms[id].id).execute(client) + + if (!signResult.isSuccess) { + withContext(Dispatchers.Main) { + DisplayUtils.showSnackMessage(view, R.string.sign_tos_failed) + } + } + } + } + + companion object { private const val TAG = "TermsOfServiceDialog" }