/* Ċ Ġ* ĠCopyright Ġ( C ) Ġgu olin , ĠSu zh ou ĠQu xi ang ĠInc . ĠOpen Ġsource Ġcodes Ġfor Ġstudy Ġonly . Ċ Ġ* ĠDo Ġnot Ġuse Ġfor Ġcommercial Ġpurpose . Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ Ċ package Ġcom . qu xi ang gif . opensource Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Count Down Timer Ċ import Ġandroid . support . transition . Fade Ċ import Ġandroid . support . transition . Transition Manager Ċ import Ġandroid . transition . Transition Ċ import Ġandroid . view . View Ċ import Ġcom . qu xi ang gif . common . callback . Simple Transition Listener Ċ import Ġcom . qu xi ang gif . core . extension . log Debug Ċ import Ġcom . qu xi ang gif . core . extension . log Warn Ċ import Ġcom . qu xi ang gif . core . extension . show Toast Ċ import Ġcom . qu xi ang gif . core . util . Android Version Ċ import Ġcom . qu xi ang gif . core . util . Global Util Ċ import Ġcom . qu xi ang gif . event . Finish Activity Event Ċ import Ġcom . qu xi ang gif . login . ui . Login Activity Ċ import Ġcom . qu xi ang gif . network . model . Callback Ċ import Ġcom . qu xi ang gif . network . model . Fetch V Code Ċ import Ġcom . qu xi ang gif . network . model . Phone Login Ċ import Ġcom . qu xi ang gif . network . model . Response Ċ import Ġcom . qu xi ang gif . network . util . Auth Util Ċ import Ġcom . qu xi ang gif . util . Response Handler Ċ import Ġkotlinx . android . synt hetic . main . activity _ login .* Ċ import Ġorg . green robot . event bus . EventBus Ċ import Ġjava . util . regex . Pattern Ċ Ċ /** Ċ Ġ* Ġ å¼ĢæºĲ çīĪ çĻ»å½ķ çķĮéĿ¢ ï¼Į æĶ¯æĮģ æīĭæľº åı· çĻ»å½ķ ãĢĤ å¦Ĥæŀľ çĻ»å½ķ çļĦ è´¦åı· è¿ĺ æ²¡æľī æ³¨åĨĮ ä¼ļ è·³è½¬ åĪ° æ³¨åĨĮ çķĮéĿ¢ ï¼Į å¦Ĥæŀľ å·²ç»ı æ³¨åĨĮ è¿ĩ äºĨ åĪĻ ä¼ļ çĽ´æİ¥ è·³è½¬ åĪ° åºĶçĶ¨ ä¸» çķĮéĿ¢ ãĢĤ Ċ Ġ* Ġ@ author Ġgu olin Ċ Ġ* Ġ@ since Ġ 2 0 1 8 / 1 2 / 2 6 Ċ Ġ*/ Ċ class ĠOpen Source Login Activity Ġ: ĠLogin Activity () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtimer : ĠCount Down Timer ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæĺ¯åĲ¦ æŃ£åľ¨ çĻ»å½ķ ä¸Ń ãĢĤ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġis Login Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ login ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsetup Views () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . setup Views () ĊĠĠĠĠĠĠĠ Ġval Ġis Start With Transition Ġ= Ġintent . getBoolean Extra ( Login Activity . START _ WITH _ TRANS ITION , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġif Ġ( Android Version . has L ol lip op () Ġ&& Ġis Start With Transition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Transition ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow . shared Element Enter Transition . addListener ( object Ġ: ĠSimple Transition Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Transition End ( transition : ĠTransition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠFinish Activity Event () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . activity Class Ġ= ĠOpen Source Splash Activity :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Bus . getDefault (). post ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Transition ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfade Elements In () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogin Layout Bottom . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogin Bg Wall Layout . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtimer Ġ= ĠSM ST imer ( 6 0 Ġ* Ġ 1 0 0 0 , Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġget Verify Code . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= ĠphoneNumber Edit . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( number . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast ( Global Util . getString ( R . string . phone _ number _ is _ empty )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpattern Ġ= Ġ"^ 1 \\ d { 1 0 }\ $" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Pattern . matches ( pattern , Ġnumber )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast ( Global Util . getString ( R . string . phone _ number _ is _ invalid )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Verify Code . is Clickable Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFetch V Code . getResponse ( number , Ġobject Ġ: ĠCallback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( response : ĠResponse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . status Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Code Edit . request Focus () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast ( response . msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Verify Code . is Clickable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Warn ( TAG , Ġe . message , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse Handler . handle Failure ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Verify Code . is Clickable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogin Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Login ) Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= ĠphoneNumber Edit . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġverify Code Edit . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( number . isEmpty () Ġ|| Ġcode . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast ( Global Util . getString ( R . string . phone _ number _ or _ code _ is _ empty )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpattern Ġ= Ġ"^ 1 \\ d { 1 0 }\ $" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Pattern . matches ( pattern , Ġnumber )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast ( Global Util . getString ( R . string . phone _ number _ is _ invalid )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Login ( number , Ġcode ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġtimer . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Login ( number : ĠString , Ġcode : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhide Soft Keyboard () ĊĠĠĠĠĠĠĠ Ġlogin InProgress ( true ) ĊĠĠĠĠĠĠĠ ĠPhone Login . getResponse ( number , Ġcode , Ġobject Ġ: ĠCallback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( response : ĠResponse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Response Handler . handle Response ( response )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthird Party Login Ġ= Ġresponse Ġas ĠPhone Login ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġthird Party Login . status ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġthird Party Login . msg ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġthird Party Login . userId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġthird Party Login . token ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide Soft Keyboard () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ å¤ĦçĲĨ çĻ»å½ķ æĪĲåĬŁ æĹ¶çļĦ éĢ»è¾ĳ ï¼Į åĮħæĭ¬ æķ°æį® ç¼ĵåŃĺ ï¼Į çķĮéĿ¢ è·³è½¬ çŃī ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Auth Data ( userId , Ġtoken , ĠTYPE _ PHONE _ LOGIN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetUser Base info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 1 0 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide Soft Keyboard () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOpen Source Register Activity . register By Phone ( this @ Open Source Login Activity , Ġnumber , Ġcode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin InProgress ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Warn ( TAG , Ġ" Login Ġfailed . Ġ" Ġ+ ĠGlobal Util . getResponse Cl ue ( status , Ġmsg )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast ( response . msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin InProgress ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin InProgress ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Warn ( TAG , Ġe . message , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse Handler . handle Failure ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin InProgress ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæł¹æį® çĶ¨æĪ· æĺ¯åĲ¦ æŃ£åľ¨ æ³¨åĨĮ æĿ¥ åĪ·æĸ° çķĮéĿ¢ ãĢĤ å¦Ĥæŀľ æŃ£åľ¨ å¤ĦçĲĨ å°± æĺ¾ç¤º è¿Ľ åº¦ æĿ¡ ï¼Į åĲ¦åĪĻ çļĦè¯Ŀ å°± æĺ¾ç¤º è¾ĵåħ¥ æ¡Ĩ ãĢĤ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġin Progress Ġæĺ¯åĲ¦ æŃ£åľ¨ æ³¨åĨĮ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġlogin InProgress ( in Progress : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Android Version . has Mar shm allow () Ġ&& Ġ!( in Progress Ġ&& Ġlogin Root Layout . keyboard Show ed )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTransition Manager . begin Delayed Transition ( login Root Layout , ĠF ade ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis Login Ġ= Ġin Progress ĊĠĠĠĠĠĠĠ Ġif Ġ( in Progress ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogin Input Elements . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogin ProgressBar . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogin ProgressBar . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogin Input Elements . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå°Ĩ Login Activity çļĦ çķĮéĿ¢ åħĥç´ł ä½¿çĶ¨ æ· ¡ åħ¥ çļĦæĸ¹å¼ı æĺ¾ç¤º åĩºæĿ¥ ãĢĤ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfade Elements In () Ġ{ ĊĠĠĠĠĠĠĠ ĠTransition Manager . begin Delayed Transition ( login Layout Bottom , ĠF ade ()) ĊĠĠĠĠĠĠĠ Ġlogin Layout Bottom . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ ĠTransition Manager . begin Delayed Transition ( login Bg Wall Layout , ĠF ade ()) ĊĠĠĠĠĠĠĠ Ġlogin Bg Wall Layout . visibility Ġ= ĠView . VISIBLE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠSM ST imer ( millis In Future : ĠLong , Ġcount Down Interval : ĠLong ) Ġ: ĠCount Down Timer ( millis In Future , Ġcount Down Interval ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Finish () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Verify Code . text Ġ= ĠGlobal Util . getString ( R . string . fetch _ v code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Verify Code . is Clickable Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tick ( millis Until Finished : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Verify Code . text Ġ= ĠString . format ( Global Util . getString ( R . string . sms _ is _ sent ), Ġmillis Until Finished Ġ/ Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG Ġ= Ġ" Open Source Login Activity " ĊĠĠĠ Ġ} Ċ Ċ }