package Ġcom . dof . my t mdb Ċ Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Persist able Bundle Ċ import Ġandroid . support . v 4 . view . Gesture Detector Compat Ċ import Ġandroid . support . v 4 . view . Motion Event Compat Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Gesture Detector Ċ import Ġandroid . view . Motion Event Ċ import Ġcom . dof . my t mdb . ui . main . Discover Fragment Ċ import Ġcom . dof . my t mdb . view . Back drop Behavior Ċ import Ġkotlinx . android . synt hetic . main . main _ activity .* Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity (), ĠGest ure Detector . On Gesture Listener , ĊĠĠĠĠĠĠĠ ĠGest ure Detector . On Double Tap Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Detector : ĠGest ure Detector Compat ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġback drop Behavior Ġ: ĠBack drop Behavior ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSP _ LAST _ ITEM _ USED Ġ= Ġ" sp _ last _ item _ used " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEBUG _ TAG Ġ= Ġ" Gest ures " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" MainActivity " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . main _ activity ) ĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsupport FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( R . id . front Container , ĠDis cover Fragment . newInstance ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit Now () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġback drop Behavior Ġ= Ġfront Container . find Behavior () ĊĠĠĠĠĠĠĠ Ġwith ( backdrop Behavior ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattach Back Container ( R . id . back Container ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattach Toolbar ( R . id . toolbar ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwith ( toolbar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetTitle ( R . string . app _ name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnavigation View . set Navigation ItemSelected Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback drop Behavior . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġm Detector Ġ= ĠGest ure Detector Compat ( this , Ġthis ) ĊĠĠĠĠĠĠĠ Ġm Detector . setOn Double Tap Listener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġwindow . set Exit Transition ( null ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ?, Ġout Persistent State : ĠPers ist able Bundle ?) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġout State ?. put Int ( SP _ LAST _ ITEM _ USED , Ġnavigation View . get ) ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State , Ġout Persistent State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispatch Touch Event ( event : ĠMotion Event ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġm Detector . on Touch Event ( event ) ĊĊĠĠĠĠĠĠĠ Ġval Ġaction : ĠInt Ġ= ĠMotion Event Compat . getAction Mask ed ( event ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Scrolling ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġback drop Behavior . replace View ( current Y Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Scrolling Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Y Pos Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . dispatch Touch Event ( event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Down ( event : ĠMotion Event ): ĠBoolean Ġ{ Ċ // ĠĠĠĠĠĠĠ ĠLog . d ( DEBUG _ TAG , Ġ" on Down : Ġ$ event ") ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Fl ing ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent 1 : ĠMotion Event , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent 2 : ĠMotion Event , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity X : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Y : ĠFloat ĊĠĠĠ Ġ): ĠBoolean Ġ{ Ċ // ĠĠĠĠĠĠĠ ĠLog . d ( DEBUG _ TAG , Ġ" on Fl ing : Ġx : Ġ${ event 1 . x } Ġy : Ġ${ event 1 . y } Ġx : Ġ${ event 2 . x } Ġy : Ġ${ event 2 . y }") ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Long Press ( event : ĠMotion Event ) Ġ{ Ċ // ĠĠĠĠĠĠĠ ĠLog . d ( DEBUG _ TAG , Ġ" on Long Press : Ġ$ event ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġbegin Y Pos Ġ: ĠFloat Ġ= Ġ 0 F ĊĠĠĠ Ġprivate Ġvar Ġcurrent Y Pos Ġ: ĠFloat Ġ= Ġ 0 F ĊĠĠĠ Ġprivate Ġvar Ġis Scrolling Ġ: ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġon Scroll ( event 1 : ĠMotion Event , Ġevent 2 : ĠMotion Event , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdistance X : ĠFloat , Ġdistance Y : ĠFloat ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ"${ event 1 . y } Ġ=> Ġ${ backdrop Behavior . end Y 1 } Ġ&& Ġ${ event 1 . y } Ġ<= Ġ${ backdrop Behavior . end Y 2 }") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( event 1 . y Ġ>= Ġback drop Behavior . start Y 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġevent 1 . y Ġ<= Ġback drop Behavior . start Y 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġback drop Behavior . state Ġ== ĠBack drop Behavior . Drop State . CLOSE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Scrolling Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event 2 . y Ġ>= Ġback drop Behavior . min Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġevent 2 . y Ġ<= Ġback drop Behavior . max Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġbegin Y Pos Ġ== Ġ 0 F ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Y Pos Ġ= Ġevent 2 . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Y Pos Ġ= Ġback drop Behavior . min Height Ġ+ Ġ( event 2 . y Ġ- Ġbegin Y Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Y Pos Ġ>= Ġback drop Behavior . min Height Ġ&& Ġcurrent Y Pos Ġ<= Ġback drop Behavior . max Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfront Container . y Ġ= Ġcurrent Y Pos ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( event 1 . y Ġ>= Ġback drop Behavior . end Y 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġevent 1 . y Ġ<= Ġback drop Behavior . end Y 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġback drop Behavior . state Ġ== ĠBack drop Behavior . Drop State . OPEN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Scrolling Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event 2 . y Ġ>= Ġback drop Behavior . min Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġevent 2 . y Ġ<= Ġback drop Behavior . max Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġbegin Y Pos Ġ== Ġ 0 F ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Y Pos Ġ= Ġevent 2 . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Y Pos Ġ= Ġback drop Behavior . max Height Ġ- Ġ( begin Y Pos Ġ- Ġevent 2 . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Y Pos Ġ>= Ġback drop Behavior . min Height Ġ&& Ġcurrent Y Pos Ġ<= Ġback drop Behavior . max Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfront Container . y Ġ= Ġcurrent Y Pos ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Show Press ( event : ĠMotion Event ) Ġ{ Ċ // ĠĠĠĠĠĠĠ ĠLog . d ( DEBUG _ TAG , Ġ" on Show Press : Ġ$ event ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Single Tap Up ( event : ĠMotion Event ): ĠBoolean Ġ{ Ċ // ĠĠĠĠĠĠĠ ĠLog . d ( DEBUG _ TAG , Ġ" on Single Tap Up : Ġ$ event ") ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Double Tap ( event : ĠMotion Event ): ĠBoolean Ġ{ Ċ // ĠĠĠĠĠĠĠ ĠLog . d ( DEBUG _ TAG , Ġ" on Double Tap : Ġ$ event ") ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Double Tap Event ( event : ĠMotion Event ): ĠBoolean Ġ{ Ċ // ĠĠĠĠĠĠĠ ĠLog . d ( DEBUG _ TAG , Ġ" on Double Tap Event : Ġ$ event ") ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Single Tap Confirmed ( event : ĠMotion Event ): ĠBoolean Ġ{ Ċ // ĠĠĠĠĠĠĠ ĠLog . d ( DEBUG _ TAG , Ġ" on Single Tap Confirmed : Ġ$ event ") ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} Ċ }