package Ġcom . ky ong gi . rand hand _ chat . Activity Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . activity . result . contract . Activity Result Contracts Ċ import Ġcom . google . android . gms . auth . api . signin . Google SignIn Ċ import Ġcom . google . android . gms . auth . api . signin . Google SignIn Account Ċ import Ġcom . google . android . gms . auth . api . signin . Google SignIn Client Ċ import Ġcom . google . android . gms . auth . api . signin . Google SignIn Options Ċ import Ġcom . google . android . gms . common . SignIn Button Ċ import Ġcom . google . android . gms . common . api . ApiException Ċ import Ġcom . google . android . gms . tasks . Task Ċ import Ġcom . ky ong gi . rand hand _ chat . Domain . User . Client Ċ import Ġcom . ky ong gi . rand hand _ chat . R Ċ import Ġcom . ky ong gi . rand hand _ chat . Ret rofit . IR et rofit . IR et rofit User Ċ import Ġcom . ky ong gi . rand hand _ chat . Ret rofit . Service URL Ċ import Ġcom . ky ong gi . rand hand _ chat . Util . App Util Ċ import Ġcom . ky ong gi . rand hand _ chat . databinding . Activity Login Binding Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Callback Ċ import Ġretrofit 2 . Response Ċ import Ġretrofit 2 . Ret rofit ĊĊ Ċ class ĠLogin Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlogin Binding : ĠActivity Login Binding ĊĠĠĠ Ġlateinit Ġvar Ġm Google SignIn Client : ĠGoogle SignIn Client ĊĊĠĠĠ Ġ// ĠRet rofit Ġê´Ģ ëł¨ Ġë³ĢìĪĺ ĠìĥĿìĦ± ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġretrofit : ĠRet rofit ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsupp lement Service : ĠI Ret rofit User ĊĊĠĠĠ Ġ// Ġêµ¬ ê¸ Ģ Ġë¡ľ ê·¸ ìĿ¸ Ġë Ł ° ì²ĺ ĠìĥĿìĦ± ĊĠĠĠ Ġprivate Ġval Ġgoogle Launcher Ġ= Ġregister For Activity Result ( Activity Result Contracts . Start Activity For Result ()) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( result . result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġresult . data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGoogle SignIn . get Signed In Account From Intent ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle SignIn Result ( task ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġlogin Binding Ġ= ĠActivity Login Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( login Binding . root ) ĊĠĠĠĠĠĠĠ Ġ// ĠRet rofit Ġinit ĊĠĠĠĠĠĠĠ Ġinit Ret rofit () ĊĊĠĠĠĠĠĠĠ Ġval Ġg so Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGoogle SignIn Options . Builder ( Google SignIn Options . DEFAULT _ SIGN _ IN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. requestId Token ( getString ( R . string . default _ web _ client _ id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. request Email () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġm Google SignIn Client Ġ= ĠGoogle SignIn . getClient ( this , Ġg so ) ĊĠĠĠĠĠĠĠ Ġ// Ġêµ¬ ê¸ Ģ Ġë²Ħ íĬ ¼ ĠìĻ Ģ ëĵľ íķĺê²Į ĠìĦ¤ìłķ ĊĠĠĠĠĠĠĠ Ġlogin Binding . google Login Button . setSize ( SignIn Button . SIZE _ W IDE ) ĊĊĠĠĠĠĠĠĠ Ġlogin Binding . google Login Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign In () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġë¡ľ ê·¸ ìĿ¸ Ġíİ ĺìĿ´ ì§Ģ ê°Ģ Ġìĭľìŀĳ íķĺ ìĺ Ģ ìĿĦ ë ķĮ ĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġ// Ġê¸° ì ¡´ ìĹĲ Ġë¡ľ ê·¸ ìĿ¸ Ġíĸ Ī ëį ĺ Ġê³Ħ ìłķ ìĿĦ ĠíĻķìĿ¸ íķľëĭ¤ ĊĠĠĠĠĠĠĠ Ġval Ġg sa Ġ= ĠGoogle SignIn . getLast Signed In Account ( this ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġê¸° ì ¡´ ìĹĲ Ġë¡ľ ê·¸ ìĿ¸ ĠìĹ¬ ë¶Ģ ĊĠĠĠĠĠĠĠ Ġif Ġ( g sa Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget UserId Request ( supp lement Service , Ġ" google ", Ġg sa . email !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġ// ĠonStart ĠEnd ĊĊĠĠĠ Ġprivate Ġfun Ġsign In () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsign In Intent Ġ= Ġm Google SignIn Client . signIn Intent ĊĠĠĠĠĠĠĠ Ġgoogle Launcher . launch ( signIn Intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠìĤ¬ìļ©ìŀĲ Ġìłķë³´ Ġê°Ģ ìł¸ ìĺ¤ ê¸° ĊĠĠĠ Ġprivate Ġfun Ġhandle SignIn Result ( completed Task : ĠTask < Google SignIn Account > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccount Ġ= Ġcompleted Task ?. getResult ( ApiException :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSigned Ġin Ġsuccessfully ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġêµ¬ ê¸ Ģ ìĹĲìĦľ Ġê°Ģ ìł¸ ìĺ ¨ Ġìłķë³´ ë¡ľ Ġë° ± ìķ ¤ ëĵľ ĠìĦľë²Ħ ìĹĲ Ġí ļĮ ìĽĲ ê°Ģ ìŀħ ĠìļĶ ì²Ń ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauth Ġ= Ġ" google " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġemail Ġ= Ġaccount ?. email ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgoogle FirstName Ġ= Ġaccount ?. given Name Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgoogle LastName Ġ= Ġaccount ?. family Name Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġgoogle LastName + google FirstName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpicture Ġ= Ġaccount ?. photoUrl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġphoto Ġ: ĠString ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( picture Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġphoto Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġphoto Ġ= Ġpicture . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠClient ( null , Ġauth , Ġemail , Ġname , Ġnull , Ġphoto ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠìĿ´ë © Ķ ìĿ¼ ĠìłĢìŀ¥ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemail ?. let Ġ{ ĠApp Util . prefs . setString (" email ", Ġit ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġë° ± ìķ ¤ ëĵľ ĠìĦľë²Ħ ìĹĲ Ġí ļĮ ìĽĲ ê°Ģ ìŀħ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign In Client ( supp lement Service , Ġclient ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠApiException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġe . toString (), ĠToast . LENGTH _ SHORT ). show () ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġget UserId Request ( supp lement Service : ĠI Ret rofit User , Ġauth : ĠString , Ġemail : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsupp lement Service . request UserId ( auth , Ġemail ). enqueue ( object Ġ: ĠCallback < Client > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall < Client >, Ġresponse : ĠResponse < Client >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġresponse . body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( body Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody . userId ?. let Ġ{ ĠApp Util . prefs . setString (" userId ", Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody . name ?. let Ġ{ ĠApp Util . prefs . setString (" userName ", Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody . picture ?. let Ġ{ ĠApp Util . prefs . setString (" image ", Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody . message ?. let Ġ{ ĠApp Util . prefs . setString (" status ", Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= ĠApp Util . prefs . getString (" userId ", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠClient ( userId , Ġnull , Ġemail , Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin Client ( supp lement Service , Ġclient ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Client >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" ERROR ", Ġ" Login Activity (). getUserId Request ĠìĹĲ ëŁ¬ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsign In Client ( supp lement Service : ĠI Ret rofit User , Ġclient : ĠClient ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsupp lement Service . signup Client ( client ). enqueue ( object Ġ: ĠCallback < Client >{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall < Client >, Ġresponse : ĠResponse < Client >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġresponse . body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody ?. userId ?. let Ġ{ ĠApp Util . prefs . setString (" userId ", Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody ?. name ?. let Ġ{ ĠApp Util . prefs . setString (" userName ", Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody ?. picture ?. let Ġ{ ĠApp Util . prefs . setString (" image ", Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody ?. message ?. let Ġ{ ĠApp Util . prefs . setString (" status ", Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠClient ( body ?. userId , Ġnull , Ġbody ?. email , Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin Client ( supp lement Service , Ġclient ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġemail Ġ= ĠApp Util . prefs . getString (" email ", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠìĿ´ë¯¸ Ġí ļĮ ìĽĲ ìľ¼ë¡ľ Ġëĵ± ë¡Ŀ ëĲĺìĸ´ ĠìŀĪ ìľ¼ ë©´ Ġë¡ľ ê·¸ ìĿ¸ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠìķĦ ìĿ´ ëĶĶ Ġìĸ » ìĿĢ í ĽĦ Ġë¡ľ ê·¸ ìĿ¸ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget UserId Request ( supp lement Service , Ġ" google ", Ġemail ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Client >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġë¡ľ ê·¸ ìĿ¸ ĠíĽĦ Ġí Ĩł ê·¼ Ġ+ ĠID ĠìłĢìŀ¥ íķ ´ë ĳĲ ê³ł ĠHeader Ġê°Ĵ ìľ¼ë¡ľ ĠìĤ¬ìļ© ĊĠĠĠ Ġprivate Ġfun Ġlogin Client ( supp lement Service : ĠI Ret rofit User , Ġclient : ĠClient ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsupp lement Service . request Login ( client ). enqueue ( object Ġ: ĠCallback < Void > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall < Void >, Ġresponse : ĠResponse < Void >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġresponse . headers ()[" token "] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Util . prefs . setString (" token ", Ġ" Bearer Ġ$ token ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( this @ Login Activity , ĠMainActivity :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Void >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ Login Activity , Ġ" ë¡ľ ê·¸ ìĿ¸ ìĹĲ Ġìĭ¤ íĮ ¨ íķĺ ìĺ Ģ ìĬµëĭĪëĭ¤ .", Toast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Ret rofit () Ġ{ ĊĠĠĠĠĠĠĠ Ġretrofit Ġ= ĠService URL . getInstance () ĊĠĠĠĠĠĠĠ Ġsupp lement Service Ġ= Ġretrofit . create ( IR et rofit User :: class . java ) ĊĠĠĠ Ġ} Ċ } Ċ