package Ġcom . video . trim mer . view Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . media . Media Metadata Retriever Ċ import Ġandroid . net . Uri Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Long Sparse Array Ċ import Ġandroid . view . View Ċ import Ġcom . video . trim mer . R Ċ import Ġcom . video . trim mer . utils . Background Executor Ċ import Ġcom . video . trim mer . utils . Ui Thread Executor Ċ import Ġkotlin . math . ceil Ċ Ċ class ĠTime Line View Ġ@ Jvm Over loads Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet , Ġdef Style Attr : ĠInt Ġ= Ġ 0 ) Ġ: ĠView ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġm Video Uri : ĠUri ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Height View : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Bitmap List : ĠLong Sparse Array < Bitmap >? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Height View Ġ= Ġcontext . resources . get Dimension Pixel Offset ( R . dim en . frames _ video _ height ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmin W Ġ= Ġpadding Left Ġ+ Ġpadding Right Ġ+ Ġsuggested Minimum Width ĊĠĠĠĠĠĠĠ Ġval Ġw Ġ= Ġresolve Size And State ( min W , Ġwidth Measure Spec , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġmin H Ġ= Ġpadding Bottom Ġ+ Ġpadding Top Ġ+ Ġm Height View ĊĠĠĠĠĠĠĠ Ġval Ġh Ġ= Ġresolve Size And State ( min H , Ġheight Measure Spec , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġset Measured Dimension ( w , Ġh ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Size Changed ( w : ĠInt , Ġh : ĠInt , Ġold W : ĠInt , Ġold H : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Size Changed ( w , Ġh , Ġold W , Ġold H ) ĊĠĠĠĠĠĠĠ Ġif Ġ( w Ġ!= Ġold W ) Ġget Bitmap ( w ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Bitmap ( view Width : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠBackground Executor . execute ( object Ġ: ĠBackground Executor . Task ("", Ġ 0 L , Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthreshold Ġ= Ġ 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthumbnail List Ġ= ĠLong Sparse Array < Bitmap >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Metadata Retriever Ġ= ĠMedia Metadata Retriever () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Metadata Retriever . set DataSource ( context , Ġm Video Uri ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvideo Duration Ġ= Ġmedia Metadata Retriever . extract Metadata ( Media Metadata Retriever . METADATA _ KEY _ DURATION )?. toInt () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvideo Length In Ms Ġ= Ġ( video Duration Ġ* Ġ 1 0 0 0 ). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġframe Height Ġ= Ġm Height View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitial Bitmap Ġ= Ġmedia Metadata Retriever . get Frame At Time ( 0 , ĠMedia Metadata Retriever . OPTION _ CLOSE ST _ SYNC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġframe Width Ġ= Ġ(( initial Bitmap !!. width . toFloat () Ġ/ Ġinitial Bitmap . height . toFloat ()) Ġ* Ġframe Height . toFloat ()). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnum Thumb s Ġ= Ġceil (( view Width . toFloat () Ġ/ Ġframe Width )). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( num Thumb s Ġ< Ġthreshold ) Ġnum Thumb s Ġ= Ġthreshold ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcrop Width Ġ= Ġview Width Ġ/ Ġthreshold ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinterval Ġ= Ġvideo Length In Ms Ġ/ Ġnum Thumb s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġnum Thumb s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbitmap Ġ= Ġmedia Metadata Retriever . get Frame At Time ( i Ġ* Ġinterval , ĠMedia Metadata Retriever . OPTION _ CLOSE ST _ SYNC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bitmap Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Ġ= ĠBitmap . create Scaled Bitmap ( bitmap , Ġframe Width , Ġframe Height , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Ġ= ĠBitmap . create Bitmap ( bitmap , Ġ 0 , Ġ 0 , Ġcrop Width , Ġbitmap . height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthumbnail List . put ( i . to Long (), Ġbitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Metadata Retriever . release () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Bit maps ( thumbnail List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . getDefault Un caught ExceptionHandler (). unc a ught Exception ( Thread . currentThread (), Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreturn Bit maps ( thumbnail List : ĠLong Sparse Array < Bitmap >) Ġ{ ĊĠĠĠĠĠĠĠ ĠUi Thread Executor . run Task ("", ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bitmap List Ġ= Ġthumbnail List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ}, Ġ 0 L ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġif Ġ( m Bitmap List Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . save () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ( m Bitmap List ?. size () Ġ?: Ġ 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= Ġm Bitmap List ?. get ( i . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bitmap Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Bitmap ( bitmap , Ġx . toFloat (), Ġ 0 f , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ+= Ġbitmap . width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Video ( data : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Video Uri Ġ= Ġdata ĊĠĠĠ Ġ} Ċ } Ċ