Continue PIN code library integration (fork required)

This commit is contained in:
ganfra 2020-07-28 20:22:59 +02:00
parent cd38aa42aa
commit ecdef52829
9 changed files with 122 additions and 9 deletions

View File

@ -42,7 +42,7 @@ allprojects {
// PhotoView // PhotoView
includeGroupByRegex 'com\\.github\\.chrisbanes' includeGroupByRegex 'com\\.github\\.chrisbanes'
// PFLockScreen-Android // PFLockScreen-Android
includeGroupByRegex 'com\\.github\\.thealeksandr' includeGroupByRegex 'com\\.github\\.ganfra'
} }
} }
maven { maven {

View File

@ -346,7 +346,7 @@ dependencies {
implementation 'me.saket:better-link-movement-method:2.2.0' implementation 'me.saket:better-link-movement-method:2.2.0'
implementation 'com.google.android:flexbox:1.1.1' implementation 'com.google.android:flexbox:1.1.1'
implementation "androidx.autofill:autofill:$autofill_version" implementation "androidx.autofill:autofill:$autofill_version"
implementation 'com.github.thealeksandr:PFLockScreen-Android:1.0.0-beta7' implementation 'com.github.ganfra:PFLockScreen-Android:1.0.0-beta8'
// Custom Tab // Custom Tab
implementation 'androidx.browser:browser:1.2.0' implementation 'androidx.browser:browser:1.2.0'

View File

@ -18,16 +18,16 @@ package im.vector.riotx.features.pin
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import com.beautycoder.pflockscreen.PFFLockScreenConfiguration import com.beautycoder.pflockscreen.PFFLockScreenConfiguration
import com.beautycoder.pflockscreen.fragments.PFLockScreenFragment import com.beautycoder.pflockscreen.fragments.PFLockScreenFragment
import com.beautycoder.pflockscreen.fragments.PFLockScreenFragment.OnPFLockScreenCodeCreateListener import com.beautycoder.pflockscreen.fragments.PFLockScreenFragment.OnPFLockScreenCodeCreateListener
import im.vector.riotx.R import im.vector.riotx.R
import im.vector.riotx.core.extensions.addFragment
import im.vector.riotx.core.extensions.replaceFragment import im.vector.riotx.core.extensions.replaceFragment
import im.vector.riotx.core.platform.ToolbarConfigurable import im.vector.riotx.core.platform.ToolbarConfigurable
import im.vector.riotx.core.platform.VectorBaseActivity import im.vector.riotx.core.platform.VectorBaseActivity
import timber.log.Timber
class PinActivity : VectorBaseActivity(), ToolbarConfigurable { class PinActivity : VectorBaseActivity(), ToolbarConfigurable {
@ -41,10 +41,8 @@ class PinActivity : VectorBaseActivity(), ToolbarConfigurable {
override fun getLayoutRes() = R.layout.activity_simple override fun getLayoutRes() = R.layout.activity_simple
override fun initUiAndData() { override fun initUiAndData() {
if (isFirstCreation()) {
showCreateFragment() showCreateFragment()
} }
}
override fun configure(toolbar: Toolbar) { override fun configure(toolbar: Toolbar) {
configureToolbar(toolbar) configureToolbar(toolbar)
@ -57,6 +55,7 @@ class PinActivity : VectorBaseActivity(), ToolbarConfigurable {
.setTitle("Choose a PIN for security") .setTitle("Choose a PIN for security")
.setNewCodeValidationTitle("Confirm PIN") .setNewCodeValidationTitle("Confirm PIN")
.setMode(PFFLockScreenConfiguration.MODE_CREATE) .setMode(PFFLockScreenConfiguration.MODE_CREATE)
createFragment.setConfiguration(builder.build()) createFragment.setConfiguration(builder.build())
createFragment.setCodeCreateListener(object : OnPFLockScreenCodeCreateListener { createFragment.setCodeCreateListener(object : OnPFLockScreenCodeCreateListener {
override fun onNewCodeValidationFailed() { override fun onNewCodeValidationFailed() {
@ -66,7 +65,7 @@ class PinActivity : VectorBaseActivity(), ToolbarConfigurable {
showAuthFragment(encodedCode) showAuthFragment(encodedCode)
} }
}) })
addFragment(R.id.simpleFragmentContainer, createFragment) replaceFragment(R.id.simpleFragmentContainer, createFragment)
} }
private fun showAuthFragment(encodedCode: String) { private fun showAuthFragment(encodedCode: String) {
@ -75,25 +74,41 @@ class PinActivity : VectorBaseActivity(), ToolbarConfigurable {
.setUseFingerprint(true) .setUseFingerprint(true)
.setTitle("Enter your PIN") .setTitle("Enter your PIN")
.setLeftButton("Forgot PIN?") .setLeftButton("Forgot PIN?")
.setClearCodeOnError(true)
.setMode(PFFLockScreenConfiguration.MODE_AUTH) .setMode(PFFLockScreenConfiguration.MODE_AUTH)
authFragment.setConfiguration(builder.build()) authFragment.setConfiguration(builder.build())
authFragment.setEncodedPinCode(encodedCode) authFragment.setEncodedPinCode(encodedCode)
authFragment.setOnLeftButtonClickListener { authFragment.setOnLeftButtonClickListener {
displayForgotPinWarningDialog()
} }
authFragment.setLoginListener(object : PFLockScreenFragment.OnPFLockScreenLoginListener { authFragment.setLoginListener(object : PFLockScreenFragment.OnPFLockScreenLoginListener {
override fun onPinLoginFailed() { override fun onPinLoginFailed() {
} }
override fun onFingerprintSuccessful() { override fun onFingerprintSuccessful() {
Toast.makeText(this@PinActivity, "Pin successful", Toast.LENGTH_LONG).show()
finish()
} }
override fun onFingerprintLoginFailed() { override fun onFingerprintLoginFailed() {
} }
override fun onCodeInputSuccessful() { override fun onCodeInputSuccessful() {
Toast.makeText(this@PinActivity, "Pin successful", Toast.LENGTH_LONG).show()
finish()
} }
}) })
replaceFragment(R.id.simpleFragmentContainer, authFragment) replaceFragment(R.id.simpleFragmentContainer, authFragment)
} }
private fun displayForgotPinWarningDialog() {
AlertDialog.Builder(this)
.setTitle("Reset pin")
.setMessage("To reset your PIN, you'll need to re-login and create a new one.")
.setPositiveButton("Reset pin") { _, _ ->
showCreateFragment()
}
.setNegativeButton(R.string.cancel, null)
.show()
}
} }

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<stroke
android:color="?riotx_text_secondary"
android:width="1px"/>
<size
android:width="24dp"
android:height="24dp"/>
</shape>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid
android:color="?colorPrimary"/>
<size
android:width="24dp"
android:height="24dp"/>
</shape>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- NOTE: order is important (the first matching state(s) is what is rendered) -->
<item
android:state_checked="true"
android:drawable="@drawable/pin_code_dot_fill"/>
<item
android:drawable="@drawable/pin_code_dot_empty"/>
</selector>

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="PinCodeScreenStyle" >
<item name="android:background">?riotx_background</item>
</style>
<style name="PinCodeKeyButtonStyle">
<item name="android:textColor">?riotx_text_primary</item>
<item name="android:textSize">18sp</item>
<item name="background">@drawable/touch_selector_pf</item>
</style>
<style name="PinCodeDotsViewStyle">
<item name="android:button">@drawable/pin_code_dots</item>
</style>
<style name="PinCodeNextButtonStyle" parent="VectorButtonStylePositive">
<item name="android:textSize">18sp</item>
<item name="android:backgroundTint">@android:color/transparent</item>
<item name="android:layout_marginBottom">24dp</item>
</style>
<style name="PinCodeDeleteButtonStyle">
<item name="android:src">@drawable/delete_lockscreen_pf</item>
<item name="android:tint">?riotx_text_primary</item>
<item name="background">@drawable/touch_selector_pf</item>
</style>
<style name="PinCodeFingerprintButtonStyle">
<item name="android:src">@drawable/fingerprint_lockscreen_pf</item>
<item name="android:tint">?riotx_text_primary</item>
<item name="background">@drawable/touch_selector_pf</item>
</style>
<style name="PinCodeTitleStyle">
<item name="android:textColor">?riotx_text_primary</item>
</style>
<style name="PinCodeHintStyle">
<item name="android:textColor">?riotx_text_primary</item>
</style>
</resources>

View File

@ -222,6 +222,16 @@
<item name="snackbarButtonStyle">@style/VectorSnackBarButton</item> <item name="snackbarButtonStyle">@style/VectorSnackBarButton</item>
<!-- Style to use for message text within a SnackBar in this theme. --> <!-- Style to use for message text within a SnackBar in this theme. -->
<item name="snackbarTextViewStyle">@style/VectorSnackBarText</item> <item name="snackbarTextViewStyle">@style/VectorSnackBarText</item>
<item name="pf_lock_screen">@style/PinCodeScreenStyle</item>
<item name="pf_key_button">@style/PinCodeKeyButtonStyle</item>
<item name="pf_title">@style/PinCodeTitleStyle</item>
<item name="pf_hint">@style/PinCodeHintStyle</item>
<item name="pf_code_view">@style/PinCodeDotsViewStyle</item>
<item name="pf_delete_button">@style/PinCodeDeleteButtonStyle</item>
<item name="pf_fingerprint_button">@style/PinCodeFingerprintButtonStyle</item>
<item name="pf_next">@style/PinCodeNextButtonStyle</item>
</style> </style>
<style name="AppTheme.Dark" parent="AppTheme.Base.Dark" /> <style name="AppTheme.Dark" parent="AppTheme.Base.Dark" />

View File

@ -222,6 +222,16 @@
<item name="snackbarButtonStyle">@style/VectorSnackBarButton</item> <item name="snackbarButtonStyle">@style/VectorSnackBarButton</item>
<!-- Style to use for message text within a SnackBar in this theme. --> <!-- Style to use for message text within a SnackBar in this theme. -->
<item name="snackbarTextViewStyle">@style/VectorSnackBarText</item> <item name="snackbarTextViewStyle">@style/VectorSnackBarText</item>
<item name="pf_lock_screen">@style/PinCodeScreenStyle</item>
<item name="pf_key_button">@style/PinCodeKeyButtonStyle</item>
<item name="pf_title">@style/PinCodeTitleStyle</item>
<item name="pf_hint">@style/PinCodeHintStyle</item>
<item name="pf_code_view">@style/PinCodeDotsViewStyle</item>
<item name="pf_delete_button">@style/PinCodeDeleteButtonStyle</item>
<item name="pf_fingerprint_button">@style/PinCodeFingerprintButtonStyle</item>
<item name="pf_next">@style/PinCodeNextButtonStyle</item>
</style> </style>
<style name="AppTheme.Light" parent="AppTheme.Base.Light" /> <style name="AppTheme.Light" parent="AppTheme.Base.Light" />