package Ġcom . alex vas . timeline . demo . ui Ċ Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġcom . alex vas . timeline . demo . R Ċ import Ġcom . alex vas . widget . Timeline View Ċ import Ġcom . alex vas . widget . Timeline View . Time Record Ċ import Ġkotlin . math . max Ċ Ċ class ĠTimeline Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠTAG : ĠString Ġ= ĠTimeline Fragment :: class . java . simple Name ĊĠĠĠ Ġprivate Ġval ĠDEBUG Ġ= Ġtrue ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtimeline View : ĠTimeline View ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtimeline ViewModel : ĠTimeline ViewModel ĊĠĠĠ Ġprivate Ġval Ġrecords Background Events : ĠArrayList < Time Record > Ġ= ĠArrayList () ĊĠĠĠ Ġprivate Ġval Ġrecords Major 1 Events : ĠArrayList < Time Record > Ġ= ĠArrayList () ĊĠĠĠ Ġprivate Ġval Ġrecords Major 2 Events : ĠArrayList < Time Record > Ġ= ĠArrayList () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtimeline ViewModel Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewModel Provider ( this ). get ( Timeline ViewModel :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġinflater . inflate ( R . layout . fragment _ timeline , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġtimeline View Ġ= Ġroot . findViewById ( R . id . timeline ) ĊĠĠĠĠĠĠĠ Ġtimeline View . setOn Timeline Listener ( object : Timeline View . On Timeline Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Time Select ing () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Time Selected ( timestamp M sec : ĠLong , Ġrecord : ĠTime Record ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Request More Major 1 Data () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Request More Major 2 Data () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Request More Background Data () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġzoom In Ġ= Ġroot . findViewById < View >( R . id . zoom In ) ĊĠĠĠĠĠĠĠ Ġval Ġzoom Out Ġ= Ġroot . findViewById < View >( R . id . zoom Out ) ĊĠĠĠĠĠĠĠ Ġzoom In . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimeline View . decrease Interval With Animation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġis Min Interval Ġwill Ġbe Ġvalid Ġonly Ġafter Ġanimation Ġcompleted Ġ( 1 5 0 Ġm sec ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzoom In . isEnabled Ġ= Ġ! timeline View . is Min Interval ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzoom Out . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĠTimeline View . ANIM ATION _ DURATION _ M SEC Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġzoom Out . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimeline View . increase Interval With Animation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġis Max Interval Ġwill Ġbe Ġvalid Ġonly Ġafter Ġanimation Ġcompleted Ġ( 1 5 0 Ġm sec ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzoom Out . isEnabled Ġ= Ġ! timeline View . is Max Interval ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzoom In . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĠTimeline View . ANIM ATION _ DURATION _ M SEC Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġroot . findViewById < View >( R . id . last Event ). setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgoto Last Major 1 Record () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġroot . findViewById < View >( R . id . prev Event ). setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgoto Prev Record ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġroot . findViewById < View >( R . id . next Event ). setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgoto Next Record ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġroot ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) ĠLog . v ( TAG , Ġ" onStart () ") ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġtimeline ViewModel . load Params ( context ) ĊĠĠĠĠĠĠĠ Ġload First Values () ĊĠĠĠĠĠĠĠ Ġupdate Timeline () ĊĠĠĠĠĠĠĠ Ġgoto Last Major 1 Record () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) ĠLog . v ( TAG , Ġ" on Stop () ") ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġtimeline ViewModel . save Params ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠEvent Record () ĊĊĠĠĠ Ġprivate Ġfun Ġload First Values () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) ĠLog . v ( TAG , Ġ" load First Values () ") ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġrecords Major 1 Events . clear () ĊĠĠĠĠĠĠĠ Ġrecords Major 1 Events . add ( Time Record ( time Ġ- Ġ 1 0 0 0 , Ġ 0 , ĠEvent Record ())) Ġ// Ġduration Ġcan Ġbe Ġ 0 Ġif Ġunknown ĊĠĠĠĠĠĠĠ Ġrecords Major 1 Events . add ( Time Record ( time Ġ- Ġ 2 0 0 0 , Ġ 0 , ĠEvent Record ())) ĊĠĠĠĠĠĠĠ Ġrecords Major 1 Events . add ( Time Record ( time Ġ- Ġ 5 0 0 0 , Ġ 1 0 0 0 , ĠEvent Record ())) ĊĠĠĠĠĠĠĠ Ġrecords Major 1 Events . add ( Time Record ( time Ġ- Ġ 3 0 0 0 0 , Ġ 2 0 0 0 0 , ĠEvent Record ())) ĊĠĠĠĠĠĠĠ Ġrecords Major 1 Events . add ( Time Record ( time Ġ- Ġ 3 0 0 0 0 0 , Ġ 2 0 0 0 0 , ĠEvent Record ())) ĊĠĠĠĠĠĠĠ Ġrecords Major 1 Events . add ( Time Record ( time Ġ- Ġ 1 8 0 0 0 0 0 , Ġ 1 0 0 0 0 0 , ĠEvent Record ())) ĊĠĠĠĠĠĠĠ Ġrecords Major 1 Events . add ( Time Record ( time Ġ- Ġ 3 6 0 0 0 0 0 , Ġ 7 0 0 0 0 , ĠEvent Record ())) ĊĠĠĠĠĠĠĠ Ġrecords Major 1 Events . add ( Time Record ( time Ġ- Ġ 3 6 0 0 0 0 0 0 0 , Ġ 1 5 0 0 0 0 , ĠEvent Record ())) ĊĠĠĠĠĠĠĠ Ġrecords Major 1 Events . add ( Time Record ( time Ġ- Ġ 5 0 0 0 0 0 0 0 0 , Ġ 1 5 0 0 0 0 0 , ĠEvent Record ())) ĊĊĠĠĠĠĠĠĠ Ġrecords Major 2 Events . clear () ĊĠĠĠĠĠĠĠ Ġrecords Major 2 Events . add ( Time Record ( time Ġ- Ġ 5 0 0 , Ġ 2 0 0 0 , ĠEvent Record ())) ĊĠĠĠĠĠĠĠ Ġrecords Major 2 Events . add ( Time Record ( time Ġ- Ġ 5 2 0 0 , Ġ 5 0 0 , ĠEvent Record ())) ĊĠĠĠĠĠĠĠ Ġ// ĠOver writing Ġdefault Ġdraw Ġcolor ĊĠĠĠĠĠĠĠ Ġrecords Major 2 Events . add ( Time Record ( time Ġ- Ġ 6 0 0 0 , Ġ 1 0 0 0 , ĠEvent Record (), ĠColor . YELLOW )) ĊĊĠĠĠĠĠĠĠ Ġrecords Background Events . clear () ĊĠĠĠĠĠĠĠ Ġrecords Background Events . add ( Time Record ( time Ġ- Ġ 5 0 0 0 0 , Ġ 2 0 0 0 0 , ĠEvent Record ())) ĊĠĠĠĠĠĠĠ Ġrecords Background Events . add ( Time Record ( time Ġ- Ġ 5 0 0 0 0 0 , Ġ 5 0 0 0 0 0 , ĠEvent Record ())) ĊĠĠĠĠĠĠĠ Ġrecords Background Events . add ( Time Record ( time Ġ- Ġ 1 0 0 0 0 0 0 , Ġ 2 5 0 0 0 0 , ĠEvent Record ())) ĊĠĠĠĠĠĠĠ Ġrecords Background Events . add ( Time Record ( time Ġ- Ġ 2 5 0 0 0 0 0 , Ġ 1 0 0 0 0 0 0 , ĠEvent Record ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Timeline () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) ĠLog . v ( TAG , Ġ" update Timeline () ") ĊĠĠĠĠĠĠĠ Ġtimeline View . set Major 1 Records ( records Major 1 Events ) ĊĠĠĠĠĠĠĠ Ġtimeline View . set Major 2 Records ( records Major 2 Events ) ĊĠĠĠĠĠĠĠ Ġtimeline View . setBackground Records ( records Background Events ) ĊĠĠĠĠĠĠĠ Ġtimeline View . invalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgoto Last Major 1 Record () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) ĠLog . v ( TAG , Ġ" goto Last Major 1 Record () ") ĊĠĠĠĠĠĠĠ Ġvar Ġrecords : Ġjava . util . ArrayList < Time Record > Ġ= Ġtimeline View . major 1 Records ĊĠĠĠĠĠĠĠ Ġ// ĠAt Ġleast Ġone Ġevent Ġexists ĊĠĠĠĠĠĠĠ Ġif Ġ( records . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecord Ġ= Ġrecords [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimestamp : ĠLong Ġ= Ġget Timestamp From Record ( record ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Time Selected ( timestamp , Ġrecord ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimeline View . setCurrent With Animation ( record . timestamp M sec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimeline View . invalidate () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġevents Ġfound . ĠShow Ġlast Ġvideo Ġrecording . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecords Ġ= Ġtimeline View . background Records ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( records . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecord Ġ= Ġrecords [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 3 0 Ġsec Ġbefore Ġvideo Ġfinished . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimestamp Ġ= Ġrecord . timestamp M sec Ġ+ Ġmax ( record . duration M sec Ġ- Ġ 3 0 0 0 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Time Selected ( timestamp , Ġrecord ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimeline View . setCurrent With Animation ( record . timestamp M sec ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimeline View . invalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgoto Prev Record ( animation : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) ĠLog . v ( TAG , Ġ" goto Prev Record ( animation =$ animation )") ĊĠĠĠĠĠĠĠ Ġval Ġrecord : ĠTime Record ? Ġ= Ġtimeline View . get Prev Major Record () ĊĠĠĠĠĠĠĠ Ġif Ġ( record Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġrecord . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimestamp Ġ= Ġget Timestamp From Record ( record ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Time Selected ( timestamp , Ġrecord ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( animation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimeline View . setCurrent With Animation ( record . timestamp M sec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimeline View . setCurrent ( record . timestamp M sec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimeline View . invalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgoto Next Record ( animation : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) ĠLog . v ( TAG , Ġ" goto Next Record ( animation =$ animation )") ĊĠĠĠĠĠĠĠ Ġval Ġrecord : ĠTime Record ? Ġ= Ġtimeline View . getNext Major Record () ĊĠĠĠĠĠĠĠ Ġif Ġ( record Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġrecord . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimestamp Ġ= Ġget Timestamp From Record ( record ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Time Selected ( timestamp , Ġrecord ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( animation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimeline View . setCurrent With Animation ( record . timestamp M sec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimeline View . setCurrent ( record . timestamp M sec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimeline View . invalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Timestamp From Record ( record : ĠTime Record ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrecord . timestamp M sec ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Time Selected ( timestamp : ĠLong , Ġrecord : ĠTime Record ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠPlay back Ġcode Ġgoes Ġhere ĊĠĠĠ Ġ} Ċ Ċ } Ċ