package Ġcom . ut n . fr ba . des ar rol lo mobile . h unter . ui . fragment Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . hardware .* Ċ import Ġandroid . location . Location Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View . GONE Ċ import Ġandroid . view . View . VISIBLE Ċ import Ġandroid . view . Window Ċ import Ġandroid . view . animation . Animation Ċ import Ġandroid . view . animation . Rotate Animation Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġcom . google . zx ing . integration . android . Intent Integr ator Ċ import Ġcom . squareup . pic asso . Pic asso Ċ import Ġcom . ut n . fr ba . des ar rol lo mobile . h unter . R Ċ import Ġcom . ut n . fr ba . des ar rol lo mobile . h unter . extensions . set Toolbar Title Ċ import Ġcom . ut n . fr ba . des ar rol lo mobile . h unter . extensions . show Fragment Ċ import Ġcom . ut n . fr ba . des ar rol lo mobile . h unter . service . API Adapter Ċ import Ġcom . ut n . fr ba . des ar rol lo mobile . h unter . service . models . Game Ċ import Ġcom . ut n . fr ba . des ar rol lo mobile . h unter . service . models . User Ċ import Ġcom . ut n . fr ba . des ar rol lo mobile . h unter . utils . Login Handler Ċ import Ġkotlinx . android . synt hetic . main . dialog _ cl ue _ layout . view .* Ċ import Ġkotlinx . android . synt hetic . main . fragment _ compass .* Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Callback Ċ import Ġretrofit 2 . Response Ċ import Ġjava . lang . Double Ċ import Ġjava . text . Decimal Format ĊĊ Ċ class ĠComp ass Fragment Ġ: ĠBase Location Fragment ( R . layout . fragment _ compass ), ĠSensor EventListener Ġ{ ĊĊĠĠĠ Ġ// Ġcomp ass Ġarrow Ġdegree Ġdirection ĊĠĠĠ Ġprivate Ġvar Ġcurrent Degree Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġval ĠCL UE _ RADIUS Ġ= Ġ 1 5 ĊĊĠĠĠ Ġoverride Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Sensor Manager Ġ= Ġactivity ?. getSystem Service ( Context . SENSOR _ SERVICE ) Ġas ĠSensor Manager ĊĊĠĠĠĠĠĠĠ Ġshow Cl ue Button . setOnClickListener Ġ{ Ġshow Cl ue () Ġ} ĊĠĠĠĠĠĠĠ Ġscan QR Button . setOnClickListener Ġ{ Ġsc ann QR () Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Login Handler . USER ID Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcall GetUser Response Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAPI Adapter . get API (). getUser () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall GetUser Response . enqueue ( object Ġ: ĠCallback < User > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < User >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" throw ĠMessage " Ġ+ Ġt . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall : ĠCall < User >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse : ĠResponse < User > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġresponse . body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogin Handler . USER ID Ġ= Ġit . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsc ann QR () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ ĠIntent Integr ator . for Support Fragment ( this ). init iate Scan (); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Integr ator . parse Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . contents Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqr Ġ= Ġresult . contents ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcall Win Game Response Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAPI Adapter . get API (). win Game ( game ID , Ġqr ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Win Game Response . enqueue ( object Ġ: ĠCallback < Game > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Game >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" throw ĠMessage " Ġ+ Ġt . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall : ĠCall < Game >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse : ĠResponse < Game > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġresponse . body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġended : ĠBoolean Ġ= Ġit . ended Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwin ID : ĠInt Ġ= Ġit . win Id Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ended Ġ&& Ġwin ID Ġ== ĠLogin Handler . USER ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Fragment ( Win Fragment (), Ġtrue , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// else ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġshow Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġon Sensor Changed ( event : ĠSensor Event ) Ġ{ Ġ// Ġget Ġthe Ġangle Ġaround Ġthe Ġz - axis Ġrotated ĊĠĠĠĠĠĠĠ Ġactual Location ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdegree Ġ= ĠMath . round ( event . values [ 0 ]). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecl ination Ġ= Ġgeo Field . get Decl ination () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdegree Ġ+= Ġdecl ination ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbe aring : ĠFloat Ġ= Ġit . be aring To ( target ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdegree Ġ= Ġ( be aring Ġ- Ġdegree ) Ġ* Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdegree Ġ= Ġnormalize Degree ( degree ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcreate Ġa Ġrotation Ġanimation Ġ( reverse Ġturn Ġdegree Ġdegrees ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġra Ġ= ĠRotate Animation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Degree , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- degree , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnimation . REL ATIVE _ TO _ SELF , Ġ 0 . 5 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnimation . REL ATIVE _ TO _ SELF , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhow Ġlong Ġthe Ġanimation Ġwill Ġtake Ġplace ĊĠĠĠĠĠĠĠĠĠĠĠ Ġra . duration Ġ= Ġ 2 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġthe Ġanimation Ġafter Ġthe Ġend Ġof Ġthe Ġreservation Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠ Ġra . fill After Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStart Ġthe Ġanimation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomp ass View . start Animation ( ra ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Degree Ġ= Ġ- degree ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnormalize Degree ( value : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ+ Ġ 3 6 0 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Accuracy Changed ( sensor : ĠSensor ?, Ġaccuracy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġnot Ġin Ġuse ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġgo ToMap Fragment () Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Fragment ( Map Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= ĠBundle (). apply Ġ{ Ġput Int ( GAME _ ID , Ġgame . id . toString (). toInt ()) Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġset Toolbar Title ( getString ( R . string . compass _ title )) ĊĠĠĠĠĠĠĠ Ġ// Ġfor Ġthe Ġsystem 's Ġorientation Ġsensor Ġregistered Ġlisteners ĊĠĠĠĠĠĠĠ Ġm Sensor Manager ?. register Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , Ġm Sensor Manager ?. getDefault Sensor ( Sensor . TYPE _ OR IENTATION ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSensor Manager . SENSOR _ DELAY _ GAME ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġ// Ġto Ġstop Ġthe Ġlistener Ġand Ġsave Ġbattery ĊĠĠĠĠĠĠĠ Ġm Sensor Manager ?. unregister Listener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Location Updated ( actual Location : ĠLocation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( actual Location ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeo Field Ġ= ĠGe om ag netic Field ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble . valueOf ( latitude ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble . valueOf ( longitude ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble . valueOf ( altitude ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġit . distance To ( actual Location ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistance TextView . text Ġ= ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . compass _ distance , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDecimal Format ("# . ## "). format ( distance ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistance Ġ> ĠTARGET _ RADIUS Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" H UN TER ", Ġ" distance Ġ> ĠTARGET _ RADIUS ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgo ToMap Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistance Ġ<= ĠCL UE _ RADIUS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" H UN TER ", Ġ" distance Ġ<= ĠTARGET _ RADIUS ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Cl ue Button . visibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" H UN TER ", Ġ" else ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Cl ue Button . visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Cl ue () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdialog View Ġ= Ġlayout Inflater . inflate ( R . layout . dialog _ cl ue _ layout , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġval Ġalert : ĠAlertDialog ? ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setView ( dialog View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Cancel able ( false ) ĊĠĠĠĠĠĠĠ Ġalert Ġ= Ġbuilder . create () ĊĠĠĠĠĠĠĠ Ġalert . request Window Feature ( Window . FEATURE _ NO _ TITLE ) ĊĠĠĠĠĠĠĠ Ġdialog View . cl ue Text . text Ġ= Ġgame . cl ues . first () ĊĊĠĠĠĠĠĠĠ Ġdialog View . cl ue Close Btn . setOnClickListener Ġ{ Ġalert . dismiss () Ġ} ĊĠĠĠĠĠĠĠ Ġdialog View . cl ue Image . layout Params . width Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( resources . display Metrics . width Pixels Ġ* Ġ 0 . 8 ). toInt () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! game . photo . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPic asso . get (). load ( game . photo ). into ( dialog View . cl ue Image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog View . cl ue Image . visibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġalert . show () ĊĠĠĠ Ġ} Ċ } Ċ