/** Ċ Ġ* ĠThe ĠMIT ĠLicense Ġ( MIT ) Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 6 - 2 0 1 8 ĠBer tr and ĠMart el Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN Ċ Ġ* ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġfr . bm art el . android . fade c andy . service Ċ Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . app . Service Ċ import Ġandroid . content .* Ċ import Ġandroid . hardware . usb . Usb Constants Ċ import Ġandroid . hardware . usb . Usb Device Ċ import Ġandroid . hardware . usb . Usb Interface Ċ import Ġandroid . hardware . usb . Usb Manager Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Toast Ċ import Ġfr . bm art el . android . fade c andy . activity . Usb Event Receiver Activity Ċ import Ġfr . bm art el . android . fade c andy . constant . Constants Ċ import Ġfr . bm art el . android . fade c andy . inter . I Usb EventListener Ċ import Ġfr . bm art el . android . fade c andy . model . ServiceType Ċ import Ġfr . bm art el . android . fade c andy . model . Usb Item Ċ import Ġfr . bm art el . android . fade c andy . utils . Manual Reset Event Ċ import Ġfr . bm art el . android . fade c andy . utils . Notification Helper Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠF ade c andy ĠServer Ġservice . Ċ Ġ* Ċ Ġ* Ġ@ author ĠBer tr and ĠMart el Ċ Ġ*/ Ċ class ĠF ade c andy Service Ġ: ĠService () Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠU sb Ġmanager Ġinstance . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġlateinit Ġvar Ġm Usb Manager : ĠU sb Manager ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠList Ġof ĠF ade c andy ĠUSB Ġdevice Ġattached . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieve Ġlist Ġof ĠF ade c andy ĠUSB Ġdevice Ġattached . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġusb Device Map Ġ= ĠHashMap < Int ?, ĠU sb Item ?> () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠServer Ġaddress . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieve Ġserver Ġaddress s . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġip Address : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġaddress ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . edit (). putString ( Constants . PREFER ENCE _ IP _ ADDRESS , Ġaddress ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġdefine Ġthat Ġserver Ġis Ġstarted Ġor Ġnot . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġdefine Ġif Ġserver Ġis Ġstarted Ġor Ġnot . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġis Server Running : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġlist Ġof ĠUSB Ġlisteners . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġm Usb Listeners Ġ= ĠArrayList < I Usb EventListener >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġmonitoring Ġobject Ġused Ġto Ġwait Ġfor Ġserver Ġclose Ġbefore Ġstarting Ġserver Ġif Ġalready Ġstarted . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġevent Manager Ġ= ĠManual Reset Event ( open Ġ= Ġfalse ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShared Ġpreferences Ġused Ġby ĠService . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġprefs : ĠSharedPreferences ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġdefine Ġif Ġuser Ġhas Ġclick Ġon Ġnotification Ġto Ġclose ĠService . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġm Exit Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġget Ġcurrent ĠF ade c andy Ġserver Ġconfiguration . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġfade c andy Ġconfiguration . Ġserver Ġmust Ġbe Ġrestarted Ġto Ġtake Ġeffect . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġconfig ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġconfig : ĠString Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġset ( conf ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġconf ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . edit (). putString ( Constants . PREFER ENCE _ CONFIG , Ġconf ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBroadcast Ġreceiver Ġused Ġto Ġreceive ĠATT ACHED / DET ACHED Ġusb Ġevent Ġ& Ġusb Ġuser Ġpermission Ġevents Ġ. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġreceiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġintent . action ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Usb Manager . ACTION _ USB _ DEVICE _ DET ACHED Ġ== Ġaction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" ACTION _ USB _ DEVICE _ DET ACHED ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġintent . get Parcelable Extra < Usb Device >( Usb Manager . EXTRA _ DEVICE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( device Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġit Ġ= Ġusb Device Map . entries . iterator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( it . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġit . next () Ġas ĠMap . Entry < Int , ĠU sb Item > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pair . value . device Ġ== Ġdevice ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusb Device Left ( pair . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusb Device Map . remove ( pair . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġm Usb Listeners . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Usb Listeners [ i ]. on Usb Device Detached ( usb Item Ġ= Ġpair . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" usb Ġdevice Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( Usb Event Receiver Activity . ACTION _ USB _ DEVICE _ ATTACH ED Ġ== Ġaction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġintent . get Parcelable Extra < Usb Device >( Usb Manager . EXTRA _ DEVICE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Attached ( device Ġ= Ġdevice ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( ACTION _ USB _ PERMISSION Ġ== Ġaction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" ACTION _ USB _ PERMISSION ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent . getBoolean Extra ( Usb Manager . EXTRA _ PERMISSION _ GRAN TED , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" Received Ġpermission Ġresult ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġintent . get Parcelable Extra < Usb Device >( Usb Manager . EXTRA _ DEVICE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( device Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġopen Device ( device Ġ= Ġdevice ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfd Ġ= Ġitem . connection . file Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Usb ( device Ġ= Ġitem , Ġfd Ġ= Ġfd ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" permission Ġdenied Ġfor Ġdevice ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" permission Ġdenied ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( Fade c andy Service . ACTION _ EXIT Ġ== Ġaction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" stopping ĠF ade c andy Service ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Exit Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Foreground ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Binder : ĠF ade c andy Service Binder ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieve Ġservice Ġtype Ġ( persistent Ġor Ġnon Ġpersistent ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġservice Ġtype . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġservice Type ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġservice Type : ĠService Type ? Ġ= ĠConstants . DEFAULT _ SERVICE _ TYPE ĊĠĠĠĠĠĠĠ Ġset ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . edit (). put Int ( Constants . PREFER ENCE _ SERVICE _ TYPE , ĠService Type . getState ( type )). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieve Ġserver Ġport . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġserver Ġport . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġport ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġserver Port : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġset ( port ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġport ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . edit (). put Int ( Constants . PREFER ENCE _ PORT , Ġport ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart ĠF ade c andy Ġserver . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġconfig ĠF ade c andy Ġconfiguration Ġin ĠJson Ġstring . ĊĠĠĠĠ Ġ* Ġ@ return Ġstart Ġstatus Ġ( 0 Ġ: ĠOK Ġ| Ġ 1 Ġ: ĠERROR ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġexternal Ġfun Ġstart Fc Server ( config : ĠString ): ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStop Ġfade c andy Ġserver Ġ( async ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġexternal Ġfun Ġstop Fc Server () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġnotify ĠF ade c andy Ġserver Ġthat Ġa ĠF ade c andy ĠUSB Ġdevice Ġhas Ġbeen Ġattached Ġand Ġprovide Ġall Ġits Ġcharacteristics . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvendor Id ĠĠĠĠĠĠ ĠF ade c andy Ġdevice Ġvendor ĠID ĊĠĠĠĠ Ġ* Ġ@ param ĠproductId ĠĠĠĠĠ ĠF ade c andy Ġdevice Ġproduct ĠID ĊĠĠĠĠ Ġ* Ġ@ param Ġserial Number ĠĠ ĠF ade c andy Ġdevice Ġserial Ġnumber Ġ( depend Ġon ĠAndroid Ġversion ) ĊĠĠĠĠ Ġ* Ġ@ param ĠfileDescriptor ĠUSB Ġfile Ġdescriptor Ġ( what Ġis Ġused Ġto Ġidentify Ġthe ĠUSB Ġdevice ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġexternal Ġfun Ġusb Device Ar rived ( vendor Id : ĠInt , ĠproductId : ĠInt , Ġserial Number : ĠString , ĠfileDescriptor : ĠInt ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġnotify ĠF ade c andy Ġserver Ġthat Ġa ĠF ade c andy ĠUSB Ġdevice Ġhas Ġbeen Ġdet ached . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠfileDescriptor ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġexternal Ġfun Ġusb Device Left ( file Descriptor : ĠInt ) ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĊĠĠĠĠĠĠĠ Ġm Exit Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġm Binder Ġ= ĠF ade c andy Service Binder ( service Ġ= Ġthis ) ĊĊĠĠĠĠĠĠĠ Ġprefs Ġ= Ġthis . get SharedPreferences ( Constants . PREFER ENCE _ PRE FS , ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġconfig Ġ= Ġprefs . getString ( Constants . PREFER ENCE _ CONFIG , ĠgetDefault Config ( Constants . DEFAULT _ SERVER _ ADDRESS , ĠConstants . DEFAULT _ SERVER _ PORT )) ĊĠĠĠĠĠĠĠ Ġservice Type Ġ= ĠService Type . getService Type ( prefs . getInt ( Constants . PREFER ENCE _ SERVICE _ TYPE , ĠService Type . getState ( Constants . DEFAULT _ SERVICE _ TYPE ))) ĊĠĠĠĠĠĠĠ Ġserver Port Ġ= Ġprefs . getInt ( Constants . PREFER ENCE _ PORT , ĠConstants . DEFAULT _ SERVER _ PORT ) ĊĠĠĠĠĠĠĠ Ġip Address Ġ= Ġprefs . getString ( Constants . PREFER ENCE _ IP _ ADDRESS , ĠConstants . DEFAULT _ SERVER _ ADDRESS ) ĊĊĠĠĠĠĠĠĠ Ġm Usb Manager Ġ= Ġget System Service ( Context . USB _ SERVICE ) Ġas ĠU sb Manager ĊĊĠĠĠĠĠĠĠ Ġinit Broadcast Receiver () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitialize Ġbroadcast Ġreceiver Ġto Ġreceive ĠUSB ĠATT ACHED / DET ACHED Ġevents . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinit Broadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= ĠIntent Filter () ĊĠĠĠĠĠĠĠ Ġfilter . addAction ( ACTION _ USB _ PERMISSION ) ĊĠĠĠĠĠĠĠ Ġfilter . addAction ( Usb Event Receiver Activity . ACTION _ USB _ DEVICE _ ATTACH ED ) ĊĠĠĠĠĠĠĠ Ġfilter . addAction ( Usb Manager . ACTION _ USB _ DEVICE _ DET ACHED ) ĊĠĠĠĠĠĠĠ Ġfilter . addAction ( Fade c andy Service . ACTION _ EXIT ) ĊĠĠĠĠĠĠĠ Ġregister Receiver ( receiver , Ġfilter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġadd Ġan Ġusb Ġlistener Ġto Ġlisten Ġfor ĠF ade c andy Ġdevice Ġattached Ġ Ġ/ Ġdet ached . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Usb Listener ( listener : ĠI Usb EventListener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Usb Listeners . add ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġremove Ġan Ġusb Ġlistener . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove Usb Listener ( listener : ĠI Usb EventListener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Usb Listeners . remove ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġinitialize Ġusb Ġdevice Ġlist Ġto Ġrequest Ġpermission Ġif Ġnot Ġalready Ġgiven Ġfor Ġalready Ġconnected ĠUSB Ġdevices . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinit Usb Device List () Ġ{ ĊĠĠĠĠĠĠĠ Ġusb Device Map . clear () ĊĊĠĠĠĠĠĠĠ Ġval Ġdevice List Ġ= Ġm Usb Manager . device List ĊĠĠĠĠĠĠĠ Ġval Ġdevice Iterator Ġ= Ġdevice List ?. values ?. iterator () ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ(( device Iterator ?. hasNext () Ġ== Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġdevice Iterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( device ?. vendor Id Ġ== ĠConstants . FC _ VENDOR Ġ&& Ġdevice . productId Ġ== ĠConstants . FC _ PRODUCT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Attached ( device Ġ= Ġdevice ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġstart ĠF ade c andy Ġserver Ġwith Ġa Ġnew Ġconfiguration . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstart Server ( config : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . config Ġ= Ġconfig ĊĠĠĠĠĠĠĠ Ġreturn Ġstart Server () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġstop Ġserver Ġ& Ġunregister Ġreceiver . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclean () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Fc Server () ĊĠĠĠĠĠĠĠ Ġunregister Receiver ( receiver ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" on Destroy ") ĊĠĠĠĠĠĠĠ Ġclean () ĊĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĊĠĠĠĠĠĠĠ Ġ//@ todo Ġfind Ġwhy Ġa Ġprocess Ġstill Ġexist Ġat Ġthis Ġmoment ĊĠĠĠĠĠĠĠ Ġif Ġ( m Exit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . os . Process . kill Process ( android . os . Process . my Pid ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġdis patched Ġattached Ġusb Ġdevice Ġto Ġfade c andy Ġserver Ġnative Ġinterface . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdevice ĠU sb Ġdevice Ġto Ġbe Ġdis patched . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdispatch Attached ( device : ĠU sb Device ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Usb Manager . has Permission ( device ) Ġ!= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" Request ing Ġper mis si om Ġto Ġdevice ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Permission Intent Ġ= ĠPending Intent . get Broadcast ( this , Ġ 0 , ĠIntent ( ACTION _ USB _ PERMISSION ), Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Usb Manager . request Permission ( device , Ġm Permission Intent ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" Already Ġhas Ġpermission Ġ: Ġopening Ġdevice ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġopen Device ( device Ġ= Ġdevice ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfd Ġ= Ġitem ?. connection ?. file Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Usb ( device Ġ= Ġitem , Ġfd Ġ= Ġfd ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġappend ĠUSB Ġdevice Ġto Ġusb Ġlist Ġ& Ġpass Ġto Ġnative Ġinterface ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdevice ĠUSB Ġdevice Ġobject ĊĠĠĠĠ Ġ* Ġ@ param Ġfd ĠĠĠĠ ĠUSB Ġdevice Ġfile Ġdescriptor ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdispatch Usb ( device : ĠU sb Item ?, Ġfd : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġserial Num : ĠString ? ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserial Num Ġ= Ġdevice ?. device ?. serial Number ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserial Num Ġ= Ġ"${ device ?. device ?. productId }" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġusb Device Map . set ( fd , Ġdevice ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġm Usb Listeners . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Usb Listeners [ i ]. on Usb Device Attached ( usb Item Ġ= Ġdevice ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠSystem . out . println (" vendor Ġid Ġ: Ġ" Ġ+ Ġdevice ?. device ?. vendor Id ) ĊĠĠĠĠĠĠĠ ĠSystem . out . println (" product Ġid Ġ: Ġ" Ġ+ Ġdevice ?. device ?. productId ) ĊĠĠĠĠĠĠĠ Ġusb Device Ar rived ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvendor Id Ġ= Ġdevice ?. device ?. vendor Id Ġ?: Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠproductId Ġ= Ġdevice ?. device ?. productId Ġ?: Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserial Number Ġ= Ġserial Num Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfileDescriptor Ġ= Ġfd Ġ?: Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ): ĠI Binder ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Binder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent ?, Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// this Ġis Ġthe Ġactivity Ġwhich Ġwill Ġbe Ġopened Ġwhen Ġuser Ġclick Ġon Ġnotification ĊĠĠĠĠĠĠĠ Ġval Ġtest Intent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠ Ġif Ġ( intent Ġ!= Ġnull Ġ&& Ġintent . has Extra ( Constants . SERVICE _ EXTRA _ ACTIVITY )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Intent . component Ġ= ĠComponent Name . un flatten FromString ( intent . getString Extra ( Constants . SERVICE _ EXTRA _ ACTIVITY )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġservice Type Override : ĠService Type ? ĊĊĠĠĠĠĠĠĠ Ġif Ġ( intent Ġ!= Ġnull Ġ&& Ġintent . has Extra ( Constants . SERVICE _ EXTRA _ SERVICE _ TYPE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice Type Override Ġ= ĠService Type . getService Type ( intent . getInt Extra ( Constants . SERVICE _ EXTRA _ SERVICE _ TYPE , ĠService Type . NON _ PER SIST ENT _ SERVICE . ordinal )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice Type Override Ġ= Ġservice Type ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( service Type Override ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠService Type . NON _ PER SIST ENT _ SERVICE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" starting ĠNON _ PER SIST ENT _ SERVICE ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠService . START _ NOT _ STICK Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠService Type . PER SIST ENT _ SERVICE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Foreground ( 4 2 4 2 , ĠNotification Helper . create Notification ( this , Ġnull , Ġtest Intent )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" starting ĠPER SIST ENT _ SERVICE ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠService . START _ STICK Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠService . START _ NOT _ STICK Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġstart ĠF ade c andy Ġserver ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġserver Ġstatus Ġ( 0 Ġ: Ġstarted Ġ| Ġ 1 Ġ: Ġnot Ġstated Ġ( error )) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstart Server (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Server Running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Manager . reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Server () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Manager . wait One ( milliseconds Ġ= ĠSTOP _ SERVER _ TIMEOUT . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( config Ġ== Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Ġ= ĠgetDefault Config ( address Ġ= Ġip Address , Ġserver Port Ġ= Ġserver Port ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġstart Fc Server ( config Ġ= Ġconfig ) ĊĊĠĠĠĠĠĠĠ Ġinit Usb Device List () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" server Ġrunning ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Server Running Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" error Ġoccured Ġwhile Ġstarting Ġserver ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġstatus ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStop ĠF ade c andy Ġserver . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġstop Ġstatus ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstop Server (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" stop Ġserver ") ĊĠĠĠĠĠĠĠ Ġstop Fc Server () ĊĠĠĠĠĠĠĠ Ġis Server Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġcalled Ġfrom Ġnative Ġto Ġnotify Ġserver Ġhas Ġbeen Ġclosed Ġsuccessfully . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġon Server Close () Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Manager . set () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġcalled Ġfrom Ġnative Ġto Ġprocess ĠUSB Ġtransfer . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠfileDescriptor ĠUSB Ġdevice Ġfile Ġdescriptor . ĊĠĠĠĠ Ġ* Ġ@ param Ġtimeout ĠĠĠĠĠĠĠ Ġtransfer Ġtimeout . ĊĠĠĠĠ Ġ* Ġ@ param Ġdata ĠĠĠĠĠĠĠĠĠĠ Ġdata Ġto Ġbe Ġtransferred . ĊĠĠĠĠ Ġ* Ġ@ return Ġtransfer Ġstatus ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġbulk Transfer ( file Descriptor : ĠInt , Ġtimeout : ĠInt , Ġdata : ĠByteArray ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( usb Device Map . containsKey ( file Descriptor )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġusb Device Map [ file Descriptor ]?. connection ?. bulk Transfer ( usb Device Map [ file Descriptor ]?. usb Endpoint , Ġdata , Ġdata . size , Ġtimeout ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" device Ġwith Ġfd Ġ$ file Descriptor Ġnot Ġfound ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon ParseError ( parse Offset : ĠInt , Ġmessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Parse Ġerror Ġat Ġcharacter Ġ$ parse Offset : Ġ$ message ", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOpen ĠUSB Ġdevice Ġ& Ġchoose ĠUSB Endpoint . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdevice ĠU sb Ġdevice Ġobject . ĊĠĠĠĠ Ġ* Ġ@ return ĠU bs Ġitem Ġcomposed Ġof ĠUSB Device Ġ, ĠUSB Endpoint Ġ& ĠU sb Connection ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġopen Device ( device : ĠU sb Device ?): ĠU sb Item ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġget System Service ( Context . USB _ SERVICE ) Ġas ĠU sb Manager ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġmanager . open Device ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v (" USB ", Ġ" Device Ġname =" Ġ+ Ġdevice ?. device Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġint f : ĠU sb Interface ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( interface Index Ġin Ġ 0 Ġuntil Ġ( device ?. interface Count Ġ?: Ġ 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusb Interface Ġ= Ġdevice ?. get Interface ( interface Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( usb Interface ?. interface Class Ġ== ĠU sb Constants . USB _ CLASS _ VENDOR _ SPEC ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint f Ġ= Ġusb Interface ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intf Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint f Ġ= Ġdevice ?. get Interface ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġendpoint Ġ= Ġint f ?. get Endpoint ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( connection Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . claim Interface ( intf , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" USB Ġconnection Ġerror ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠU sb Item ( device Ġ= Ġdevice , Ġconnection Ġ= Ġconnection , Ġusb Endpoint Ġ= Ġendpoint ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠF ade c andy Service :: class . java . simple Name ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġbroadcast Ġaction Ġreceived Ġwhen Ġuser Ġaccept ĠUSB Ġpermission . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠACTION _ USB _ PERMISSION Ġ= Ġ" fr . bm art el . fade c andy . USB _ PERMISSION " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġbroadcast Ġaction Ġreceived Ġwhen Ġuser Ġclick Ġto Ġremove Ġservice Ġnotification . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠACTION _ EXIT Ġ= Ġ" exit " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġmax Ġtime Ġto Ġwait Ġfor Ġserver Ġclose Ġcallback Ġ( in Ġmillis ) ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSTOP _ SERVER _ TIMEOUT Ġ= Ġ 4 0 0 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġload Ġshared Ġlibraries . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . load Library (" websocket s ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . load Library (" fade c andy - server ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġget Ġdefault ĠF ade c andy Ġserver Ġconfiguration . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun ĠgetDefault Config ( address : ĠString ?, Ġserver Port : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" {\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠ Ġ\" listen \": Ġ[ \"" Ġ+ Ġaddress Ġ+ Ġ"\ ", Ġ" Ġ+ Ġserver Port Ġ+ Ġ" ], \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠ Ġ\" verbose \": Ġtrue ,\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠ Ġ\" color \": Ġ{\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠĠĠĠĠ Ġ\" gamma \": Ġ 2 . 5 ,\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠĠĠĠĠ Ġ\" white point \": Ġ[ 1 . 0 , Ġ 1 . 0 , Ġ 1 . 0 ]\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠ Ġ},\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠ Ġ\" devices \": Ġ[\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠĠĠĠĠ Ġ{\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠĠĠĠĠĠĠĠĠ Ġ\" type \": Ġ\" fade c andy \",\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠĠĠĠĠĠĠĠĠ Ġ\" map \": Ġ[\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ[ Ġ 0 , Ġ 0 , Ġ 0 , Ġ 5 1 2 Ġ] \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠĠĠĠĠĠĠĠĠ Ġ] \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠĠĠĠĠ Ġ}\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠ Ġ] \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }