{"id":347891,"date":"2025-09-08T15:46:50","date_gmt":"2025-09-08T20:46:50","guid":{"rendered":"https:\/\/michigandigitalnews.com\/index.php\/2025\/09\/08\/how-dashlane-brought-credential-manager-to-wear-os-with-only-78-new-lines-of-code\/"},"modified":"2025-09-08T15:46:50","modified_gmt":"2025-09-08T20:46:50","slug":"how-dashlane-brought-credential-manager-to-wear-os-with-only-78-new-lines-of-code","status":"publish","type":"post","link":"https:\/\/michigandigitalnews.com\/index.php\/2025\/09\/08\/how-dashlane-brought-credential-manager-to-wear-os-with-only-78-new-lines-of-code\/","title":{"rendered":"How Dashlane Brought Credential Manager to Wear OS with Only 78 New Lines of Code"},"content":{"rendered":"<p> [ad_1]<br \/>\n<\/p>\n<div>\n<meta content=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEh7PL6eMADSYrcItaaKQcBWyf_PhGAm1IKtZzHh-YFx-juqBqLcw31CrnxLzSjJJvoPeIfQypH-7FLITwQF-rda1KCZtbklHQRIh19RK17005Pzyj5sWuTnGGNRRZJ_DpUg5fVpOb9YCcuZR3b15_DVjcFABr7DR0v-7wwiYCVRBKmstuclRo2ZA2cnO2Y\/s1600\/image4.png\" name=\"twitter:image\"\/><br \/>\n<img decoding=\"async\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEh7PL6eMADSYrcItaaKQcBWyf_PhGAm1IKtZzHh-YFx-juqBqLcw31CrnxLzSjJJvoPeIfQypH-7FLITwQF-rda1KCZtbklHQRIh19RK17005Pzyj5sWuTnGGNRRZJ_DpUg5fVpOb9YCcuZR3b15_DVjcFABr7DR0v-7wwiYCVRBKmstuclRo2ZA2cnO2Y\/s1600\/image4.png\" style=\"display: none;\"\/><\/p>\n<p><em>Posted by John Zoeller &#8211; Developer Relations Engineer, Loyrn Hairston &#8211; Product Marketing Manager, and Jonathan Salamon &#8211; Dashlane Staff Software Engineer<\/em><\/p>\n<p><iframe title=\"Android Developer Story: How Dashlane brought Credential Manager to Wear OS with 92% code reuse\" width=\"1200\" height=\"675\" src=\"https:\/\/www.youtube.com\/embed\/lgo5hRLVUow?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<p><a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.dashlane&amp;hl=en_US\" target=\"_blank\" rel=\"noopener\">Dashlane<\/a> is a password management and provision tool that provides a secure way to manage user credentials, access control, and authentication across multiple systems and applications.<\/p>\n<p>Dashlane has over 18 million users and 20,000 businesses in 180 countries. It\u2019s available on Android, Wear OS, iOS, macOS, Windows, and as a web app with an extension for Chrome, Firefox, Edge, and Safari.<\/p>\n<p>Recently, they expanded their offerings by creating a Wear OS app with a <a href=\"https:\/\/developer.android.com\/identity\/sign-in\/credential-provider\" target=\"_blank\" rel=\"noopener\">Credential Provider<\/a> integration from the <a href=\"https:\/\/developer.android.com\/reference\/androidx\/credentials\/CredentialManager\" target=\"_blank\" rel=\"noopener\">Credential Manager API<\/a>, bringing passkeys to their clients and users on smartwatches.<\/p>\n<h2><span style=\"font-size: x-large;\">Streamlining Authentication on Wear OS<\/span><\/h2>\n<p>Dashlane users have frequently requested a Wear OS solution that provides standalone authentication for their favorite apps. In the past, Wear OS lacked the key APIs necessary for this request, which kept Dashlane from being able to provide the functionality. In their words:<\/p>\n<blockquote><p><center><i>\u201cOur biggest challenge was the lack of a standard credentials API on Wear OS, which meant that it was impossible to bring our core features to this platform.\u201d<\/i><\/center><\/p><\/blockquote>\n<p>This has changed with the introduction of the new <a href=\"https:\/\/android-developers.googleblog.com\/2025\/08\/the-evolution-of-wear-os-authentication.html\" target=\"_blank\" rel=\"noopener\">Credential Manager API on Wear OS<\/a>.<\/p>\n<p><a href=\"https:\/\/developer.android.com\/training\/wearables\/apps\/auth-wear#auth-methods\" target=\"_blank\" rel=\"noopener\">Credential Manager<\/a> provides a simplified, standardized user sign-in experience with built-in authentication options for <a href=\"https:\/\/fidoalliance.org\/passkeys\/\" target=\"_blank\" rel=\"noopener\">passkeys<\/a>, passwords, and federated identities like Sign in with Google. Conveniently, it can be implemented with minimal effort by reusing the same code as the mobile version.<\/p>\n<p>The Dashlane team was thrilled to learn about this, as it meant they could save a lot of time and effort: <em>\u201c[The] CredentialManager API provides the same API on phones and Wear OS; you write the code only once to support multiple form factors.\u201d<\/em><\/p>\n<p><image><\/p>\n<div style=\"text-align: center;\"><img decoding=\"async\" alt=\"Credential selection Screenshot\" border=\"0\" id=\"imgCaption\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhWOOLrEcC8tlzFXYqfYxC8c6AC8y5mIL0FzmFrMwsSaLELQXzJcqJb2tGYBd6cGHvTEipzDSmwrB8viUHfFq-XJT3oT8cqeWk9oBcZYQmgInJCv3Jarbgv2lnYeLXCmm32hcmwQIDUtSbum-YlHPc8LF8V49kPi9tU6ourM2YpMNkXR-tVUwl7fIV49QE\/s1600\/image5.png\" width=\"50%\"\/><\/div>\n<p><imgcaption><center><em>Selecting Dashlane-provided credentials is simple for users<\/em><\/center><\/imgcaption><\/image><\/p>\n<p>After Dashlane had planned out their roadmap, they were able execute their vision for the new app with only a small engineering investment, reusing 92% of the Credential Manager code from their mobile app.  And because the developers built Dashlane\u2019s app UI with <a href=\"https:\/\/developer.android.com\/training\/wearables\/compose?version=3\" target=\"_blank\" rel=\"noopener\">Jetpack Compose for Wear OS<\/a>, 60% of their UI code was also reused.<\/p>\n<p><image><\/p>\n<div style=\"text-align: center;\"><img decoding=\"async\" alt=\"Quote from Sebastien Eggenspieler, Senior engineer at Dashlane\" border=\"0\" id=\"imgCaption\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgiYQiILCL2ajv33zy47x7CA8VYrHflvzrDyDUcdNVOWmmcFR5yYSQnmxaeS9wHDMFEBCBwu30K4KVYm8O2-jQwHVlzT6O2Ox2pZwLPgGLX6eYHL21SCcE1fFQJLiSezZLvRgLVAz7wkD8wUV01SsMisIKhMvKyTJB9IJnKOiL2jGp9GWcWsFtQucPSoM8\/s1600\/image1.png\" width=\"100%\"\/><\/div>\n<p><\/image><\/p>\n<h2><span style=\"font-size: x-large;\">Developing for Wear OS<\/span><\/h2>\n<p>To provide credentials to other apps with Credential Manager, Dashlane needed to <a href=\"https:\/\/developer.android.com\/identity\/sign-in\/credential-provider\" target=\"_blank\" rel=\"noopener\">implement the Credential Provider interface<\/a> on Wear OS. This proved to be a simple exercise in calling their existing mobile code, where Dashlane had already implemented behavior for credential querying and credential selection.<\/p>\n<p>For example, Dashlane was able to reuse their logic to handle client invocations of <a href=\"https:\/\/developer.android.com\/reference\/androidx\/credentials\/CredentialManager#getCredential(android.content.Context,androidx.credentials.PrepareGetCredentialResponse.PendingGetCredentialHandle)\" target=\"_blank\" rel=\"noopener\">CredentialManager.getCredential<\/a>.  When a client invokes this, the Android framework propagates the client\u2019s <span style=\"color: #0d904f ;font-family: courier;\">getCredentialRequest<\/span> to Dashlane\u2019s <a href=\"https:\/\/developer.android.com\/reference\/kotlin\/androidx\/credentials\/provider\/CredentialProviderService#onBeginGetCredentialRequest(androidx.credentials.provider.BeginGetCredentialRequest,android.os.CancellationSignal,android.os.OutcomeReceiver)\" target=\"_blank\" rel=\"noopener\">CredentialProviderService.onBeginGetCredentialRequest<\/a> implementation to retrieve the credentials specified in the request.<\/p>\n<p>Dashlane delegates the logic for <span style=\"color: #0d904f ;font-family: courier;\">onBeginGetCredentialRequest<\/span> to their <a href=\"https:\/\/github.com\/Dashlane\/android-apps\/blob\/018f827f2a01b174ebdb721832e0c8463a02ed22\/dashlane-project\/modules\/features\/credentialmanager\/src\/main\/java\/com\/dashlane\/credentialmanager\/CredentialManagerHandler.kt#L90\" target=\"_blank\" rel=\"noopener\">handleGetCredentials<\/a> function, below, which is shared between their mobile and Wear OS implementations.<\/p>\n<p><!--Kotlin--><\/p>\n<div style=\"background: #f8f8f8; overflow:auto;width:auto;border:0;\">\n<pre style=\"margin: 0; line-height: 125%;\"><span\/><span style=\"color: #3D7B7B; font-style: italic\">\/\/ When a Credential Manager client calls 'getCredential', the Android<\/span>\n<span style=\"color: #3D7B7B; font-style: italic\">\/\/ framework invokes `onBeginGetCredentialRequest`. Dashlane<\/span>\n<span style=\"color: #3D7B7B; font-style: italic\">\/\/ implemented this `handleGetCredentials` function to handle some of<\/span>\n<span style=\"color: #3D7B7B; font-style: italic\">\/\/ the logic needed for `onBeginGetCredentialRequest`<\/span>\n<span style=\"color: #008000; font-weight: bold\">override<\/span><span style=\"color: #BBB\"> <\/span><span style=\"color: #008000; font-weight: bold\">fun<\/span><span style=\"color: #BBB\"> <\/span><span style=\"color: #00F\">handleGetCredentials<\/span>(\n<span style=\"color: #BBB\">    <\/span>context:<span style=\"color: #BBB\"> <\/span>Context,\n<span style=\"color: #BBB\">    <\/span>request:<span style=\"color: #BBB\"> <\/span>BeginGetCredentialRequest):\nList<span style=\"color: #666\">&lt;<\/span>CredentialEntry<span style=\"color: #666\">&gt;<\/span><span style=\"color: #BBB\"> <\/span><span style=\"color: #666\">=<\/span>\n<span style=\"color: #BBB\">  <\/span>request.<span style=\"color: #687822\">beginGetCredentialOptions<\/span>.<span style=\"color: #687822\">flatMap<\/span><span style=\"color: #BBB\"> <\/span>{<span style=\"color: #BBB\"> <\/span>option<span style=\"color: #BBB\"> <\/span><span style=\"color: #666\">-&gt;<\/span>\n<span style=\"color: #BBB\">    <\/span><span style=\"color: #008000; font-weight: bold\">when<\/span><span style=\"color: #BBB\"> <\/span>(option)<span style=\"color: #BBB\"> <\/span>{\n<span style=\"color: #BBB\">      <\/span><span style=\"color: #3D7B7B; font-style: italic\">\/\/ Handle passkey credential<\/span>\n<span style=\"color: #BBB\">      <\/span><span style=\"color: #008000; font-weight: bold\">is<\/span><span style=\"color: #BBB\"> <\/span>BeginGetPublicKeyCredentialOption<span style=\"color: #BBB\"> <\/span><span style=\"color: #666\">-&gt;<\/span><span style=\"color: #BBB\"> <\/span>{\n<span style=\"color: #BBB\">        <\/span><span style=\"color: #008000; font-weight: bold\">val<\/span><span style=\"color: #BBB\"> <\/span><span style=\"color: #19177C\">passkeyRequestOptions<\/span><span style=\"color: #BBB\"> <\/span><span style=\"color: #666\">=<\/span><span style=\"color: #BBB\"> <\/span>Gson().<span style=\"color: #687822\">fromJson<\/span>(\n<span style=\"color: #BBB\">            <\/span>option.<span style=\"color: #687822\">requestJson<\/span>,<span style=\"color: #BBB\"> <\/span>PasskeyRequestOptions<span style=\"color: #666\">::<\/span>class.<span style=\"color: #687822\">java<\/span>)\n\n<span style=\"color: #BBB\">        <\/span>credentialLoader.<span style=\"color: #687822\">loadPasskeyCredentials<\/span>(\n<span style=\"color: #BBB\">          <\/span>passkeyRequestOptions.<span style=\"color: #687822\">rpId<\/span>,\n<span style=\"color: #BBB\">          <\/span>passkeyRequestOptions.<span style=\"color: #687822\">allowCredentials<\/span><span style=\"color: #BBB\"> <\/span><span style=\"color: #666\">?:<\/span><span style=\"color: #BBB\"> <\/span>listOf()\n<span style=\"color: #BBB\">        <\/span>).<span style=\"color: #687822\">map<\/span><span style=\"color: #BBB\"> <\/span>{<span style=\"color: #BBB\"> <\/span>passkey<span style=\"color: #BBB\"> <\/span><span style=\"color: #666\">-&gt;<\/span>\n<span style=\"color: #BBB\">          <\/span><span style=\"color: #008000; font-weight: bold\">val<\/span><span style=\"color: #BBB\"> <\/span><span style=\"color: #19177C\">passkeyDisplayName<\/span><span style=\"color: #BBB\"> <\/span><span style=\"color: #666\">=<\/span><span style=\"color: #BBB\"> <\/span>getSuggestionTitle(passkey,<span style=\"color: #BBB\"> <\/span>context)\n\n<span style=\"color: #BBB\">          <\/span>PublicKeyCredentialEntry.<span style=\"color: #687822\">Builder<\/span>(\n<span style=\"color: #BBB\">            <\/span>context,\n<span style=\"color: #BBB\">            <\/span>passkeyDisplayName,\n<span style=\"color: #BBB\">            <\/span>pendingIntentForGet(context,<span style=\"color: #BBB\"> <\/span>passkey.<span style=\"color: #687822\">id<\/span>),\n<span style=\"color: #BBB\">            <\/span>option\n<span style=\"color: #BBB\">          <\/span>)\n<span style=\"color: #BBB\">          <\/span>.<span style=\"color: #687822\">setLastUsedTime<\/span>(passkey.<span style=\"color: #687822\">locallyViewedDate<\/span>)\n<span style=\"color: #BBB\">          <\/span>.<span style=\"color: #687822\">setIcon<\/span>(buildMicroLogomarkIcon(context<span style=\"color: #BBB\"> <\/span><span style=\"color: #666\">=<\/span><span style=\"color: #BBB\"> <\/span>context))\n<span style=\"color: #BBB\">          <\/span>.<span style=\"color: #687822\">setDisplayName<\/span>(passkeyDisplayName)\n<span style=\"color: #BBB\">          <\/span>.<span style=\"color: #687822\">build<\/span>()\n<span style=\"color: #3D7B7B; font-style: italic\">\/\/ Handle other credential types<\/span>\n<\/pre>\n<\/div>\n<p>Reusing precise logic flows like this made it a breeze for Dashlane to implement their Wear OS app.<\/p>\n<p><em>\u201cThe Credential Manager API is unified across phones and Wear OS, which was a huge advantage. It meant <b>we only had to write our code once<\/b>.\u201d<\/em><\/p>\n<h2><span style=\"font-size: x-large;\">Impact and Improved Growth<\/span><\/h2>\n<p>The team is excited to be among the first credential providers on wearables: <em>\u201cBeing one of the first on Wear OS was a key differentiator for us. It reinforces our brand as an innovator, focusing on the user experience, better meeting and serving our users where they are.\u201d<\/em><\/p>\n<p>As an early adopter of this new technology, Dashlanes Wear OS app has already shown early promise, as described by Dashlane software engineer, Sebastien Eggenspieler: <em>\u201cIn the first 3 months, our Wear OS app organically grew to represent 1% of our active device install base.\u201d<\/em><\/p>\n<p>With their new experience launched, Wear OS apps can now rely on Dashlane as a trusted credential provider for their own Credential Manager integrations, using Dashlane to allow users to log in with a single tap; and users can view details about their credentials right from their wrist.<\/p>\n<p><image><\/p>\n<div style=\"text-align: center;\"><img decoding=\"async\" alt=\"app homescreen screenshot\" border=\"0\" id=\"imgCaption\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgwsCkFimgtmhOvlJDLHxrk9Lm3jieV4VXks_YgfW1RFtiE8zrdLLoZnbF7BEuwW7vM_adw15WnYd0ww87JQ9VDbSZjywaLe6g_86MoTW1sLFo7tFa1mixmI5J5AK6P-ZHklYPnNZpnPmZWFZHUo8bN8ijp7qsevrbil3_ocpFNyvHBdxbbahV9Y9GzdUM\/s1600\/image1.png\" width=\"50%\"\/><\/div>\n<p><imgcaption><center><em>Dashlane\u2019s innovative design helps users manage their credentials<\/em><\/center><\/imgcaption><\/image><\/p>\n<h2><span style=\"font-size: x-large;\">Dashlane\u2019s Recommendations to Wear OS Developers<\/span><\/h2>\n<p>With their implementation complete, the Dashlane team can offer some advice for other developers who are considering the Credential Manager API. Their message is clear: <em>\u201cthe future is passwordless\u2026 and passkeys are leading the way, [so] provide a passkey option.\u201d<\/em><\/p>\n<p>As a true innovator in their field, and the preferred credential provider for so many users, we are thrilled to have Dashlane support Credential Manager. They truly inspired us with their commitment to providing Wear OS users with the best experience possible:<\/p>\n<p><em>\u201cWe hope that in the future every app developer will migrate their existing users to the Credential Manager API.\u201d<\/em><\/p>\n<h2><span style=\"font-size: x-large;\">Get Started with Credential Manager<\/span><\/h2>\n<p>With its elegant simplicity and built-in secure authentication methods, the Credential Manager API provides a simple, straightforward authentication experience for users that changes the game in Wear OS.<\/p>\n<p>Want to find out more about how Dashlane is driving the future of end-user authentication? Check out our <a href=\"http:\/\/youtube.com\/watch?v=lgo5hRLVUow&amp;feature=youtu.be\" target=\"_blank\" rel=\"noopener\">video blog with their team in Paris<\/a>, and read about how they found a <a href=\"http:\/\/youtube.com\/watch?v=lgo5hRLVUow&amp;feature=youtu.be\" target=\"_blank\" rel=\"noopener\">70% in sign-in conversion rates with passkeys<\/a>.<\/p>\n<p>To learn more about how you can implement Credential Manager, read our official <a href=\"https:\/\/developer.android.com\/training\/wearables\/apps\/auth-wear\" target=\"_blank\" rel=\"noopener\">developer<\/a> and <a href=\"https:\/\/developer.android.com\/design\/ui\/wear\/guides\/m2-5\/behaviors-and-patterns\/sign-in\" target=\"_blank\" rel=\"noopener\">UX<\/a> guides, and be sure to check out our brand <a href=\"https:\/\/android-developers.googleblog.com\/2025\/08\/the-evolution-of-wear-os-authentication.html\" target=\"_blank\" rel=\"noopener\">new blog post<\/a> and <a href=\"https:\/\/www.youtube.com\/watch?v=SfkxK-rFeNM\" target=\"_blank\" rel=\"noopener\">video blog<\/a> as part of Wear OS Spotlight week!<\/p>\n<p>We\u2019ve also expanded our existing <a href=\"https:\/\/github.com\/android\/identity-samples\/tree\/credman-compose\/Shrine\/\" target=\"_blank\" rel=\"noopener\">Credential Manager sample<\/a> to support Wear OS, to help guide you along the way, and if you&#8217;d like to provide credentials like Dashlane, you can use our <a href=\"https:\/\/github.com\/android\/identity-samples\/tree\/main\/CredentialProvider\/MyVault\" target=\"_blank\" rel=\"noopener\">Credential Provider sample<\/a>.<\/p>\n<p>Finally, explore how you can start developing additional experiences for Wear OS today with our <a href=\"https:\/\/developer.android.com\/wear\" target=\"_blank\" rel=\"noopener\">documentation<\/a> and <a href=\"https:\/\/github.com\/android\/wear-os-samples\" target=\"_blank\" rel=\"noopener\">samples<\/a>.<\/p>\n<\/div>\n<p>[ad_2]<br \/>\n<br \/><a href=\"http:\/\/android-developers.googleblog.com\/2025\/09\/dashlane-credential-security-wear-os-app.html\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>[ad_1] Posted by John Zoeller &#8211; Developer Relations Engineer, Loyrn Hairston &#8211; Product Marketing Manager, and Jonathan Salamon &#8211; Dashlane Staff Software Engineer Dashlane is<\/p>\n","protected":false},"author":1,"featured_media":347892,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[146],"tags":[],"_links":{"self":[{"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/posts\/347891"}],"collection":[{"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/comments?post=347891"}],"version-history":[{"count":0,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/posts\/347891\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/media\/347892"}],"wp:attachment":[{"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/media?parent=347891"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/categories?post=347891"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/tags?post=347891"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}