package Ġcom . okit oki . ok chat . ui . sign Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Sender . Send Intent Exception Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . view . View Ċ import Ġandroidx . annotation . Layout Res Ċ import Ġandroidx . datastore . DataStore Ċ import Ġandroidx . datastore . preferences . Preferences Ċ import Ġandroidx . datastore . preferences . create DataStore Ċ import Ġandroidx . datastore . preferences . edit Ċ import Ġandroidx . datastore . preferences . preferences Key Ċ import Ġcom . google . android . ex op layer 2 . Player . REPEAT _ MODE _ ALL Ċ import Ġcom . google . android . ex op layer 2 . Simple Exo Player Ċ import Ġcom . google . android . ex op layer 2 . source . Media Source Ċ import Ġcom . google . android . ex op layer 2 . source . Progress ive Media Source Ċ import Ġcom . google . android . ex op layer 2 . upstream . Default DataSource Factory Ċ import Ġcom . google . android . ex op layer 2 . upstream . Default Http DataSource Factory Ċ import Ġcom . google . android . ex op layer 2 . upstream . Raw Resource DataSource Ċ import Ġcom . google . android . ex op layer 2 . util . Util Ċ import Ġcom . google . android . gms . auth . api . Auth Ċ import Ġcom . google . android . gms . auth . api . credentials . Credential Ċ import Ġcom . google . android . gms . auth . api . credentials . Credentials Options Ċ import Ġcom . google . android . gms . auth . api . credentials . Hint Request Ċ import Ġcom . google . android . gms . auth . api . phone . Sms Retriever Ċ import Ġcom . google . android . gms . common . api . Google ApiClient Ċ import Ġcom . mike pen z . about libraries . Lib s Builder Ċ import Ġcom . okit oki . ok chat . R Ċ import Ġcom . okit oki . ok chat . databinding . Activity Login Binding Ċ import Ġcom . okit oki . ok chat . ui . base . Base Activity Ċ import Ġcom . or h ano but . logger . Logger Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġorg . k oin . android x . view model . ext . android . get ViewModel ĊĊ Ċ /** Ċ Ġ* ĠCreated Ġby Ġok c Ġon Ġ 2 0 1 9 - 0 4 - 0 1 . Ċ Ġ*/ Ċ class ĠLogin Activity Ġ: ĠBase Activity < Activity Login Binding >() Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġplayer : ĠSimple Exo Player ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġplay When Ready Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġcurrent Window Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġplayback Position Ġ= Ġ 0 L ĊĊĠĠĠ Ġlateinit Ġvar Ġm Google ApiClient Ġ: ĠGoogle ApiClient ĊĊĠĠĠ Ġ@ Layout Res ĊĠĠĠ Ġoverride Ġfun Ġget Layout Res Id () Ġ= ĠR . layout . activity _ login ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding . vm Ġ= Ġget ViewModel () ĊĠĠĠĠĠĠĠ Ġbinding . lifecycle Owner Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġbinding . ac it iv ty Ġ= Ġthis ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ ĠData Store Ġwith ĠFlow ĠExample ĊĠĠĠĠĠĠĠĠ Ġ*/ Ċ // ĠĠĠĠĠĠĠ ĠCor outine Scope ( Main ). launch Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġread Pref DataStore () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġincrement Counter Pref DataStore () Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġread Proto DataStore () Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġregist SMS Retriever () ĊĊĠĠĠĠĠĠĠ Ġget Signature () ĊĊĠĠĠĠĠĠĠ Ġin in Google API () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Signature () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsignature Helper Ġ= ĠApp Signature Helper ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġapp Signatures Ġ= Ġsignature Helper . app Signatures ĊĠĠĠĠĠĠĠ ĠLogger . d ("[ SMS ] Ġapp Sign att ure Ġ= Ġ" Ġ+ Ġapp Signatures [ 0 ]) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġregist SMS Retriever (){ ĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠS ms Retriever . getClient ( this Ġ/* Ġcontext Ġ*/) ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġclient . start Sms Retriever () ĊĠĠĠĠĠĠĠ Ġtask . add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSuccessfully Ġstarted Ġretrie ver , Ġexpect Ġbroadcast Ġintent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d ("[ SMS ] Ġadd On Success Listener Ġ$ it ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtask . add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFailed Ġto Ġstart Ġretrie ver , Ġinspect ĠException Ġfor Ġmore Ġdetails ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ... ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d ("[ SMS ] Ġadd On Failure Listener Ġ$ it ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠìĿ´ ê± ´ ĠìķĪ ëĲĺëĬĶ ê²ĥ Ġê°Ļ ëĭ¤ . Ġ ã ħ ł , ã ħ ł Ġê² Į ëĭ¤ ê°Ģ ĠDeprecated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġin in Google API () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġm Google ApiClient Ġ= ĠGoogle ApiClient . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Connection Callbacks ( object Ġ: ĠGoogle ApiClient . Connection Callbacks Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Connected ( bundle : ĠBundle ?) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Connection Sus pended ( i : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. enable Auto Manage ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Api ( Auth . CRED ENTIAL S _ API ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġm Google ApiClient . connect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠonClick Phone Test ( view : ĠView ){ Ċ // ĠĠĠĠĠĠĠ Ġget Ph on Number Test () Ċ // ĠĠĠĠĠĠĠ Ġpicker Test () ĊĠĠĠĠĠĠĠ Ġabout Libraries Test () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġabout Libraries Test (){ ĊĠĠĠĠĠĠĠ ĠLib s Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Activity Title (" ìĺ¤ íĶ Ī ìĨĮ ìĬ¤ Ġíħ Į ìĬ¤ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with About AppName ( getString ( R . string . app _ name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with About Icon Shown ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with About Version Shown ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Auto Detect ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with License Shown ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. start ( this ) Ġ// Ġstart Ġthe Ġactivity ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpicker Test (){ ĊĠĠĠĠĠĠĠ Ġval Ġpick Photo Ġ= ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ P ICK , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Images . Media . EXTERNAL _ CONTENT _ URI ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( pick Photo , Ġ 2 0 0 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ Ġê¸° ê¸° ë³Ħ ë¡ľ ĠìķĪ ëĲĺ ê¸° ëıĦ Ġíķĺ ê³ł ĠëĲĺ ê¸° ëıĦ Ġíķĺ ê³ł ĠìĿ¼ ëĭ¨ Ġìĭ¤ íĮ ¨ íĸĪ ìĿĮ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Ph on Number Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhint Request Ġ= ĠHint Request . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set PhoneNumber Identifier Supported ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠCredentials Options . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. force Enable Save Dialog () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () Ċ Ċ // ĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠCredentials . getClient ( this , Ġoptions ). get Hint Picker Intent ( hint Request ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġintent : ĠPending Intent Ġ= Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠCredentials . getClient ( this ). get Hint Picker Intent ( hint Request ) ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠAuth . Credentials Api . get Hint Picker Intent ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Google ApiClient , Ġhint Request ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Intent Sender For Result ( intent . intent Sender , Ġ 1 0 1 0 2 , Ġnull , Ġ 0 , Ġ 0 , Ġ 0 , ĠBundle ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSend Intent Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d ("[ Auth Google ] ĠSend Intent Exception Ġ$ e ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Hint PhoneNumber () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhint Request Ġ= ĠHint Request . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set PhoneNumber Identifier Supported ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġm Intent Ġ= ĠAuth . Credentials Api . get Hint Picker Intent ( m Google ApiClient , Ġhint Request ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Intent Sender For Result ( m Intent . intent Sender , Ġ 1 0 1 0 2 , Ġnull , Ġ 0 , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSend Intent Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ ĠLogger . d ("[ Auth Google ] Ġon Activity Result ĠresultCode Ġ$ result Code Ġ/ Ġ= Ġ$ data ") ĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 1 0 2 Ġ-> ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠObtain Ġthe Ġphone Ġnumber Ġfrom Ġthe Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠRESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcredential : ĠCredential Ġ= Ġdata ?. get Parcelable Extra ( Credential . EXTRA _ KEY ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcredential . getId (); Ġ Ġ<-- Ġwill Ġneed Ġto Ġprocess Ġphone Ġnumber Ġstring ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d ("[ Auth Google ] Ġcredential Ġ= Ġ$ credential ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġread Pref DataStore () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Store : ĠData Store < Preferences > Ġ= Ġcreate DataStore ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" settings " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġcounter _ test Ġ= Ġpreferences Key < Int >(" counter _ test ") ĊĠĠĠĠĠĠĠ Ġval Ġexample Counter Flow : ĠFlow < Int > Ġ= Ġdata Store . data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġpreferences Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġtype Ġsafety . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences [ counter _ test ] Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġincrement Counter Pref DataStore (){ ĊĠĠĠĠĠĠĠ Ġval Ġdata Store : ĠData Store < Preferences > Ġ= Ġcreate DataStore ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" settings " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġcounter _ test Ġ= Ġpreferences Key < Int >(" counter _ test ") ĊĊĠĠĠĠĠĠĠ Ġdata Store . edit Ġ{ Ġsettings Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Counter Value Ġ= Ġsettings [ counter _ test ] Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings [ counter _ test ] Ġ= Ġcurrent Counter Value Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ // ĠĠĠ Ġobject ĠSettings Serializer Ġ: ĠSerializer < Settings > Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġoverride Ġfun Ġread From ( input : ĠInputStream ): ĠSettings Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSettings . parseFrom ( input ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠInvalid ProtocolBufferException ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCor ruption Exception (" Cannot Ġread Ġproto .", Ġexception ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġoverride Ġfun ĠwriteTo ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġt : ĠSettings , Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġoutput : ĠOutputStream Ċ // ĠĠĠĠĠĠĠ Ġ) Ġ= Ġt . writeTo ( output ) Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġval Ġsettings DataStore : ĠData Store < Settings > Ġ= Ġcontext . create DataStore ( Ċ // ĠĠĠĠĠĠĠ ĠfileName Ġ= Ġ" settings . pb ", Ċ // ĠĠĠĠĠĠĠ Ġserializer Ġ= ĠSettings Serializer Ċ // ĠĠĠ Ġ) Ċ // Ċ // ĠĠĠ Ġsuspend Ġfun Ġread Proto DataStore () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġsettings DataStore . update Data Ġ{ Ġcurrent Settings Ġ-> Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Settings . to Builder () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Example Counter ( current Settings . example Counter Ġ+ Ġ 1 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġinit After Binding () Ġ{ Ċ Ċ // ĠĠĠĠĠĠĠ Ġshow Loading () Ċ Ċ // ĠĠĠĠĠĠĠ ĠHandler (). post Delayed ({ Ġhide Loading () Ġ}, Ġ 8 0 0 0 L ) ĊĊĠĠĠĠĠĠĠ Ġinitialize Player () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize Player (){ ĊĠĠĠĠĠĠĠ Ġif ( player Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Ġ= ĠSimple Exo Player . Builder ( application Context ). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . pv Ex op layer . player Ġ= Ġplayer ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġvar Ġvideo _ url : String Ġ= Ġ"{ url }" ĊĠĠĠĠĠĠĠ Ġ// Ġvar Ġmedia Source : ĠMedia Source Ġ= Ġbuild Media Source ( Uri . parse ( video _ url )) ĊĠĠĠĠĠĠĠ Ġvar Ġuri Ġ= ĠRaw Resource DataSource . build Raw Resource Uri ( R . raw . on boarding ) ĊĠĠĠĠĠĠĠ Ġvar Ġmedia Source : ĠMedia Source Ġ= Ġbuild Media Source ( uri ) ĊĊĠĠĠĠĠĠĠ Ġ// ì¤Ģ ë¹Ħ Ċ // ĠĠĠĠĠĠĠ Ġplayer !!. seek To ( current Window , Ġplayback Position ) ĊĠĠĠĠĠĠĠ Ġplayer ?. prepare ( media Source , Ġtrue , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġplayer ?. play When Ready Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġplayer ?. repeat Mode Ġ= ĠRE PEAT _ MODE _ ALL ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Media Source ( uri : ĠUri ) Ġ: ĠMedia Source { ĊĠĠĠĠĠĠĠ Ġvar Ġuser Agent : String Ġ= ĠUtil . getUser Agent ( this , ĠpackageName ) ĊĠĠĠĠĠĠĠ Ġif ( uri . last Path Segment ?. contains (" mp 3 ") Ġ== Ġtrue Ġ|| Ġuri . last Path Segment ?. contains (" mp 4 ") Ġ== Ġtrue ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠProgress ive Media Source . Factory ( Default Http DataSource Factory ( userAgent )). create Media Source ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠ Ġ} else Ġif ( uri . getLast Path Segment (). contains (" m 3 u 8 ")){ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠH ls Media Source . Factory ( Default Http DataSource Factory ( userAgent )). create Media Source ( uri ) ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠProgress ive Media Source . Factory ( Default DataSource Factory ( this , Ġuser Agent )). create Media Source ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrelease Player (){ ĊĠĠĠĠĠĠĠ Ġplayer ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayback Position Ġ= Ġit . current Position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Window Ġ= Ġit . current Window Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay When Ready Ġ= Ġit . play When Ready ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . pv Ex op layer . player Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . release () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġrelease Player () ĊĠĠĠ Ġ} Ċ } Ċ