Created PatternSecurityLockDialog, which will be in charge of creating and confirming a new Pattern of validating the existing one, with a logic similar to PINSecurityLockDialog's. Created basic PatternSecurityLockDialog with a UI that resembles Android's.

This commit is contained in:
Severiano Jaramillo 2019-02-14 19:57:42 -06:00
parent e8e1259314
commit e44f4ea6e2
5 changed files with 192 additions and 11 deletions

View file

@ -0,0 +1,75 @@
package cy.agorise.bitsybitshareswallet.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import cy.agorise.bitsybitshareswallet.R
import kotlinx.android.synthetic.main.dialog_pattern_security_lock.*
import com.andrognito.patternlockview.PatternLockView
import com.andrognito.patternlockview.listener.PatternLockViewListener
import cy.agorise.bitsybitshareswallet.utils.toast
/**
* Contains all the specific logic to create and confirm a new Pattern or verifying the validity of the current one.
*/
class PatternSecurityLockDialog : BaseSecurityLockDialog() {
companion object {
const val TAG = "PatternSecurityLockDialog"
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.dialog_pattern_security_lock, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupScreen()
patternLockView.addPatternLockListener(mPatternLockViewListener)
}
private val mPatternLockViewListener = object : PatternLockViewListener {
override fun onStarted() {
context?.toast("Pattern started")
}
override fun onProgress(progressPattern: List<PatternLockView.Dot>) {
tvMessage.text = getString(R.string.msg__release_finger)
}
override fun onComplete(pattern: List<PatternLockView.Dot>) {
if (pattern.size < 4) {
patternLockView.setViewMode(PatternLockView.PatternViewMode.WRONG)
}
}
override fun onCleared() {
context?.toast("Pattern has been cleared")
}
}
private fun setupScreen() {
when (currentStep) {
STEP_SECURITY_LOCK_VERIFY -> {
tvTitle.text = getString(R.string.title__re_enter_your_pattern)
tvSubTitle.text = getString(R.string.msg__enter_your_pattern)
btnClear.visibility = View.INVISIBLE
}
STEP_SECURITY_LOCK_CREATE -> {
tvTitle.text = getString(R.string.title__set_bitsy_screen_lock)
tvSubTitle.text = getString(R.string.msg__set_bitsy_pattern)
btnClear.visibility = View.INVISIBLE
}
STEP_SECURITY_LOCK_CONFIRM -> {
tvTitle.text = getString(R.string.title__re_enter_your_pin)
tvSubTitle.text = ""
tvSubTitle.visibility = View.GONE
}
}
}
}

View file

@ -233,19 +233,23 @@ class SettingsFragment : Fragment(), ServiceConnection, BaseSecurityLockDialog.O
* @return true if the action was handled, false otherwise * @return true if the action was handled, false otherwise
*/ */
private fun verifySecurityLock(securityLockSelected: Int, actionIdentifier: Int): Boolean { private fun verifySecurityLock(securityLockSelected: Int, actionIdentifier: Int): Boolean {
return when (securityLockSelected) { // Args used for both PIN and Pattern options
0 -> { /* PIN */
val pinFrag = PINSecurityLockDialog()
val args = Bundle() val args = Bundle()
args.putInt(BaseSecurityLockDialog.KEY_STEP_SECURITY_LOCK, args.putInt(BaseSecurityLockDialog.KEY_STEP_SECURITY_LOCK,
BaseSecurityLockDialog.STEP_SECURITY_LOCK_VERIFY) BaseSecurityLockDialog.STEP_SECURITY_LOCK_VERIFY)
args.putInt(BaseSecurityLockDialog.KEY_ACTION_IDENTIFIER, actionIdentifier) args.putInt(BaseSecurityLockDialog.KEY_ACTION_IDENTIFIER, actionIdentifier)
return when (securityLockSelected) {
0 -> { /* PIN */
val pinFrag = PINSecurityLockDialog()
pinFrag.arguments = args pinFrag.arguments = args
pinFrag.show(childFragmentManager, "pin_security_lock_tag") pinFrag.show(childFragmentManager, "pin_security_lock_tag")
true true
} }
1 -> { /* Pattern */ 1 -> { /* Pattern */
val patternFrag = PatternSecurityLockDialog()
patternFrag.arguments = args
patternFrag.show(childFragmentManager, "pattern_security_lock_tag")
true true
} }
else -> { /* None */ else -> { /* None */
@ -281,19 +285,23 @@ class SettingsFragment : Fragment(), ServiceConnection, BaseSecurityLockDialog.O
context?.let { context?.let {
MaterialDialog(it).show { MaterialDialog(it).show {
title(R.string.title__security_dialog) title(R.string.title__security_dialog)
listItems(R.array.security_lock_options) {dialog, index, text -> listItems(R.array.security_lock_options) {_, index, _ ->
when (index) { // Args used for both PIN and Pattern options
0 -> { /* PIN */
val pinFrag = PINSecurityLockDialog()
val args = Bundle() val args = Bundle()
args.putInt(BaseSecurityLockDialog.KEY_STEP_SECURITY_LOCK, args.putInt(BaseSecurityLockDialog.KEY_STEP_SECURITY_LOCK,
BaseSecurityLockDialog.STEP_SECURITY_LOCK_CREATE) BaseSecurityLockDialog.STEP_SECURITY_LOCK_CREATE)
args.putInt(BaseSecurityLockDialog.KEY_ACTION_IDENTIFIER, -1) args.putInt(BaseSecurityLockDialog.KEY_ACTION_IDENTIFIER, -1)
when (index) {
0 -> { /* PIN */
val pinFrag = PINSecurityLockDialog()
pinFrag.arguments = args pinFrag.arguments = args
pinFrag.show(childFragmentManager, "pin_security_lock_tag") pinFrag.show(childFragmentManager, "pin_security_lock_tag")
} }
1 -> { /* Pattern */ 1 -> { /* Pattern */
val patternFrag = PatternSecurityLockDialog()
patternFrag.arguments = args
patternFrag.show(childFragmentManager, "pattern_security_lock_tag")
} }
else -> { /* None */ else -> { /* None */
PreferenceManager.getDefaultSharedPreferences(context).edit() PreferenceManager.getDefaultSharedPreferences(context).edit()

View file

@ -0,0 +1,86 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingStart="@dimen/activity_horizontal_margin"
android:paddingEnd="@dimen/activity_horizontal_margin"
android:orientation="vertical"
tools:context=".fragments.PINSecurityLockDialog">
<ImageView
android:id="@+id/ivLock"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginTop="@dimen/spacing_same_topic"
android:src="@drawable/ic_lock"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:contentDescription="@string/title__re_enter_your_pin" />
<TextView
android:id="@+id/tvTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/spacing_same_topic"
tools:text="Enter your pattern"
android:textAppearance="@style/TextAppearance.Bitsy.Headline5"
app:layout_constraintTop_toBottomOf="@id/ivLock" />
<TextView
android:id="@+id/tvSubTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
tools:text="Enter your BiTSy pattern to continue"
android:textAppearance="@style/TextAppearance.Bitsy.Body1"
app:layout_constraintTop_toBottomOf="@id/tvTitle"/>
<TextView
android:id="@+id/tvMessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:text="Draw an unlock pattern"
android:textAlignment="center"
app:layout_constraintBottom_toTopOf="@id/patternLockView"
app:layout_constraintTop_toBottomOf="@id/tvSubTitle"
app:layout_constraintVertical_chainStyle="spread"
tools:layout_editor_absoluteX="16dp" />
<com.andrognito.patternlockview.PatternLockView
android:id="@+id/patternLockView"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="@dimen/spacing_different_topic"
app:normalStateColor="?android:textColorSecondary"
app:correctStateColor="@color/colorPrimary"
app:wrongStateColor="@color/colorSend"
app:layout_constraintDimensionRatio="h,1:1"
app:layout_constraintTop_toBottomOf="@id/tvMessage"
app:layout_constraintBottom_toTopOf="@id/btnClear"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<Button
android:id="@+id/btnClear"
style="@style/Widget.Bitsy.Button.TextButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn__clear"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
<Button
android:id="@+id/btnNext"
style="@style/Widget.Bitsy.Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn__next"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -151,5 +151,11 @@
<string name="msg__set_bitsy_pin">Por seguridad, crea un PIN para BiTSy</string> <string name="msg__set_bitsy_pin">Por seguridad, crea un PIN para BiTSy</string>
<string name="msg__min_pin_length">El PIN debe tener al menos 6 dígitos</string> <string name="msg__min_pin_length">El PIN debe tener al menos 6 dígitos</string>
<string name="title__pins_dont_match">El PIN no concuerda</string> <string name="title__pins_dont_match">El PIN no concuerda</string>
<string name="title__re_enter_your_pattern">Reingresa tu patrón</string>
<string name="msg__enter_your_pattern">Ingresa tu patrón de BiTSy para continuar</string>
<string name="msg__set_bitsy_pattern">Por seguridad, crea un patrón para BiTSy</string>
<string name="msg__release_finger">Suelta tu dedo al terminar</string>
<string name="btn__clear">Limpiar</string>
<string name="btn__next">Siguiente</string>
</resources> </resources>

View file

@ -152,5 +152,11 @@
<string name="msg__set_bitsy_pin">For security, set BiTSy PIN</string> <string name="msg__set_bitsy_pin">For security, set BiTSy PIN</string>
<string name="msg__min_pin_length">PIN must be at least 6 digits</string> <string name="msg__min_pin_length">PIN must be at least 6 digits</string>
<string name="title__pins_dont_match">PINs don\'t match</string> <string name="title__pins_dont_match">PINs don\'t match</string>
<string name="title__re_enter_your_pattern">Re-enter your pattern</string>
<string name="msg__enter_your_pattern">Enter your BiTSy pattern to continue</string>
<string name="msg__set_bitsy_pattern">For security, set BiTSy pattern</string>
<string name="msg__release_finger">Release finger when done</string>
<string name="btn__clear">Clear</string>
<string name="btn__next">Next</string>
</resources> </resources>