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
37
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
Claude Codeをどのように キャッチアップしているか
oikon48
13
8.8k
Oracle AI Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
4
3k
MUSUBI 田中裕一『AIと共に行う「しごとのリデザイン」- スモールバックオフィス編』AI Ops Lab #4
musubi
0
300
新しいUbuntu/GNOMEが使いたいからXからWaylandへ移行頑張ってるの巻 2026-06-20
nobutomurata
0
160
技術・能力を向上する原理原則 #きのこセッションa #きのこ2026
bash0c7
0
110
Chainlitで作るお手軽チャットUI
ynt0485
0
290
PostgreSQL 19 新機能概要 OSC Hokkaido 2026
nori_shinoda
0
230
Bucharest Tech Week 2026 - Reinventing testing practices in the AI era
edeandrea
PRO
1
170
【Snowflake Summit 2026 Recap!!】Snowflake Summit Deep Dive: Security & Governance
civitaspo
1
300
Flow 不死:AI 時代 DevOps 的不變本質
cheng_wei_chen
2
480
WebGIS AI Agentの紹介
_shimizu
0
530
AI時代のコスト管理を考えよう〜明日から使える実践AWSノウハウ~
yoshimi0227
0
830
Featured
See All Featured
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.7k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
390
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1k
AI: The stuff that nobody shows you
jnunemaker
PRO
8
730
How to Think Like a Performance Engineer
csswizardry
28
2.7k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Agile that works and the tools we love
rasmusluckow
331
22k
Optimising Largest Contentful Paint
csswizardry
37
3.7k
Making Projects Easy
brettharned
120
6.7k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
400
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.5k
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