package Ġgithub . show ang . flutter app auth wrapper Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . browser . custom tabs . Custom Tabs Intent Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . annotations . SerializedName Ċ import Ġnet . openid . app auth .* Ċ import Ġnet . openid . app auth . browser . Browser Black list Ċ import Ġkotlin . properties . ReadOnly Property Ċ import Ġkotlin . reflect . K Property ĊĊ Ċ class ĠOAuth Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠINPUT _ STRING _ JSON _ AUTH _ CONFIG Ġ= Ġ" 1 1 " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠREQUEST _ AUTH _ CODE Ġ= Ġ 1 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġauth Config Json Ġby Ġstring Extra ( INPUT _ STRING _ JSON _ AUTH _ CONFIG ) ĊĊĠĠĠ Ġprivate Ġval Ġevent Sink Ġget () Ġ= ĠFlutter App Auth Wrapper Plugin . oauth Event Sink ĊĊĠĠĠ Ġprivate Ġvar Ġauth Service : ĠAuthorization Service ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġauth Config Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGson (). fromJson ( auth Config Json , ĠAuth Config :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError (" Illegal Ġargument Ġerror ", Ġ" input Ġjson : Ġ$ auth Config Json ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġval Ġauth Config Ġ= Ġauth Config Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġauth Request Ġ= Ġwith ( Authorization Request . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuthorization Service Configuration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse ( auth Config . endpoint . auth ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse ( auth Config . endpoint . token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauth Config . clientId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauth Config . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse ( auth Config . redirect Url ) ĊĠĠĠĠĠĠĠ Ġ)) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetState ( auth Config . state ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Prompt ( auth Config . prompt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Scopes ( auth Config . scopes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Additional Parameters ( auth Config . custom Parameters ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġauth Service Ġ= ĠAuthorization Service ( this , Ġwith ( App Auth Configuration . Builder ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Browser Matcher ( Browser Black list ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġauth Intent : ĠIntent ? Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth Service ?. get Authorization Request Intent ( auth Request , Ġwith ( Custom Tabs Intent . Builder ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Toolbar Color ( Color . parse Color ( auth Config . color Ġ?: Ġ"# 2 1 9 6 F 3 ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetShow Title ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable Url Bar H iding () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuthorization Management Activity . create Start For Result Intent ( this , Ġauth Request , ĠIntent ( Intent . ACTION _ VIEW ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġauth Request . to Uri () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( auth Intent , ĠREQUEST _ AUTH _ CODE ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġauth Service ?. dispose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ AUTH _ CODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Data Ġ= Ġdata Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError (" Auth Ġcallback Ġnull ", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuthorization Exception . from Intent ( s Data )?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError (" Auth ĠException ", ĠtoJson String ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresp Ġ= ĠAuthorization Response . from Intent ( s Data ) Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError (" Auth Ġresponse Ġnull ", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauth Service ?. perform Token Request ( resp . create Token Exchange Request (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClient Secret Basic ( auth Config ?. client Secret Ġ?: Ġ"")) Ġ{ Ġresponse , Ġex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Sink ?. success ( Gson (). toJson ( map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" access _ token " Ġto ĠaccessToken , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" refresh _ token " Ġto Ġrefresh Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" expires _ at " Ġto ĠaccessToken Expiration Time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĠonError (" Exchange ĠToken ĠFailed ", Ġex ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠonError (" Unknown Ġcallback Ġerror ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun ĠonError ( message : ĠString , Ġdetails : ĠAny ? Ġ= Ġ" No Ġdetails ", Ġcallback : Ġ() Ġ-> ĠUnit Ġ= Ġ{}) Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Sink ?. error (" OAuth Error ", Ġmessage , Ġdetails ) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġcallback () ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ Ċ fun Ġstring Extra ( key : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠReadOnly Property < Activity , ĠString > Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġdata : ĠString ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠActivity , Ġproperty : ĠK Property < *> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Ġ== Ġnull ) Ġdata Ġ= Ġthis Ref . intent . getString Extra ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdata Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ data Ġclass ĠAuth Config ( ĊĠĠĠĠĠĠĠ Ġ@ SerializedName (" endpoint ") Ġval Ġendpoint : ĠAuth Endpoint , ĊĠĠĠĠĠĠĠ Ġ@ SerializedName (" clientId ") Ġval ĠclientId : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ SerializedName (" client Secret ") Ġval Ġclient Secret : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ SerializedName (" redirect Url ") Ġval Ġredirect Url : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ SerializedName (" scopes ") Ġval Ġscopes : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġ@ SerializedName (" state ") Ġval Ġstate : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ SerializedName (" prompt ") Ġval Ġprompt : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ SerializedName (" type ") Ġval Ġtype : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ SerializedName (" custom Parameters ") Ġval Ġcustom Parameters : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠ Ġ@ SerializedName (" color ") Ġval Ġcolor : ĠString ? Ċ ) Ċ Ċ data Ġclass ĠAuth Endpoint ( ĊĠĠĠĠĠĠĠ Ġ@ SerializedName (" auth ") Ġval Ġauth : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ SerializedName (" token ") Ġval Ġtoken : ĠString Ċ )