/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 , ĠM os he ĠW ais berg Ċ Ġ* Ċ Ġ* Ġ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 . github . fields . electric Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Point Ċ import Ġandroid . os . Parcel Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . os . System Clock . uptime Millis Ċ import Ġandroid . text . format . Date Utils . SECOND _ IN _ M ILL IS Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view .* Ċ import Ġandroidx . preference . Preference Manager Ċ import Ġcom . github . utils . copy Ċ import Ġio . reactivex . rx java 3 . core . Observer Ċ import Ġio . reactivex . rx java 3 . dis pos ables . Disposable Ċ import Ġio . reactivex . rx java 3 . schedul ers . Schedulers Ċ import Ġjava . util .* Ċ import Ġkotlin . math . min Ċ Ċ /** Ċ Ġ* ĠE lectric ĠFields Ġview . Ċ Ġ* Ċ Ġ* Ġ@ author ĠM os he ĠW ais berg Ċ Ġ*/ Ċ class ĠE lectric Fields View Ġ: ĠView , ĊĠĠĠ ĠE lectric Fields , ĊĠĠĠ ĠObserver < Bitmap >, ĊĠĠĠ ĠGest ure Detector . On Gesture Listener , ĊĠĠĠ ĠGest ure Detector . On Double Tap Listener , ĊĠĠĠ ĠScale Gesture Detector . On Scale Gesture Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcharges : ĠMutable List < Charge > Ġ= ĠArrayList () ĊĊĠĠĠ Ġprivate Ġval Ġsize : ĠPoint Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Value Ġ= ĠPoint () ĊĠĠĠĠĠĠĠ Ġval Ġwindow Manager Ġ= Ġcontext . getSystem Service ( Context . WINDOW _ SERVICE ) Ġas ĠWindow Manager ĊĠĠĠĠĠĠĠ Ġval Ġdisplay Ġ= Ġwindow Manager . default Display ĊĠĠĠĠĠĠĠ Ġ// Ġinclude Ġnavigation Ġbar ĊĠĠĠĠĠĠĠ Ġdisplay . get Real Size ( size Value ) ĊĠĠĠĠĠĠĠ Ġsize Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġ_ bitmap : ĠBitmap ? Ġ= Ġnull ĊĠĠĠ Ġval Ġbitmap : ĠBitmap ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ bitmap Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġthis . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġsize . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġsize . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ bitmap Ġ= ĠBitmap . create Bitmap ( width , Ġheight , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ_ bitmap !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġtask : ĠFields Task ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġsame Charge Distance : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġlistener : ĠE lectric Fields Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġgesture Detector : ĠGest ure Detector ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġscale Gesture Detector : ĠScale Gesture Detector ĊĠĠĠ Ġprivate Ġvar Ġcharge To Scale : ĠCharge ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġscale Factor Ġ= Ġ 1 f ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġprefs : ĠSharedPreferences ĊĠĠĠ Ġprivate Ġvar Ġmeasured Width Diff Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġmeasured Height Diff Ġ= Ġ 0 f ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: Ġsuper ( context , Ġattrs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet , Ġdef Style Attr : ĠInt ) Ġ: Ġsuper ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġcontext . resources ĊĠĠĠĠĠĠĠ Ġsame Charge Distance Ġ= Ġres . get Dimension Pixel Size ( R . dim en . same _ charge ) ĊĠĠĠĠĠĠĠ Ġsame Charge Distance Ġ*= Ġsame Charge Distance ĊĠĠĠĠĠĠĠ Ġgesture Detector Ġ= ĠGest ure Detector ( context , Ġthis ) ĊĠĠĠĠĠĠĠ Ġscale Gesture Detector Ġ= ĠScale Gesture Detector ( context , Ġthis ) ĊĠĠĠĠĠĠĠ Ġprefs Ġ= ĠPreference Manager . getDefault SharedPreferences ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Size Changed ( w : ĠInt , Ġh : ĠInt , Ġold w : ĠInt , Ġold h : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Size Changed ( w , Ġh , Ġold w , Ġold h ) ĊĠĠĠĠĠĠĠ Ġmeasured Width Diff Ġ= Ġ( w Ġ- Ġbitmap . width ) Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠ Ġmeasured Height Diff Ġ= Ġ( h Ġ- Ġbitmap . height ) Ġ/ Ġ 2 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Charge ( x : ĠInt , Ġy : ĠInt , Ġsize : ĠDouble ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġadd Charge ( Charge ( x , Ġy , Ġsize )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Charge ( charge : ĠCharge ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( charges . size Ġ< ĠMAX _ CHAR GES ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( charges . add ( charge )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Charge Added ( this , Ġcharge ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinvert Charge ( x : ĠInt , Ġy : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcharge Ġ= Ġfind Charge ( x , Ġy ) ĊĠĠĠĠĠĠĠ Ġif Ġ( charge Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharge . size Ġ= Ġ- charge . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Charge In verted ( this , Ġcharge ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Charge ( x : ĠInt , Ġy : ĠInt ): ĠCharge ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcharge Nearest : ĠCharge ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġdx : ĠInt ĊĠĠĠĠĠĠĠ Ġvar Ġdy : ĠInt ĊĠĠĠĠĠĠĠ Ġvar Ġd : ĠInt ĊĠĠĠĠĠĠĠ Ġvar Ġd Min Ġ= ĠInteger . MAX _ VALUE ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( charge Ġin Ġcharges ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdx Ġ= Ġx Ġ- Ġcharge . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdy Ġ= Ġy Ġ- Ġcharge . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd Ġ= Ġ( dx Ġ* Ġdx ) Ġ+ Ġ( dy Ġ* Ġdy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( d Ġ<= Ġsame Charge Distance ) Ġ&& Ġ( d Ġ< Ġd Min )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharge Nearest Ġ= Ġcharge ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd Min Ġ= Ġd ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcharge Nearest ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġcharges . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcanvas . draw Bitmap ( bitmap , Ġmeasured Width Diff , Ġmeasured Height Diff , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart ( delay : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Idle ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdensity Ġ= Ġprefs . getInt ( Palette Dialog . PRE F _ D ENS ITY , ĠPalette Dialog . DEFAULT _ D ENS ITY ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh ues Ġ= Ġprefs . getInt ( Palette Dialog . PRE F _ H UES , ĠPalette Dialog . DEFAULT _ H UES ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFields Task ( charges . copy (), Ġbitmap , Ġdensity , Ġh ues ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Delay Ġ= Ġdelay ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribe On ( Schedulers . computation ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( observer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġtask ?. cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġlistener Ġfor Ġevents . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener Ġthe Ġlistener . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Electric Fields Listener ( listener : ĠE lectric Fields Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState (): ĠParcel able ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsuper State Ġ= Ġsuper . on Save InstanceState () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(( super State Ġ!= Ġnull ) Ġ&& Ġ( charges . size Ġ> Ġ 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġss Ġ= ĠSaved State ( super State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġss . charges Ġ= Ġcharges ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġss ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper State ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Restore InstanceState ( state : ĠParcel able ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġ! is ĠSaved State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Restore InstanceState ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuper . on Restore InstanceState ( state . super State ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( state . charges Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( charge Ġin Ġstate . charges !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Charge ( charge ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestart () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIs Ġthe Ġtask Ġidle Ġand Ġnot Ġrendering Ġthe Ġfields ? ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġidle . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Idle (): ĠBoolean Ġ= Ġ( task Ġ== Ġnull ) Ġ|| Ġtask !!. is Idle () ĊĊĠĠĠ Ġoverride Ġfun Ġon Double Tap ( e : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Double Tap Event ( e : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Down ( e : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Fl ing ( e 1 : ĠMotion Event , Ġe 2 : ĠMotion Event , Ġvelocity X : ĠFloat , Ġvelocity Y : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Long Press ( e : ĠMotion Event ) Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġon Scroll ( e 1 : ĠMotion Event , Ġe 2 : ĠMotion Event , Ġdistance X : ĠFloat , Ġdistance Y : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* val Ġdx Ġ= Ġdistance X . absolute Value ĊĠĠĠĠĠĠĠ Ġval Ġdy Ġ= Ġdistance Y . absolute Value ĊĠĠĠĠĠĠĠ Ġif Ġ( dx Ġ>= Ġdy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġchange Ġpalette Ġh ues ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġchange Ġpalette Ġdensity ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue */ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Scale Begin ( detector : ĠScale Gesture Detector ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġscale Factor Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġ( detector . focus X Ġ- Ġmeasured Width Diff ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġ( detector . focus Y Ġ- Ġmeasured Height Diff ). toInt () ĊĠĠĠĠĠĠĠ Ġcharge To Scale Ġ= Ġfind Charge ( x , Ġy ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ( listener Ġ!= Ġnull ) Ġ&& Ġ( charge To Scale Ġ!= Ġnull ) Ġ&& Ġlistener !!. on Charge Scale Begin ( this , Ġcharge To Scale !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Scale ( detector : ĠScale Gesture Detector ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġscale Factor Ġ*= Ġdetector . scale Factor ĊĠĠĠĠĠĠĠ Ġreturn Ġ( listener Ġ!= Ġnull ) Ġ&& Ġlistener !!. on Charge Scale ( this , Ġcharge To Scale !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Scale End ( detector : ĠScale Gesture Detector ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( charge To Scale Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharge To Scale !!. size Ġ*= Ġscale Factor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Charge Scale End ( this , Ġcharge To Scale !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Show Press ( e : ĠMotion Event ) Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġon Single Tap Confirmed ( e : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġ( e . x Ġ- Ġmeasured Width Diff ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġ( e . y Ġ- Ġmeasured Height Diff ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġmin ( uptime Millis () Ġ- Ġe . down Time , ĠSE COND _ IN _ M ILL IS ) ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġ 1 . 0 Ġ+ Ġ( duration Ġ/ Ġ 2 0 L ). toDouble () ĊĠĠĠĠĠĠĠ Ġif Ġ( listener ?. on Render Field Clicked ( this , Ġx , Ġy , Ġsize ) Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperform H aptic Feedback ( H aptic Feedback Constants . LONG _ PRESS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Single Tap Up ( e : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġscale Gesture Detector . on Touch Event ( event ) ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġgesture Detector . on Touch Event ( event ) Ġ|| Ġresult ĊĠĠĠĠĠĠĠ Ġreturn Ġresult Ġ|| Ġsuper . on Touch Event ( event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Next ( value : ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpost Invalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlistener ?. on Render Field Cancelled ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonComplete () Ġ{ ĊĠĠĠĠĠĠĠ Ġlistener ?. on Render Field Finished ( this ) ĊĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Subscribe ( d : ĠDis posable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlistener ?. on Render Field Started ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Detached From Window () ĊĠĠĠĠĠĠĠ Ġ_ bitmap ?. recycle () ĊĠĠĠĠĠĠĠ Ġ_ bitmap Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠSaved State Ġ: ĠBase Saved State Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġcharges : ĠMutable List < Charge >? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconstructor ( source : ĠParcel ) Ġ: Ġsuper ( source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharges Ġ= ĠArrayList < Charge >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource . read Typed List ( charges !! , ĠCharge . CRE ATOR ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconstructor ( super State : ĠParcel able ) Ġ: Ġsuper ( super State ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠwriteTo Parcel ( out : ĠParcel , Ġflags : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . writeTo Parcel ( out , Ġflags ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . write Typed List ( charges ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdescribe Contents (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject ĠCRE ATOR Ġ: ĠParcel able . Creator < Saved State > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate From Parcel ( parcel : ĠParcel ): ĠSaved State Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSaved State ( parcel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnew Array ( size : ĠInt ): ĠArray < Saved State ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠarrayOf Null s ( size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIN _ CHAR GES Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ CHAR GES Ġ= Ġ 1 0 ĊĠĠĠ Ġ} Ċ } Ċ