/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ */ Ċ Ċ package Ġcom . ul . ims . g mdl . view model Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . view . View Ċ import Ġandroidx . databinding . Observable Field Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġcom . ul . ims . g mdl . R Ċ import Ġcom . ul . ims . g mdl . cb or data . security . Co se Sign 1 Ċ import Ġcom . ul . ims . g mdl . cb or data . security . Issuer Name Spaces Ċ import Ġcom . ul . ims . g mdl . cb or data . security . mso . Mobile Security Object Ċ import Ġcom . ul . ims . g mdl . cb or data . model . User Credential Ċ import Ġcom . ul . ims . g mdl . security . issuer data authentication . Issuer Data Authentication Exception Ċ import Ġcom . ul . ims . g mdl . security . issuer data authentication . Issuer Data Authenticator Ċ import Ġcom . ul . ims . g mdl . security . issuer data authentication . Root Certificate Initial iser Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . Single Observer Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġorg . jetbrains . ank o . do Async Ċ import Ġjava . util .* Ċ Ċ class ĠDisplay Credentials ViewModel ( val Ġapp : ĠApplication ) Ġ: ĠAndroid ViewModel ( app ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLOG _ TAG Ġ= Ġ" Display Credentials ViewModel " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġcredential LiveData Ġ= ĠMutable LiveData < User Credential >() ĊĠĠĠ Ġprivate Ġvar Ġerror LiveData Ġ= ĠMutable LiveData < Throwable >() ĊĠĠĠ Ġvar Ġshare Button Visibility Ġ= ĠObservable Field < Int >() ĊĠĠĠ Ġvar Ġcredential Vis ib it ity Ġ= ĠObservable Field < Int >() ĊĠĠĠ Ġvar Ġloading Visibility Ġ= ĠObservable Field < Int >() ĊĠĠĠ Ġvar Ġissuer Auth Img Ġ= ĠObservable Field < Int >() ĊĠĠĠ Ġvar Ġissuer Auth Visibility Ġ= ĠObservable Field < Int >() ĊĊĠĠĠ Ġfun Ġget Credential LiveData (): ĠLive Data < User Credential > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcredential LiveData ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Provision Errors LiveData (): ĠLive Data < Throwable > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġerror LiveData ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġverify Issuer Data Auth entic ity ( issuer Auth Ġ: ĠC ose Sign 1 ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġissuer Name Spaces Ġ: ĠIss uer Name Spaces ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġissuer Auth Visibility . set ( View . IN VISIBLE ) ĊĠĠĠĠĠĠĠ Ġissuer Auth ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġissuer Name Spaces ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Issuer Data Verifier Async ( issuer Auth , Ġissuer Name Spaces ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( Issuer Data Authentication Consumer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprovision Credential ( credential : ĠUser Credential ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġprovision Credential Async ( credential ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( Provision Consumer ( credential ?. let Ġ{ Ġfalse Ġ} Ġ?: run Ġ{ Ġtrue Ġ})) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġverify Issuer Data Verifier Async ( co se Sign 1 Ġ: ĠC ose Sign 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġissuer Name Spaces Ġ: ĠIss uer Name Spaces ) Ġ: ĠSingle < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . create Ġ{ emitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm so Ġ= ĠMobile Security Object . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. decode ( co se Sign 1 . payload Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm so ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Certificate Initial iser Ġ= ĠRoot Certificate Initial iser ( app . application Context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġissuer Data Authenticator Ġ= ĠIss uer Data Authenticator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Certificate Initial iser . root Certificates And Public Keys , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco se Sign 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġissuer Name Spaces , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm so . document Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . on Success ( issuer Data Authenticator . is Data Auth entic ( Date ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex Ġ: ĠIss uer Data Authentication Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . on Success ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( RuntimeException (" MS O ĠObject Ġis ĠNull ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . on Success ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprovision Credential Async ( credential : ĠUser Credential ?): ĠSingle < User Credential > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCredential Ġreceived Ġafter Ġa ĠBLE Ġtransfer . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( credential Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . on Success ( credential ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( RuntimeException (" credential Ġis Ġnull ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠPro vision Consumer ( val Ġshow Share Button Ġ: ĠBoolean ) Ġ: ĊĠĠĠĠĠĠĠ ĠSingle Observer < User Credential > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( t : ĠUser Credential ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading Visibility . set ( View . GONE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcredential Vis ib it ity . set ( View . VISIBLE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Share Button ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshare Button Visibility . set ( View . VISIBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcredential LiveData . post Value ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Subscribe ( d : ĠDis posable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading Visibility . set ( View . VISIBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcredential Vis ib it ity . set ( View . GONE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshare Button Visibility . set ( View . GONE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcredential Vis ib it ity . set ( View . GONE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshare Button Visibility . set ( View . GONE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading Visibility . set ( View . GONE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror LiveData . post Value ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠIss uer Data Authentication Consumer Ġ: ĠSingle Observer < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( t : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( t ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġissuer Auth Img . set ( R . drawable . ic _ baseline _ done ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġissuer Auth Img . set ( R . drawable . ic _ baseline _ error _ outline ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġissuer Auth Visibility . set ( View . VISIBLE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Subscribe ( d : ĠDis posable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġissuer Auth Visibility . set ( View . IN VISIBLE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġissuer Auth Img . set ( R . drawable . ic _ baseline _ error _ outline ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġissuer Auth Visibility . set ( View . VISIBLE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }