@ file : Suppress (" DE PREC ATION ") Ċ package Ġme . fab ian fg . files ender . frontend . ui . send Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . Dialog Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . location . Location Manager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . net . wifi . Wifi Manager Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Count Down Timer Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . text . format . Formatter Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . ImageView Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġcom . google . zx ing . Barcode Format Ċ import Ġcom . google . zx ing . Multi Format Writer Ċ import Ġcom . le in ard i . android . speed dial . Speed Dial Action Item Ċ import Ġkotlinx . android . synt hetic . main . activity _ send .* Ċ import Ġkotlinx . android . synt hetic . main . content _ send .* Ċ import Ġkotlinx . android . synt hetic . main . file share _ send _ dialog .* Ċ import Ġkotlinx . android . synt hetic . main . file share _ waiting _ for _ client _ dialog .* Ċ import Ġkotlinx . coroutines .* Ċ import Ġme . fab ian fg . files ender . CLIENT _ TIMEOUT Ċ import Ġme . fab ian fg . files ender . R Ċ import Ġme . fab ian fg . files ender . config . getName Ċ import Ġme . fab ian fg . files ender . config . getServer Port Ċ import Ġme . fab ian fg . files ender . config . getVersion Ċ import Ġme . fab ian fg . files ender . config . update Ċ import Ġme . fab ian fg . files ender . frontend . re ceiv ers . Ap State Receiver Ċ import Ġme . fab ian fg . files ender . frontend . ui . app send . App Send Activity Ċ import Ġme . fab ian fg . files ender . server .* Ċ import Ġme . fab ian fg . files ender . utils .* Ċ import Ġjava . io . File Ċ import Ġjava . net . Bind Exception Ċ import Ġkotlin . math . round ToInt ĊĊ Ċ class ĠSend Activity Ġ: ĠAppCompatActivity (), ĠCor outine Scope Ġby ĠMain Scope () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġfile Open Request Code Ġ= Ġ 6 9 ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġlocation Permission Request Code Ġ= Ġ 7 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġapp Open Request Code Ġ= Ġ 7 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġwhite Ġ= Ġ- 0 x 1 ĊĠĠĠ Ġvar Ġblack Ġ= Ġ- 0 x 1 0 0 0 0 0 0 ĊĠĠĠ Ġprivate Ġval Ġwidth Ġ= Ġ 5 0 0 ĊĊĠĠĠ Ġprivate Ġvar Ġtop Title ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtoolbar _ layout . title ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ toolbar _ layout . title Ġ= Ġvalue } ĊĊĠĠĠ Ġlateinit Ġvar Ġfile Server Ġ: ĠFile Server ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġprivate Ġval Ġclient List Content Ġ= Ġmutable ListOf < Client Info >() ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġclient ListAdapter Ġ: ĠClient ListAdapter ĊĊĠĠĠ Ġprivate Ġval Ġfile List Content Ġ= Ġmutable ListOf < FileInfo Container >() ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfile ListAdapter Ġ: ĠFile ListAdapter ĊĊĠĠĠ Ġprivate Ġvar Ġis Running Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġhot spot Info Holder Ġ: ĠHot spot Info Holder ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġap State Receiver Ġ: ĠAp State Receiver ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ send ) ĊĠĠĠĠĠĠĠ Ġupdate ( this ) ĊĠĠĠĠĠĠĠ Ġap State Receiver Ġ= ĠAp State Receiver ( this ) ĊĠĠĠĠĠĠĠ Ġregister Receiver ( ap State Receiver , ĠIntent Filter (" android . net . wifi . WIFI _ AP _ STATE _ CHANGED ")) ĊĠĠĠĠĠĠĠ Ġfile Server Ġ= ĠFile Server ( this , ĠgetName (), Ġget Version (), Ġget Server Port ()) ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( toolbar ) ĊĠĠĠĠĠĠĠ Ġtop Title Ġ= ĠgetString ( R . string . inactive ) ĊĠĠĠĠĠĠĠ Ġsend Info Layout . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġqr Code Button . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġfile List . empty View Ġ= Ġempty Files ĊĠĠĠĠĠĠĠ Ġclient List . empty View Ġ= Ġempty Clients ĊĠĠĠĠĠĠĠ Ġfab . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isRunning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Server () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( check Self Permission Compat ( Manifest . permission . ACCESS _ F INE _ LOCATION ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġloc Manager Ġ= Ġapplication Context . getSystem Service ( Context . LOCATION _ SERVICE ) Ġas ĠLocation Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! loc Manager . is Provider Enabled ( Location Manager . NETWORK _ PROVIDER )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( Settings . ACTION _ LOCATION _ SOURCE _ SETTINGS )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoolbar _ layout . set BackgroundColor ( resources . getColor ( android . R . color . holo _ orange _ dark )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Title Ġ= ĠgetString ( R . string . starting ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġapplication Context . getSystem Service ( Context . WIFI _ SERVICE ) Ġas ĠW ifi Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Using Local Only Hot spot ( manager ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Using Normal Hot spot ( manager ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Location Permission () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient ListAdapter Ġ= ĠClient ListAdapter ( this , ĠR . layout . client _ adapter _ layout , Ġclient List Content ) ĊĠĠĠĠĠĠĠ Ġclient List . adapter Ġ= Ġclient ListAdapter ĊĠĠĠĠĠĠĠ Ġfile ListAdapter Ġ= ĠFile ListAdapter ( this , ĠR . layout . file _ adapter _ layout , Ġfile List Content ) ĊĠĠĠĠĠĠĠ Ġfile List . adapter Ġ= Ġfile ListAdapter ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( intent ?. action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ SEND Ġ-> Ġhandle File Share ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ SEND _ MULTIPLE Ġ-> Ġhandle Multiple File Share ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġintent ?. let Ġ{ Ġhandle A pk Share ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġadd File Dial . addAction Item ( Speed Dial Action Item . Builder ( R . id . fab _ add _ app , Ġandroid . R . drawable . sym _ def _ app _ icon ). setLabel ( R . string . add _ app ). create ()) ĊĠĠĠĠĠĠĠ Ġadd File Dial . addAction Item ( Speed Dial Action Item . Builder ( R . id . fab _ add _ file , Ġandroid . R . drawable . ic _ menu _ add ). setLabel ( R . string . add _ file ). create ()) ĊĠĠĠĠĠĠĠ Ġadd File Dial . setOn Action Selected Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( it . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . fab _ add _ app Ġ-> ĠstartActivity For Result ( Intent ( this , ĠApp Send Activity :: class . java ), Ġapp Open Request Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . fab _ add _ file Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setType ("* /* ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( Intent . ACTION _ GET _ CONTENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra ( Intent . EXTRA _ ALLOW _ MULTIPLE , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Category ( Intent . CATEGORY _ OP ENABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( intent , Ġfile Open Request Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon New Intent ( intent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on New Intent ( intent ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( intent ?. action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ SEND Ġ-> Ġhandle File Share ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ SEND _ MULTIPLE Ġ-> Ġhandle Multiple File Share ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġintent ?. let Ġ{ Ġhandle A pk Share ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . O ) ĊĠĠĠ Ġprivate Ġfun Ġstart Using Local Only Hot spot ( manager : ĠW ifi Manager ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmanager . start Local Only Hot spot ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠW ifi Manager . Local Only Hot spot Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failed ( reason : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( this @ Send Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . failed _ to _ start _ hot spot _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( reason ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠERROR _ GENERIC Ġ-> ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . failed _ to _ start _ hot spot , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ERROR _ GENERIC " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠERROR _ IN COMPAT IBLE _ MODE Ġ-> ĠgetString ( R . string . hot spot _ already _ enabled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠERROR _ T ETHER ING _ DIS ALLOWED Ġ-> ĠgetString ( R . string . dis allowed _ to _ start _ hot spot ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠERROR _ NO _ CHANNEL Ġ-> ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . failed _ to _ start _ hot spot , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ERROR _ NO _ CHANNEL " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠgetString ( R . string . failed _ to _ start _ hot spot _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġstop Server () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Started ( reservation : ĠW ifi Manager . Local Only Hot spot Reservation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠMulti Format Writer (). encode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreservation . wifi Configuration . SSID Ġ+ Ġ":" Ġ+ Ġreservation . wifi Configuration . pre Shared Key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBar code Format . QR _ CODE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw : ĠInt Ġ= Ġresult . width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh : ĠInt Ġ= Ġresult . height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpixels Ġ= ĠInt Array ( w Ġ* Ġh ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġy Ġ* Ġw ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġw ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpixels [ offset Ġ+ Ġx ] Ġ= Ġif Ġ( result . get ( x , Ġy )) Ġblack Ġelse Ġwhite ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= ĠBitmap . create Bitmap ( w , Ġh , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap . set Pixels ( pixels , Ġ 0 , Ġwidth , Ġ 0 , Ġ 0 , Ġw , Ġh ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġstart Server ( reservation , Ġbitmap ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stopped () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġstop Server () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Using Normal Hot spot ( manager : ĠW ifi Manager ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( manager . is Wifi Ap Enabled ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ Ġstart Server () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( manager . set Wifi Ap Enabled ( true )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ Ġstart Server () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( this @ Send Activity ). setTitle ( R . string . warning ). setMessage ( R . string . failed _ to _ start _ hot spot _ try _ man ually ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Server () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest Location Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M Ġ&& Ġcheck Self Permission ( Manifest . permission . ACCESS _ F INE _ LOCATION ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions ( array Of ( Manifest . permission . ACCESS _ F INE _ LOCATION ), Ġlocation Permission Request Code ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Server () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Stop Ġthe Ġserver ĊĠĠĠĠĠĠĠ Ġval Ġinfo Holder Ġ= Ġhot spot Info Holder ĊĠĠĠĠĠĠĠ Ġinfo Holder ?. close () ĊĠĠĠĠĠĠĠ Ġlaunch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġapplication Context . getSystem Service ( Context . WIFI _ SERVICE ) Ġas ĠW ifi Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( manager . is Wifi Ap Enabled () Ġ&& Ġ! manager . set Wifi Ap Enabled ( false ) Ġ&& Ġinfo Holder Ġ! is ĠAndroid 8 Hot spot Info Holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( this @ Send Activity ). setTitle ( R . string . warning ). setMessage ( R . string . failed _ to _ stop _ hot spot _ try _ man ually ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhot spot Info Holder Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġclient List Content . clear () ĊĠĠĠĠĠĠĠ Ġclient ListAdapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠ Ġfile Server . stop () ĊĠĠĠĠĠĠĠ Ġfile Server Ġ= ĠFile Server ( this , ĠgetName (), Ġget Version (), Ġget Server Port ()) ĊĠĠĠĠĠĠĠ Ġfile List Content . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġfile Server . add File ( it . descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . id Ġ= Ġid ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġfab . setImage Resource ( android . R . drawable . ic _ media _ play ) ĊĠĠĠĠĠĠĠ Ġ// Icon Ġwould Ġdis appear Ġif Ġnot Ġbe Ġredraw n ĊĠĠĠĠĠĠĠ Ġfab . hide () ĊĠĠĠĠĠĠĠ Ġfab . show () ĊĠĠĠĠĠĠĠ Ġtoolbar _ layout . set BackgroundColor ( resources . getColor ( R . color . color Primary )) ĊĠĠĠĠĠĠĠ Ġhot spot Name . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġhot spot Password . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġsend Info Layout . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġqr Code Button . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġtop Title Ġ= ĠgetString ( R . string . inactive ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Server () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Start Ġthe Ġserver ĊĠĠĠĠĠĠĠ Ġhot spot Info Holder Ġ= ĠFake Hot spot Info Holder () ĊĠĠĠĠĠĠĠ Ġfile Server . start () ĊĠĠĠĠĠĠĠ Ġis Running Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġfab . setImage Resource ( android . R . drawable . ic _ media _ pause ) ĊĠĠĠĠĠĠĠ Ġ// Icon Ġwould Ġdis appear Ġif Ġnot Ġbe Ġredraw n ĊĠĠĠĠĠĠĠ Ġfab . hide () ĊĠĠĠĠĠĠĠ Ġfab . show () ĊĠĠĠĠĠĠĠ Ġtoolbar _ layout . set BackgroundColor ( resources . getColor ( android . R . color . holo _ green _ light )) ĊĠĠĠĠĠĠĠ Ġsend Info Layout . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġconnected Clients . text Ġ= ĠgetString ( R . string . con _ clients , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġhot spot Name . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġhot spot Password . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġqr Code Button . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġtop Title Ġ= ĠgetString ( R . string . running ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . O ) ĊĠĠĠ Ġfun Ġstart Server ( reservation : ĠW ifi Manager . Local Only Hot spot Reservation , Ġqr Code Ġ: ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= ĠDialog ( this @ Send Activity ) ĊĠĠĠĠĠĠĠ Ġdialog . set ContentView ( R . layout . qr _ dialog ) ĊĠĠĠĠĠĠĠ Ġval Ġimg Ġ= Ġdialog . findViewById < ImageView >( R . id . qr Code View ) ĊĠĠĠĠĠĠĠ Ġimg . setImage Bitmap ( qr Code ) ĊĠĠĠĠĠĠĠ Ġthis . hot spot Info Holder Ġ= ĠAndroid 8 Hot spot Info Holder ( reservation , Ġdialog ) ĊĠĠĠĠĠĠĠ Ġ// Start Ġthe Ġserver ĊĠĠĠĠĠĠĠ Ġfile Server . start () ĊĠĠĠĠĠĠĠ Ġis Running Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġfab . setImage Resource ( android . R . drawable . ic _ media _ pause ) ĊĠĠĠĠĠĠĠ Ġ// Icon Ġwould Ġdis appear Ġif Ġnot Ġbe Ġredraw n ĊĠĠĠĠĠĠĠ Ġfab . hide () ĊĠĠĠĠĠĠĠ Ġfab . show () ĊĠĠĠĠĠĠĠ Ġtoolbar _ layout . set BackgroundColor ( resources . getColor ( android . R . color . holo _ green _ light )) ĊĠĠĠĠĠĠĠ Ġsend Info Layout . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġconnected Clients . text Ġ= ĠgetString ( R . string . con _ clients , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġhot spot Name . text Ġ= ĠgetString ( R . string . hot spot _ name , Ġreservation . wifi Configuration . SSID ) ĊĠĠĠĠĠĠĠ Ġhot spot Password . text Ġ= ĠgetString ( R . string . hot spot _ password , Ġreservation . wifi Configuration . pre Shared Key ) ĊĠĠĠĠĠĠĠ Ġqr Code Button . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġtop Title Ġ= ĠgetString ( R . string . running ) ĊĠĠĠĠĠĠĠ Ġshow Qr Code Dialog () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Qr Code Dialog () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġhot spot Info Holder ĊĠĠĠĠĠĠĠ Ġif Ġ( info Ġ!= Ġnull Ġ&& Ġinfo Ġis ĠAndroid 8 Hot spot Info Holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . qr Code Dialog . show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Qr Code Button Clicked ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġunused ( view ) ĊĠĠĠĠĠĠĠ Ġshow Qr Code Dialog () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Bind Failed ( ex Ġ: ĠBind Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . server _ start _ failed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ("${ ex :: class . java . simple Name }: Ġ${ ex . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Server () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġunregister Receiver ( ap State Receiver ) ĊĠĠĠĠĠĠĠ Ġstop Server () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== Ġfile Open Request Code Ġ&& ĠresultCode Ġ== ĠRESULT _ OK Ġ&& Ġdata Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclip Data Ġ= Ġdata . clip Data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( clip Data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġclip Data . item Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister New File ( clip Data . getItem At ( i ). uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Uri Ġ= Ġdata . data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Uri Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister New File ( file Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( request Code Ġ== Ġapp Open Request Code Ġ&& ĠresultCode Ġ== ĠActivity . RESULT _ OK Ġ&& Ġdata Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle A pk Share ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < out ĠString >, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== Ġlocation Permission Request Code Ġ&& Ġpermissions . isNotEmpty () Ġ&& Ġpermissions [ 0 ] Ġ== ĠManifest . permission . ACCESS _ F INE _ LOCATION Ġ&& Ġgrant Results . isNotEmpty () Ġ&& Ġgrant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfab . perform Click () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Client List ( clients Ġ: ĠCollection < Client Info >) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient List Content . clear () ĊĠĠĠĠĠĠĠ Ġclient List Content . addAll ( clients ) ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnected Clients . text Ġ= ĠgetString ( R . string . con _ clients , Ġclients . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient ListAdapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient List . set Dynamic Height () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle File Share ( intent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġextra Ġ= Ġintent . get Parcelable Extra < Parcelable >( Intent . EXTRA _ STREAM ) Ġas ? ĠUri ? ĊĠĠĠĠĠĠĠ Ġextra ?. let Ġ{ Ġregister New File ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle A pk Share ( intent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġintent . getString Extra ( App Send Activity . AP K _ PATH ) ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġintent . getString Extra ( App Send Activity . AP K _ NAME ) ĊĠĠĠĠĠĠĠ Ġif Ġ( path Ġ!= Ġnull Ġ&& Ġname Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Desc Ġ= ĠA pk FileDescriptor ( File ( path ), Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister New File ( file Desc ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġregister New File ( descriptor : ĠFile Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Id Ġ= Ġfile Server . add File ( descriptor ) ĊĠĠĠĠĠĠĠ Ġfile List Content . add ( FileInfo Container ( file Id , Ġdescriptor )) ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile ListAdapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile List . set Dynamic Height () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġprivate Ġfun Ġregister New File ( uri Ġ: ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= ĠUri FileDescriptor ( this , Ġuri ) ĊĠĠĠĠĠĠĠ Ġregister New File ( descriptor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Multiple File Share ( intent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġextra Ġ= Ġintent . get Parcelable ArrayList Extra < Parcelable >( Intent . EXTRA _ STREAM ) ĊĠĠĠĠĠĠĠ Ġextra ?. forEach Ġ{ Ġshare Ġ-> Ġ( share Ġas ? ĠUri ?) ?. let Ġ{ Ġregister New File ( it ) Ġ} Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend File ( file : ĠFileInfo Container ) Ġ{ ĊĠĠĠĠĠĠĠ ĠClient Select Dialog ( this , Ġclient List Content ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend File ( file , Ġit ) ĊĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend File ( file : ĠFileInfo Container , Ġclient : ĠClient Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( onError , ĠonStart , Ġon Progress Update , ĠonComplete ) Ġ= Ġprepare Send File ( file . descriptor , Ġclient ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Server . send File ( client . clientId , Ġfile . id , ĠonError , ĠonStart , Ġon Progress Update , ĠonComplete ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" SetText I 1 8 n ") ĊĠĠĠ Ġfun Ġprepare Send File ( file Ġ: ĠBasic FileDescriptor , Ġclient Ġ: ĠClient Info ) Ġ: ĠServer . Share Listeners Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġasync ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Name Ġ= Ġclient . client Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwait Dialog Ġ= ĠWaiting For Client Dialog ( this @ Send Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait Dialog . set Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait Dialog . show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait Dialog . client Name View . text Ġ= Ġclient Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait Dialog . remaining Time Bar . max Ġ= ĠCLIENT _ TIMEOUT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Down Ġ= Ġobject Ġ: ĠCount Down Timer ( CLIENT _ TIMEOUT . to Long (), Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tick ( millis Until Finished : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait Dialog . remaining Time Bar . progress Ġ= Ġmillis Until Finished . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait Dialog . remaining Time View . text Ġ= Ġ"${ millis Until Finished / 1 0 0 0 } s " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Finish () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait Dialog . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= ĠFile Share Send Dialog ( this @ Send Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . set Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmax Set Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠonError Ġ: Ġ( Fail Reason ) Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġwhen ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFail Reason . CLIENT _ DIS CONNECTED Ġ-> ĠgetString ( R . string . fail _ reason _ client _ disconnected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFail Reason . CLIENT _ DEN IED Ġ-> ĠgetString ( R . string . fail _ reason _ client _ den ied ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFail Reason . CLIENT _ NOT _ EN OU GH _ STORAGE Ġ-> ĠgetString ( R . string . fail _ reason _ client _ not _ en ough _ storage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFail Reason . TIMEOUT Ġ-> ĠgetString ( R . string . fail _ reason _ timeout ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFail Reason . FAILED _ TO _ OPEN _ INPUT _ STREAM Ġ-> ĠgetString ( R . string . fail _ reason _ failed _ to _ open _ input _ stream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait Dialog . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Down . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( this @ Send Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . file share _ failed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠonStart Ġ: Ġ( File Handle ) Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Down . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait Dialog . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . fileName View . text Ġ= Ġfile . fileName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġon Progress Update Ġ: Ġ( File Handle ) Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprocessed Ġ= ĠFormatter . format FileSize ( this @ Send Activity , Ġit . send Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Ġ= ĠFormatter . format FileSize ( this @ Send Activity , Ġit . file Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress String Ġ= Ġ"$ processed /$ max " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpercentage String Ġ= Ġ"${ ( 1 0 0 . 0 / it . file Size * it . send Bytes ). round ToInt ()} %" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! max Set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . progress Bar . max Ġ= Ġit . chunk Count . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Set Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . progress Bar . progress Ġ= Ġit . send Chunks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . progress View . text Ġ= Ġprogress String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . percentage View . text Ġ= Ġpercentage String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠonComplete Ġ: Ġ( File Handle ) Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait Dialog . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Down . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ async ĠServer . Share Listeners ( onError , ĠonStart , Ġon Progress Update , ĠonComplete ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. await () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove File ( file : ĠFileInfo Container ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfile List Content . remove ( file ) ĊĠĠĠĠĠĠĠ Ġfile Server . remove File ( file . id ) ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile ListAdapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile List . set Dynamic Height () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ