package Ġeu . rek isoft . flutter . auto login Ċ Ċ import Ġandroid . app . Activity . RESULT _ OK Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Sender Ċ import Ġandroid . util . Log Ċ import Ġcom . google . android . gms . auth . api . credentials . Credential Ċ import Ġcom . google . android . gms . auth . api . credentials . Credential Request Ċ import Ġcom . google . android . gms . auth . api . credentials . Credentials Ċ import Ġcom . google . android . gms . auth . api . credentials . Credentials Options Ċ import Ġcom . google . android . gms . auth . api . credentials . Identity Providers Ċ import Ġcom . google . android . gms . common . Connection Result Ċ import Ġcom . google . android . gms . common . Google Api Availability Ċ import Ġcom . google . android . gms . common . api . ApiException Ċ import Ġcom . google . android . gms . common . api . Common StatusCode s Ċ import Ġcom . google . android . gms . common . api . Res olvable ApiException Ċ import Ġio . flutter . embedding . engine . plugins . activity . Activity Plugin Binding Ċ import Ġio . flutter . plugin . common . Plugin Registry Ċ Ċ object ĠLogin Helper Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval Ġlogin Request Code Ġ= Ġ 4 8 2 3 2 ĊĠĠĠ Ġprivate Ġconst Ġval Ġsave Request Code Ġ= Ġ 4 8 2 3 3 ĊĠĠĠ Ġinternal Ġconst Ġval Ġdebug Calls Ġ= Ġtrue ĊĊĠĠĠ Ġfun Ġis Platform Supported ( binding : ĠActivity Plugin Binding ) Ġ= ĠGoogle Api Availability (). is Google Play Services Available ( binding . activity ) Ġ== ĠConnection Result . SUCCESS ĊĊĠĠĠ Ġfun Ġload Login Data ( binding : ĠActivity Plugin Binding , Ġcallback : Ġ( username : ĠString ?, Ġpassword : ĠString ?) Ġ-> ĠUnit , Ġerror : Ġ( Exception ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġavailability Ġ= ĠGoogle Api Availability (). is Google Play Services Available ( binding . activity ) ĊĠĠĠĠĠĠĠ Ġif Ġ( availability Ġ== ĠConnection Result . SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠCredential Request . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Account Types ( Identity Providers . GOOGLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Password Login Supported ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCredentials . getClient ( binding . activity ). request ( request ). add On Complete Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusername Ġ= Ġit . result ?. credential ?. id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= Ġit . result ?. credential ?. password ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( username , Ġpassword ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRes olvable ApiException Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġmost Ġlikely Ġthe Ġcase Ġwhere Ġthe Ġuser Ġhas Ġmultiple Ġsaved ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcredentials Ġand Ġneeds Ġto Ġpick Ġone . ĠThis Ġrequires Ġshowing ĠUI Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġresolve Ġthe Ġread Ġrequest . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . add Activity Result Listener ( login Request Code ) Ġ{ Ġ_, Ġdata Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug (" on Activity Result (_, _, $ data )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcredential Ġ= Ġdata ?. get Parcelable Extra < Credential >( Credential . EXTRA _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusername Ġ= Ġcredential ?. id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= Ġcredential ?. password ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug (" username : Ġ$ username , Ġpassword : Ġ(${ if Ġ( password . isNull Or Blank ()) Ġ" not Ġset " Ġelse Ġ" removed "}) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( username , Ġpassword ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . exception Ġas ĠRes olvable ApiException ). start Resolution For Result ( binding . activity , Ġlogin Request Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIntent Sender . Send Intent Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠApiException Ġ-> Ġerror ( Google ApiError (( it . exception Ġas ĠApiException ). statusCode , Ġit . exception )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror ( it . exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ( Google ApiError ( availability )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Login Data ( binding : ĠActivity Plugin Binding , Ġemail : ĠString , Ġpassword : ĠString , Ġresult : Ġ( Boolean ) Ġ-> ĠUnit , Ġerror : Ġ( Exception ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġavailability Ġ= ĠGoogle Api Availability (). is Google Play Services Available ( binding . activity ) ĊĠĠĠĠĠĠĠ Ġif Ġ( availability Ġ== ĠConnection Result . SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcredential : ĠCredential Ġ= ĠCredential . Builder ( email ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Password ( password ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠCredentials Options . Builder (). force Enable Save Dialog (). build () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCredentials . getClient ( binding . activity , Ġoptions ). save ( credential ). add On Complete Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Successful Ġ-> Ġresult ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . exception Ġas ? ĠApiException )?. statusCode Ġ== ĠCommon StatusCode s . C ANCE LED Ġ-> Ġresult ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . exception Ġis ĠRes olvable ApiException Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTry Ġto Ġresolve Ġthe Ġsave Ġrequest . ĠThis Ġwill Ġprompt Ġthe Ġuser Ġif ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġcredential Ġis Ġnew . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug (" Adding Ġlistener Ġfor Ġthe Ġsave Ġrequest ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . add Activity Result Listener ( save Request Code ) Ġ{ ĠresultCode , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ( result Code Ġ== ĠRESULT _ OK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . exception Ġas ĠRes olvable ApiException ). start Resolution For Result ( binding . activity , Ġsave Request Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIntent Sender . Send Intent Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug (" On Ġno , Ġsomething Ġcr ashed . Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror ( it . exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug (" Cannot Ġsave Ġthe Ġlogin Ġdata ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ( Google ApiError ( availability )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdisable Auto Log In ( binding : ĠActivity Plugin Binding , Ġsuccess : Ġ( Boolean ) Ġ-> ĠUnit , Ġerror : Ġ( Exception ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġavailable Ġ= ĠGoogle Api Availability (). is Google Play Services Available ( binding . activity ) Ġ== ĠConnection Result . SUCCESS ĊĠĠĠĠĠĠĠ Ġif Ġ( available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCredentials . getClient ( binding . activity ). disable Auto SignIn () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuccess ( available ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠActivity Plugin Binding . add Activity Result Listener ( request Code Filter : ĠInt , Ġlistener : Ġ( result Code : ĠInt , Ġdata : ĠIntent ?) Ġ-> ĠUnit ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Activity Result Listener ( object Ġ: ĠPlugin Registry . Activity Result Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== Ġrequest Code Filter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ( request Code , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Activity Result Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġclass ĠGoogle ApiError ( val Ġerror : ĠInt , Ġcause : ĠException ? Ġ= Ġnull ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRuntimeException (" Error Ġcode Ġ$ error Ġwhile Ġloading Ġthe Ġlogin Ġdata Ġ(${ cause ?. message Ġ?: Ġ" no Ġdetails Ġgiven "}) ", Ġcause ) Ċ } Ċ Ċ internal Ġinline Ġfun Ġdebug ( msg : ĠString ) Ġ{ ĊĠĠĠ Ġif Ġ( Login Helper . debug Calls ) ĠLog . d (" Auto Login ", Ġmsg ) Ċ } Ċ