/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠZ en Key , Ġ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 . x ci . zen key . sdk . internal Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . content . Activity NotFoundException Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġcom . x ci . zen key . sdk . Authorization Response Ċ import Ġcom . x ci . zen key . sdk . internal . browser . No Browser Exception Ċ import Ġcom . x ci . zen key . sdk . internal . contract .* Ċ import Ġcom . x ci . zen key . sdk . internal . k tx .* Ċ import Ġcom . x ci . zen key . sdk . internal . model . Authorization Request Ċ import Ġcom . x ci . zen key . sdk . internal . model . Authorization State Ċ import Ġcom . x ci . zen key . sdk . internal . model . Authorization State .* Ċ import Ġcom . x ci . zen key . sdk . internal . model . Open Id Configuration Ċ import Ġcom . x ci . zen key . sdk . internal . model . exception . Provider NotFoundException Ċ Ċ internal Ġclass ĠDefault Authorization Service Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdiscovery Service : ĠI Discovery Service , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġintent Factory : ĠAuthorization Intent Factory , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsim DataProvider : ĠSim DataProvider , ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġresponse Factory : ĠAuthorization Response . Factory Ċ ) Ġ: ĠAuthorization Service Ġ{ ĊĊĠĠĠ Ġinternal Ġvar Ġstate : ĠAuthorization State ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġrequest : ĠAuthorization Request ĊĠĠĠ Ġinternal Ġvar Ġm cc M nc : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġsuccess Intent : ĠPending Intent ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġfailure Intent : ĠPending Intent ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġcompletion Intent : ĠPending Intent ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġcancellation Intent : ĠPending Intent ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( activity : ĠActivity , Ġintent : ĠIntent , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ== Ġnull Ġ&& Ġintent . extras Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġshould Ġset Result Ġwith Ġerror . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . finish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġactivity . override Pending Transition ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġintent Factory . bind Web Session ( activity ) ĊĠĠĠĠĠĠĠ Ġextract State ( savedInstanceState Ġ?: Ġintent . extras !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume ( activity : ĠActivity , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck State ( activity , Ġintent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsave State ( out State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon New Intent ( activity : ĠActivity , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġactivity . intent Ġ= Ġintent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy ( activity : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . intent Factory . unbind Web Session ( activity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract State ( savedInstanceState : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Ġ= ĠsavedInstanceState . get Parcelable ( EXTRA _ KEY _ REQUEST ) !! ĊĠĠĠĠĠĠĠ Ġm cc M nc Ġ= ĠsavedInstanceState . getString ( Json . KEY _ M CC _ M NC , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġif ( savedInstanceState . containsKey ( EXTRA _ KEY _ STATE )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠsavedInstanceState . get Serializable ( EXTRA _ KEY _ STATE ) Ġas ĠAuthorization State ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate State ( NONE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuccess Intent Ġ= ĠsavedInstanceState . get Parcelable ( EXTRA _ KEY _ SUCCESS _ INT ENT ) ĊĠĠĠĠĠĠĠ Ġfailure Intent Ġ= ĠsavedInstanceState . get Parcelable ( EXTRA _ KEY _ FAILURE _ INT ENT ) ĊĠĠĠĠĠĠĠ Ġcompletion Intent Ġ= ĠsavedInstanceState . get Parcelable ( EXTRA _ KEY _ COMP LE TION _ INT ENT ) ĊĠĠĠĠĠĠĠ Ġcancellation Intent Ġ= ĠsavedInstanceState . get Parcelable ( EXTRA _ KEY _ C ANCE LL ATION _ INT ENT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġcheck State ( activity : ĠActivity , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Uri Ġ= Ġintent . data ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ== ĠNONE Ġ-> Ġon State None ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Uri Ġ!= Ġnull Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ== ĠDIS COVER _ UI Ġ-> Ġon State Discover UI ( activity , Ġresult Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ== ĠAUTHOR IZE Ġ-> Ġon State Authorize ( activity , Ġresult Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ== ĠDIS COVER _ USER _ NOT _ FOUND Ġ-> Ġon State Discover User NotFound ( activity , Ġresult Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfinish With Authorization Success ( activity , Ġresult Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġset Result Canceled And Finish ( activity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġon State None ( activity : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate M cc M nc ( sim DataProvider . sim Operator ) ĊĠĠĠĠĠĠĠ ĠLogger . get (). begin ( request , Ġm cc M nc ) ĊĠĠĠĠĠĠĠ Ġdiscover Open Id Configuration ( false , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġauthorize ( activity , Ġit , ĠAUTHOR IZE , Ġnull ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Provider NotFound Or Finish ( activity , Ġthrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiscover Ui Endpoint Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate State ( DIS COVER _ UI ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Provider NotFoundError ( activity , Ġdiscover Ui Endpoint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġon State Discover UI ( activity : ĠActivity , Ġresult Uri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( request . isNot Matching ( result Uri . state )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish With State Miss Match Error ( activity ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate M cc M nc ( result Uri . m cc M nc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiscover Open Id Configuration ( false , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġauthorize ( activity , Ġit , ĠAUTHOR IZE , Ġresult Uri . login Hint Token ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Provider NotFound Or Finish ( activity , Ġit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish With Too Many Redirect Error ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġon State Authorize ( activity : ĠActivity , Ġresult Uri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( result Uri . is User NotFoundError ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiscover Open Id Configuration ( Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// With Ġthe Ġprompt = true Ġparameter , Ġthis Ġcase Ġcan 't Ġhappen . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// This Ġparameter Ġforce Ġthe Ġendpoint Ġto Ġreturn Ġa ĠProvider NotFoundException ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish With Unexpected OID C ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Provider NotFound Or Finish ( activity , Ġthrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiscover Ui Endpoint Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate State ( DIS COVER _ USER _ NOT _ FOUND ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Provider NotFoundError ( activity , Ġdiscover Ui Endpoint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish With Authorization Success ( activity , Ġresult Uri ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġon State Discover User NotFound ( activity : ĠActivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Uri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( request . isNot Matching ( result Uri . state )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish With State Miss Match Error ( activity ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate M cc M nc ( result Uri . m cc M nc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiscover Open Id Configuration ( false , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġauthorize ( activity , Ġit , ĠAUTHOR IZE _ USER _ NOT _ FOUND , Ġresult Uri . login Hint Token ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Provider NotFound Or Finish ( activity , Ġit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish With Too Many Redirect Error ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdiscover Open Id Configuration ( prompt : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess : Ġ( Open Id Configuration ) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError : Ġ( Throwable ) Ġ-> ĠUnit ){ ĊĠĠĠĠĠĠĠ Ġthis . discovery Service . discover Configuration ( m cc M nc , Ġprompt , ĠonSuccess , ĠonError ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġauthorize ( activity : ĠActivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration : ĠOpen Id Configuration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate : ĠAuthorization State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin Hint Token : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate M cc M nc If NotNull ( configuration . m cc M nc ) ĊĠĠĠĠĠĠĠ Ġupdate State ( state ) ĊĠĠĠĠĠĠĠ Ġstart Authorize ( activity , Ġconfiguration , Ġlogin Hint Token ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġsave State ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout State . put Serializable ( EXTRA _ KEY _ STATE , Ġstate ) ĊĠĠĠĠĠĠĠ Ġout State . put Parcelable ( EXTRA _ KEY _ REQUEST , Ġrequest ) ĊĠĠĠĠĠĠĠ Ġout State . putString ( Json . KEY _ M CC _ M NC , Ġm cc M nc ) ĊĠĠĠĠĠĠĠ Ġout State . put Parcelable ( EXTRA _ KEY _ SUCCESS _ INT ENT , Ġsuccess Intent ) ĊĠĠĠĠĠĠĠ Ġout State . put Parcelable ( EXTRA _ KEY _ FAILURE _ INT ENT , Ġfailure Intent ) ĊĠĠĠĠĠĠĠ Ġout State . put Parcelable ( EXTRA _ KEY _ COMP LE TION _ INT ENT , Ġcompletion Intent ) ĊĠĠĠĠĠĠĠ Ġout State . put Parcelable ( EXTRA _ KEY _ C ANCE LL ATION _ INT ENT , Ġcancellation Intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġstart Authorize ( activity : ĠActivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Id Configuration : ĠOpen Id Configuration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin Hint Token : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġauth Uri Ġ= Ġrequest . with Login Hint Token ( login Hint Token ). to Authorization Uri ( open Id Configuration . authorization Endpoint ) ĊĠĠĠĠĠĠĠ ĠLogger . get (). request ( auth Uri ) ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent Factory . create Authorize Intent ( auth Uri , Ġopen Id Configuration . packages ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNo Browser Exception ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish With No Browser Available ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġactivity . start Authorization Flow Activity ( intent ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish With No Browser Available ( activity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġstart Discover UI ( activity : ĠActivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiscover UI Endpoint : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent Factory . create Discover UI Intent ( request . to Discover Ui Uri ( discover UI Endpoint )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNo Browser Exception ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish With No Browser Available ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġactivity . start Authorization Flow Activity ( intent ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish With No Browser Available ( activity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġhandle Provider NotFound Or Finish ( activity : ĠActivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable : ĠThrowable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Provider NotFound : Ġ( String ?) Ġ-> ĠUnit ){ ĊĠĠĠĠĠĠĠ ĠLogger . get (). throwable ( throwable ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable Ġis ĠProvider NotFoundException Ġ-> Ġon Provider NotFound . invoke ( throwable . discover Ui Endpoint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable . is Network Failure Ġ-> Ġfinish With Network Failure ( activity , Ġthrowable . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfinish With Throwable Error ( activity , Ġthrowable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġon Provider NotFoundError ( activity : ĠActivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiscover Ui Endpoint : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( discover Ui Endpoint Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Discover UI ( activity , Ġdiscover Ui Endpoint ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish With Missing Discover UI Endpoint ( activity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠEX TRA _ KEY _ REQUEST Ġ= Ġ" EXTRA _ KEY _ REQUEST " ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠEX TRA _ KEY _ STATE Ġ= Ġ" EXTRA _ KEY _ STATE " ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠEX TRA _ KEY _ SUCCESS _ INT ENT Ġ= Ġ" EXTRA _ KEY _ SUCCESS _ INT ENT " ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠEX TRA _ KEY _ FAILURE _ INT ENT Ġ= Ġ" EXTRA _ KEY _ FAILURE _ INT ENT " ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠEX TRA _ KEY _ COMP LE TION _ INT ENT Ġ= Ġ" EXTRA _ KEY _ COMP LE TION _ INT ENT " ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠEX TRA _ KEY _ C ANCE LL ATION _ INT ENT Ġ= Ġ" EXTRA _ KEY _ C ANCE LL ATION _ INT ENT " ĊĠĠĠ Ġ} Ċ } Ċ