package Ġcom . github . t us arr 1 0 . track me . ui . adapters . calls adapter Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroid . net . Uri Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroid . view . View Ċ import Ġandroid . widget .* Ċ import Ġat . grab ner . circle progress . Circle Progress View Ċ import Ġcom . github . t us arr 1 0 . track me . R Ċ import Ġcom . github . t us arr 1 0 . track me . data . model . Calls Ċ import Ġcom . github . t us arr 1 0 . track me . utils . Const Fun . run Thread Ċ import Ġcom . github . t us arr 1 0 . track me . utils . Const Fun . convert Current Duration Ċ import Ġcom . p aw eg io . k android . long Toast Ċ import Ġk ot ter knife . bind View Ċ import Ġjava . io . File Ċ import Ġjava . io . FileNotFoundException Ċ import Ġandroid . media . Audio Manager Ċ import Ġcom . github . t us arr 1 0 . track me . utils . Consts . TYPE _ CALL _ IN COM ING Ċ import Ġcom . github . t us arr 1 0 . track me . utils . Consts . TYPE _ CALL _ OUT GO ING Ċ import Ġcom . p aw eg io . k android . hide Ċ import Ġcom . p aw eg io . k android . show Ċ import Ġcom . rom anch a . play pause . Play Pause View Ċ import Ġde . hd od enh of . circle image view . Circle ImageView Ċ import Ġcom . github . t us arr 1 0 . track me . data . preference . Data Share Preference . getSelected Item ĊĊ Ċ /** Ċ Ġ* Ċ Ġ*/ Ċ class ĠCalls ViewHolder ( view : ĠView , Ġval Ġcontext : ĠContext ) Ġ: ĠRecyclerView . ViewHolder ( view ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcontact : ĠTextView Ġby Ġbind View ( R . id . contact _ item _ calls ) ĊĠĠĠ Ġprivate Ġval ĠphoneNumber : ĠTextView Ġby Ġbind View ( R . id . phone _ number _ item _ calls ) ĊĠĠĠ Ġprivate Ġval ĠdateTime : ĠTextView Ġby Ġbind View ( R . id . date _ item _ calls ) ĊĠĠĠ Ġval Ġimage Item : ĠImageView Ġby Ġbind View ( R . id . img _ item _ calls ) ĊĠĠĠ Ġval Ġprogress Call : ĠCircle Progress View Ġby Ġbind View ( R . id . progress _ item _ calls ) ĊĠĠĠ Ġval Ġitem Click : ĠLinearLayout Ġby Ġbind View ( R . id . item _ click _ calls ) ĊĠĠĠ Ġprivate Ġval Ġduration : ĠTextView Ġby Ġbind View ( R . id . duration _ item _ calls ) ĊĠĠĠ Ġprivate Ġval Ġcurrent Duration : ĠTextView Ġby Ġbind View ( R . id . current _ duration _ item _ calls ) ĊĠĠĠ Ġprivate Ġval Ġimg Call Type Ġ: ĠImageView Ġby Ġbind View ( R . id . img _ type _ call ) ĊĠĠĠ Ġval Ġbtn Play : ĠPlay Pause View Ġby Ġbind View ( R . id . play _ button _ calls ) ĊĠĠĠ Ġprivate Ġval Ġseek Bar Progress Ġ: ĠSeek Bar Ġby Ġbind View ( R . id . progress _ seek bar _ calls ) ĊĠĠĠ Ġprivate Ġval Ġimg Check Ġ: ĠCircle ImageView Ġby Ġbind View ( R . id . img _ selected _ calls ) ĊĠĠĠ Ġprivate Ġval Ġcard Ġ: Ġandroidx . card view . widget . Card View Ġby Ġbind View ( R . id . card view _ calls ) ĊĊĠĠĠ Ġprivate Ġval Ġaudio Ġ= Ġcontext . getSystem Service ( Context . AUDIO _ SERVICE ) Ġas ĠAudio Manager ĊĊĠĠĠ Ġinternal Ġvar Ġdown loader Ġ: ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġmedia Player : ĠMedia Player ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcurrent Progress Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġrun Threads : ĠThread ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġplaying : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġstop Player : ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġfun Ġis SelectedItem ( key : String , file : File ){ ĊĠĠĠĠĠĠĠ Ġif Ġ( item View . context . getSelected Item ( key )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimg Check . show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn Play . hide () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Item . hide () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard . set Card BackgroundColor ( Context Compat . getColor ( item View . context , R . color . color Selected )) ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard . set Card BackgroundColor ( Context Compat . getColor ( item View . context , R . color . color White )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimg Check . hide () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġset On Play ( true ) Ġelse Ġset On Play ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbind ( item : ĠCalls ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprogress Call . max Value Ġ= Ġ 1 0 0 f ĊĠĠĠĠĠĠĠ Ġcontact . text Ġ= Ġitem . contact ĊĠĠĠĠĠĠĠ ĠphoneNumber . text Ġ= Ġitem . phoneNumber ĊĠĠĠĠĠĠĠ ĠdateTime . text Ġ= Ġitem . dateTime ĊĠĠĠĠĠĠĠ Ġduration . text Ġ= Ġitem . duration ĊĠĠĠĠĠĠĠ Ġif Ġ( item . type == ĠTYPE _ CALL _ OUT GO ING ) Ġimg Call Type . setImage Resource ( R . drawable . ic _ made _ green _ 2 4 dp ) ĊĠĠĠĠĠĠĠ Ġif Ġ( item . type == ĠTYPE _ CALL _ IN COM ING ) Ġimg Call Type . setImage Resource ( R . drawable . ic _ received _ blue _ 2 4 dp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Playing (): ĠBoolean Ġ= Ġplaying ĊĠĠĠ Ġfun Ġget Stop Player (): ĠBoolean Ġ= Ġstop Player ĊĊĠĠĠ Ġfun Ġinitialize MediaPlayer ( fileName : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player Ġ= ĠMedia Player . create ( context , ĠUri . from File ( File ( fileName ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player !!. setOn Completion Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Stop Audio Call () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . long Toast ( e . message . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Play Audio Call () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Volume Ġ= Ġaudio . get Stream Volume ( Audio Manager . STREAM _ M US IC ) ĊĠĠĠĠĠĠĠ Ġif Ġ( current Volume Ġ== Ġ 0 ) Ġcontext . long Toast ( R . string . volume _ up ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( media Player Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn Play . toggle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Max Progress ( media Player !!. duration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player !!. start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaying Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Player Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Progress Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetCurrent Progress () ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Pause Audio Call () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( media Player Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player !!. pause () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn Play . toggle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaying Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Player Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Stop Audio Call () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( media Player Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Progress Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Current Progress () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player !!. stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player !!. release () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! btn Play . on Playing ()) Ġbtn Play . toggle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Progress Value ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaying Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Player Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset On Play ( on Play : Boolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( on Play ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Item . hide () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn Play . show () ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Item . show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn Play . hide () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Max Progress ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġseek Bar Progress . progress Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġseek Bar Progress . max Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġseek Bar Progress . setOn Seek Bar ChangeListener ( object Ġ: ĠSeek Bar . On Seek Bar ChangeListener { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress Changed ( seek Bar : ĠSeek Bar ?, Ġprogress : ĠInt , Ġfrom User : ĠBoolean ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart Tracking Touch ( seek Bar : ĠSeek Bar ?) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop Tracking Touch ( seek Bar : ĠSeek Bar ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseek ( seek Bar Progress . progress ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġseek ( position : Int ){ ĊĠĠĠĠĠĠĠ Ġif Ġ( media Player != null ) Ġmedia Player !!. seek To ( position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Progress Value ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Duration . text Ġ= Ġconvert Current Duration ( value . to Long ()) ĊĠĠĠĠĠĠĠ Ġseek Bar Progress . progress Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetCurrent Progress () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Threads Ġ= Ġrun Thread ( 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Progress ) Ġif Ġ( media Player Ġ!= Ġnull ) Ġset Progress Value ( media Player !!. current Position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun Threads !!. start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Current Progress () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( run Threads Ġ!= Ġnull ) Ġrun Threads !!. interrupt () ĊĠĠĠ Ġ} Ċ Ċ }