/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 6 ĠAnd re ĠT iet z Ċ Ġ* Ċ Ġ* Ġ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 . and ret iet z . ret ro auth Ċ Ċ import Ġandroid . accounts . Account Ċ import Ġandroid . accounts . Account Manager Ċ import Ġandroid . app . Application Ċ import Ġandroid . os . Looper Ċ import Ġjava . util . Locale Ċ import Ġjava . util . concurrent . Callable Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . Future Ċ import Ġjava . util . concurrent . Future Task Ċ Ċ /** Ċ Ġ* ĠThis Ġis Ġthe Ġimplementation Ġof Ġa Ġ[ Token Storage ] Ġin ĠAndroid Ġusing Ġthe ĠAndroid Ġ[ Account Manager ] Ċ Ġ*/ Ċ class ĠAndroid Token Storage Ġconstructor ( ĊĠ Ġprivate Ġval Ġapplication : ĠApplication Ċ ) Ġ: ĠToken Storage < Account , ĠAndroid TokenType , ĠAndroid Token > Ġ{ ĊĊĠ Ġprivate Ġval Ġexecutor Ġby Ġlazy Ġ{ ĠExec utors . new Single Thread Executor () Ġ} ĊĠ Ġprivate Ġval Ġaccount Manager Ġby Ġlazy Ġ{ ĠAccount Manager . get ( application ) Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġprivate Ġfun Ġcreate Data Key ( type : ĠAndroid TokenType , Ġkey : ĠString ) Ġ= ĊĠĠĠĠĠ ĠString . format ( Locale . US , Ġ"% s _% s ", Ġtype . token Type , Ġkey ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠgetToken ( ĊĠĠĠ Ġowner : ĠAccount , ĊĠĠĠ Ġtype : ĠAndroid TokenType , ĊĠĠĠ Ġcallback : ĠCallback < Android Token >? ĊĠ Ġ): ĠFuture < Android Token > Ġ{ ĊĠĠĠ Ġval Ġtask Ġ= ĠGet Token Task ( application , Ġaccount Manager , Ġowner , Ġtype , Ġcallback ) ĊĠĠĠ Ġif Ġ( Looper . my Looper () Ġ== ĠL ooper . get Main Looper ()) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġexecutor . submit ( task ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġfuture Ġ= ĠFuture Task ( task ) ĊĠĠĠ Ġfuture . run () ĊĠĠĠ Ġreturn Ġfuture ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġremove Token ( owner : ĠAccount , Ġtype : ĠAndroid TokenType , Ġtoken : ĠAndroid Token ) Ġ{ ĊĠĠĠ Ġaccount Manager . invalidate AuthToken ( owner . type , Ġtoken . token ) ĊĠĠĠ Ġtype . data Keys ?. forEach Ġ{ Ġaccount Manager . set UserData ( owner , Ġcreate Data Key ( type , Ġit ), Ġnull ) Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġstore Token ( owner : ĠAccount , Ġtype : ĠAndroid TokenType , Ġtoken : ĠAndroid Token ) Ġ{ ĊĠĠĠ Ġaccount Manager . set AuthToken ( owner , Ġtype . token Type , Ġtoken . token ) ĊĠĠĠ Ġif Ġ( type . data Keys Ġ!= Ġnull Ġ&& Ġtoken . data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġtype . data Keys . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! token . data . containsKey ( it )) Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠ ĠString . format ( Locale . US , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġtoken Ġyou Ġwant Ġto Ġstore , Ġneeds Ġto Ġcontain Ġtoken - data Ġwith Ġthe Ġkeys : Ġ% s ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . data Keys . toString ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġaccount Manager . set UserData ( owner , Ġcreate Data Key ( type , Ġit ), Ġtoken . data [ it ]) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġclass ĠGet Token Task ( ĊĠĠĠ Ġapplication : ĠApplication , ĊĠĠĠ Ġprivate Ġval Ġaccount Manager : ĠAccount Manager , ĊĠĠĠ Ġprivate Ġval Ġowner : ĠAccount , ĊĠĠĠ Ġprivate Ġval Ġtype : ĠAndroid TokenType , ĊĠĠĠ Ġprivate Ġval Ġcallback : ĠCallback < Android Token >? ĊĠ Ġ) Ġ: ĠCallable < Android Token > Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġactivity Manager Ġ= ĠActivity Manager [ application ] ĊĊĠĠĠ Ġoverride Ġfun Ġcall (): ĠAndroid Token Ġ{ ĊĠĠĠĠĠ Ġval Ġfuture Ġ= Ġaccount Manager . get AuthToken ( ĊĠĠĠĠĠĠĠ Ġowner , ĊĠĠĠĠĠĠĠ Ġtype . token Type , ĊĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠ Ġactivity Manager . activity , ĊĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠ Ġnull ) ĊĠĠĠĠĠ Ġreturn Ġ( future . result . getString ( Account Manager . KEY _ AUTH TOKEN ) ĊĠĠĠĠĠĠĠ Ġ?: Ġaccount Manager . peek AuthToken ( owner , Ġtype . token Type ) ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠAuthentication Canceled Exception ()). let Ġ{ Ġtoken Ġ-> ĊĠĠĠĠĠĠĠ ĠAndroid Token ( ĊĠĠĠĠĠĠĠĠĠ Ġtoken , ĊĠĠĠĠĠĠĠĠĠ Ġtype . data Keys ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . associate To ( HashMap ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġto Ġaccount Manager . getUser Data ( owner , Ġcreate Data Key ( type , Ġit )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcallback ?. on Result ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ