@@ -14,6 +14,7 @@ import android.widget.AdapterView
14
14
import android.widget.ArrayAdapter
15
15
import androidx.core.app.ActivityCompat.finishAffinity
16
16
import androidx.fragment.app.DialogFragment
17
+ import androidx.lifecycle.lifecycleScope
17
18
import com.google.android.material.dialog.MaterialAlertDialogBuilder
18
19
import com.nextcloud.android.lib.resources.tos.GetTermsRemoteOperation
19
20
import com.nextcloud.android.lib.resources.tos.SignTermRemoteOperation
@@ -29,9 +30,9 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult
29
30
import com.owncloud.android.lib.common.utils.Log_OC
30
31
import com.owncloud.android.utils.DisplayUtils
31
32
import com.owncloud.android.utils.theme.ViewThemeUtils
32
- import kotlinx.coroutines.CoroutineScope
33
33
import kotlinx.coroutines.Dispatchers
34
34
import kotlinx.coroutines.launch
35
+ import kotlinx.coroutines.withContext
35
36
import javax.inject.Inject
36
37
37
38
class TermsOfServiceDialog : DialogFragment (), Injectable {
@@ -50,52 +51,56 @@ class TermsOfServiceDialog : DialogFragment(), Injectable {
50
51
lateinit var terms: List <Term >
51
52
lateinit var languages: Map <String , String >
52
53
53
- override fun onCreate (savedInstanceState : Bundle ? ) {
54
- super .onCreate(savedInstanceState)
55
-
56
- fetchTerms()
57
- }
58
-
59
54
override fun onCreateDialog (savedInstanceState : Bundle ? ): Dialog {
60
55
binding = DialogShowTosBinding .inflate(requireActivity().layoutInflater)
61
-
62
56
return createDialogBuilder().create()
63
57
}
64
58
59
+ override fun onStart () {
60
+ super .onStart()
61
+ fetchTerms()
62
+ }
63
+
65
64
private fun updateDialog () {
66
65
binding.message.setHtmlContent(terms[0 ].renderedBody)
67
66
68
- val arrayAdapter: ArrayAdapter <String > = ArrayAdapter (
67
+ val arrayAdapter: ArrayAdapter <String > = ArrayAdapter < String > (
69
68
binding.root.context,
70
69
android.R .layout.simple_spinner_item
71
- )
70
+ ).apply {
71
+ for ((_, _, languageCode) in terms) {
72
+ add(languages[languageCode])
73
+ }
72
74
73
- for ((_, _, languageCode) in terms) {
74
- arrayAdapter.add(languages[languageCode])
75
+ setDropDownViewResource(android.R .layout.simple_spinner_dropdown_item)
75
76
}
76
77
77
- arrayAdapter.setDropDownViewResource(android.R .layout.simple_spinner_dropdown_item)
78
+ setupLanguageDropdown(arrayAdapter)
79
+ }
78
80
79
- binding.languageDropdown.adapter = arrayAdapter
80
- binding.languageDropdown.onItemSelectedListener = object : AdapterView .OnItemSelectedListener {
81
- override fun onItemSelected (adapterView : AdapterView <* >? , view : View , position : Int , l : Long ) {
82
- binding.message
83
- .setHtmlContent(terms[position].renderedBody)
84
- }
81
+ private fun setupLanguageDropdown (arrayAdapter : ArrayAdapter <String >) {
82
+ binding.languageDropdown.run {
83
+ adapter = arrayAdapter
84
+ onItemSelectedListener = object : AdapterView .OnItemSelectedListener {
85
+ override fun onItemSelected (adapterView : AdapterView <* >? , view : View , position : Int , l : Long ) {
86
+ binding.message
87
+ .setHtmlContent(terms[position].renderedBody)
88
+ }
85
89
86
- override fun onNothingSelected (adapterView : AdapterView <* >? ) = Unit
87
- }
90
+ override fun onNothingSelected (adapterView : AdapterView <* >? ) = Unit
91
+ }
88
92
89
- if (terms.size == 1 ) {
90
- binding.languageDropdown.visibility = View .GONE
93
+ if (terms.size == 1 ) {
94
+ visibility = View .GONE
95
+ }
91
96
}
92
97
}
93
98
99
+ @Suppress(" DEPRECATION" )
94
100
private fun fetchTerms () {
95
- CoroutineScope (Dispatchers .IO ).launch {
96
- // viewLifecycleOwner.lifecycleScope.launch {
101
+ lifecycleScope.launch(Dispatchers .IO ) {
97
102
try {
98
- client = clientFactory.createNextcloudClient(accountManager.getUser() )
103
+ client = clientFactory.createNextcloudClient(accountManager.user )
99
104
val result = GetTermsRemoteOperation ().execute(client)
100
105
101
106
if (result.isSuccess &&
@@ -105,8 +110,7 @@ class TermsOfServiceDialog : DialogFragment(), Injectable {
105
110
languages = result.resultData.languages
106
111
terms = result.resultData.terms
107
112
108
- CoroutineScope (Dispatchers .Main ).launch {
109
- // withContext(Dispatchers.Main) {
113
+ withContext(Dispatchers .Main ) {
110
114
updateDialog()
111
115
}
112
116
}
@@ -125,17 +129,25 @@ class TermsOfServiceDialog : DialogFragment(), Injectable {
125
129
}
126
130
.setPositiveButton(R .string.terms_of_services_agree) { dialog, _ ->
127
131
dialog.dismiss()
128
- Thread {
129
- val id = binding.languageDropdown.selectedItemPosition
130
- val signResult: RemoteOperationResult <Void > =
131
- SignTermRemoteOperation (terms.get(id).id).execute(client)
132
- if (! signResult.isSuccess) {
133
- DisplayUtils .showSnackMessage(view, R .string.sign_tos_failed)
134
- }
135
- }.start()
132
+ agreeToS()
136
133
}
137
134
}
138
135
136
+ private fun agreeToS () {
137
+ lifecycleScope.launch(Dispatchers .IO ) {
138
+ val id = binding.languageDropdown.selectedItemPosition
139
+ val signResult: RemoteOperationResult <Void > =
140
+ SignTermRemoteOperation (terms[id].id).execute(client)
141
+
142
+ if (! signResult.isSuccess) {
143
+ withContext(Dispatchers .Main ) {
144
+ DisplayUtils .showSnackMessage(view, R .string.sign_tos_failed)
145
+ }
146
+ }
147
+ }
148
+ }
149
+
150
+
139
151
companion object {
140
152
private const val TAG = " TermsOfServiceDialog"
141
153
}
0 commit comments