@@ -21,12 +21,18 @@ import android.os.Bundle
21
21
import android.view.LayoutInflater
22
22
import android.view.View
23
23
import android.view.ViewGroup
24
+ import com.airbnb.epoxy.OnModelBuildFinishedListener
25
+ import com.airbnb.mvrx.Fail
26
+ import com.airbnb.mvrx.Loading
27
+ import com.airbnb.mvrx.Success
28
+ import com.airbnb.mvrx.Uninitialized
24
29
import com.airbnb.mvrx.parentFragmentViewModel
25
30
import com.airbnb.mvrx.withState
26
31
import dagger.hilt.android.AndroidEntryPoint
27
32
import im.vector.app.R
28
33
import im.vector.app.core.extensions.cleanup
29
34
import im.vector.app.core.extensions.configureWith
35
+ import im.vector.app.core.extensions.giveAccessibilityFocus
30
36
import im.vector.app.core.extensions.registerStartForActivityResult
31
37
import im.vector.app.core.platform.VectorBaseFragment
32
38
import im.vector.app.core.utils.PERMISSIONS_FOR_TAKING_PHOTO
@@ -36,15 +42,26 @@ import im.vector.app.core.utils.registerForPermissionsResult
36
42
import im.vector.app.databinding.BottomSheetVerificationChildFragmentBinding
37
43
import im.vector.app.features.crypto.verification.VerificationAction
38
44
import im.vector.app.features.qrcode.QrCodeScannerActivity
45
+ import org.matrix.android.sdk.api.session.crypto.verification.EVerificationState
39
46
import timber.log.Timber
40
47
import javax.inject.Inject
41
48
42
49
@AndroidEntryPoint
43
- class SelfVerificationFragment : VectorBaseFragment <BottomSheetVerificationChildFragmentBinding >(),
50
+ class SelfVerificationFragment : VectorBaseFragment <BottomSheetVerificationChildFragmentBinding >(),
44
51
SelfVerificationController .InteractionListener {
45
52
46
53
@Inject lateinit var controller: SelfVerificationController
47
54
55
+ private var requestAccessibilityFocus: Boolean = false
56
+ private val modelBuildListener: OnModelBuildFinishedListener = OnModelBuildFinishedListener {
57
+ if (requestAccessibilityFocus) {
58
+ // Do not use giveAccessibilityFocusOnce() here.
59
+ views.bottomSheetVerificationRecyclerView.layoutManager?.findViewByPosition(0 )?.giveAccessibilityFocus()
60
+ requestAccessibilityFocus = false
61
+ // Note: it does not work when the recycler view is displayed for the first time, because findViewByPosition(0) is null
62
+ }
63
+ }
64
+
48
65
private val viewModel by parentFragmentViewModel(SelfVerificationViewModel ::class )
49
66
50
67
override fun getBinding (inflater : LayoutInflater , container : ViewGroup ? ): BottomSheetVerificationChildFragmentBinding {
@@ -58,17 +75,22 @@ class SelfVerificationFragment : VectorBaseFragment<BottomSheetVerificationChil
58
75
59
76
override fun onDestroyView () {
60
77
views.bottomSheetVerificationRecyclerView.cleanup()
78
+ controller.removeModelBuildListener(modelBuildListener)
61
79
controller.listener = null
62
80
super .onDestroyView()
63
81
}
64
82
65
83
private fun setupRecyclerView () {
66
84
views.bottomSheetVerificationRecyclerView.configureWith(controller, hasFixedSize = false , disableItemAnimation = true )
85
+ controller.addModelBuildListener(modelBuildListener)
67
86
controller.listener = this
68
87
}
69
88
70
89
override fun invalidate () = withState(viewModel) { state ->
71
90
// Timber.w("VALR: invalidate with State: ${state.pendingRequest}")
91
+ if (state.isNewScreen()) {
92
+ requestAccessibilityFocus = true
93
+ }
72
94
controller.update(state)
73
95
}
74
96
@@ -176,4 +198,41 @@ class SelfVerificationFragment : VectorBaseFragment<BottomSheetVerificationChil
176
198
override fun declineRequest () {
177
199
viewModel.handle(VerificationAction .CancelPendingVerification )
178
200
}
201
+
202
+ private var currentScreenIndex = - 1
203
+
204
+ private fun SelfVerificationViewState.isNewScreen (): Boolean {
205
+ val newIndex = toScreenIndex()
206
+ if (currentScreenIndex == newIndex) {
207
+ return false
208
+ }
209
+ currentScreenIndex = newIndex
210
+ return true
211
+ }
212
+
213
+ private fun SelfVerificationViewState.toScreenIndex (): Int {
214
+ return if (activeAction !is UserAction .None ) {
215
+ when (activeAction) {
216
+ UserAction .ConfirmCancel -> 30
217
+ UserAction .None -> 31
218
+ }
219
+ } else {
220
+ when (pendingRequest) {
221
+ is Fail -> 0
222
+ is Loading -> 1
223
+ is Success -> when (pendingRequest.invoke().state) {
224
+ EVerificationState .WaitingForReady -> 10
225
+ EVerificationState .Requested -> 11
226
+ EVerificationState .Ready -> 12
227
+ EVerificationState .Started -> 13
228
+ EVerificationState .WeStarted -> 14
229
+ EVerificationState .WaitingForDone -> 15
230
+ EVerificationState .Done -> 16
231
+ EVerificationState .Cancelled -> 17
232
+ EVerificationState .HandledByOtherSession -> 18
233
+ }
234
+ Uninitialized -> 2
235
+ }
236
+ }
237
+ }
179
238
}
0 commit comments