package Ġru . gr ak hell . phot io . auth . provider Ċ /* Ċ Copyright Ġ 2 0 2 2 ĠD mit ri i Ġ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 . Ċ */ Ċ import Ġandroid . content . Content Provider Ċ import Ġandroid . content . Content Values Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Uri Matcher Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . database . Matrix Cursor Ċ import Ġandroid . net . Uri Ċ import Ġandroid . util . Log Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ import Ġru . gr ak hell . phot io . auth . Auth Provider Factory Ċ import Ġru . gr ak hell . phot io . auth . util . OAuth State Ċ import Ġru . gr ak hell . phot io . core . util . serialize Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . io . String Writer Ċ import Ġjava . lang . NullPointerException Ċ Ċ internal Ġconst Ġval ĠPRO VIDER _ NAME Ġ= Ġ" ru . gr ak hell . auth provider . provider " Ċ internal Ġconst Ġval ĠAUTH _ STATUS _ URI Ġ= Ġ" check " Ċ internal Ġconst Ġval ĠAUTH _ PROFILE _ URI Ġ= Ġ" profile " Ċ internal Ġconst Ġval ĠCODE _ PROFILE Ġ= Ġ 0 Ċ internal Ġconst Ġval ĠCODE _ STATUS Ġ= Ġ 1 Ċ Ċ class ĠAuth Status Provider : ĠContent Provider () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcontext NotNull : ĠContext ĊĠĠĠ Ġprivate Ġvar Ġprovider : ĠAuth Wrapper ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġscope : ĠCor outine Scope Ġ= ĠCor outine Scope ( Dispatch ers . Main ) ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate (): ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġfun ĠgetType ( uri : ĠUri ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Auth Provider (): ĠAuth Wrapper Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! this :: context NotNull . isInitialized ) Ġcontext NotNull Ġ= Ġcontext ?: Ġthrow ĠNullPointerException (" No Ġcontext ") ĊĠĠĠĠĠĠĠ Ġreturn Ġprovider ?: Auth Provider Factory . get Wrapper ( context NotNull ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider ?. listen Profile ()?. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext NotNull . content Resolver . notify Change ( getQuery Uri ( AUTH _ PROFILE _ URI ), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider ?. listen Status ()?. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it Ġis ĠOAuth State . Error ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerr Ġ= ĠString Writer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . t . printStackTrace ( PrintWriter ( err )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( Ġthis . toString (), err . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext NotNull . content Resolver . notify Change ( getQuery Uri ( AUTH _ STATUS _ URI ), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġquery ( uri : ĠUri , Ġprojection : ĠArray < out ĠString > ?, Ġselection : ĠString ?, Ġselection Args : ĠArray < out ĠString > ?, Ġsort Order : ĠString ?): ĠCursor ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpr Ġ= Ġget Auth Provider () ĊĠĠĠĠĠĠĠ Ġvar Ġcursor : Cursor ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġwhen ( uri Matcher . match ( uri )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCODE _ PROFILE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġget Cursor ( array Of ( AUTH _ PROFILE ), Ġ 1 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add Row ( array Of ( pr . get Profile ()?. serialize ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCODE _ STATUS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġget Cursor ( array Of ( AUTH _ STATUS ), Ġ 1 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add Row ( array Of ( pr . getStatus (). status . serialize ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcursor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Cursor ( keys : Array < out ĠString > ?, Ġsize : Int ): ĠMatrix Cursor Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMatrix Cursor ( keys , Ġsize ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinsert ( uri : ĠUri , Ġvalues : ĠContent Values ?): ĠUri Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpr Ġ= Ġget Auth Provider () ĊĠĠĠĠĠĠĠ Ġwhen ( uri Matcher . match ( uri )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCODE _ PROFILE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpr . login () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext NotNull . content Resolver . notify Change ( uri , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġuri ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete ( uri : ĠUri , Ġselection : ĠString ?, Ġselection Args : ĠArray < out ĠString >? ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpr Ġ= Ġget Auth Provider () ĊĠĠĠĠĠĠĠ Ġwhen ( uri Matcher . match ( uri )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCODE _ PROFILE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpr . logout () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext NotNull . content Resolver . notify Change ( uri , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate ( uri : ĠUri , Ġvalues : ĠContent Values ?, Ġselection : ĠString ?, Ġselection Args : ĠArray < out ĠString >? ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġcontent Ġ= Ġ" content ://" ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġuri Matcher Ġ= ĠUri Matcher ( Uri Matcher . NO _ MATCH ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd URI ( PROVIDER _ NAME , Ġ"/ $ AUTH _ PROFILE _ URI ", ĠCODE _ PROFILE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd URI ( PROVIDER _ NAME , Ġ"/ $ AUTH _ STATUS _ URI ", ĠCODE _ STATUS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġget Query Uri ( type : String ): Uri Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠUri . parse ("$ content ${ PROVIDER _ NAME }/${ type }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ }