MOB-40 changed nav logic, refactored Home, Pin and Can fragments

This commit is contained in:
Henrik Lepson 2021-10-16 13:20:55 +03:00
parent 2678fd3c42
commit bd686739fc
13 changed files with 382 additions and 104 deletions

View File

@ -1,7 +1,6 @@
package com.tarkvaraprojekt.mobileauthapp package com.tarkvaraprojekt.mobileauthapp
import android.app.AlertDialog import android.app.AlertDialog
import android.content.DialogInterface
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@ -15,7 +14,9 @@ import com.tarkvaraprojekt.mobileauthapp.databinding.FragmentCanBinding
import com.tarkvaraprojekt.mobileauthapp.model.SmartCardViewModel import com.tarkvaraprojekt.mobileauthapp.model.SmartCardViewModel
/** /**
* Fragment that deals with asking the user for six digit CAN * Fragment that deals with asking the user for a six digit CAN. If the CAN is already saved
* then the fragment is skipped immediately and if the CAN is not saved then the user
* is asked whether it should be saved for the future or not before continuing.
*/ */
class CanFragment : Fragment() { class CanFragment : Fragment() {
@ -23,7 +24,10 @@ class CanFragment : Fragment() {
private var binding: FragmentCanBinding? = null private var binding: FragmentCanBinding? = null
// Navigation arguments. saving = true means that we are navigating here from the settings menu and must return to the settings // Navigation arguments:
// saving = true means that we are navigating here from the settings menu and must return to the settings menu.
// reading = true means that we are only reading the information from the ID card that does not need PIN 1,
// this information is passed on to the next PinFragment.
private val args: CanFragmentArgs by navArgs() private val args: CanFragmentArgs by navArgs()
override fun onCreateView( override fun onCreateView(
@ -37,62 +41,90 @@ class CanFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
if (viewModel.userCan.length == 6) { checkIfSkip()
skip() // If the user arrives from the settings menu then the button should say
} // save instead of continue.
if (args.saving) { if (args.saving) {
binding!!.nextButton.text = getString(R.string.save_text) binding!!.nextButton.text = getString(R.string.save_text)
} }
binding!!.nextButton.setOnClickListener { goToNextFragment() } binding!!.nextButton.setOnClickListener { checkEnteredCan() }
binding!!.cancelButton.setOnClickListener { goToTheStart() } binding!!.cancelButton.setOnClickListener { goToTheStart() }
} }
// If CAN is already set /**
private fun skip() { * Checks if the current fragment can be skipped or not.
findNavController().navigate(R.id.action_canFragment_to_pinFragment) * If the user has CAN saved on the device there is no need to ask it again.
*/
private fun checkIfSkip() {
if (viewModel.userCan.length == 6) {
goToTheNextFragment()
}
} }
// Might need some rework, must break it up and make logic better. /**
private fun goToNextFragment() { * Takes user to the next fragment, which is PinFragment.
*/
private fun goToTheNextFragment() {
val action = CanFragmentDirections.actionCanFragmentToPinFragment(reading = args.reading)
findNavController().navigate(action)
}
/**
* Checks whether the user has entered a 6 digit can to the input field.
* If yes then the user is allowed to continue otherwise the user is
* allowed to modify the entered can.
*/
private fun checkEnteredCan() {
val enteredCan = binding!!.canEditText.editText?.text.toString() val enteredCan = binding!!.canEditText.editText?.text.toString()
if (enteredCan.length != 6) { if (enteredCan.length == 6) {
Toast.makeText(requireContext(), getString(R.string.length_can), Toast.LENGTH_SHORT) viewModel.setUserCan(enteredCan)
.show()
} else {
viewModel.setUserCan(
binding!!.canEditText.editText?.text.toString()
)
if (args.saving) { if (args.saving) {
viewModel.storeCan(requireContext()) viewModel.storeCan(requireContext())
findNavController().navigate(R.id.action_canFragment_to_settingsFragment) goToTheStart()
} else { } else {
val canStoreQuestion: AlertDialog? = activity?.let { frag -> val storeCanQuestion = getDialog()
storeCanQuestion?.show()
}
} else {
Toast.makeText(requireContext(), getString(R.string.length_can), Toast.LENGTH_SHORT)
.show()
}
}
/**
* Builds a dialog that asks the user whether the entered CAN should be saved
* on the device or not.
*/
private fun getDialog(): AlertDialog? {
return activity?.let { frag ->
val builder = AlertDialog.Builder(frag) val builder = AlertDialog.Builder(frag)
builder.apply { builder.apply {
// If response is positive then save the CAN on the device.
setPositiveButton(R.string.save_text) { _, _ -> setPositiveButton(R.string.save_text) { _, _ ->
viewModel.storeCan( viewModel.storeCan(
requireContext() requireContext()
) )
findNavController().navigate(R.id.action_canFragment_to_pinFragment) goToTheNextFragment()
} }
setNegativeButton(R.string.deny_text) { _, _ -> setNegativeButton(R.string.deny_text) { _, _ ->
findNavController().navigate(R.id.action_canFragment_to_pinFragment) goToTheNextFragment()
} }
} }
builder.setMessage(R.string.can_save_request) builder.setMessage(R.string.can_save_request)
builder.setTitle(R.string.save_can_title) builder.setTitle(R.string.save_can_title)
builder.create() builder.create()
} }
canStoreQuestion?.show()
}
}
} }
/**
* Navigates the user back to the start depending on where the user arrived.
* If the user arrived from the settings menu then the start is the settings menu
* not the HomeFragment.
*/
private fun goToTheStart() { private fun goToTheStart() {
if (args.saving) { if (args.saving) {
findNavController().navigate(R.id.action_canFragment_to_settingsFragment) findNavController().navigate(R.id.action_canFragment_to_settingsFragment)
} else { } else {
viewModel.clearUserInfo()
findNavController().navigate(R.id.action_canFragment_to_homeFragment) findNavController().navigate(R.id.action_canFragment_to_homeFragment)
} }
} }

View File

@ -1,7 +1,6 @@
package com.tarkvaraprojekt.mobileauthapp package com.tarkvaraprojekt.mobileauthapp
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
@ -11,6 +10,13 @@ import androidx.navigation.fragment.findNavController
import com.tarkvaraprojekt.mobileauthapp.databinding.FragmentHomeBinding import com.tarkvaraprojekt.mobileauthapp.databinding.FragmentHomeBinding
import com.tarkvaraprojekt.mobileauthapp.model.SmartCardViewModel import com.tarkvaraprojekt.mobileauthapp.model.SmartCardViewModel
/**
* HomeFragment is only shown to the user when then the user launches the application. When the application
* is launched by another application or a website then this Fragment will be skipped.
* This fragment uses the fields from the MainActivity by casting the activity to MainActivity.
* This might not be the best practice, but the application uses a single activity design so it should
* always work.
*/
class HomeFragment : Fragment() { class HomeFragment : Fragment() {
private val viewModel: SmartCardViewModel by activityViewModels() private val viewModel: SmartCardViewModel by activityViewModels()
@ -23,18 +29,72 @@ class HomeFragment : Fragment() {
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
binding = FragmentHomeBinding.inflate(inflater, container, false) binding = FragmentHomeBinding.inflate(inflater, container, false)
// Making settings menu active again
(activity as MainActivity).menuAvailable = true
return binding!!.root return binding!!.root
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
viewModel.checkCan(requireContext()) initialChecks()
viewModel.checkPin(requireContext()) binding!!.beginButton.setOnClickListener { goToTheNextFragment() }
binding!!.beginButton.setOnClickListener { goToNextFragment() }
} }
private fun goToNextFragment() { /**
findNavController().navigate(R.id.action_homeFragment_to_canFragment) * Method where all the initial checks that should be done before any user input is accepted should be added.
*/
private fun initialChecks() {
viewModel.checkCan(requireContext())
viewModel.checkPin(requireContext())
displayStates()
}
/**
* Starts the process of interacting with the ID card by sending user to the CAN fragment.
*/
private fun goToTheNextFragment() {
// Making settings menu inactive
(activity as MainActivity).menuAvailable = false
// Currently saving is true because the application is not yet integrated with
// other applications or websites.
val action = HomeFragmentDirections.actionHomeFragmentToCanFragment(reading = true)
findNavController().navigate(action)
}
/**
* Displays texts that inform the user whether the CAN and PIN 1 are saved on the device or not.
* This might help the user to save some time as checking menu is not necessary unless the user
* wishes to make changes to the saved CAN or PIN 1.
*/
private fun displayStates() {
canState()
pinState()
}
/**
* Checks the state of the CAN, saved or not saved. Updates the text and logo.
*/
private fun canState() {
if (viewModel.userCan.length == 6) {
binding!!.canStatusText.text = getString(R.string.can_status_saved)
binding!!.canStatusLogo.setImageResource(R.drawable.ic_check_logo)
} else {
binding!!.canStatusText.text = getString(R.string.can_status_negative)
binding!!.canStatusLogo.setImageResource(R.drawable.ic_info_logo)
}
}
/**
* Checks the state of the PIN 1, saved or not saved. Updates the text and logo.
*/
private fun pinState() {
if (viewModel.userPin.length in 4..12) {
binding!!.pinStatusText.text = getString(R.string.pin_status_saved)
binding!!.pinStatusLogo.setImageResource(R.drawable.ic_check_logo)
} else {
binding!!.pinStatusText.text = getString(R.string.pin_status_negative)
binding!!.pinStatusLogo.setImageResource(R.drawable.ic_info_logo)
}
} }
override fun onDestroyView() { override fun onDestroyView() {

View File

@ -1,22 +1,25 @@
package com.tarkvaraprojekt.mobileauthapp package com.tarkvaraprojekt.mobileauthapp
import android.nfc.NfcAdapter
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.widget.Toast import android.widget.Toast
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.findNavController
import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.NavHostFragment
import com.tarkvaraprojekt.mobileauthapp.databinding.ActivityMainBinding import com.tarkvaraprojekt.mobileauthapp.databinding.ActivityMainBinding
import java.util.*
/**
* The only activity of the application (single activity design).
*/
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
private lateinit var navigationController: NavController private lateinit var navigationController: NavController
// If true the settings menu can be accessed from the toolbar in the upper part of the screen.
var menuAvailable: Boolean = true
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater) val binding = ActivityMainBinding.inflate(layoutInflater)
@ -35,10 +38,14 @@ class MainActivity : AppCompatActivity() {
override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) { override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
R.id.menu_settings_option -> { R.id.menu_settings_option -> {
if (menuAvailable) {
navigationController.navigate(R.id.action_homeFragment_to_settingsFragment) navigationController.navigate(R.id.action_homeFragment_to_settingsFragment)
true true
} else {
Toast.makeText(this, getString(R.string.unavailable), Toast.LENGTH_SHORT).show()
false
}
} }
else -> super.onOptionsItemSelected(item) else -> super.onOptionsItemSelected(item)
} }
} }

View File

@ -14,7 +14,9 @@ import com.tarkvaraprojekt.mobileauthapp.databinding.FragmentPinBinding
import com.tarkvaraprojekt.mobileauthapp.model.SmartCardViewModel import com.tarkvaraprojekt.mobileauthapp.model.SmartCardViewModel
/** /**
* Fragment that deals with asking the user for PIN1 * Fragment that deals with asking the user for PIN 1. If the user has already saved the PIN 1 then it is not asked again
* and the fragment is skipped and if the PIN 1 is not saved then the user is asked whether it should be saved or
* not before continuing.
*/ */
class PinFragment : Fragment() { class PinFragment : Fragment() {
@ -22,7 +24,10 @@ class PinFragment : Fragment() {
private var binding: FragmentPinBinding? = null private var binding: FragmentPinBinding? = null
// Navigation arguments. saving = true means that we are navigating here from the settings menu and must return to the settings // Navigation arguments:
// saving = true means that the user must be returned to the settings menu
// reading = true means that we are reading information from the ID card that does
// not require PIN 1 so it is not necessary to ask it.
private val args: CanFragmentArgs by navArgs() private val args: CanFragmentArgs by navArgs()
override fun onCreateView( override fun onCreateView(
@ -36,48 +41,51 @@ class PinFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
if (viewModel.userPin.length in 4..12) { checkIfSkip()
skip() // If the user arrives from the settings menu then the button says
} // save instead of continue.
if (args.saving) { if (args.saving) {
binding!!.nextButton.text = getString(R.string.save_text) binding!!.nextButton.text = getString(R.string.save_text)
} }
binding!!.nextButton.setOnClickListener { goToNextFragment() } binding!!.nextButton.setOnClickListener { checkEnteredPin() }
binding!!.cancelButton.setOnClickListener { goToTheStart() } binding!!.cancelButton.setOnClickListener { goToTheStart() }
} }
private fun skip() { /**
* Checks if the current fragment can be skipped or not.
* If the user has PIN 1 saved on the device or PIN 1 is not required
* then the PIN 1 won't be asked.
*/
private fun checkIfSkip() {
if (args.reading) {
goToTheNextFragment()
} else if (viewModel.userPin.length in 4..12) {
goToTheNextFragment()
}
}
/**
* Takes user to the next fragment, which is AuthFragment.
*/
private fun goToTheNextFragment() {
findNavController().navigate(R.id.action_pinFragment_to_authFragment) findNavController().navigate(R.id.action_pinFragment_to_authFragment)
} }
private fun goToNextFragment() { /**
val enteredPin1 = binding!!.pinEditText.editText?.text.toString() * Checks whether the user has entered a PIN 1 with length between [4, 12] in the
if (enteredPin1.length in 4..12) { * input field. If yes then the user is allowed to continue otherwise the user is
viewModel.setUserPin( * allowed to modify the entered PIN 1.
binding!!.pinEditText.editText?.text.toString() */
) private fun checkEnteredPin() {
val enteredPin = binding!!.pinEditText.editText?.text.toString()
if (enteredPin.length in 4..12) {
viewModel.setUserPin(enteredPin)
if (args.saving) { if (args.saving) {
viewModel.storePin(requireContext()) viewModel.storePin(requireContext())
findNavController().navigate(R.id.action_pinFragment_to_settingsFragment) goToTheStart()
} else { } else {
val canStoreQuestion: AlertDialog? = activity?.let { frag -> val storePinQuestion = getDialog()
val builder = AlertDialog.Builder(frag) storePinQuestion?.show()
builder.apply {
setPositiveButton(R.string.save_text) { _, _ ->
viewModel.storePin(
requireContext()
)
findNavController().navigate(R.id.action_pinFragment_to_authFragment)
}
setNegativeButton(R.string.deny_text) { _, _ ->
findNavController().navigate(R.id.action_pinFragment_to_authFragment)
}
}
builder.setMessage(R.string.pin_save_request)
builder.setTitle(R.string.save_pin_title)
builder.create()
}
canStoreQuestion?.show()
} }
} else { } else {
Toast.makeText(requireContext(), getString(R.string.length_pin), Toast.LENGTH_SHORT) Toast.makeText(requireContext(), getString(R.string.length_pin), Toast.LENGTH_SHORT)
@ -85,6 +93,35 @@ class PinFragment : Fragment() {
} }
} }
/**
* Builds a dialog that asks the user whether the entered PIN 1 should be saved
* on the device or not.
*/
private fun getDialog(): AlertDialog? {
return activity?.let { frag ->
val builder = AlertDialog.Builder(frag)
builder.apply {
// If response is positive save the PIN 1 on the device.
setPositiveButton(R.string.save_text) { _, _ ->
viewModel.storePin(
requireContext()
)
goToTheNextFragment()
}
setNegativeButton(R.string.deny_text) { _, _ ->
goToTheNextFragment()
}
}
builder.setMessage(R.string.pin_save_request)
builder.setTitle(R.string.save_pin_title)
builder.create()
}
}
/**
* Returns user to the start. If the user arrived from the settings menu then the start is
* settings menu not the HomeFragment.
*/
private fun goToTheStart() { private fun goToTheStart() {
if (args.saving) { if (args.saving) {
findNavController().navigate(R.id.action_pinFragment_to_settingsFragment) findNavController().navigate(R.id.action_pinFragment_to_settingsFragment)

View File

@ -42,6 +42,7 @@ class SettingsFragment : Fragment() {
binding!!.canMenuAction.setOnClickListener { canAction() } binding!!.canMenuAction.setOnClickListener { canAction() }
binding!!.pinMenuAction.setOnClickListener { pinAction() } binding!!.pinMenuAction.setOnClickListener { pinAction() }
binding!!.pinMenuShow.setOnClickListener { togglePin() } binding!!.pinMenuShow.setOnClickListener { togglePin() }
binding!!.returnButton.setOnClickListener { backToHome() }
} }
/** /**
@ -66,7 +67,7 @@ class SettingsFragment : Fragment() {
viewModel.deleteCan(requireContext()) viewModel.deleteCan(requireContext())
showCanField() showCanField()
} else { } else {
val action = SettingsFragmentDirections.actionSettingsFragmentToCanFragment(true) val action = SettingsFragmentDirections.actionSettingsFragmentToCanFragment(saving = true)
findNavController().navigate(action) findNavController().navigate(action)
} }
} }
@ -100,7 +101,7 @@ class SettingsFragment : Fragment() {
viewModel.deletePin(requireContext()) viewModel.deletePin(requireContext())
showPinField() showPinField()
} else { } else {
val action = SettingsFragmentDirections.actionSettingsFragmentToPinFragment(true) val action = SettingsFragmentDirections.actionSettingsFragmentToPinFragment(saving = true)
findNavController().navigate(action) findNavController().navigate(action)
} }
} }
@ -125,6 +126,13 @@ class SettingsFragment : Fragment() {
} }
} }
/**
* Navigates back to home fragment.
*/
private fun backToHome() {
findNavController().navigate(R.id.action_settingsFragment_to_homeFragment)
}
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
binding = null binding = null

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z"/>
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-6h2v6zM13,9h-2L11,7h2v2z"/>
</vector>

View File

@ -7,23 +7,87 @@
android:padding="24dp" android:padding="24dp"
tools:context=".HomeFragment"> tools:context=".HomeFragment">
<TextView <LinearLayout
android:id="@+id/home_fragment_text" android:id="@+id/saved_states"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/home_fragment" android:orientation="vertical"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" /> app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent">
<com.google.android.material.card.MaterialCardView
android:id="@+id/can_status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="12dp"
app:strokeWidth="1dp"
app:strokeColor="@color/stroke_color"
app:cardElevation="0dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/can_status_logo"
android:layout_marginStart="12dp"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
<TextView
android:id="@+id/can_status_text"
android:textSize="20sp"
android:padding="12dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.card.MaterialCardView
android:id="@+id/pin_status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="12dp"
app:strokeWidth="1dp"
app:strokeColor="@color/stroke_color"
app:cardElevation="0dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/pin_status_logo"
android:layout_marginStart="12dp"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
<TextView
android:id="@+id/pin_status_text"
android:textSize="20sp"
android:padding="12dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
<!-- Temporary button for testing purposes -->
<Button <Button
android:id="@+id/begin_button" android:id="@+id/begin_button"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/begin_text" android:text="@string/begin_text"
android:layout_marginTop="24dp" android:layout_marginTop="24dp"
app:layout_constraintTop_toBottomOf="@id/home_fragment_text" android:textSize="18sp"
app:layout_constraintTop_toBottomOf="@id/saved_states"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/> app:layout_constraintEnd_toEndOf="parent"/>

View File

@ -33,6 +33,7 @@
<Button <Button
android:id="@+id/can_menu_action" android:id="@+id/can_menu_action"
android:layout_margin="12dp" android:layout_margin="12dp"
android:textSize="18sp"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content"/> android:layout_height="wrap_content"/>
<TextView <TextView
@ -49,11 +50,13 @@
<Button <Button
android:id="@+id/pin_menu_action" android:id="@+id/pin_menu_action"
android:layout_margin="12dp" android:layout_margin="12dp"
android:textSize="18sp"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
<Button <Button
android:id="@+id/pin_menu_show" android:id="@+id/pin_menu_show"
android:layout_margin="12dp" android:layout_margin="12dp"
android:textSize="18sp"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:visibility="gone"/> android:visibility="gone"/>
@ -61,4 +64,14 @@
</LinearLayout> </LinearLayout>
</com.google.android.material.card.MaterialCardView> </com.google.android.material.card.MaterialCardView>
<Button
android:id="@+id/return_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/return_text"
android:layout_margin="24dp"
android:textSize="18sp"
app:layout_constraintTop_toBottomOf="@id/settings_card"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -42,6 +42,10 @@
android:id="@+id/action_pinFragment_to_authFragment" android:id="@+id/action_pinFragment_to_authFragment"
app:destination="@id/authFragment" app:destination="@id/authFragment"
app:popUpTo="@id/homeFragment" /> app:popUpTo="@id/homeFragment" />
<argument
android:name="reading"
app:argType="boolean"
android:defaultValue="false" />
</fragment> </fragment>
<fragment <fragment
android:id="@+id/canFragment" android:id="@+id/canFragment"
@ -66,6 +70,10 @@
android:id="@+id/action_canFragment_to_pinFragment" android:id="@+id/action_canFragment_to_pinFragment"
app:destination="@id/pinFragment" app:destination="@id/pinFragment"
app:popUpTo="@id/homeFragment" /> app:popUpTo="@id/homeFragment" />
<argument
android:name="reading"
app:argType="boolean"
android:defaultValue="false" />
</fragment> </fragment>
<fragment <fragment
android:id="@+id/authFragment" android:id="@+id/authFragment"
@ -104,5 +112,10 @@
<action <action
android:id="@+id/action_settingsFragment_to_pinFragment" android:id="@+id/action_settingsFragment_to_pinFragment"
app:destination="@id/pinFragment" /> app:destination="@id/pinFragment" />
<action
android:id="@+id/action_settingsFragment_to_homeFragment"
app:destination="@id/homeFragment"
app:popUpTo="@id/homeFragment"
app:popUpToInclusive="true" />
</fragment> </fragment>
</navigation> </navigation>

View File

@ -4,11 +4,18 @@
<string name="app_name">NFC authentication</string> <string name="app_name">NFC authentication</string>
<string name="home_fragment">Work in progress</string> <string name="home_fragment">Work in progress</string>
<string name="begin_text">ALUSTA</string> <!-- string resources for HomeFragment -->
<string name="pin_status_saved">PIN 1 on salvestatud</string>
<string name="pin_status_negative">PIN 1 ei ole salvestatud</string>
<string name="can_status_saved">CAN on salvestatud</string>
<string name="can_status_negative">CAN ei ole salvestatud</string>
<string name="begin_text">LOE ID KAARTI</string>
<string name="next_text">EDASI</string> <string name="next_text">EDASI</string>
<string name="cancel_text">KATKESTA</string> <string name="cancel_text">KATKESTA</string>
<string name="save_text">SALVESTA</string> <string name="save_text">SALVESTA</string>
<string name="deny_text">EI</string> <string name="deny_text">EI</string>
<string name="return_text">TAGASI</string>
<!-- string resources for PinFragment --> <!-- string resources for PinFragment -->
<string name="pin_fragment">Palun sisesta PIN 1</string> <string name="pin_fragment">Palun sisesta PIN 1</string>
@ -54,4 +61,5 @@
<string name="show">NÄITA</string> <string name="show">NÄITA</string>
<string name="hide">PEIDA</string> <string name="hide">PEIDA</string>
<string name="hidden_pin">****</string> <string name="hidden_pin">****</string>
<string name="unavailable">Seaded pole hetkel saadaval</string>
</resources> </resources>

View File

@ -3,11 +3,18 @@
<string name="app_name">NFC authentication</string> <string name="app_name">NFC authentication</string>
<string name="home_fragment">Work in progress</string> <string name="home_fragment">Work in progress</string>
<string name="begin_text">ALUSTA</string> <string name="begin_text">LOE ID KAARTI</string>
<string name="next_text">EDASI</string> <string name="next_text">EDASI</string>
<string name="cancel_text">KATKESTA</string> <string name="cancel_text">KATKESTA</string>
<string name="save_text">SALVESTA</string> <string name="save_text">SALVESTA</string>
<string name="deny_text">EI</string> <string name="deny_text">EI</string>
<string name="return_text">TAGASI</string>
<!-- string resources for HomeFragment -->
<string name="pin_status_saved">PIN 1 on salvestatud</string>
<string name="pin_status_negative">PIN 1 ei ole salvestatud</string>
<string name="can_status_saved">CAN on salvestatud</string>
<string name="can_status_negative">CAN ei ole salvestatud</string>
<!-- string resources for PinFragment --> <!-- string resources for PinFragment -->
<string name="pin_fragment">Palun sisesta PIN 1</string> <string name="pin_fragment">Palun sisesta PIN 1</string>
@ -52,4 +59,5 @@
<string name="show">NÄITA</string> <string name="show">NÄITA</string>
<string name="hide">PEIDA</string> <string name="hide">PEIDA</string>
<string name="hidden_pin">****</string> <string name="hidden_pin">****</string>
<string name="unavailable">Seaded pole hetkel saadaval</string>
</resources> </resources>

View File

@ -2,11 +2,18 @@
<string name="app_name">NFC authentication</string> <string name="app_name">NFC authentication</string>
<string name="home_fragment">Work in progress</string> <string name="home_fragment">Work in progress</string>
<string name="begin_text">ALUSTA</string> <string name="begin_text">LOE ID KAARTI</string>
<string name="next_text">EDASI</string> <string name="next_text">EDASI</string>
<string name="cancel_text">KATKESTA</string> <string name="cancel_text">KATKESTA</string>
<string name="save_text">SALVESTA</string> <string name="save_text">SALVESTA</string>
<string name="deny_text">EI</string> <string name="deny_text">EI</string>
<string name="return_text">TAGASI</string>
<!-- string resources for HomeFragment -->
<string name="pin_status_saved">PIN 1 on salvestatud</string>
<string name="pin_status_negative">PIN 1 ei ole salvestatud</string>
<string name="can_status_saved">CAN on salvestatud</string>
<string name="can_status_negative">CAN ei ole salvestatud</string>
<!-- string resources for PinFragment --> <!-- string resources for PinFragment -->
<string name="pin_fragment">Palun sisesta PIN 1</string> <string name="pin_fragment">Palun sisesta PIN 1</string>
@ -52,4 +59,5 @@
<string name="show">NÄITA</string> <string name="show">NÄITA</string>
<string name="hide">PEIDA</string> <string name="hide">PEIDA</string>
<string name="hidden_pin">****</string> <string name="hidden_pin">****</string>
<string name="unavailable">Seaded pole hetkel saadaval</string>
</resources> </resources>