package Ġcom . k amer . or ny . data . google Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . Context Ċ import Ġcom . google . api . client . googleapis . extensions . android . gms . auth . Google Account Credential Ċ import Ġcom . google . api . client . util . Exponent ial Back Off Ċ import Ġcom . google . api . services . sheets . v 4 . Sheet s Scopes Ċ import Ġcom . k amer . or ny . data . android . Activity Holder Ċ import Ġcom . k amer . or ny . data . android . Prefs Ċ import Ġcom . k amer . or ny . data . android . Reactive Activities Ċ import Ġcom . k amer . or ny . di . app . Application Scope Ċ import Ġcom . k amer . or ny . utils . has Permission Ċ import Ġcom . t br uy elle . rx permissions 2 . Rx Permissions Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject ĊĊ Ċ @ Application Scope Ċ class ĠGoogle Auth Holder Impl Ġ@ Inject Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġprefs : ĠP refs , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġactivity Holder : ĠActivity Holder , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġreactive Activities : ĠReactive Activities ) ĊĠĠĠ Ġ: ĠGoogle Auth Holder Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSCO PES Ġ= ĠarrayOf ( Sheet s Scopes . SP READ SHE ETS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlogin (): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( prefs . account Name . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComp letable . complete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcheck Permission () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( create Credentials ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġreactive Activities . choose Google Account ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ Ġaccount Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComp letable . from Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . account Name Ġ= Ġaccount Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlogout (): ĠComp letable Ġ= ĠComp letable . from Action Ġ{ ĊĠĠĠĠĠĠĠ Ġprefs . account Name Ġ= Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Active Credentials (): ĠSingle < Google Account Credential > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Auth () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( check Permission ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( create Credentials ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġcredential Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck If Account Exist ( credential ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Single Ġ{ Ġcredential Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Credentials (): ĠSingle < Google Account Credential > Ġ= ĠSingle . from Callable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaccount Credential Ġ= ĠGoogle Account Credential . using OAuth 2 ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĠArrays . asList < String >(* SCOPES )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Back Off ( Exponent ial Back Off ()) ĊĠĠĠĠĠĠĠ Ġaccount Credential . selected AccountName Ġ= Ġprefs . account Name ĊĠĠĠĠĠĠĠ Ġreturn @ from Callable Ġaccount Credential ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Auth (): ĠComp letable Ġ= ĠComp letable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. from Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prefs . account Name . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Not Ġlogged ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. retry When Ġ{ Ġerror Stream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Stream . flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreactive Activities . login (). to Single Default (" "). to Flow able () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck If Account Exist ( credential : ĠGoogle Account Credential ): ĠComp letable Ġ= ĠComp letable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. from Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( context . has Permission ( Manifest . permission . GET _ ACCOUNT S ) Ġ&& Ġcredential . selected AccountName . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . account Name Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Account Ġnot Ġexist ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. retry When Ġ{ Ġerror Stream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Stream . flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreactive Activities . login (). to Single Default (" "). to Flow able () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Permission (): ĠComp letable Ġ= ĠSingle . just (" "). flatMap Comp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= Ġactivity Holder . getActivity () ĊĠĠĠĠĠĠĠ Ġreturn @ flatMap Comp letable Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . has Permission ( Manifest . permission . GET _ ACCOUNT S ) Ġ-> ĠComp letable . complete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity Ġ!= Ġnull Ġ-> ĠObservable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. just ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// create ĠRx Permissions () Ġinstance Ġonly Ġwhen Ġneeded ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĠObservable . just (" "). compose ( Rx Permissions ( activity ). ensure ( Manifest . permission . GET _ ACCOUNT S )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ Ġgranted Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( gr anted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComp letable . complete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComp letable . error ( Security Exception (" Permission Ġdenied ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠComp letable . error ( Exception (" No Ġactivity Ġto Ġcheck Ġpermission ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ }