/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 6 ĠR ic card o ĠLes chi ut ta Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . pr gp as cal . qr datat rans fer . activities Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . Dialog Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . bluetooth . Bluetooth Device Ċ import Ġandroid . content .* Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . widget . Array Adapter Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . fragment . app . Dialog Fragment Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġcom . pr gp as cal . qr datat rans fer . R Ċ import Ġcom . pr gp as cal . qr datat rans fer . fragments . Client Fragment Ċ import Ġcom . pr gp as cal . qr datat rans fer . fragments . Client Interface Ċ import Ġcom . pr gp as cal . qr datat rans fer . utils .* Ċ import Ġcom . pr gp as cal . qr datat rans fer . utils . Transfer Params . Companion . ERROR _ NO _ DEVICE _ SELECTED Ċ import Ġcom . pr gp as cal . qr datat rans fer . utils . Transfer Params . Companion . PARAM _ I _ AM _ THE _ SERVER Ċ import Ġcom . pr gp as cal . qr datat rans fer . utils . Transfer Params . Companion . PARAM _ MESSAGES Ċ import Ġcom . pr gp as cal . qr datat rans fer . view models . Client Ack Sender ViewModel Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . HashMap Ċ Ċ const Ġval ĠTAG _ SELECT _ DEVICE Ġ= Ġ" aq rt _ select _ device " Ċ Ċ class ĠClient Transfer Activity Ġ: ĠBase Transfer Activity (), ĠClient Interface Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġserver Mac Address : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġreceived Messages Ġ= ĠArrayList < String >() ĊĠĠĠ Ġprivate Ġvar Ġprevious Message Ack : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġbt Intent Filter Ġ= ĠIntent Filter () ĊĠĠĠ Ġprivate Ġval Ġbt Devices Map Ġ= ĠHashMap < String , ĠBluetooth Device >() ĊĠĠĠ Ġprivate Ġval Ġbt Devices List Ġ= ĠArrayList < Bluetooth Device >() ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbt Devices Adapter : ĠArray Adapter < String > ĊĊĠĠĠ Ġprivate Ġvar ĠviewModel : ĠClient Ack Sender ViewModel ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Layout () Ġ{ ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . a qr dt _ transfer _ activity ) ĊĠĠĠĠĠĠĠ Ġsupport FragmentManager . beginTransaction (). add ( R . id . fragment _ container , ĠClient Fragment ()). commit () ĊĊĠĠĠĠĠĠĠ Ġbt Devices Adapter Ġ= ĠArray Adapter ( this , ĠR . layout . aq rt _ dialog _ select _ device ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġbon ded Ġ( already Ġpaired ) Ġdevices ĊĠĠĠĠĠĠĠ Ġfor Ġ( device Ġin ĠBluetooth Adapter . getDefault Adapter (). bon ded Devices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbt Devices Map [ device . address ] Ġ= Ġdevice ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbt Devices List . add ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbt Devices Adapter . add ( device . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠgetString ( R . string . a qr dt _ unknown ) Ġ+ Ġ"\ n " Ġ+ Ġdevice . address ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbt Intent Filter . addAction ( Bluetooth Device . ACTION _ FOUND ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Bluetooth Adapter . getDefault Adapter (). is Discover ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Adapter . getDefault Adapter (). cancel Discovery () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠBluetooth Adapter . getDefault Adapter (). start Discovery () ĊĊĠĠĠĠĠĠĠ ĠSelect Device Dialog (). show ( support FragmentManager , ĠTAG _ SELECT _ DEVICE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġregister Receiver ( bt Devices Receiver , Ġbt Intent Filter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġunregister Receiver ( bt Devices Receiver ) ĊĠĠĠĠĠĠĠ ĠviewModel ?. stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Bt Device Selected ( selected Device : ĠBluetooth Device ) Ġ{ ĊĠĠĠĠĠĠĠ Ġserver Mac Address Ġ= Ġselected Device . address ĊĠĠĠĠĠĠĠ ĠBluetooth Adapter . getDefault Adapter (). cancel Discovery () ĊĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠViewModel Provider ( this ). get ( Client Ack Sender ViewModel :: class . java ) ĊĠĠĠĠĠĠĠ ĠviewModel !!. start ( selected Device . address ) ĊĠĠĠĠĠĠĠ Ġval Ġack Observer Ġ= ĠObserver < String > Ġ{ Ġack Sent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Message Ack Ġ= Ġack Sent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Finish ing Trans mission ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġlast ĠACK Ġwas Ġsent . ĠFinish . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Trans mission With Success () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel !!. last Sent Ack LiveData . observe ( this , Ġack Observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġqr Message Received ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġack : ĠString Ġ= Ġget Ack From Message ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent : ĠString Ġ= ĠgetContent From Message ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdigest : ĠString Ġ= Ġget Digest From Message ( message ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( digest Ġ== Ġcalculate Digest ( content )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( content ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG _ EOT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEnd Ġof ĠTrans mission Ġreached ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ack Ġ!= Ġprevious Message Ack ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Finish ing Trans mission Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Ack ToServer ( ack ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRegular Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ack Ġ!= Ġprevious Message Ack ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceived Messages . add ( content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Ack ToServer ( ack ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠString Index OutOfBoundsException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠString Index OutOfBoundsException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Ack ToServer ( ack : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel ?. send Ack ( ack ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfinish Trans mission With Success () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreturn Intent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠ Ġreturn Intent . putExtra ( PARAM _ I _ AM _ THE _ SERVER , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Intent . putString ArrayList Extra ( PARAM _ MESSAGES , Ġreceived Messages ) ĊĠĠĠĠĠĠĠ Ġset Result ( Activity . RESULT _ OK , Ġreturn Intent ) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠSelect Device Dialog Ġ: ĠDialog Fragment () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate Dialog ( savedInstanceState : ĠBundle ?): ĠDialog Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= Ġactivity Ġas ĠClient Transfer Activity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( activity Ġas ĠContext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setTitle ( getString ( R . string . a qr dt _ select _ device )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setAdapter ( callback . bt Devices Adapter ) Ġ{ Ġ_, Ġindex : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Bt Device Selected ( callback . bt Devices List [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuilder . create () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancel ( dialog : ĠDialog Interface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Cancel ( dialog ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= Ġactivity Ġas ĠClient Transfer Activity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . finish Trans mission WithError ( error Ġ= ĠERROR _ NO _ DEVICE _ SELECTED ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġbt Devices Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġintent . action ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Bluetooth Device . ACTION _ FOUND Ġ== Ġaction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġintent . get Parcelable Extra < Bluetooth Device >( Bluetooth Device . EXTRA _ DEVICE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( device Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Address Ġ= Ġdevice . address ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! bt Devices Map . contains ( device Address )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbt Devices Map [ device Address ] Ġ= Ġdevice ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbt Devices List . add ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbt Devices Adapter . add ( device . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠgetString ( R . string . a qr dt _ unknown ) Ġ+ Ġ"\ n " Ġ+ Ġdevice . address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbt Devices Adapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }