package Ġn stu . av t 7 1 6 . et ro sh k ova . dip lom . presentation . main Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Service Connection Ċ import Ġandroid . media . projection . Media Projection Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . Menu Inflater Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġir . so h re co . android file cho oser . External Storage Not Available Exception Ċ import Ġir . so h re co . android file cho oser . FileChooser Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġm oxy . M vp AppCompatActivity Ċ import Ġm oxy . presenter . Inject Presenter Ċ import Ġm oxy . presenter . Provide Presenter Ċ import Ġn stu . av t 7 1 6 . et ro sh k ova . dip lom . R Ċ import Ġn stu . av t 7 1 6 . et ro sh k ova . dip lom . presentation . delegate . Ad Delegate Ċ import Ġn stu . av t 7 1 6 . et ro sh k ova . dip lom . presentation . delegate . Permission Delegate Ċ import Ġn stu . av t 7 1 6 . et ro sh k ova . dip lom . presentation . delegate . Toast Delegate Ċ import Ġn stu . av t 7 1 6 . et ro sh k ova . dip lom . presentation . information . Information Activity Ċ import Ġn stu . av t 7 1 6 . et ro sh k ova . dip lom . presentation . service . Record Service Ċ import Ġtoo th pick . T ooth pick Ċ Ċ class ĠMainActivity Ġ: ĠM vp AppCompatActivity (), ĠMain View Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġpermission Delegate Ġby Ġlazy Ġ{ ĠPermission Delegate ( this ) Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġad Delegate Ġby Ġlazy Ġ{ ĠAd Delegate ( this ) Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtoast Delegate Ġby Ġlazy Ġ{ ĠToast Delegate ( this ) Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġprojection : ĠMedia Projection ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġrecord Service : ĠRecord Service ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar ĠresultCode : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġdata : ĠIntent ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġconnection Ġ= Ġobject Ġ: ĠService Connection Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Disconnected ( name : ĠComponent Name ?) Ġ{} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Connected ( name : ĠComponent Name ?, Ġservice : ĠI Binder ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinder Ġ= Ġservice Ġas ĠRecord Service . Record Binder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecord Service Ġ= Ġbinder . record Service ĊĠĠĠĠĠĠĠĠĠĠĠ ĠresultCode ?. let Ġ{ Ġcode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ Ġdata Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecord Service ?. projection Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Delegate . build Media Projection ( code , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġusb Permissions Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . FO REG ROUND _ SERVICE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . READ _ EXTERNAL _ STORAGE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġwifi Permissions Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . FO REG ROUND _ SERVICE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . READ _ EXTERNAL _ STORAGE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ WIFI _ STATE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġaudio Permissions Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . RECORD _ AUDIO ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Inject Presenter ĊĠĠĠ Ġlateinit Ġvar Ġpresenter : ĠMain Presenter ĊĊĠĠĠ Ġ@ Provide Presenter ĊĠĠĠ Ġfun Ġprovide Presenter (): ĠMain Presenter Ġ= ĊĠĠĠĠĠĠĠ ĠT ooth pick . open Scopes (" App "). getInstance ( Main Presenter :: class . java ) ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġstop Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . disconnect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwifi TextView . text Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġusb Connect Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . handle Usb Connection () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwifi Connect Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . handle IP Connection () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaudio CheckBox . setOn Checked ChangeListener Ġ{ Ġ_, Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . allow Audio Record ( isChecked ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvideo CheckBox . setOn Checked ChangeListener Ġ{ Ġ_, Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . allow Save Video ( isChecked ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsend Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow FileChooser () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġobserve State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠPermission Delegate . MEDIA _ PRO JECTION _ CODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . notify Screen Projection Granted ( result Code , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . notify Screen Projection Denied () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < out ĠString >, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠPermission Delegate . PERMISSION _ CODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( permission Delegate . is Permissions Granted ( grant Results )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . notify Permissions Granted () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . notify Permission Denied () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrequest USB Permissions ( is Audio Record Allowed : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpermission Delegate . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusb Permissions Ġ+ Ġif Ġ( is Audio Record Allowed ) Ġaudio Permissions Ġelse ĠarrayOf () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrequest Wifi Permissions ( is Audio Record Allowed : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpermission Delegate . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwifi Permissions Ġ+ Ġif Ġ( is Audio Record Allowed ) Ġaudio Permissions Ġelse ĠarrayOf () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrequest Audio Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġpermission Delegate . request Permissions ( audio Permissions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrequest Screen Projection () Ġ{ ĊĠĠĠĠĠĠĠ Ġpermission Delegate . request Media Projection () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshow Error ( error : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtoast Delegate . show Toast ( error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart Service ( result Code : ĠInt , Ġdata : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠRecord Service :: class . java ) ĊĠĠĠĠĠĠĠ Ġintent . action Ġ= ĠREC ORD _ START _ KEY ĊĠĠĠĠĠĠĠ Ġstart Service ( intent ) ĊĠĠĠĠĠĠĠ Ġthis . result Code Ġ= ĠresultCode ĊĠĠĠĠĠĠĠ Ġthis . data Ġ= Ġdata ĊĠĠĠĠĠĠĠ Ġ// projection Ġ= Ġpermission Delegate . build Media Projection ( result Code , Ġdata ) ĊĠĠĠĠĠĠĠ Ġbind Service ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( this , ĠRecord Service :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext . BIND _ AUTO _ CREATE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġapply Audio Settings ( is Audio Record Allowed : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġaudio CheckBox . isChecked Ġ= Ġis Audio Record Allowed ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġapply Video Settings ( is Save Video Allowed : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvideo CheckBox . isChecked Ġ= Ġis Save Video Allowed ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstop Service () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun bind Service ( connection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠRecord Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . action Ġ= ĠREC ORD _ STOP _ KEY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Service ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġad Delegate . load Ad () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinflater : ĠMenu Inflater Ġ= Ġmenu Inflater ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . main _ menu , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . settings Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . open Information () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file Chooser Container . visibility Ġ== ĠView . VISIBLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Chooser Container . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve State () Ġ{ ĊĠĠĠĠĠĠĠ Ġpresenter . wifi Data . observe ( this , Ġwifi Observer ) ĊĠĠĠĠĠĠĠ Ġpresenter . loading State . observe ( this , Ġloading Observer ) ĊĠĠĠĠĠĠĠ Ġpresenter . information Event . observe ( this , Ġinformation Observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġwifi Observer ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠObserver < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwifi TextView . text Ġ= ĠgetString ( R . string . info _ wifi , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġloading Observer ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠObserver < Boolean > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading View . visibility Ġ= Ġif Ġ( it ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġinformation Observer ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠObserver < Boolean > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( this , ĠInformation Activity :: class . java )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow FileChooser () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Chooser . Builder ( FileChooser . Chooser Type . FILE _ CH OO SER , ĠFile Chooser . Chooser Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . send File ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Chooser Container . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Select Multiple Files ButtonText (" Choose ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Select Multiple Files Button Background ( R . drawable . shape _ rect _ white ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set List Items TextColor ( R . color . color Primary ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Previous Directory Button Icon ( R . drawable . ic _ prev _ dir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Directory Icon ( R . drawable . ic _ folder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set File Icon ( R . drawable . ic _ file ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Chooser Fragment Ġ= Ġbuilder . build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġsupport FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . replace ( R . id . file Chooser Container , Ġfile Chooser Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Chooser Container . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠExternal Storage Not Available Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠREC ORD _ START _ KEY Ġ= Ġ" 1 0 0 3 " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠREC ORD _ STOP _ KEY Ġ= Ġ" 1 0 0 4 " ĊĠĠĠ Ġ} Ċ } Ċ