add the actual fingerprint check
This commit is contained in:
parent
65abda8f20
commit
705812c8bf
9 changed files with 92 additions and 40 deletions
|
@ -2,6 +2,7 @@ package com.simplemobiletools.commons.adapters
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.support.v4.view.PagerAdapter
|
import android.support.v4.view.PagerAdapter
|
||||||
|
import android.util.SparseArray
|
||||||
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,15 +12,18 @@ import com.simplemobiletools.commons.interfaces.HashListener
|
||||||
import com.simplemobiletools.commons.interfaces.SecurityTab
|
import com.simplemobiletools.commons.interfaces.SecurityTab
|
||||||
|
|
||||||
class PasswordTypesAdapter(val context: Context, val requiredHash: String, val hashListener: HashListener) : PagerAdapter() {
|
class PasswordTypesAdapter(val context: Context, val requiredHash: String, val hashListener: HashListener) : PagerAdapter() {
|
||||||
|
private val tabs = SparseArray<SecurityTab>()
|
||||||
|
|
||||||
override fun instantiateItem(container: ViewGroup, position: Int): Any {
|
override fun instantiateItem(container: ViewGroup, position: Int): Any {
|
||||||
val view = LayoutInflater.from(context).inflate(layoutSelection(position), container, false)
|
val view = LayoutInflater.from(context).inflate(layoutSelection(position), container, false)
|
||||||
container.addView(view)
|
container.addView(view)
|
||||||
|
tabs.put(position, view as SecurityTab)
|
||||||
(view as SecurityTab).initTab(requiredHash, hashListener)
|
(view as SecurityTab).initTab(requiredHash, hashListener)
|
||||||
return view
|
return view
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun destroyItem(container: ViewGroup, position: Int, item: Any) {
|
override fun destroyItem(container: ViewGroup, position: Int, item: Any) {
|
||||||
|
tabs.remove(position)
|
||||||
container.removeView(item as View)
|
container.removeView(item as View)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,4 +37,8 @@ class PasswordTypesAdapter(val context: Context, val requiredHash: String, val h
|
||||||
2 -> R.layout.tab_fingerprint
|
2 -> R.layout.tab_fingerprint
|
||||||
else -> throw RuntimeException("Only 3 tabs allowed")
|
else -> throw RuntimeException("Only 3 tabs allowed")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun isTabVisible(position: Int, isVisible: Boolean) {
|
||||||
|
tabs[position]?.visibilityChanged(isVisible)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import android.support.design.widget.TabLayout
|
||||||
import android.support.v4.view.ViewPager
|
import android.support.v4.view.ViewPager
|
||||||
import android.support.v7.app.AlertDialog
|
import android.support.v7.app.AlertDialog
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
|
import android.view.ViewTreeObserver
|
||||||
import com.simplemobiletools.commons.R
|
import com.simplemobiletools.commons.R
|
||||||
import com.simplemobiletools.commons.activities.BaseSimpleActivity
|
import com.simplemobiletools.commons.activities.BaseSimpleActivity
|
||||||
import com.simplemobiletools.commons.adapters.PasswordTypesAdapter
|
import com.simplemobiletools.commons.adapters.PasswordTypesAdapter
|
||||||
|
@ -22,12 +23,15 @@ import kotlinx.android.synthetic.main.dialog_security.view.*
|
||||||
class SecurityDialog(val activity: BaseSimpleActivity, val requiredHash: String, val showTabIndex: Int, val callback: (hash: String, type: Int) -> Unit) : HashListener {
|
class SecurityDialog(val activity: BaseSimpleActivity, val requiredHash: String, val showTabIndex: Int, val callback: (hash: String, type: Int) -> Unit) : HashListener {
|
||||||
var dialog: AlertDialog? = null
|
var dialog: AlertDialog? = null
|
||||||
val view = LayoutInflater.from(activity).inflate(R.layout.dialog_security, null)
|
val view = LayoutInflater.from(activity).inflate(R.layout.dialog_security, null)
|
||||||
|
lateinit var tabsAdapter: PasswordTypesAdapter
|
||||||
|
lateinit var viewPager: MyDialogViewPager
|
||||||
|
|
||||||
init {
|
init {
|
||||||
view.apply {
|
view.apply {
|
||||||
val viewPager = findViewById(R.id.dialog_tab_view_pager) as MyDialogViewPager
|
viewPager = findViewById(R.id.dialog_tab_view_pager) as MyDialogViewPager
|
||||||
viewPager.offscreenPageLimit = 2
|
viewPager.offscreenPageLimit = 2
|
||||||
viewPager.adapter = PasswordTypesAdapter(context, requiredHash, this@SecurityDialog)
|
tabsAdapter = PasswordTypesAdapter(context, requiredHash, this@SecurityDialog)
|
||||||
|
viewPager.adapter = tabsAdapter
|
||||||
viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
|
viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
|
||||||
override fun onPageScrollStateChanged(state: Int) {
|
override fun onPageScrollStateChanged(state: Int) {
|
||||||
}
|
}
|
||||||
|
@ -40,6 +44,13 @@ class SecurityDialog(val activity: BaseSimpleActivity, val requiredHash: String,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
viewPager.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
|
||||||
|
override fun onGlobalLayout() {
|
||||||
|
viewPager.viewTreeObserver.removeOnGlobalLayoutListener(this)
|
||||||
|
updateTabVisibility()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
if (showTabIndex == SHOW_ALL_TABS) {
|
if (showTabIndex == SHOW_ALL_TABS) {
|
||||||
val textColor = context.baseConfig.textColor
|
val textColor = context.baseConfig.textColor
|
||||||
|
|
||||||
|
@ -61,6 +72,8 @@ class SecurityDialog(val activity: BaseSimpleActivity, val requiredHash: String,
|
||||||
tab.text.toString().equals(resources.getString(R.string.pin), true) -> viewPager.currentItem = PROTECTION_PIN
|
tab.text.toString().equals(resources.getString(R.string.pin), true) -> viewPager.currentItem = PROTECTION_PIN
|
||||||
else -> viewPager.currentItem = PROTECTION_FINGERPRINT
|
else -> viewPager.currentItem = PROTECTION_FINGERPRINT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateTabVisibility()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
@ -81,4 +94,10 @@ class SecurityDialog(val activity: BaseSimpleActivity, val requiredHash: String,
|
||||||
callback(hash, type)
|
callback(hash, type)
|
||||||
dialog!!.dismiss()
|
dialog!!.dismiss()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun updateTabVisibility() {
|
||||||
|
for (i in 0..2) {
|
||||||
|
tabsAdapter.isTabVisible(i, viewPager.currentItem == i)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,3 +60,4 @@ val PROTECTION_FINGERPRINT = 2
|
||||||
val SHOW_ALL_TABS = -1
|
val SHOW_ALL_TABS = -1
|
||||||
val SHOW_PATTERN = 0
|
val SHOW_PATTERN = 0
|
||||||
val SHOW_PIN = 1
|
val SHOW_PIN = 1
|
||||||
|
val SHOW_FINGERPRINT = 2
|
||||||
|
|
|
@ -2,4 +2,6 @@ package com.simplemobiletools.commons.interfaces
|
||||||
|
|
||||||
interface SecurityTab {
|
interface SecurityTab {
|
||||||
fun initTab(requiredHash: String, listener: HashListener)
|
fun initTab(requiredHash: String, listener: HashListener)
|
||||||
|
|
||||||
|
fun visibilityChanged(isVisible: Boolean)
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,35 +10,38 @@ import com.github.ajalt.reprint.core.AuthenticationListener
|
||||||
import com.github.ajalt.reprint.core.Reprint
|
import com.github.ajalt.reprint.core.Reprint
|
||||||
import com.simplemobiletools.commons.extensions.baseConfig
|
import com.simplemobiletools.commons.extensions.baseConfig
|
||||||
import com.simplemobiletools.commons.extensions.updateTextColors
|
import com.simplemobiletools.commons.extensions.updateTextColors
|
||||||
|
import com.simplemobiletools.commons.helpers.PROTECTION_FINGERPRINT
|
||||||
import com.simplemobiletools.commons.interfaces.HashListener
|
import com.simplemobiletools.commons.interfaces.HashListener
|
||||||
import com.simplemobiletools.commons.interfaces.SecurityTab
|
import com.simplemobiletools.commons.interfaces.SecurityTab
|
||||||
import kotlinx.android.synthetic.main.tab_fingerprint.view.*
|
import kotlinx.android.synthetic.main.tab_fingerprint.view.*
|
||||||
|
|
||||||
class FingerprintTab(context: Context, attrs: AttributeSet) : RelativeLayout(context, attrs), SecurityTab {
|
class FingerprintTab(context: Context, attrs: AttributeSet) : RelativeLayout(context, attrs), SecurityTab {
|
||||||
private var hash = ""
|
|
||||||
private var requiredHash = ""
|
|
||||||
lateinit var hashListener: HashListener
|
lateinit var hashListener: HashListener
|
||||||
|
|
||||||
override fun onFinishInflate() {
|
override fun onFinishInflate() {
|
||||||
super.onFinishInflate()
|
super.onFinishInflate()
|
||||||
val textColor = context.baseConfig.textColor
|
val textColor = context.baseConfig.textColor
|
||||||
context.updateTextColors(fingerprint_lock_holder)
|
context.updateTextColors(fingerprint_lock_holder)
|
||||||
finterprint_image.colorFilter = PorterDuffColorFilter(textColor, PorterDuff.Mode.SRC_IN)
|
fingerprint_image.colorFilter = PorterDuffColorFilter(textColor, PorterDuff.Mode.SRC_IN)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun initTab(requiredHash: String, listener: HashListener) {
|
||||||
|
hashListener = listener
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visibilityChanged(isVisible: Boolean) {
|
||||||
|
if (isVisible) {
|
||||||
Reprint.authenticate(object : AuthenticationListener {
|
Reprint.authenticate(object : AuthenticationListener {
|
||||||
override fun onSuccess(moduleTag: Int) {
|
override fun onSuccess(moduleTag: Int) {
|
||||||
|
hashListener.receivedHash("", PROTECTION_FINGERPRINT)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onFailure(failureReason: AuthenticationFailureReason, fatal: Boolean, errorMessage: CharSequence?, moduleTag: Int, errorCode: Int) {
|
override fun onFailure(failureReason: AuthenticationFailureReason, fatal: Boolean, errorMessage: CharSequence?, moduleTag: Int, errorCode: Int) {
|
||||||
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
} else {
|
||||||
|
Reprint.cancelAuthentication()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun initTab(requiredHash: String, listener: HashListener) {
|
|
||||||
this.requiredHash = requiredHash
|
|
||||||
hash = requiredHash
|
|
||||||
hashListener = listener
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,11 +32,9 @@ class PatternTab(context: Context, attrs: AttributeSet) : RelativeLayout(context
|
||||||
receivedHash(PatternLockUtils.patternToSha1(pattern_lock_view, pattern))
|
receivedHash(PatternLockUtils.patternToSha1(pattern_lock_view, pattern))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCleared() {
|
override fun onCleared() {}
|
||||||
}
|
|
||||||
|
|
||||||
override fun onStarted() {
|
override fun onStarted() {}
|
||||||
}
|
|
||||||
|
|
||||||
override fun onProgress(progressPattern: MutableList<PatternLockView.Dot>?) {
|
override fun onProgress(progressPattern: MutableList<PatternLockView.Dot>?) {
|
||||||
}
|
}
|
||||||
|
@ -50,16 +48,19 @@ class PatternTab(context: Context, attrs: AttributeSet) : RelativeLayout(context
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun receivedHash(newHash: String) {
|
private fun receivedHash(newHash: String) {
|
||||||
if (hash.isEmpty()) {
|
when {
|
||||||
|
hash.isEmpty() -> {
|
||||||
hash = newHash
|
hash = newHash
|
||||||
pattern_lock_view.clearPattern()
|
pattern_lock_view.clearPattern()
|
||||||
pattern_lock_title.setText(R.string.repeat_pattern)
|
pattern_lock_title.setText(R.string.repeat_pattern)
|
||||||
} else if (hash == newHash) {
|
}
|
||||||
|
hash == newHash -> {
|
||||||
pattern_lock_view.setViewMode(PatternLockView.PatternViewMode.CORRECT)
|
pattern_lock_view.setViewMode(PatternLockView.PatternViewMode.CORRECT)
|
||||||
Handler().postDelayed({
|
Handler().postDelayed({
|
||||||
hashListener.receivedHash(hash, PROTECTION_PATTERN)
|
hashListener.receivedHash(hash, PROTECTION_PATTERN)
|
||||||
}, 300)
|
}, 300)
|
||||||
} else {
|
}
|
||||||
|
else -> {
|
||||||
pattern_lock_view.setViewMode(PatternLockView.PatternViewMode.WRONG)
|
pattern_lock_view.setViewMode(PatternLockView.PatternViewMode.WRONG)
|
||||||
context.toast(R.string.wrong_pattern)
|
context.toast(R.string.wrong_pattern)
|
||||||
Handler().postDelayed({
|
Handler().postDelayed({
|
||||||
|
@ -71,4 +72,7 @@ class PatternTab(context: Context, attrs: AttributeSet) : RelativeLayout(context
|
||||||
}, 1000)
|
}, 1000)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visibilityChanged(isVisible: Boolean) {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,4 +97,6 @@ class PinTab(context: Context, attrs: AttributeSet) : RelativeLayout(context, at
|
||||||
val bigInteger = BigInteger(1, digest)
|
val bigInteger = BigInteger(1, digest)
|
||||||
return String.format(Locale.getDefault(), "%0${digest.size * 2}x", bigInteger).toLowerCase()
|
return String.format(Locale.getDefault(), "%0${digest.size * 2}x", bigInteger).toLowerCase()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visibilityChanged(isVisible: Boolean) {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
android:text="@string/add_fingerprint"/>
|
android:text="@string/add_fingerprint"/>
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/finterprint_image"
|
android:id="@+id/fingerprint_image"
|
||||||
android:layout_width="@dimen/fingerprint_icon_size"
|
android:layout_width="@dimen/fingerprint_icon_size"
|
||||||
android:layout_height="@dimen/fingerprint_icon_size"
|
android:layout_height="@dimen/fingerprint_icon_size"
|
||||||
android:layout_below="@+id/fingerprint_lock_title"
|
android:layout_below="@+id/fingerprint_lock_title"
|
||||||
|
@ -21,4 +21,16 @@
|
||||||
android:layout_marginTop="@dimen/activity_margin"
|
android:layout_marginTop="@dimen/activity_margin"
|
||||||
android:src="@drawable/ic_fingerprint"/>
|
android:src="@drawable/ic_fingerprint"/>
|
||||||
|
|
||||||
|
<com.simplemobiletools.commons.views.MyTextView
|
||||||
|
android:id="@+id/fingerprint_label"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@+id/fingerprint_image"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:layout_marginLeft="@dimen/activity_margin"
|
||||||
|
android:layout_marginRight="@dimen/activity_margin"
|
||||||
|
android:gravity="center"
|
||||||
|
android:padding="@dimen/activity_margin"
|
||||||
|
android:text="@string/place_finger"/>
|
||||||
|
|
||||||
</com.simplemobiletools.commons.views.FingerprintTab>
|
</com.simplemobiletools.commons.views.FingerprintTab>
|
||||||
|
|
|
@ -167,6 +167,7 @@
|
||||||
<string name="repeat_pattern">Repeat pattern</string>
|
<string name="repeat_pattern">Repeat pattern</string>
|
||||||
<string name="fingerprint">Fingerprint</string>
|
<string name="fingerprint">Fingerprint</string>
|
||||||
<string name="add_fingerprint">Add fingerprint</string>
|
<string name="add_fingerprint">Add fingerprint</string>
|
||||||
|
<string name="place_finger">Please place your finger on the fingerprint sensor</string>
|
||||||
<string name="protection_setup_successfully">Password setup successfully. Please reinstall the app in case you forget it.</string>
|
<string name="protection_setup_successfully">Password setup successfully. Please reinstall the app in case you forget it.</string>
|
||||||
|
|
||||||
<!-- Times -->
|
<!-- Times -->
|
||||||
|
|
Loading…
Reference in a new issue