diff --git a/build.gradle b/build.gradle index 5593a56f6e..12c5181ea4 100644 --- a/build.gradle +++ b/build.gradle @@ -42,7 +42,7 @@ allprojects { // PhotoView includeGroupByRegex 'com\\.github\\.chrisbanes' // PFLockScreen-Android - includeGroupByRegex 'com\\.github\\.thealeksandr' + includeGroupByRegex 'com\\.github\\.ganfra' } } maven { diff --git a/vector/build.gradle b/vector/build.gradle index 0d654438f5..f60f74629f 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -346,7 +346,7 @@ dependencies { implementation 'me.saket:better-link-movement-method:2.2.0' implementation 'com.google.android:flexbox:1.1.1' 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 implementation 'androidx.browser:browser:1.2.0' diff --git a/vector/src/main/java/im/vector/riotx/features/pin/PinActivity.kt b/vector/src/main/java/im/vector/riotx/features/pin/PinActivity.kt index 1fc1270192..fc0d3b1bcb 100644 --- a/vector/src/main/java/im/vector/riotx/features/pin/PinActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/pin/PinActivity.kt @@ -18,16 +18,16 @@ package im.vector.riotx.features.pin import android.content.Context import android.content.Intent +import android.widget.Toast +import androidx.appcompat.app.AlertDialog import androidx.appcompat.widget.Toolbar import com.beautycoder.pflockscreen.PFFLockScreenConfiguration import com.beautycoder.pflockscreen.fragments.PFLockScreenFragment import com.beautycoder.pflockscreen.fragments.PFLockScreenFragment.OnPFLockScreenCodeCreateListener import im.vector.riotx.R -import im.vector.riotx.core.extensions.addFragment import im.vector.riotx.core.extensions.replaceFragment import im.vector.riotx.core.platform.ToolbarConfigurable import im.vector.riotx.core.platform.VectorBaseActivity -import timber.log.Timber class PinActivity : VectorBaseActivity(), ToolbarConfigurable { @@ -41,9 +41,7 @@ class PinActivity : VectorBaseActivity(), ToolbarConfigurable { override fun getLayoutRes() = R.layout.activity_simple override fun initUiAndData() { - if (isFirstCreation()) { - showCreateFragment() - } + showCreateFragment() } override fun configure(toolbar: Toolbar) { @@ -57,6 +55,7 @@ class PinActivity : VectorBaseActivity(), ToolbarConfigurable { .setTitle("Choose a PIN for security") .setNewCodeValidationTitle("Confirm PIN") .setMode(PFFLockScreenConfiguration.MODE_CREATE) + createFragment.setConfiguration(builder.build()) createFragment.setCodeCreateListener(object : OnPFLockScreenCodeCreateListener { override fun onNewCodeValidationFailed() { @@ -66,7 +65,7 @@ class PinActivity : VectorBaseActivity(), ToolbarConfigurable { showAuthFragment(encodedCode) } }) - addFragment(R.id.simpleFragmentContainer, createFragment) + replaceFragment(R.id.simpleFragmentContainer, createFragment) } private fun showAuthFragment(encodedCode: String) { @@ -75,25 +74,41 @@ class PinActivity : VectorBaseActivity(), ToolbarConfigurable { .setUseFingerprint(true) .setTitle("Enter your PIN") .setLeftButton("Forgot PIN?") + .setClearCodeOnError(true) .setMode(PFFLockScreenConfiguration.MODE_AUTH) authFragment.setConfiguration(builder.build()) authFragment.setEncodedPinCode(encodedCode) authFragment.setOnLeftButtonClickListener { - + displayForgotPinWarningDialog() } authFragment.setLoginListener(object : PFLockScreenFragment.OnPFLockScreenLoginListener { override fun onPinLoginFailed() { } override fun onFingerprintSuccessful() { + Toast.makeText(this@PinActivity, "Pin successful", Toast.LENGTH_LONG).show() + finish() } override fun onFingerprintLoginFailed() { } override fun onCodeInputSuccessful() { + Toast.makeText(this@PinActivity, "Pin successful", Toast.LENGTH_LONG).show() + finish() } }) 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() + } } diff --git a/vector/src/main/res/drawable/pin_code_dot_empty.xml b/vector/src/main/res/drawable/pin_code_dot_empty.xml new file mode 100644 index 0000000000..6ee800a07d --- /dev/null +++ b/vector/src/main/res/drawable/pin_code_dot_empty.xml @@ -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> \ No newline at end of file diff --git a/vector/src/main/res/drawable/pin_code_dot_fill.xml b/vector/src/main/res/drawable/pin_code_dot_fill.xml new file mode 100644 index 0000000000..799ea30174 --- /dev/null +++ b/vector/src/main/res/drawable/pin_code_dot_fill.xml @@ -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> \ No newline at end of file diff --git a/vector/src/main/res/drawable/pin_code_dots.xml b/vector/src/main/res/drawable/pin_code_dots.xml new file mode 100644 index 0000000000..29e445e511 --- /dev/null +++ b/vector/src/main/res/drawable/pin_code_dots.xml @@ -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> \ No newline at end of file diff --git a/vector/src/main/res/values/styles_pin_code.xml b/vector/src/main/res/values/styles_pin_code.xml new file mode 100644 index 0000000000..498b791e05 --- /dev/null +++ b/vector/src/main/res/values/styles_pin_code.xml @@ -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> \ No newline at end of file diff --git a/vector/src/main/res/values/theme_dark.xml b/vector/src/main/res/values/theme_dark.xml index fae33cf6bf..a391e48cfb 100644 --- a/vector/src/main/res/values/theme_dark.xml +++ b/vector/src/main/res/values/theme_dark.xml @@ -222,6 +222,16 @@ <item name="snackbarButtonStyle">@style/VectorSnackBarButton</item> <!-- Style to use for message text within a SnackBar in this theme. --> <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 name="AppTheme.Dark" parent="AppTheme.Base.Dark" /> diff --git a/vector/src/main/res/values/theme_light.xml b/vector/src/main/res/values/theme_light.xml index 28b29094e5..cfd7b7cc81 100644 --- a/vector/src/main/res/values/theme_light.xml +++ b/vector/src/main/res/values/theme_light.xml @@ -222,6 +222,16 @@ <item name="snackbarButtonStyle">@style/VectorSnackBarButton</item> <!-- Style to use for message text within a SnackBar in this theme. --> <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 name="AppTheme.Light" parent="AppTheme.Base.Light" />