package Ġcom . pot y video . library Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Display Metrics Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Button Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . appcompat . widget . AppCompat Button Ċ import Ġandroidx . appcompat . widget . AppCompat Image Button Ċ import Ġcom . google . android . ex op layer 2 . ui . Player View Ċ import Ġcom . pot y video . library . global Enums .* Ċ import Ġcom . pot y video . library . utils . DoubleClick Ċ import Ġjava . lang . StringBuilder Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . pow Ċ import Ġkotlin . math . round ToInt Ċ import Ġkotlin . math . sign ĊĊ Ċ abstract Ġclass ĠAnd Exo Player Root Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġattribute Set : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠ Ġdef Style Attr : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠLinearLayout ( context , Ġattribute Set , Ġdef Style Attr ) Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġscreen Config : ĠScreen Config ĊĠĠĠ Ġprivate Ġvar Ġinfl ated View : ĠView Ġ= Ġinf late ( context , ĠR . layout . layout _ player _ base _ kotlin , Ġthis ) ĊĊĠĠĠ Ġcompanion Ġobject { ĊĠĠĠĠĠĠĠ Ġprivate Ġ Ġval ĠTAG Ġ= ĠAnd Exo Player Root :: class . java . simple Name ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġplayer View : ĠPlayer View ĊĠĠĠ Ġvar Ġretry View : ĠLinearLayout ĊĠĠĠ Ġvar Ġretry View Title : ĠTextView ĊĠĠĠ Ġvar Ġretry Button : ĠButton ĊĠĠĠ Ġvar Ġbackward View : ĠAppCompat Button ĊĠĠĠ Ġvar Ġforward View : ĠAppCompat Button ĊĠĠĠ Ġvar Ġmute : ĠAppCompat Image Button ĊĠĠĠ Ġvar Ġun Mute : ĠAppCompat Image Button ĊĠĠĠ Ġvar Ġsetting Container : ĠFrame Layout ĊĠĠĠ Ġvar Ġseek Text : ĠTextView ĊĠĠĠ Ġvar Ġcontainer : ĠView ĊĊĠĠĠ Ġabstract Ġvar Ġcustom ClickListener : ĠDouble Click ĊĊĠĠĠ Ġvar Ġcurr AspectRatio : ĠEnum AspectRatio Ġ= ĠEnum AspectRatio . AS PECT _ 1 6 _ 9 ĊĠĠĠ Ġvar Ġcurr Repeat Mode : ĠEnum Repeat Mode Ġ= ĠEnum Repeat Mode . REPEAT _ OFF ĊĠĠĠ Ġvar Ġcurr Player Size : ĠEnum Player Size Ġ= ĠEnum Player Size . EX ACT LY ĊĠĠĠ Ġvar Ġcurr Resize Mode : ĠEnum Resize Mode Ġ= ĠEnum Resize Mode . FILL ĊĠĠĠ Ġvar Ġcurr Mute : ĠEnum Mute Ġ= ĠEnum Mute . UN M UTE ĊĠĠĠ Ġvar Ġcurr Playback Speed : ĠEnum Playback Speed Ġ= ĠEnum Playback Speed . NORMAL ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdm Ġ= Ġcontext . resources . display Metrics ĊĠĠĠĠĠĠĠ Ġval Ġy Range Ġ= Ġdm . width Pixels . coerce At Most ( dm . height Pixels ) ĊĠĠĠĠĠĠĠ Ġval Ġx Range Ġ= Ġdm . width Pixels . coerce At Least ( dm . height Pixels ) ĊĠĠĠĠĠĠĠ Ġscreen Config Ġ= ĠScreen Config ( dm , Ġx Range , Ġy Range , Ġresources . configuration . orientation ) ĊĠĠĠĠĠĠĠ Ġ// Ġviews ĊĠĠĠĠĠĠĠ Ġplayer View Ġ= Ġinfl ated View . findViewById ( R . id . player View ) ĊĠĠĠĠĠĠĠ Ġretry View Ġ= Ġinfl ated View . findViewById ( R . id . retry _ view ) ĊĠĠĠĠĠĠĠ Ġbackward View Ġ= Ġinfl ated View . findViewById ( R . id . exo _ backward ) ĊĠĠĠĠĠĠĠ Ġforward View Ġ= Ġinfl ated View . findViewById ( R . id . exo _ forward ) ĊĠĠĠĠĠĠĠ Ġretry View Title Ġ= Ġretry View . findViewById ( R . id . textView _ retry _ title ) ĊĠĠĠĠĠĠĠ Ġretry Button Ġ= Ġretry View . findViewById ( R . id . button _ try _ again ) ĊĠĠĠĠĠĠĠ Ġmute Ġ= Ġplayer View . findViewById ( R . id . exo _ mute ) ĊĠĠĠĠĠĠĠ Ġun Mute Ġ= Ġplayer View . findViewById ( R . id . exo _ un mute ) ĊĠĠĠĠĠĠĠ Ġsetting Container Ġ= Ġplayer View . findViewById ( R . id . container _ setting ) ĊĠĠĠĠĠĠĠ Ġseek Text Ġ= Ġinfl ated View . findViewById ( R . id . time Forward ) ĊĠĠĠĠĠĠĠ Ġcontainer Ġ= Ġinfl ated View . findViewById ( R . id . container ) ĊĠĠĠĠĠĠĠ Ġseek Text . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ// Ġlisteners ĊĠĠĠĠĠĠĠ Ġinit Listeners () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġretry Button . setOnClickListener ( custom ClickListener ) ĊĠĠĠĠĠĠĠ Ġbackward View . setOnClickListener ( custom ClickListener ) ĊĠĠĠĠĠĠĠ Ġforward View . setOnClickListener ( custom ClickListener ) ĊĠĠĠĠĠĠĠ Ġmute . setOnClickListener ( custom ClickListener ) ĊĠĠĠĠĠĠĠ Ġun Mute . setOnClickListener ( custom ClickListener ) ĊĠĠĠĠĠĠĠ Ġplayer View . setOn Touch Listener ( object Ġ: ĠOn Touch Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdistance : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġinit Touch Y Ġ: ĠFloat Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtouch Y Ġ: ĠFloat Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġinit Touch X Ġ: ĠFloat Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtouch X Ġ: ĠFloat Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Touch ( v : ĠView ?, Ġevent : ĠMotion Event ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Changed Ġ= Ġif Ġ( touch X Ġ!= Ġ- 1 f Ġ&& Ġtouch Y Ġ!= Ġ- 1 f ) Ġevent . x Ġ- Ġtouch X Ġelse Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Changed Ġ= Ġif Ġ( touch X Ġ!= Ġ- 1 f Ġ&& Ġtouch Y Ġ!= Ġ- 1 f ) Ġevent . y Ġ- Ġtouch Y Ġelse Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcoef Ġis Ġthe Ġgradient 's Ġmove Ġto Ġdetermine Ġa Ġneutral Ġzone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcoef Ġ= Ġabs ( y Changed Ġ/ Ġx Changed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx gesture size Ġ= Ġx Changed Ġ/ Ġscreen Config . metrics . xd pi Ġ* Ġ 2 . 5 4 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Y Ġ= Ġ(( abs ( init Touch Y Ġ- Ġevent . y ) Ġ/ Ġscreen Config . metrics . xd pi Ġ+ Ġ 0 . 5 f ) Ġ* Ġ 2 f ). coerce At Least ( 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . action Ġ Ġ== Ġ( Motion Event . ACTION _ DOWN )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistance Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Touch Y Ġ= Ġevent . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Touch X Ġ= Ġevent . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Y Ġ= Ġinit Touch Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch X Ġ= Ġevent . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . action Ġ Ġ== ( Motion Event . ACTION _ MOVE )) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Seek Touch ( delta Y . round ToInt (), Ġx gesture size , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( event . action Ġ Ġ== ( Motion Event . ACTION _ UP )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseek Text . setText (" 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Seek Touch ( delta Y . round ToInt (), Ġx gesture size , Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseek Text . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĠĠĠĠ Ġfun Ġhide Info () Ġ{ ĊĠĠĠĠĠĠĠĠ Ġseek Text . visibility Ġ= ĠView . GONE ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġshow Info ( text Ġ: ĠString ){ ĊĠĠĠĠĠĠĠ Ġseek Text . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġseek Text . setText ( text ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġabstract Ġfun Ġdo Seek Touch ( coef : ĠInt , Ġgesture size : ĠFloat , Ġseek : ĠBoolean ) ĊĊĠĠĠ Ġprotected Ġfun Ġshow Retry View () Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Retry View ( null ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġshow Retry View ( retry Title : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġretry View . visibility Ġ= ĠVIS IBLE ĊĊĠĠĠĠĠĠĠ Ġif Ġ( retry Title Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretry View Title . text Ġ= Ġretry Title ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġhide Retry View () Ġ{ ĊĠĠĠĠĠĠĠ Ġretry View . visibility Ġ= ĠG ONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġshow Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġhide Retry View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġhide Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġhide Retry View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġshow Controller () Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer View . show Controller () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġhide Controller () Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer View . hide Controller () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġshow Un Mute Button () Ġ{ ĊĠĠĠĠĠĠĠ Ġmute . visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠ Ġun Mute . visibility Ġ= ĠVIS IBLE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġshow Mute Button () Ġ{ ĊĠĠĠĠĠĠĠ Ġmute . visibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠ Ġun Mute . visibility Ġ= ĠG ONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun ĠsetShow Setting ( show Setting : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( show Setting ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetting Container . visibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetting Container . visibility Ġ= ĠG ONE ĊĠĠĠ Ġ} Ċ Ċ } Ċ data Ġclass ĠScreen Config ( val Ġmetrics : ĠDisplay Metrics , Ġval Ġx Range : ĠInt , Ġval Ġy Range : ĠInt , Ġval Ġorientation : ĠInt )