Skip to content
This repository was archived by the owner on Jan 9, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,76 +18,53 @@ package com.example.android.uamp.automotive

import android.os.Bundle
import android.text.method.LinkMovementMethod
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import androidx.core.text.HtmlCompat
import androidx.fragment.app.Fragment
import com.example.android.uamp.automotive.databinding.PhoneSignInBinding

/**
* Fragment that is used to facilitate phone sign-in. The fragment allows users to choose between
* either the PIN or QR code sign-in flow.
*/
class PhoneSignInFragment : Fragment() {

private lateinit var toolbar: Toolbar
private lateinit var appIcon: ImageView
private lateinit var primaryTextView: TextView
private lateinit var pinSignInButton: Button
private lateinit var qrCodeSignInButton: Button
private lateinit var footerTextView: TextView

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.phone_sign_in, container, false)
}
class PhoneSignInFragment : Fragment(R.layout.phone_sign_in) {

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val context = requireContext()

toolbar = view.findViewById(R.id.toolbar)
appIcon = view.findViewById(R.id.app_icon)
primaryTextView = view.findViewById(R.id.primary_message)
pinSignInButton = view.findViewById(R.id.pin_sign_in_button)
qrCodeSignInButton = view.findViewById(R.id.qr_sign_in_button)
footerTextView = view.findViewById(R.id.footer)
val binding = PhoneSignInBinding.bind(view)

toolbar.setNavigationOnClickListener {
binding.toolbar.setNavigationOnClickListener {
requireActivity().supportFragmentManager.popBackStack()
}

// Set up PIN sign in button.
appIcon.setImageDrawable(context.getDrawable(R.drawable.aural_logo))
primaryTextView.text = getString(R.string.phone_sign_in_primary_text)
pinSignInButton.text = getString(R.string.pin_sign_in_button_label)
pinSignInButton.setOnClickListener {
binding.appIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.aural_logo))
binding.primaryMessage.text = getString(R.string.phone_sign_in_primary_text)
binding.pinSignInButton.text = getString(R.string.pin_sign_in_button_label)
binding.pinSignInButton.setOnClickListener {
requireActivity().supportFragmentManager.beginTransaction()
.replace(R.id.sign_in_container, PinCodeSignInFragment())
.addToBackStack("landingPage")
.commit()
}

// Set up QR code sign in button.
qrCodeSignInButton.text = getString(R.string.qr_sign_in_button_label)
qrCodeSignInButton.setOnClickListener {
binding.qrSignInButton.text = getString(R.string.qr_sign_in_button_label)
binding.qrSignInButton.setOnClickListener {
requireActivity().supportFragmentManager.beginTransaction()
.replace(R.id.sign_in_container, QrCodeSignInFragment())
.addToBackStack("landingPage")
.commit()
}

// Links in footer text should be clickable.
footerTextView.text = HtmlCompat.fromHtml(
binding.footer.text = HtmlCompat.fromHtml(
context.getString(R.string.sign_in_footer),
HtmlCompat.FROM_HTML_MODE_LEGACY
)
footerTextView.movementMethod = LinkMovementMethod.getInstance()
binding.footer.movementMethod = LinkMovementMethod.getInstance()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,12 @@ import android.os.Bundle
import android.text.method.LinkMovementMethod
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import androidx.core.text.HtmlCompat
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import com.example.android.uamp.automotive.databinding.PinSignInBinding

/**
* Fragment that is used to facilitate PIN code sign-in. This fragment displayed a configurable
Expand All @@ -38,64 +36,44 @@ import androidx.lifecycle.ViewModelProvider
*/
class PinCodeSignInFragment : Fragment(R.layout.pin_sign_in) {

private lateinit var toolbar: Toolbar
private lateinit var appIcon: ImageView
private lateinit var primaryTextView: TextView
private lateinit var secondaryTextView: TextView
private lateinit var pinCodeContainer: ViewGroup
private lateinit var footerTextView: TextView

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val context = requireContext()

toolbar = view.findViewById(R.id.toolbar)
appIcon = view.findViewById(R.id.app_icon)
primaryTextView = view.findViewById(R.id.primary_message)
secondaryTextView = view.findViewById(R.id.secondary_message)
pinCodeContainer = view.findViewById(R.id.pin_code_container)
footerTextView = view.findViewById(R.id.footer)
val binding = PinSignInBinding.bind(view)

toolbar.setNavigationOnClickListener {
binding.toolbar.setNavigationOnClickListener {
requireActivity().supportFragmentManager.popBackStack()
}

appIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.aural_logo))
primaryTextView.text = getString(R.string.pin_sign_in_primary_text)
secondaryTextView.text = getString(R.string.pin_sign_in_secondary_text)
binding.appIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.aural_logo))
binding.primaryMessage.text = getString(R.string.pin_sign_in_primary_text)
binding.secondaryMessage.text = getString(R.string.pin_sign_in_secondary_text)

// Links in footer text should be clickable.
footerTextView.text = HtmlCompat.fromHtml(
binding.footer.text = HtmlCompat.fromHtml(
context.getString(R.string.sign_in_footer),
HtmlCompat.FROM_HTML_MODE_LEGACY
)
footerTextView.movementMethod = LinkMovementMethod.getInstance()
binding.footer.movementMethod = LinkMovementMethod.getInstance()

val pin = ViewModelProvider(requireActivity())
.get(SignInActivityViewModel::class.java)
.generatePin()
setPin(pin)
}

/**
* Sets the PIN code rendered on this sign in screen.
*
* @param pin The PIN to display.
*/
private fun setPin(pin: CharSequence) {
// Remove existing PIN characters.
if (pinCodeContainer.childCount > 0) {
pinCodeContainer.removeAllViews()
if (binding.pinCodeContainer.childCount > 0) {
binding.pinCodeContainer.removeAllViews()
}

for (element in pin) {
val pinItem = LayoutInflater.from(context).inflate(
R.layout.pin_item,
pinCodeContainer,
binding.pinCodeContainer,
false
) as TextView
pinItem.text = element.toString()
pinCodeContainer.addView(pinItem)
binding.pinCodeContainer.addView(pinItem)
}
}
}