package Ġcom . da im ler . mb ingress kit . implementation . network . rop c . token exchange . ci am Ċ Ċ import Ġcom . da im ler . mb ingress kit . common . authentication . Authentication Type Ċ import Ġcom . da im ler . mb ingress kit . common . identifier Ċ import Ġcom . da im ler . mb ingress kit . implementation . Auth state Repository Ċ import Ġcom . da im ler . mb ingress kit . implementation . network . rop c . token exchange . Token Exchange Service Ċ import Ġcom . da im ler . mb ingress kit . implementation . network . rop c . token exchange . Token Ex ch anger Ċ import Ġcom . da im ler . mb ingress kit . persistence . User Cache Ċ import Ġcom . da im ler . mb logger kit . MB Logger Kit Ċ import Ġcom . da im ler . mb network kit . task . Future Task Ċ import Ġcom . da im ler . mb network kit . task . Task Object Ċ Ċ internal Ġclass ĠC iam Token Exchange Service ( ĊĠĠĠ Ġprivate Ġval Ġtoken Ex ch anger : ĠToken Ex ch anger , ĊĠĠĠ Ġprivate Ġval Ġauth State Repository : ĠAuth state Repository , ĊĠĠĠ Ġprivate Ġval Ġuser Cache : ĠUser Cache , ĊĠĠĠ Ġprivate Ġval ĠdeviceId : ĠString Ċ ) Ġ: ĠToken Exchange Service Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġis Exchange Token Possible (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġauthentication State Ġ= Ġauth State Repository . read Auth State () ĊĠĠĠĠĠĠĠ Ġreturn Ġauthentication State . is Authorized () Ġ&& Ġauthentication State . getToken (). authentication Type Ġ!= ĠAuthentication Type . CI AM ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexchange Token (): ĠFuture Task < Unit , ĠToken Exchange Service . Error > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexchange Task Ġ= ĠTask Object < Unit , ĠToken Exchange Service . Error >() ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Exchange Token Possible ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMB Logger Kit . d (" Token Exchange Ġfailed : ĠToken Ġin ĠAuth State Repository Ġis Ġalready Ġa ĠCI AM ĠToken ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexchange Task . fail ( Token Exchange Service . Error . Imp ossible ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexchange Task . future Task () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġauth State Ġ= Ġauth State Repository . read Auth State () ĊĠĠĠĠĠĠĠ Ġtoken Ex ch anger . exchange Token ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdeviceId Ġ= ĠdeviceId , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserName Ġ= Ġuser Cache . load User ()?. identifier . or Empty (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken Ġ= Ġauth State . getToken (). accessToken ĊĠĠĠĠĠĠĠ Ġ). onComplete Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMB Logger Kit . d (" Token Exchange Ġsuccessful : Ġupdate Ġtoken Ġin ĠAuth State Repository ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth State . update ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth State Repository . save Auth State ( auth State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexchange Task . complete ( Unit ) ĊĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMB Logger Kit . d (" Token Exchange Ġfailed : Ġnetwork Ġerror Ġ${ it ?. network Error ?. toString () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexchange Task . fail ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken Exchange Service . Error . Network Failure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. network Error ?. toString (). or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġexchange Task . future Task () ĊĠĠĠ Ġ} Ċ } Ċ