/* Ċ Ġ* ĠCreated Ġby ĠLee ĠOh ĠH young Ġon Ġ 2 0 2 0 / 0 6 / 2 1 Ġ.. ĠĊ Ġ*/ Ċ package Ġkr . pn u . ga 2 0 1 9 . presentation . main . recommend Ċ Ċ import Ġandroid . animation . Animator Set Ċ import Ġandroid . animation . Object Animator Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . view . animation . Animation Utils Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . recyclerview . widget . Default Item Animator Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġkr . pn u . ga 2 0 1 9 . R Ċ import Ġkr . pn u . ga 2 0 1 9 . databinding . Fragment Recommend Binding Ċ import Ġkr . pn u . ga 2 0 1 9 . databinding . Layout Place Pin Binding Ċ import Ġkr . pn u . ga 2 0 1 9 . databinding . Layout User Point Binding Ċ import Ġkr . pn u . ga 2 0 1 9 . domain . entity . Place Ċ import Ġkr . pn u . ga 2 0 1 9 . presentation . base . Base Fragment Ċ import Ġkr . pn u . ga 2 0 1 9 . utility . Const Ċ import Ġkr . pn u . ga 2 0 1 9 . utility . dp To Pixel Ċ import Ġorg . jetbrains . ank o . support . v 4 . toast Ċ import Ġkotlin . random . Random Ċ Ċ class ĠRecommend Fragment Ġ: ĠBase Fragment < Fragment Recommend Binding , ĠRecommend ViewModel >( ĊĠĠĠ Ġresource Id Ġ= ĠR . layout . fragment _ recommend Ċ ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMOVE _ ANIM ATION _ DURATION : ĠLong Ġ= Ġ 2 5 0 0 L ĊĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance (): ĠRecommend Fragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= ĠBundle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= ĠRecommend Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . arguments Ġ= Ġargs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfragment ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmy Location : ĠLayout User Point Binding Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate User Point (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . x Ġ= Ġ(- 4 5 0 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . y Ġ= Ġ 1 4 5 0 . toFloat () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġpin Views : ĠArrayList < View > Ġ= Ġarray ListOf () ĊĠĠĠ Ġprivate Ġval Ġcached Places : ĠArrayList < Place > Ġ= Ġarray ListOf () ĊĠĠĠ Ġprivate Ġvar Ġis Select Moved : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġval ĠviewModel : ĠRecommend ViewModel Ġby Ġview Models () ĊĠĠĠ Ġprivate Ġval Ġvisited Place Adapter : ĠVis ited Place Adapter Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠVis ited Place Adapter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . path RecyclerView . scrollTo Position ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . path RecyclerView . adapter ?. item Count !! Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbind ViewModel () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . viewModel Ġ= ĠviewModel ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . first Enter Message . start Animation ( Animation Utils . load Animation ( require Context (), ĠR . anim . shake )) ĊĠĠĠĠĠĠĠ ĠviewModel . getAll Place () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset RecyclerView () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . path RecyclerView . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( require Context (), ĠRecyclerView . HORIZONTAL , Ġfalse ). apply Ġ{ Ġstack From End Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġvisited Place Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Animator Ġ= ĠDefault Item Animator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Item Decoration ( object : ĠRecyclerView . Item Decoration () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Offsets ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Rect : ĠRect , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview : ĠView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent : ĠRecyclerView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate : ĠRecyclerView . State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġparent . getChild Adapter Position ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( position Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Rect . left Ġ= Ġ 4 . dp To Pixel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Rect . right Ġ= Ġ 4 . dp To Pixel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( position Ġ== Ġstate . item Count Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Rect . right Ġ= Ġ 8 . dp To Pixel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġobserve LiveData () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . observe LiveData () ĊĠĠĠĠĠĠĠ ĠviewModel . places . observe ( view Lifecycle Owner , ĠObserver Ġ{ Ġplaces Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Places . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Move Button ClickListener () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaces ?. forEach Ġ{ Ġplace Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpin Ġ= ĠLayout Place Pin Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpin . place Ġ= Ġplace ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġx : Ġ- 4 0 0 Ġ~ Ġ+ 4 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġy : Ġ+ 1 0 0 Ġ~ Ġ+ 1 6 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpin . root . x Ġ= Ġplace . location X . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpin . root . y Ġ= Ġplace . location Y . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpin Views . add ( pin . root ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Places . add ( place ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . pin ch Zoom Layout . addView ( pin . root ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . recommend Result . observe ( view Lifecycle Owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Places . first Ġ{ Ġplace Ġ-> Ġplace . id Ġ== Ġresult . first . place Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġcurrent Place Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast ("${ current Place . name } ìľ¼ë¡ľ ĠìĿ´ë ı Ļ íķĺ ìĦ¸ìļĶ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" current Place ", Ġ" íĺĦ ìŀ¬ ĠìľĦ ì¹ĺ Ġ: Ġ${ current Place . name }, Ġx : Ġ${ current Place . location X }, Ġy : Ġ${ current Place . location Y }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . start Timer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . current Place Ġ= Ġcurrent Place ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmove X : ĠObject Animator Ġ= ĠObject Animator . of Float ( my Location . root , Ġ" x ", Ġcurrent Place . location X . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmove Y : ĠObject Animator Ġ= ĠObject Animator . of Float ( my Location . root , Ġ" y ", Ġcurrent Place . location Y . toFloat ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanim ator Set Ġ= ĠAn imator Set () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator Set . play To gether ( move X , Ġmove Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator Set . duration Ġ= ĠMOVE _ ANIM ATION _ DURATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator Set . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisited Place Adapter . update ( current Place ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . finish . observe ( view Lifecycle Owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Exit Dialog () ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġpin Views . forEach Ġ{ Ġview Ġ-> Ġbinding . pin ch Zoom Layout . addView ( view ) Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . pin ch Zoom Layout . addView ( my Location . root ) ĊĠĠĠĠĠĠĠ Ġif ( is Select Moved ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . first Enter Message . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġpin Views . forEach Ġ{ Ġview Ġ-> Ġbinding . pin ch Zoom Layout . remove View ( view ) Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . pin ch Zoom Layout . remove View ( my Location . root ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Exit Dialog () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . stop Timer () ĊĠĠĠĠĠĠĠ ĠExit Dialog ( require Activity ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ?. on Back Pressed () ĊĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Move Button ClickListener () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . move An c ient Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" ê³ł ëĮĢ ìłĦ ìĭľ ê´Ģ ìľ¼ë¡ľ ĠìĿ´ë ı Ļ íķĺ ìĦ¸ìļĶ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . first Enter Message . animation Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . first Enter Message . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( pin Views . isNotEmpty ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmove X : ĠObject Animator Ġ= ĠObject Animator . of Float ( my Location . root , Ġ" x ", Ġpin Views [ 0 ]. x ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmove Y : ĠObject Animator Ġ= ĠObject Animator . of Float ( my Location . root , Ġ" y ", Ġpin Views [ 0 ]. y ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanim ator Set Ġ= ĠAn imator Set () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator Set . play To gether ( move X , Ġmove Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator Set . duration Ġ= ĠMOVE _ ANIM ATION _ DURATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator Set . start () ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Select Moved Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . current Place Ġ= Ġcached Places [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisited Place Adapter . update ( cached Places [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . start Timer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . currentState . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . move Science Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" ê³¼ íķĻ ìłĦ ìĭľ ê´Ģ ìľ¼ë¡ľ ĠìĿ´ë ı Ļ íķĺ ìĦ¸ìļĶ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . first Enter Message . animation Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . first Enter Message . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( pin Views . isNotEmpty ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmove X : ĠObject Animator Ġ= ĠObject Animator . of Float ( my Location . root , Ġ" x ", Ġpin Views [ 7 ]. x ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmove Y : ĠObject Animator Ġ= ĠObject Animator . of Float ( my Location . root , Ġ" y ", Ġpin Views [ 7 ]. y ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanim ator Set Ġ= ĠAn imator Set () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator Set . play To gether ( move X , Ġmove Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator Set . duration Ġ= ĠMOVE _ ANIM ATION _ DURATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator Set . start () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Select Moved Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . current Place Ġ= Ġcached Places [ 7 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisited Place Adapter . update ( cached Places [ 7 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . start Timer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . currentState . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate User Point (): ĠLayout User Point Binding Ġ= ĊĠĠĠĠĠĠĠ ĠLayout User Point Binding . inflate ( layout Inflater ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Image . setImage Resource ( Const . random ()) ĊĠĠĠĠĠĠĠ Ġ} Ċ }