Files
packages_apps_Settings/src/com/android/settings/remoteauth/enrolling/RemoteAuthEnrollEnrolling.kt
Justin McClain 7e837fae82 Remote authenticator enrollment navigation.
This change adds an entry point for Remote Auth enrollment and
navigation through the flow.

Bug: b/293906345
Test: make RunSettingsRoboTests -j40
Change-Id: I9bc803e24c4181ed73a0ef90b171897c677e71d1
2023-08-31 21:24:09 +00:00

131 lines
4.7 KiB
Kotlin

/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.remoteauth.enrolling
import android.os.Bundle
import android.view.View
import android.widget.ProgressBar
import android.widget.TextView
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.navigation.fragment.NavHostFragment.Companion.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.android.settings.R
import com.android.settings.remoteauth.RemoteAuthEnrollBase
import com.google.android.setupcompat.template.FooterButton
import kotlinx.coroutines.launch
class RemoteAuthEnrollEnrolling :
RemoteAuthEnrollBase(
layoutResId = R.layout.remote_auth_enroll_enrolling,
glifLayoutId = R.id.setup_wizard_layout,
) {
private val viewModel: RemoteAuthEnrollEnrollingViewModel by viewModels()
private val navController by lazy { findNavController(this) }
private val adapter = RemoteAuthEnrollEnrollingRecyclerViewAdapter()
private val progressBar by lazy {
view!!.requireViewById<ProgressBar>(R.id.enrolling_list_progress_bar)
}
private val errorText by lazy { view!!.requireViewById<TextView>(R.id.error_text) }
private val recyclerView by lazy {
view!!.requireViewById<RecyclerView>(R.id.discovered_authenticator_list)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Set up adapter
recyclerView.layoutManager = LinearLayoutManager(context)
recyclerView.adapter = adapter
// Collect UIState and update UI on changes.
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.uiState.collect {
updateUi(it)
}
}
}
}
override fun onStart() {
super.onStart()
// Get list of discovered devices from viewModel.
viewModel.discoverDevices()
}
override fun initializePrimaryFooterButton(): FooterButton {
return FooterButton.Builder(requireContext())
.setText(R.string.security_settings_remoteauth_enroll_enrolling_agree)
.setListener(this::onPrimaryFooterButtonClick)
.setButtonType(FooterButton.ButtonType.NEXT)
.setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Primary)
.build()
}
override fun initializeSecondaryFooterButton(): FooterButton? {
return FooterButton.Builder(requireContext())
.setText(R.string.security_settings_remoteauth_enroll_enrolling_disagree)
.setListener(this::onSecondaryFooterButtonClick)
.setButtonType(FooterButton.ButtonType.SKIP)
.setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Secondary)
.build()
}
private fun onPrimaryFooterButtonClick(view: View) {
viewModel.registerAuthenticator()
}
private fun onSecondaryFooterButtonClick(view: View) {
navController.navigateUp()
}
private fun updateUi(uiState: RemoteAuthEnrollEnrollingUiState) {
progressBar.visibility = View.INVISIBLE
primaryFooterButton.isEnabled = false
// TODO(b/290769765): Add unit tests for all this states.
when (uiState.enrollmentUiState) {
EnrollmentUiState.NONE -> {
adapter.uiStates = uiState.discoveredDeviceUiStates
primaryFooterButton.isEnabled = viewModel.isDeviceSelected()
}
EnrollmentUiState.FINDING_DEVICES -> {
progressBar.visibility = View.VISIBLE
}
EnrollmentUiState.ENROLLING -> {}
EnrollmentUiState.SUCCESS -> {
navController.navigate(R.id.action_enrolling_to_finish)
}
}
if (uiState.errorMsg != null) {
errorText.visibility = View.VISIBLE
errorText.text = uiState.errorMsg
} else {
errorText.visibility = View.INVISIBLE
errorText.text = ""
}
}
}