167 lines
6.9 KiB
Kotlin
167 lines
6.9 KiB
Kotlin
package cy.agorise.bitsybitshareswallet.fragments
|
|
|
|
import android.os.Bundle
|
|
import android.preference.PreferenceManager
|
|
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.Constants
|
|
import cy.agorise.bitsybitshareswallet.utils.CryptoUtils
|
|
|
|
|
|
/**
|
|
* 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)
|
|
}
|
|
|
|
private var newPattern = ""
|
|
|
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
super.onViewCreated(view, savedInstanceState)
|
|
|
|
setupScreen()
|
|
|
|
patternLockView.addPatternLockListener(mPatternLockViewListener)
|
|
|
|
btnClear.setOnClickListener { setupScreen() }
|
|
}
|
|
|
|
private val mPatternLockViewListener = object : PatternLockViewListener {
|
|
override fun onStarted() {
|
|
// Make sure the button is hidden when the user starts a new pattern when it was incorrect
|
|
when (currentStep) {
|
|
STEP_SECURITY_LOCK_VERIFY -> {
|
|
tvMessage.text = ""
|
|
}
|
|
STEP_SECURITY_LOCK_CREATE -> {
|
|
btnClear.visibility = View.INVISIBLE
|
|
tvMessage.text = getString(R.string.msg__release_finger)
|
|
}
|
|
STEP_SECURITY_LOCK_CONFIRM -> {
|
|
btnClear.visibility = View.INVISIBLE
|
|
tvMessage.text = getString(R.string.msg__release_finger)
|
|
}
|
|
}
|
|
}
|
|
|
|
override fun onProgress(progressPattern: List<PatternLockView.Dot>) {
|
|
|
|
}
|
|
|
|
override fun onComplete(pattern: List<PatternLockView.Dot>) {
|
|
if (currentStep == STEP_SECURITY_LOCK_VERIFY) {
|
|
context?.let {
|
|
val encryptedPattern = CryptoUtils.encrypt(it, getStringPattern(pattern)).trim()
|
|
if (encryptedPattern == currentEncryptedPINPattern) {
|
|
// Pattern is correct, proceed
|
|
dismiss()
|
|
mCallback?.onPINPatternEntered(actionIdentifier)
|
|
} else {
|
|
tvMessage.text = getString(R.string.error__wront_pattern)
|
|
}
|
|
}
|
|
} else if (currentStep == STEP_SECURITY_LOCK_CREATE) {
|
|
btnClear.visibility = View.VISIBLE
|
|
if (pattern.size < 4) {
|
|
tvMessage.text = getString(R.string.error__connect_at_least_4_dots)
|
|
patternLockView.setViewMode(PatternLockView.PatternViewMode.WRONG)
|
|
} else {
|
|
tvMessage.text = getString(R.string.text__pattern_recorded)
|
|
patternLockView.setViewMode(PatternLockView.PatternViewMode.CORRECT)
|
|
patternLockView.isInputEnabled = false
|
|
btnNext.isEnabled = true
|
|
newPattern = getStringPattern(pattern)
|
|
btnNext.setOnClickListener {
|
|
currentStep = STEP_SECURITY_LOCK_CONFIRM
|
|
setupScreen()
|
|
}
|
|
}
|
|
} else if (currentStep == STEP_SECURITY_LOCK_CONFIRM) {
|
|
val patternConfirm = getStringPattern(pattern)
|
|
if (patternConfirm != newPattern) {
|
|
tvMessage.text = getString(R.string.error__wront_pattern)
|
|
btnNext.isEnabled = false
|
|
patternLockView.setViewMode(PatternLockView.PatternViewMode.WRONG)
|
|
} else {
|
|
tvMessage.text = getString(R.string.msg__your_new_unlock_pattern)
|
|
patternLockView.isEnabled = false
|
|
patternLockView.setViewMode(PatternLockView.PatternViewMode.CORRECT)
|
|
btnNext.isEnabled = true
|
|
btnNext.setOnClickListener {
|
|
context?.let {
|
|
val encryptedPattern = CryptoUtils.encrypt(it, patternConfirm).trim()
|
|
|
|
// Stores the newly selected Pattern, encrypted
|
|
PreferenceManager.getDefaultSharedPreferences(it).edit()
|
|
.putString(Constants.KEY_ENCRYPTED_PIN, encryptedPattern)
|
|
.putInt(Constants.KEY_SECURITY_LOCK_SELECTED, 1).apply() // 1 -> Pattern
|
|
|
|
dismiss()
|
|
mCallback?.onPINPatternChanged()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
override fun onCleared() {
|
|
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Converts the given pattern into a string representation of it.
|
|
*/
|
|
private fun getStringPattern(pattern: List<PatternLockView.Dot>): String {
|
|
val sb = StringBuilder()
|
|
for (dot in pattern)
|
|
sb.append(dot.id)
|
|
|
|
return sb.toString()
|
|
}
|
|
|
|
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.GONE
|
|
btnNext.visibility = View.GONE
|
|
patternLockView.isInStealthMode = true
|
|
}
|
|
STEP_SECURITY_LOCK_CREATE -> {
|
|
tvTitle.text = getString(R.string.title__set_bitsy_screen_lock)
|
|
tvSubTitle.text = getString(R.string.msg__set_bitsy_pattern)
|
|
tvMessage.text = getString(R.string.text__draw_an_unlock_pattern)
|
|
patternLockView.clearPattern()
|
|
patternLockView.isInputEnabled = true
|
|
btnClear.visibility = View.INVISIBLE
|
|
btnNext.isEnabled = false
|
|
}
|
|
STEP_SECURITY_LOCK_CONFIRM -> {
|
|
tvTitle.text = getString(R.string.title__re_enter_your_pattern)
|
|
tvSubTitle.text = ""
|
|
tvMessage.text = getString(R.string.msg__draw_pattern_confirm)
|
|
tvSubTitle.visibility = View.GONE
|
|
patternLockView.clearPattern()
|
|
patternLockView.isInputEnabled = true
|
|
btnClear.visibility = View.INVISIBLE
|
|
btnNext.isEnabled = false
|
|
btnNext.text = getString(R.string.btn__confirm)
|
|
}
|
|
}
|
|
}
|
|
} |