Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Best of sign in experience @ Droidcon Lisbon
Search
Dmytro Khmelenko
September 10, 2019
Technology
130
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Best of sign in experience @ Droidcon Lisbon
Dmytro Khmelenko
September 10, 2019
More Decks by Dmytro Khmelenko
See All by Dmytro Khmelenko
Securing High-Risk Django Applications: Lessons from the Payment Domain
dkhmelenko
0
38
Securing Python Web Applications
dkhmelenko
0
40
Best of login experience
dkhmelenko
0
120
Red or Green? Let us test
dkhmelenko
0
50
A journey to smaller APK size
dkhmelenko
1
130
A journey to smaller apk size
dkhmelenko
0
75
How Git helps us with localization
dkhmelenko
0
110
Dagger.Android module
dkhmelenko
0
77
MVVM vs. MVP
dkhmelenko
0
58
Other Decks in Technology
See All in Technology
打造你的 AI 工作流:Agent Skill + MCP 實戰工作坊
appleboy
0
160
徹底討論!ECS vs EKS!
daitak
3
1.8k
作る力から、見極める力へ — AI時代に広がるエンジニアの価値と役割
rince
0
360
Microsoft のサポートとフィードバック総まとめ
murachiakira
PRO
0
120
AI-DLCを “そのまま導入しなかった”話 ~組織に合わせてアジャストした 私たちの実践共有~
hiroramos4
PRO
1
440
脱SaaS!FDEを支えるプロビジョニングと分離設計
knih
0
300
テスト設計の本質を改めて考えてみる~生成AIを活用する時代だからこそ、作ったテストの説明性を高めよう~
yamasaki696
1
140
本当の”仕事”を手放せる未来が見えた
mu7889yoon
0
190
Comment regagner la souveraineté de vos données tout en étant payé grâce à Nostr !
rlifchitz
0
220
現場のトークンマネジメント
dak2
1
200
Lightning近況報告
kozy4324
0
230
2026 AI Memory Architecture
nagatsu
0
560
Featured
See All Featured
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.6k
Automating Front-end Workflow
addyosmani
1370
210k
Paper Plane (Part 1)
katiecoart
PRO
0
9.3k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
Abbi's Birthday
coloredviolet
3
8.3k
A better future with KSS
kneath
240
18k
AI: The stuff that nobody shows you
jnunemaker
PRO
8
740
The agentic SEO stack - context over prompts
schlessera
0
830
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
How to Talk to Developers About Accessibility
jct
2
260
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
1.8k
Transcript
Best of sign in experience Dmytro Khmelenko Software Engineer @
Freeletics
How often did you have to do login in apps?
!2
!3
!4
!5
!6
!7
!8
!9
!10
Why? • Privacy • Personalised content
Solutions
Log in with Facebook 2.3 billion monthly active users on
Facebook
Log in with Google
None
Distribution (Android)
Distribution (iOS)
oAuth
oAuth
Solution
Firebase Has sign in pre-built UI
Firebase https://github.com/firebase/FirebaseUI-Android
Firebase Has sign in pre-built UI Supports multiple providers
Firebase
Firebase Has sign in pre-built UI Supports multiple providers Has
account management
Firebase
Firebase Has sign in pre-built UI Supports multiple providers Has
account management Anonymous access & account linking
Firebase Has sign in pre-built UI Supports multiple providers Has
account management Anonymous access & account linking Full email sign up support
Firebase
Firebase: Good to know •Usage limits •Extending with Cloud Functions
•Accounts import/export
Classic Email log in
What’s wrong You have to type You need to remember
The password has to contain at least N characters. At least one character must be a number or a special character.
Autofill framework https://developer.android.com/guide/topics/text/autofill <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:autofillHints="password" />
None
SmartLock for Passwords https://developers.google.com/identity/smartlock-passwords/android/
SmartLock for Passwords • Increase in conversion rate • Significant
drop in register and sign in failures https://developers.google.com/identity/smartlock-passwords/case-studies
How to Auth.CredentialsApi.save(mCredentialsClient, credential).setResultCallback( new ResultCallback() { @Override public void
onResult(Status status) { if (status.isSuccess()) { // Credentials were saved } else { if (status.hasResolution()) { try { status.startResolutionForResult(this, RC_SAVE); } catch (IntentSender.SendIntentException e) { // Could not resolve the request } } } } });
RxSmartLock https://github.com/freeletics/RxSmartLock • Saving RxGoogleSmartLockManager.storeCredentials(context, credentials).subscribe()
None
RxSmartLock https://github.com/freeletics/RxSmartLock • Saving RxGoogleSmartLockManager.storeCredentials(context, credentials).subscribe() • Restoring RxGoogleSmartLockManager.retrieveCredentials(context).subscribe()
None
RxSmartLock https://github.com/freeletics/RxSmartLock implementation 'com.freeletics.rxsmartlock:rxsmartlock:1.0.2'
Fingerprint API • Secure • Fast • Easy
Fingerprint API: requirements • From API 26 • Fingerprint sensor
• Enabled Lock screen • Registered fingerprints • Grant permissions
Fingerprint API: with prompt val callback = object: BiometricPrompt.AuthenticationCallback() {
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult?) { super.onAuthenticationSucceeded(result) } override fun onAuthenticationError(errorCode: Int, errString: CharSequence?) { super.onAuthenticationError(errorCode, errString) } } val prompt = BiometricPrompt.Builder(context) .setTitle(“Login") .setDescription("Use fingerprint to login") .setNegativeButton("Cancel", { }, { dialog, i -> }) .build() prompt.authenticate(CancellationSignal(), mainExecutor, callback) https://android-developers.googleblog.com/2018/06/better-biometrics-in-android-p.html API 28
Fingerprint API: with prompt val callback = object: BiometricPrompt.AuthenticationCallback() {
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult?) { super.onAuthenticationSucceeded(result) } override fun onAuthenticationError(errorCode: Int, errString: CharSequence?) { super.onAuthenticationError(errorCode, errString) } } val prompt = BiometricPrompt.Builder(context) .setTitle(“Login") .setDescription("Use fingerprint to login") .setNegativeButton("Cancel", { }, { dialog, i -> }) .build() prompt.authenticate(CancellationSignal(), mainExecutor, callback) https://android-developers.googleblog.com/2018/06/better-biometrics-in-android-p.html API 28
API 28
Fingerprint API: how to val callback = object: FingerprintManagerCompat.AuthenticationCallback() {
override fun onAuthenticationError(errMsgId: Int, errString: CharSequence?) { super.onAuthenticationError(errMsgId, errString) } override fun onAuthenticationSucceeded( result: FingerprintManagerCompat.AuthenticationResult?) { super.onAuthenticationSucceeded(result) } } val fingerprintManager = FingerprintManagerCompat.from(context!!) fingerprintManager.authenticate(null, 0, CancellationSignal(), callback, null) https://developer.android.com/reference/android/support/v4/hardware/fingerprint/FingerprintManagerCompat
Fingerprint API: how to val callback = object: FingerprintManagerCompat.AuthenticationCallback() {
override fun onAuthenticationError(errMsgId: Int, errString: CharSequence?) { super.onAuthenticationError(errMsgId, errString) } override fun onAuthenticationSucceeded( result: FingerprintManagerCompat.AuthenticationResult?) { super.onAuthenticationSucceeded(result) } } val fingerprintManager = FingerprintManagerCompat.from(context) fingerprintManager.authenticate(null, 0, CancellationSignal(), callback, null) https://developer.android.com/reference/android/support/v4/hardware/fingerprint/FingerprintManagerCompat
https://github.com/googlesamples/android-FingerprintDialog
Happy users must have you
@dkhmelenko