package Ġcom . roll n code . back t ube . screen Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . arch . lifecycle . Lifecycle . Event . ON _ CREATE Ċ import Ġandroid . arch . lifecycle . Lifecycle . Event . ON _ DESTROY Ċ import Ġandroid . arch . lifecycle . Lifecycle . Event . ON _ PAUSE Ċ import Ġandroid . arch . lifecycle . Lifecycle . Event . ON _ RE SU ME Ċ import Ġandroid . arch . lifecycle . Lifecycle Observer Ċ import Ġandroid . arch . lifecycle . On Lifecycle Event Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build . VERSION Ċ import Ġandroid . os . Build . VERSION _ CODES Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . widget . Toast Ċ import Ġcom . roll n code . back t ube . R Ċ import Ġcom . roll n code . back t ube . logic . Tube State Ċ import Ġcom . roll n code . back t ube . logic . attempt Ċ import Ġcom . roll n code . back t ube . logic . can Draw Overlay s Ċ import Ġcom . roll n code . back t ube . logic . when Debug Ċ import Ġcom . roll n code . back t ube . player . Tube Player Ċ import Ġcom . roll n code . utility . receiver . Objects Receiver Ċ import Ġcom . roll n code . utility . receiver . Receiver Bus Ċ Ċ class ĠT ube Screen Controller ( private Ġval Ġactivity : ĠAppCompatActivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠsavedInstanceState : ĠBundle ?) Ġ: ĊĠĠĠĠĠĠĠ ĠObjects Receiver , ĠLifecycle Observer Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠEX TRA _ INTERNAL Ġ= Ġ" EXTRA _ INTERNAL " ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< A Ġ: ĠActivity > Ġnew Instance ( context : ĠContext , Ġcls : ĠClass < A >): ĠIntent Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( context , Ġcls ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra ( EXTRA _ INTERNAL , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Flags ( Intent . FLAG _ ACTIVITY _ SINGLE _ TOP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Flags ( Intent . FLAG _ ACTIVITY _ CLEAR _ TOP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Flags ( Intent . FLAG _ ACTIVITY _ NEW _ TASK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġevents Ġ= Ġint ArrayOf ( Tube State . OPEN _ Y OUT UBE , ĠT ube State . REQUEST _ OVER DRAW , ĠT ube State . OPEN _ T UBE , ĠT ube State . CLOSE _ APP ) ĊĠĠĠ Ġprivate Ġval Ġrequest Overlay Ġ= Ġ 0 xA ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġactivity . lifecycle . add Observer ( this ) ĊĠĠĠĠĠĠĠ ĠReceiver Bus . subscribe ( this , Ġ* events ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ On Lifecycle Event ( ON _ RE SU ME ) ĊĠĠĠ Ġprivate Ġfun Ġshow Player () Ġ= ĠReceiver Bus . notify ( Tube State . WINDOW _ SHOW ) ĊĊĠĠĠ Ġ@ On Lifecycle Event ( ON _ PAUSE ) ĊĠĠĠ Ġprivate Ġfun Ġhide Player () Ġ= ĠReceiver Bus . notify ( Tube State . WINDOW _ HIDE ) ĊĊĠĠĠ Ġ@ On Lifecycle Event ( ON _ DESTROY ) ĊĠĠĠ Ġprivate Ġfun Ġunsubscribe Events () Ġ= ĠReceiver Bus . unsubscribe ( this , Ġ* events ) ĊĊĠĠĠ Ġ@ On Lifecycle Event ( ON _ CREATE ) ĊĠĠĠ Ġprivate Ġfun Ġwhat Next () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġactivity . intent Ġ?: ĠIntent () ĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠT ube State . current Uri . toString (). isEmpty () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . action Ġ== ĠIntent . ACTION _ MAIN Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ!= Ġnull Ġ&& Ġintent . getBoolean Extra ( EXTRA _ INTERNAL , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT ube State . NOTH ING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT ube State . OPEN _ Y OUT UBE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . can Draw Overlay s ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> ĠT ube State . OPEN _ T UBE ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> ĠT ube State . REQUEST _ OVER DRAW ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠReceiver Bus . notify ( event , Ġintent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Activity Result ( request Code : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== Ġrequest Overlay ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReceiver Bus . notify ( if Ġ( activity . can Draw Overlay s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT ube State . OPEN _ T UBE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT ube State . CLOSE _ APP , Ġactivity . intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Objects Receive ( event : ĠInt , Ġvar arg Ġobjects : ĠAny ) Ġ= Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠ ĠT ube State . OPEN _ T UBE ĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġobjects . first () Ġas ĠIntent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġuri : ĠUri ? Ġ= Ġintent . data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uri Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattempt Ġ{ Ġuri Ġ= ĠUri . parse ( intent . getString Extra ( Intent . EXTRA _ TEXT )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uri Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= ĠT ube State . current Uri ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uri Ġ== Ġnull Ġ|| Ġuri . toString (). isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReceiver Bus . notify ( Tube State . CLOSE _ APP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT ube Player . play ( activity , Ġuri !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠT ube State . CLOSE _ APP ĠĠĠĠĠĠĠ Ġ-> Ġactivity . finish () ĊĠĠĠĠĠĠĠ ĠT ube State . OPEN _ Y OUT UBE ĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġyoutube Ġ= ĠIntent ( Intent . ACTION _ MAIN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Package (" com . google . android . youtube ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Flags ( Intent . FLAG _ ACTIVITY _ NEW _ TASK ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( youtube . resolve Activity ( activity . package Manager ) Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( activity , ĠR . string . no _ youtube , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . startActivity ( youtube ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠReceiver Bus . notify ( Tube State . CLOSE _ APP ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠT ube State . REQUEST _ OVER DRAW Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( VERSION . SDK _ INT Ġ>= ĠVERSION _ CODES . M ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . startActivity For Result ( Intent ( Settings . ACTION _ MANAGE _ OVER LAY _ PERMISSION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse (" package :${ activity . packageName }") ), Ġrequest Overlay ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Debug Ġ{ Ġthrow ĠIllegalStateException () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġwhen Debug Ġ{ Ġthrow ĠIllegalStateException (" Unknown Ġevent : Ġ$ event ") Ġ} ĊĠĠĠ Ġ} Ċ }