/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 1 ĠPat rick ĠGold inger Ċ Ġ* Ċ Ġ* Ġ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 Ġdev . pat rick gold . fl or is board . ime . text . keyboard Ċ Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . content . Context Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . animation . Accel erate Interpolator Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . foundation . layout . Box With Constraints Ċ import Ġandroidx . compose . foundation . layout . absolute Offset Ċ import Ġandroidx . compose . foundation . layout . fill Max Height Ċ import Ġandroidx . compose . foundation . layout . fill Max Width Ċ import Ġandroidx . compose . foundation . layout . height Ċ import Ġandroidx . compose . foundation . layout . padding Ċ import Ġandroidx . compose . foundation . layout . required Size Ċ import Ġandroidx . compose . foundation . layout . wrap Content Size Ċ import Ġandroidx . compose . material . Icon Ċ import Ġandroidx . compose . material . Text Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . Disposable Effect Ċ import Ġandroidx . compose . runtime . La unched Effect Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . mutable State ListOf Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . runtime . setValue Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Bias Alignment Ċ import Ġandroidx . compose . ui . Experimental Compose Ui Api Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . draw . draw With Content Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . geometry . Size Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . graphics . draw scope . Content Draw Scope Ċ import Ġandroidx . compose . ui . input . pointer . pointer Interop Filter Ċ import Ġandroidx . compose . ui . layout . on Glob ally Position ed Ċ import Ġandroidx . compose . ui . platform . Local Configuration Ċ import Ġandroidx . compose . ui . platform . Local Context Ċ import Ġandroidx . compose . ui . platform . Local Density Ċ import Ġandroidx . compose . ui . res . p ainter Resource Ċ import Ġandroidx . compose . ui . text . font . Font Family Ċ import Ġandroidx . compose . ui . text . style . Text Overflow Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġandroidx . compose . ui . unit . to Size Ċ import Ġdev . pat rick gold . fl or is board . Fl or is I me Service Ċ import Ġdev . pat rick gold . fl or is board . app . prefs . fl or is Preference Model Ċ import Ġdev . pat rick gold . fl or is board . app . ui . components . Disposable Lifecycle Effect Ċ import Ġdev . pat rick gold . fl or is board . app . ui . components . safe Times Ċ import Ġdev . pat rick gold . fl or is board . common . Fl or is Rect Ċ import Ġdev . pat rick gold . fl or is board . common . Pointer Ċ import Ġdev . pat rick gold . fl or is board . common . Pointer Map Ċ import Ġdev . pat rick gold . fl or is board . common . android . is Orientation Land scape Ċ import Ġdev . pat rick gold . fl or is board . common . observe As Transform ing State Ċ import Ġdev . pat rick gold . fl or is board . common . toInt Offset Ċ import Ġdev . pat rick gold . fl or is board . debug . Log Topic Ċ import Ġdev . pat rick gold . fl or is board . debug . f log Debug Ċ import Ġdev . pat rick gold . fl or is board . glide Typing Manager Ċ import Ġdev . pat rick gold . fl or is board . ime . core . Input KeyEvent Ċ import Ġdev . pat rick gold . fl or is board . ime . keyboard . Fl or is I me S izing Ċ import Ġdev . pat rick gold . fl or is board . ime . keyboard . Keyboard Mode Ċ import Ġdev . pat rick gold . fl or is board . ime . keyboard . Render Info Ċ import Ġdev . pat rick gold . fl or is board . ime . popup . Exceptions ForKey Codes Ċ import Ġdev . pat rick gold . fl or is board . ime . popup . Popup Ui Controller Ċ import Ġdev . pat rick gold . fl or is board . ime . popup . remember Popup Ui Controller Ċ import Ġdev . pat rick gold . fl or is board . ime . text . gest ures . G lide Typing Gesture Ċ import Ġdev . pat rick gold . fl or is board . ime . text . gest ures . Swipe Action Ċ import Ġdev . pat rick gold . fl or is board . ime . text . gest ures . Swipe Gesture Ċ import Ġdev . pat rick gold . fl or is board . ime . text . key . KeyCode Ċ import Ġdev . pat rick gold . fl or is board . ime . text . key . KeyType Ċ import Ġdev . pat rick gold . fl or is board . ime . theme . Fl or is I me Theme Ċ import Ġdev . pat rick gold . fl or is board . ime . theme . Fl or is I me Ui Ċ import Ġdev . pat rick gold . fl or is board . keyboard Manager Ċ import Ġdev . pat rick gold . fl or is board . sn y gg . ui . S ny gg Surface Ċ import Ġdev . pat rick gold . fl or is board . sn y gg . ui . sn y gg Background Ċ import Ġdev . pat rick gold . fl or is board . sn y gg . ui . solid Color Ċ import Ġdev . pat rick gold . fl or is board . sn y gg . ui . sp Size Ċ import Ġdev . pat rick gold . jet pref . datastore . model . observe As State Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . Supervisor Job Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . channels . on Failure Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . isActive Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . sqrt Ċ Ċ @ Opt In ( Experimental Compose Ui Api :: class ) Ċ @ Composable Ċ fun ĠText Keyboard Layout ( ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , ĊĠĠĠ Ġrender Info : ĠRender Info , ĊĠĠĠ Ġis Preview : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġis Smart bar Keyboard : ĠBoolean Ġ= Ġfalse , Ċ ): ĠUnit Ġ= Ġwith ( Local Density . current ) Ġ{ ĊĠĠĠ Ġval Ġprefs Ġby Ġfl or is Preference Model () ĊĠĠĠ Ġval Ġcontext Ġ= ĠLocal Context . current ĊĠĠĠ Ġval Ġconfiguration Ġ= ĠLocal Configuration . current ĊĠĠĠ Ġval Ġg lide Typing Manager Ġby Ġcontext . glide Typing Manager () ĊĊĠĠĠ Ġval Ġkeyboard Ġ= Ġrender Info . keyboard ĊĠĠĠ Ġval Ġnumber Row Enabled Ġby Ġprefs . keyboard . number Row . observe As Transform ing State Ġ{ Ġnumber Row Enabled Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( keyboard . mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKeyboard Mode . CHAR ACT ERS , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKeyboard Mode . NUMERIC _ ADV ANCED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKeyboard Mode . SYMBOL S , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKeyboard Mode . SYMBOL S 2 Ġ-> Ġnumber Row Enabled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġg lide Enabled Ġby Ġprefs . glide . enabled . observe As State () ĊĠĠĠ Ġval Ġg lide Show Trail Ġby Ġprefs . glide . show Trail . observe As State () ĊĠĠĠ Ġval Ġg lide Trail Color Ġ= ĠFl or is I me Theme . style . get ( element Ġ= ĠFl or is I me Ui . G lide Trail ) ĊĠĠĠĠĠĠĠ Ġ. foreground . solid Color ( default Ġ= ĠColor . Green ) ĊĊĠĠĠ Ġval Ġcontroller Ġ= Ġremember Ġ{ ĠText Keyboard Layout Controller ( context ) Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠ Ġit . keyboard Ġ= Ġkeyboard ĊĠĠĠĠĠĠĠ Ġif Ġ( glide Enabled Ġ&& Ġ! is Smart bar Keyboard Ġ&& Ġ! is Preview Ġ&& Ġkeyboard . mode Ġ== ĠKeyboard Mode . CHAR ACT ERS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġkeyboard . keys (). as Sequence (). toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg lide Typing Manager . setLayout ( keys ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġtouch Event Channel Ġ= Ġremember Ġ{ ĠChannel < Motion Event >( 6 4 ) Ġ} ĊĊĠĠĠ Ġfun Ġreset All Keys () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠMotion Event . obtain ( 0 L , Ġ 0 L , ĠMotion Event . ACTION _ CANCEL , Ġ 0 f , Ġ 0 f , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġcontroller . on Touch Event Internal ( event ) ĊĠĠĠĠĠĠĠ Ġcontroller . popup Ui Controller . hide () ĊĠĠĠĠĠĠĠ Ġevent . recycle () ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠDis posable Effect ( Unit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontroller . glide Typing Detector . register Listener ( controller ) ĊĠĠĠĠĠĠĠ Ġcontroller . glide Typing Detector . register Listener ( glide Typing Manager ) ĊĠĠĠĠĠĠĠ Ġon Dispose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . glide Typing Detector . unregister Listener ( controller ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . glide Typing Detector . unregister Listener ( glide Typing Manager ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset All Keys () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠDis posable Lifecycle Effect ( ĊĠĠĠĠĠĠĠ Ġon Resume Ġ= Ġ{ Ġ/* ĠDo Ġnothing Ġ*/ Ġ}, ĊĠĠĠĠĠĠĠ Ġon Pause Ġ= Ġ{ Ġreset All Keys () Ġ}, ĊĠĠĠ Ġ) ĊĊĠĠĠ ĠBox With Constraints ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Width () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. height ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Smart bar Keyboard ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFl or is I me S izing . smart bar Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFl or is I me S izing . keyboard Row Base Height Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyboard . rowCount . coerce At Least ( if Ġ( number Row Enabled ) Ġ 5 Ġelse Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Glob ally Position ed Ġ{ Ġcoords Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . size Ġ= Ġcoords . size . to Size () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. pointer Interop Filter Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Preview ) Ġreturn @ pointer Interop Filter Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event . action Mask ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ POINTER _ DOWN , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ POINTER _ UP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcloned Event Ġ= ĠMotion Event . obtain ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Event Channel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. try Send ( cloned Event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġto Ġprevent ĠMotion Event Ġmemory Ġleak age ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġcase Ġthe Ġinput Ġchannel Ġis Ġfull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcloned Event . recycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ pointer Interop Filter Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ pointer Interop Filter Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. draw With Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Content () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( glide Enabled Ġ&& Ġg lide Show Trail Ġ&& Ġ! is Smart bar Keyboard ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Dist Ġ= Ġ 3 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġradius Ġ= Ġ 2 0 . 0 f ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġradius Reduction Factor Ġ= Ġ 0 . 9 9 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( controller . f ading G lide Radius Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . draw G lide Trail ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . f ading G lide , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Dist , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . f ading G lide Radius , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġradius Reduction Factor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg lide Trail Color , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( controller . is Gl iding Ġ&& Ġcontroller . glide Data For Drawing . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . draw G lide Trail ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , Ġcontroller . glide Data For Drawing , Ġtarget Dist , Ġradius , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġradius Reduction Factor , Ġg lide Trail Color , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Margin H Ġby Ġprefs . keyboard . key Spacing Horizontal . observe As Transform ing State Ġ{ Ġit . dp . to Px () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġkey Margin V Ġby Ġprefs . keyboard . key Spacing Vertical . observe As Transform ing State Ġ{ Ġit . dp . to Px () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdesired Key Ġ= Ġremember Ġ{ ĠText Key ( data Ġ= ĠText Key Data . UNSPECIFIED ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġkeyboard Width Ġ= Ġconstraints . maxWidth . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġkeyboard Height Ġ= Ġconstraints . max Height . toFloat () ĊĠĠĠĠĠĠĠ Ġdesired Key . touch Bounds . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Smart bar Keyboard ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġkeyboard Width Ġ/ Ġ 8 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= ĠFl or is I me S izing . smart bar Height . to Px () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġkeyboard Width Ġ/ Ġ 1 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= ĠFl or is I me S izing . keyboard Row Base Height . to Px () Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( number Row Enabled Ġ&& Ġkeyboard . mode Ġ!= ĠKeyboard Mode . CHAR ACT ERS ) Ġ 1 . 1 2 f Ġelse Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdesired Key . visible Bounds . apply From ( desired Key . touch Bounds ). def late By ( key Margin H , Ġkey Margin V ) ĊĠĠĠĠĠĠĠ Ġkeyboard . layout ( keyboard Width , Ġkeyboard Height , Ġdesired Key ) ĊĊĠĠĠĠĠĠĠ Ġval ĠfontSize Multiplier Ġ= Ġprefs . keyboard . fontSize Multiplier () ĊĠĠĠĠĠĠĠ Ġval Ġpopup Ui Controller Ġ= Ġremember Popup Ui Controller ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey 1 Ġ= Ġkeyboard , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbounds Provider Ġ= Ġ{ Ġkey Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Popup Width : ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Popup Height : ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration . is Orientation Land scape () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Smart bar Keyboard ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Popup Width Ġ= Ġkey . visible Bounds . width Ġ* Ġ 1 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Popup Height Ġ= Ġdesired Key . visible Bounds . height Ġ* Ġ 3 . 0 f Ġ* Ġ 1 . 2 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Popup Width Ġ= Ġdesired Key . visible Bounds . width Ġ* Ġ 1 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Popup Height Ġ= Ġdesired Key . visible Bounds . height Ġ* Ġ 3 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Smart bar Keyboard ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Popup Width Ġ= Ġkey . visible Bounds . width Ġ* Ġ 1 . 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Popup Height Ġ= Ġdesired Key . visible Bounds . height Ġ* Ġ 2 . 5 f Ġ* Ġ 1 . 2 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Popup Width Ġ= Ġdesired Key . visible Bounds . width Ġ* Ġ 1 . 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Popup Height Ġ= Ġdesired Key . visible Bounds . height Ġ* Ġ 2 . 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Popup Diff X Ġ= Ġ( key . visible Bounds . width Ġ- Ġkey Popup Width ) Ġ/ Ġ 2 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFl or is Rect . new (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= Ġkey . visible Bounds . left Ġ+ Ġkey Popup Diff X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġkey . visible Bounds . bottom Ġ- Ġkey Popup Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Ġ= Ġleft Ġ+ Ġkey Popup Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ= Ġtop Ġ+ Ġkey Popup Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Suit able For Basic Popup Ġ= Ġ{ Ġkey Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Ġis ĠText Key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġkey . computed Data . code ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġkey . computed Data . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumeric Ġ= Ġkeyboard . mode Ġ== ĠKeyboard Mode . NUMERIC Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyboard . mode Ġ== ĠKeyboard Mode . PHONE Ġ|| Ġkeyboard . mode Ġ== ĠKeyboard Mode . PHONE 2 Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyboard . mode Ġ== ĠKeyboard Mode . NUMERIC _ ADV ANCED Ġ&& Ġt Ġ== ĠKey Type . NUMERIC ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ> ĠKeyCode . SPACE Ġ&& Ġc Ġ!= ĠKeyCode . MULTIPLE _ CODE _ POINTS Ġ&& Ġc Ġ!= ĠKeyCode . C JK _ SPACE Ġ&& Ġ! numeric ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Suit able For Extended Popup Ġ= Ġ{ Ġkey Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Ġis ĠText Key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġkey . computed Data . code ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ> ĠKeyCode . SPACE Ġ&& Ġc Ġ!= ĠKeyCode . MULTIPLE _ CODE _ POINTS Ġ&& Ġc Ġ!= ĠKeyCode . C JK _ SPACE Ġ|| ĠExceptions ForKey Codes . contains ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġpopup Ui Controller . evaluator Ġ= Ġrender Info . evaluator ĊĠĠĠĠĠĠĠ Ġpopup Ui Controller . fontSize Multiplier Ġ= ĠfontSize Multiplier ĊĠĠĠĠĠĠĠ Ġpopup Ui Controller . key Hint Configuration Ġ= Ġprefs . keyboard . key Hint Configuration () ĊĠĠĠĠĠĠĠ Ġcontroller . popup Ui Controller Ġ= Ġpopup Ui Controller ĊĠĠĠĠĠĠĠ Ġfor Ġ( text Key Ġin Ġkeyboard . keys ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText Key Button ( text Key , Ġrender Info , ĠfontSize Multiplier , Ġis Smart bar Keyboard ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpopup Ui Controller . Render Pop ups () ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠLa unched Effect ( Unit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( event Ġin Ġtouch Event Channel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isActive ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . on Touch Event Internal ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . recycle () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠText Key Button ( ĊĠĠĠ Ġkey : ĠText Key , ĊĠĠĠ Ġrender Info : ĠRender Info , ĊĠĠĠ ĠfontSize Multiplier : ĠFloat , ĊĠĠĠ Ġis Smart bar Key : ĠBoolean , Ċ ) Ġ= Ġwith ( Local Density . current ) Ġ{ ĊĠĠĠ Ġval Ġkey Style Ġ= ĠFl or is I me Theme . style . get ( ĊĠĠĠĠĠĠĠ Ġelement Ġ= Ġif Ġ( is Smart bar Key ) ĠFl or is I me Ui . Smart bar Key Ġelse ĠFl or is I me Ui . Key , ĊĠĠĠĠĠĠĠ Ġcode Ġ= Ġkey . computed Data . code , ĊĠĠĠĠĠĠĠ Ġmode Ġ= Ġrender Info . state . input Mode . value , ĊĠĠĠĠĠĠĠ Ġis Pressed Ġ= Ġkey . is Pressed Ġ&& Ġkey . isEnabled , ĊĠĠĠĠĠĠĠ Ġis Disabled Ġ= Ġ! key . isEnabled , ĊĠĠĠ Ġ) ĊĠĠĠ Ġval ĠfontSize Ġ= Ġkey Style . fontSize . sp Size () Ġsafe Times ĠfontSize Multiplier Ġsafe Times Ġwhen Ġ( key . computed Data . code ) Ġ{ ĊĠĠĠĠĠĠĠ ĠKeyCode . VIEW _ CHAR ACT ERS , ĊĠĠĠĠĠĠĠ ĠKeyCode . VIEW _ SYMBOL S , ĊĠĠĠĠĠĠĠ ĠKeyCode . VIEW _ SYMBOL S 2 Ġ-> Ġ 0 . 8 0 f ĊĠĠĠĠĠĠĠ ĠKeyCode . VIEW _ NUMERIC , ĊĠĠĠĠĠĠĠ ĠKeyCode . VIEW _ NUMERIC _ ADV ANCED Ġ-> Ġ 0 . 5 5 f ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 1 . 0 f ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġsize Ġ= Ġkey . visible Bounds . size . to Dp Size () ĊĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. required Size ( size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. absolute Offset Ġ{ Ġkey . visible Bounds . top Left . toInt Offset () Ġ}, ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġmaybe Ġmake Ġthis Ġcustom izable Ġthrough Ġa Ġsize Ġproperty Ġfor Ġkey Style ĊĠĠĠĠĠĠĠ Ġval Ġis Reduc ed Height Ġ= Ġkey . computed Data . let Ġ{ Ġit . code Ġ== ĠKeyCode . ENTER Ġ|| Ġit . code Ġ== ĠKeyCode . SPACE Ġ} ĊĠĠĠĠĠĠĠ ĠS ny gg Surface ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Width () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Reduc ed Height Ġ&& ĠFl or is I me Theme . config . is Border less ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . padding ( vertical Ġ= Ġsize . height Ġ* Ġ 0 . 1 5 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Height (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= Ġkey Style , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclip Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġis Tel pad Key Ġ= Ġkey . computed Data . type Ġ== ĠKey Type . NUMERIC Ġ&& Ġrender Info . keyboard . mode Ġ== ĠKeyboard Mode . PHONE ĊĠĠĠĠĠĠĠ Ġkey . label ?. let Ġ{ Ġlabel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key . computed Data . code Ġ== ĠKeyCode . SPACE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefs Ġby Ġfl or is Preference Model () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdisplay Language Name Ġby Ġprefs . keyboard . space Bar Language Display Enabled . observe As State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! display Language Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ let ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. wrap Content Size () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. align ( if Ġ( is Tel pad Key ) ĠB ias Alignment (- 0 . 5 f , Ġ 0 f ) Ġelse ĠAlignment . Center ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġlabel , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġkey Style . foreground . solid Color (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfontSize Ġ= ĠfontSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Lines Ġ= Ġif Ġ( key . computed Data . code Ġ== ĠKeyCode . VIEW _ NUMERIC _ ADV ANCED ) Ġ 2 Ġelse Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsoft Wrap Ġ= Ġkey . computed Data . code Ġ== ĠKeyCode . VIEW _ NUMERIC _ ADV ANCED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverflow Ġ= Ġwhen Ġ( key . computed Data . code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyCode . SPACE Ġ-> ĠText Overflow . El lipsis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠText Overflow . Visible ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġkey . hint ed Label ?. let Ġ{ Ġhint ed Label Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Hint Style Ġ= ĠFl or is I me Theme . style . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= ĠFl or is I me Ui . Key Hint , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Ġ= Ġkey . computed Hint Data . code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmode Ġ= Ġrender Info . state . input Mode . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Pressed Ġ= Ġkey . is Pressed , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhint FontSize Ġ= Ġkey Hint Style . fontSize . sp Size () Ġsafe Times ĠfontSize Multiplier ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. wrap Content Size () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. align ( if Ġ( is Tel pad Key ) ĠB ias Alignment ( 0 . 5 f , Ġ 0 f ) Ġelse ĠAlignment . Top End ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sn y gg Background ( key Hint Style ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( horizontal Ġ= Ġ( key . visible Bounds . width Ġ/ Ġ 1 2 f ). to Dp ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġhint ed Label , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġkey Hint Style . foreground . solid Color (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfontFamily Ġ= ĠFont Family . Mono space , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfontSize Ġ= Ġhint FontSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Lines Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsoft Wrap Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverflow Ġ= ĠText Overflow . Visible , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġkey . foreground Drawable Id ?. let Ġ{ Ġdrawable Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIcon ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. required Size ( fontSize . to Dp () Ġ* Ġ 1 . 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. align ( Alignment . Center ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpainter Ġ= Ġpainter Resource ( drawable Id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt int Ġ= Ġkey Style . foreground . solid Color (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" unused _ parameter ") Ċ private Ġclass ĠText Keyboard Layout Controller ( ĊĠĠĠ Ġcontext : ĠContext , Ċ ) Ġ: ĠSw ipe Gesture . Listener , ĠG lide Typing Gesture . Listener Ġ{ ĊĠĠĠ Ġprivate Ġval Ġprefs Ġby Ġfl or is Preference Model () ĊĠĠĠ Ġprivate Ġval Ġkeyboard Manager Ġby Ġcontext . keyboard Manager () ĊĊĠĠĠ Ġprivate Ġval Ġactive Editor Instance Ġget () Ġ= ĠFl or is I me Service . active Editor Instance () ĊĠĠĠ Ġprivate Ġval Ġactive State Ġget () Ġ= Ġkeyboard Manager . active State ĊĠĠĠ Ġprivate Ġval Ġinput EventDispatcher Ġget () Ġ= Ġkeyboard Manager . input EventDispatcher ĊĠĠĠ Ġprivate Ġval Ġinput Feedback Controller Ġget () Ġ= ĠFl or is I me Service . input Feedback Controller () ĊĠĠĠ Ġprivate Ġval Ġkey Hint Configuration Ġ= Ġprefs . keyboard . key Hint Configuration () ĊĠĠĠ Ġprivate Ġval Ġpointer Map : ĠPointer Map < Touch Pointer > Ġ= ĠPointer Map Ġ{ ĠTouch Pointer () Ġ} ĊĠĠĠ Ġprivate Ġval Ġscope Ġ= ĠCor outine Scope ( Dispatch ers . Main . immediate Ġ+ ĠSuper visor Job ()) ĊĠĠĠ Ġlateinit Ġvar Ġpopup Ui Controller : ĠPopup Ui Controller ĊĊĠĠĠ Ġprivate Ġvar Ġinit Selection Start : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġinit Selection End : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġis Gl iding Ġby Ġmutable State Of ( false ) ĊĊĠĠĠ Ġval Ġg lide Typing Detector Ġ= ĠG lide Typing Gesture . Detector ( context ) ĊĠĠĠ Ġval Ġg lide Data For Drawing Ġ= Ġmutable State ListOf < Pair < G lide Typing Gesture . Detector . Position , ĠLong >>() ĊĠĠĠ Ġval Ġf ading G lide Ġ= Ġmutable State ListOf < Pair < G lide Typing Gesture . Detector . Position , ĠLong >>() ĊĠĠĠ Ġvar Ġf ading G lide Radius Ġby Ġmutable State Of ( 0 . 0 f ) ĊĠĠĠ Ġprivate Ġval Ġswipe Gesture Detector Ġ= ĠSw ipe Gesture . Detector ( this ) ĊĊĠĠĠ Ġlateinit Ġvar Ġkeyboard : ĠText Keyboard ĊĠĠĠ Ġvar Ġsize Ġ= ĠSize . Zero ĊĊĠĠĠ Ġfun Ġon Touch Event Internal ( event : ĠMotion Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġf log Debug Ġ{ Ġ" event =$ event " Ġ} ĊĠĠĠĠĠĠĠ Ġswipe Gesture Detector . on Touch Event ( event ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( prefs . glide . enabled . get () Ġ&& Ġkeyboard . mode Ġ== ĠKeyboard Mode . CHAR ACT ERS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg lide Pointer Ġ= Ġpointer Map . findById ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( glide Typing Detector . on Touch Event ( event , Ġg lide Pointer ?. initial Key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( pointer Ġin Ġpointer Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pointer . active Key Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Cancel Internal ( event , Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . action Mask ed Ġ== ĠMotion Event . ACTION _ UP Ġ|| Ġevent . action Mask ed Ġ== ĠMotion Event . ACTION _ CANCEL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Map . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Gl iding Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . action Mask ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Index Ġ= Ġevent . action Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Id Ġ= Ġevent . get Pointer Id ( pointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Ġ= Ġpointer Map . add ( pointer Id , Ġpointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pointer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswipe Gesture Detector . on Touch Down ( event , Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Down Internal ( event , Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ POINTER _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Index Ġ= Ġevent . action Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Id Ġ= Ġevent . get Pointer Id ( pointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Pointer Ġ= Ġpointer Map . findById ( pointer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Pointer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswipe Gesture Detector . on Touch Cancel ( event , Ġold Pointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Cancel Internal ( event , Ġold Pointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Map . remove ById ( old Pointer . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSearch Ġfor Ġactive Ġcharacter Ġkeys Ġand Ġcancel Ġthem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( pointer Ġin Ġpointer Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactive Key Ġ= Ġpointer . active Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active Key Ġ!= Ġnull Ġ&& Ġpopup Ui Controller . is Suit able For Pop ups ( active Key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswipe Gesture Detector . on Touch Cancel ( event , Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Up Internal ( event , Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Ġ= Ġpointer Map . add ( pointer Id , Ġpointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pointer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswipe Gesture Detector . on Touch Down ( event , Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Down Internal ( event , Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( pointer Index Ġin Ġ 0 Ġuntil Ġevent . pointer Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Id Ġ= Ġevent . get Pointer Id ( pointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Ġ= Ġpointer Map . findById ( pointer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pointer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer . index Ġ= Ġpointer Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalways Trigger On Move Ġ= Ġ( pointer . has Triggered Gesture Move ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( pointer . initial Key ?. computed Data ?. code Ġ== ĠKeyCode . DELETE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġprefs . gest ures . delete Key Swipe Left . get () Ġ== ĠSw ipe Action . DELETE _ CHAR ACT ERS _ PRE CI SE LY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġpointer . initial Key ?. computed Data ?. code Ġ== ĠKeyCode . SPACE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġpointer . initial Key ?. computed Data ?. code Ġ== ĠKeyCode . C JK _ SPACE )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( swipe Gesture Detector . on Touch Move ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalways Trigger On Move ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ|| Ġpointer . has Triggered Gesture Move ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer . long Press Job ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer . long Press Job Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer . has Triggered Gesture Move Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer . active Key ?. let Ġ{ Ġactive Key Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Key . is Pressed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input EventDispatcher . is Pressed ( active Key . computed Data . code )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput EventDispatcher . send ( Input KeyEvent . cancel ( active Key . computed Data )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Move Internal ( event , Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ POINTER _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Index Ġ= Ġevent . action Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Id Ġ= Ġevent . get Pointer Id ( pointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Ġ= Ġpointer Map . findById ( pointer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pointer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer . index Ġ= Ġpointer Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( swipe Gesture Detector . on Touch Up ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ|| Ġpointer . has Triggered Gesture Move Ġ|| Ġpointer . should Block Next Up ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pointer . has Triggered Gesture Move Ġ&& Ġpointer . initial Key ?. computed Data ?. code Ġ== ĠKeyCode . DELETE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Editor Instance ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selection . is Selection Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Back wards () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Cancel Internal ( event , Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Up Internal ( event , Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Map . remove ById ( pointer . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Index Ġ= Ġevent . action Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Id Ġ= Ġevent . get Pointer Id ( pointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( pointer Ġin Ġpointer Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pointer . id Ġ== Ġpointer Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer . index Ġ= Ġpointer Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( swipe Gesture Detector . on Touch Up ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ|| Ġpointer . has Triggered Gesture Move Ġ|| Ġpointer . should Block Next Up ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pointer . has Triggered Gesture Move Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer . initial Key ?. computed Data ?. code Ġ== ĠKeyCode . DELETE Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . gest ures . delete Key Swipe Left . get () Ġ!= ĠSw ipe Action . SELECT _ CHAR ACT ERS _ PRE CI SE LY Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . gest ures . delete Key Swipe Left . get () Ġ!= ĠSw ipe Action . SELECT _ WORDS _ PRE CI SE LY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Editor Instance ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selection . is Selection Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Back wards () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Cancel Internal ( event , Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Up Internal ( event , Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswipe Gesture Detector . on Touch Cancel ( event , Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Cancel Internal ( event , Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Map . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( pointer Ġin Ġpointer Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswipe Gesture Detector . on Touch Cancel ( event , Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Cancel Internal ( event , Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Map . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Touch Down Internal ( event : ĠMotion Event , Ġpointer : ĠTouch Pointer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġf log Debug ( Log Topic . TEXT _ KEY BOARD _ VIEW ) Ġ{ Ġ" pointer =$ pointer " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġkeyboard . getKey For Pos ( event . getX ( pointer . index ), Ġevent . getY ( pointer . index )) ĊĠĠĠĠĠĠĠ Ġif Ġ( key Ġ!= Ġnull Ġ&& Ġkey . isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput EventDispatcher . send ( Input KeyEvent . down ( key . computed Data )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prefs . keyboard . popup Enabled . get () Ġ&& Ġpopup Ui Controller . is Suit able For Pop ups ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup Ui Controller . show ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Feedback Controller ?. key Press ( key . computed Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey . is Pressed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pointer . initial Key Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer . initial Key Ġ= Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpointer . active Key Ġ= Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpointer . long Press Job Ġ= Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelay Millis Ġ= Ġprefs . keyboard . long Press Delay . get (). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( key . computed Data . code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyCode . SPACE , ĠKeyCode . C JK _ SPACE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Editor Instance ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Selection Start Ġ= Ġselection . start ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Selection End Ġ= Ġselection . end ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay (( delay Millis Ġ* Ġ 2 . 5 f ). to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( prefs . gest ures . space Bar Long Press . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Action . NO _ ACTION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Action . INSERT _ SPACE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyboard Manager . execute Swipe Action ( prefs . gest ures . space Bar Long Press . get ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer . should Block Next Up Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyCode . SHIFT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay (( delay Millis Ġ* Ġ 2 . 5 f ). to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput EventDispatcher . send ( Input KeyEvent . down Up ( Text Key Data . CAPS _ LOCK )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Feedback Controller ?. key Long Press ( key . computed Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyCode . LANGUAGE _ SWITCH Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay (( delay Millis Ġ* Ġ 2 . 0 f ). to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer . should Block Next Up Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput EventDispatcher . send ( Input KeyEvent . down Up ( Text Key Data . SYSTEM _ INPUT _ METHOD _ P ICK ER )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( delay Millis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( popup Ui Controller . is Suit able For Pop ups ( key ) Ġ&& Ġkey . computed Pop ups . get Popup Keys ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Hint Configuration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup Ui Controller . extend ( key , Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Feedback Controller ?. key Long Press ( key . computed Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpointer . active Key Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Touch Move Internal ( event : ĠMotion Event , Ġpointer : ĠTouch Pointer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġf log Debug ( Log Topic . TEXT _ KEY BOARD _ VIEW ) Ġ{ Ġ" pointer =$ pointer " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġinitial Key Ġ= Ġpointer . initial Key ĊĠĠĠĠĠĠĠ Ġval Ġactive Key Ġ= Ġpointer . active Key ĊĠĠĠĠĠĠĠ Ġif Ġ( initial Key Ġ!= Ġnull Ġ&& Ġactive Key Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( popup Ui Controller . is Showing Extended Popup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġevent . getX ( pointer . index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġevent . getY ( pointer . index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! popup Ui Controller . propagate Motion Event ( active Key , Ġx , Ġy )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Cancel Internal ( event , Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Down Internal ( event , Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( event . getX ( pointer . index ) Ġ< Ġactive Key . visible Bounds . left Ġ- Ġ 0 . 1 f Ġ* Ġactive Key . visible Bounds . width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġ( event . getX ( pointer . index ) Ġ> Ġactive Key . visible Bounds . right Ġ+ Ġ 0 . 1 f Ġ* Ġactive Key . visible Bounds . width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġ( event . getY ( pointer . index ) Ġ< Ġactive Key . visible Bounds . top Ġ- Ġ 0 . 3 5 f Ġ* Ġactive Key . visible Bounds . height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġ( event . getY ( pointer . index ) Ġ> Ġactive Key . visible Bounds . bottom Ġ+ Ġ 0 . 3 5 f Ġ* Ġactive Key . visible Bounds . height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Cancel Internal ( event , Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Down Internal ( event , Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Touch Up Internal ( event : ĠMotion Event , Ġpointer : ĠTouch Pointer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġf log Debug ( Log Topic . TEXT _ KEY BOARD _ VIEW ) Ġ{ Ġ" pointer =$ pointer " Ġ} ĊĠĠĠĠĠĠĠ Ġpointer . long Press Job ?. cancel () ĊĠĠĠĠĠĠĠ Ġpointer . long Press Job Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġinitial Key Ġ= Ġpointer . initial Key ĊĠĠĠĠĠĠĠ Ġval Ġactive Key Ġ= Ġpointer . active Key ĊĠĠĠĠĠĠĠ Ġif Ġ( initial Key Ġ!= Ġnull Ġ&& Ġactive Key Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactive Key . is Pressed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( popup Ui Controller . is Suit able For Pop ups ( active Key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Data Ġ= Ġpopup Ui Controller . getActive Key Data ( active Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ret Data Ġ!= Ġnull Ġ&& Ġ! pointer . has Triggered Gesture Move ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ret Data Ġ== Ġactive Key . computed Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput EventDispatcher . send ( Input KeyEvent . up ( active Key . computed Data )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input EventDispatcher . is Pressed ( active Key . computed Data . code )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput EventDispatcher . send ( Input KeyEvent . cancel ( active Key . computed Data )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput EventDispatcher . send ( Input KeyEvent . down Up ( ret Data )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input EventDispatcher . is Pressed ( active Key . computed Data . code )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput EventDispatcher . send ( Input KeyEvent . cancel ( active Key . computed Data )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup Ui Controller . hide () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pointer . has Triggered Gesture Move ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput EventDispatcher . send ( Input KeyEvent . cancel ( active Key . computed Data )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput EventDispatcher . send ( Input KeyEvent . up ( active Key . computed Data )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpointer . active Key Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpointer . has Triggered Gesture Move Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġpointer . should Block Next Up Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Touch Cancel Internal ( event : ĠMotion Event , Ġpointer : ĠTouch Pointer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġf log Debug ( Log Topic . TEXT _ KEY BOARD _ VIEW ) Ġ{ Ġ" pointer =$ pointer " Ġ} ĊĠĠĠĠĠĠĠ Ġpointer . long Press Job ?. cancel () ĊĠĠĠĠĠĠĠ Ġpointer . long Press Job Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġactive Key Ġ= Ġpointer . active Key ĊĠĠĠĠĠĠĠ Ġif Ġ( active Key Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactive Key . is Pressed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput EventDispatcher . send ( Input KeyEvent . cancel ( active Key . computed Data )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( popup Ui Controller . is Suit able For Pop ups ( active Key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup Ui Controller . hide () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpointer . active Key Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpointer . has Triggered Gesture Move Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġpointer . should Block Next Up Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Swipe ( event : ĠSw ipe Gesture . Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpointer Ġ= Ġpointer Map . findById ( event . pointer Id ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġinitial Key Ġ= Ġpointer . initial Key Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġactive Key Ġ= Ġpointer . active Key ĊĠĠĠĠĠĠĠ Ġf log Debug ( Log Topic . TEXT _ KEY BOARD _ VIEW ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( initial Key . computed Data . code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKeyCode . DELETE Ġ-> Ġhandle Delete Swipe ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKeyCode . SPACE , ĠKeyCode . C JK _ SPACE Ġ-> Ġhandle Space Swipe ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( initial Key . computed Data . code Ġ== ĠKeyCode . SHIFT Ġ&& Ġactive Key ?. computed Data ?. code Ġ== ĠKeyCode . SPACE Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Key . computed Data . code Ġ== ĠKeyCode . SHIFT Ġ&& Ġactive Key ?. computed Data ?. code Ġ== ĠKeyCode . C JK _ SPACE ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . type Ġ== ĠSw ipe Gesture . Type . TO UCH _ MOVE Ġ-> Ġhandle Space Swipe ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Key . computed Data . code Ġ== ĠKeyCode . SHIFT Ġ&& Ġactive Key ?. computed Data ?. code Ġ!= ĠKeyCode . SHIFT Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . type Ġ== ĠSw ipe Gesture . Type . TO UCH _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Key ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput EventDispatcher . send ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput KeyEvent . up ( popup Ui Controller . getActive Key Data ( it ) Ġ?: Ġit . computed Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput EventDispatcher . send ( Input KeyEvent . cancel ( Text Key Data . SHIFT )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Key . computed Data . code Ġ> ĠKeyCode . SPACE Ġ&& Ġ! popup Ui Controller . is Showing Extended Popup Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! prefs . glide . enabled . get () Ġ&& Ġ! pointer . has Triggered Gesture Move Ġ-> Ġwhen Ġ( event . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Gesture . Type . TO UCH _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġswipe Action Ġ= Ġwhen Ġ( event . direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Gesture . Direction . UP Ġ-> Ġprefs . gest ures . swipe Up . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Gesture . Direction . DOWN Ġ-> Ġprefs . gest ures . swipe Down . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Gesture . Direction . LEFT Ġ-> Ġprefs . gest ures . swipe Left . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Gesture . Direction . RIGHT Ġ-> Ġprefs . gest ures . swipe Right . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠSw ipe Action . NO _ ACTION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( swipe Action Ġ!= ĠSw ipe Action . NO _ ACTION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyboard Manager . execute Swipe Action ( swipe Action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Delete Swipe ( event : ĠSw ipe Gesture . Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( active State . is Raw Input Editor ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġpointer Ġ= Ġpointer Map . findById ( event . pointer Id ) Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( event . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Gesture . Type . TO UCH _ MOVE Ġ-> Ġwhen Ġ( prefs . gest ures . delete Key Swipe Left . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Action . DELETE _ CHAR ACT ERS _ PRE CI SE LY , ĠSw ipe Action . SELECT _ CHAR ACT ERS _ PRE CI SE LY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Editor Instance ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( event . rel Unit Count X ) Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Feedback Controller ?. gesture Moving Swipe ( Text Key Data . DELETE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark Comp osing Region ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selection . isValid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection . update And Notify ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( selection . end Ġ+ Ġevent . abs Unit Count X Ġ+ Ġ 1 ). coerce In ( 0 , Ġselection . end ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection . end ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer . should Block Next Up Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Action . DELETE _ WORDS _ PRE CI SE LY , ĠSw ipe Action . SELECT _ WORDS _ PRE CI SE LY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Editor Instance ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( event . rel Unit Count X ) Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Feedback Controller ?. gesture Moving Swipe ( Text Key Data . DELETE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark Comp osing Region ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selection . isValid Ġ&& Ġevent . abs Unit Count X Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Set N Words Left ( abs ( event . abs Unit Count X Ġ/ Ġ 2 ) Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer . should Block Next Up Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Gesture . Type . TO UCH _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . direction Ġ== ĠSw ipe Gesture . Direction . LEFT Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . gest ures . delete Key Swipe Left . get () Ġ== ĠSw ipe Action . DELETE _ WORD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyboard Manager . execute Swipe Action ( prefs . gest ures . delete Key Swipe Left . get ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Space Swipe ( event : ĠSw ipe Gesture . Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpointer Ġ= Ġpointer Map . findById ( event . pointer Id ) Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( event . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Gesture . Type . TO UCH _ MOVE Ġ-> Ġwhen Ġ( event . direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Gesture . Direction . LEFT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġprefs . gest ures . space Bar Swipe Left . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== ĠSw ipe Action . MOVE _ CURSOR _ LEFT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabs ( event . rel Unit Count X ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġif Ġ(! pointer . has Triggered Gesture Move ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Feedback Controller ?. gesture Moving Swipe ( Text Key Data . SPACE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput EventDispatcher . send ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput KeyEvent . down Up ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Key Data . ARROW _ LEFT , Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ!= ĠSw ipe Action . NO _ ACTION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Gesture . Direction . RIGHT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġprefs . gest ures . space Bar Swipe Right . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== ĠSw ipe Action . MOVE _ CURSOR _ RIGHT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabs ( event . rel Unit Count X ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġif Ġ(! pointer . has Triggered Gesture Move ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Feedback Controller ?. gesture Moving Swipe ( Text Key Data . SPACE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput EventDispatcher . send ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput KeyEvent . down Up ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Key Data . ARROW _ RIGHT , Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ!= ĠSw ipe Action . NO _ ACTION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtrue Ġ// ĠTo Ġprevent Ġthe Ġpopup Ġdisplay Ġof Ġnearby Ġkeys ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Gesture . Type . TO UCH _ UP Ġ-> Ġwhen Ġ( event . direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Gesture . Direction . LEFT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . gest ures . space Bar Swipe Left . get (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ== ĠSw ipe Action . NO _ ACTION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ!= ĠSw ipe Action . MOVE _ CURSOR _ LEFT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyboard Manager . execute Swipe Action ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Gesture . Direction . RIGHT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . gest ures . space Bar Swipe Right . get (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ== ĠSw ipe Action . NO _ ACTION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ!= ĠSw ipe Action . MOVE _ CURSOR _ RIGHT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyboard Manager . execute Swipe Action ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . abs Unit Count Y Ġ< Ġ- 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyboard Manager . execute Swipe Action ( prefs . gest ures . space Bar Swipe Up . get ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon G lide Add Point ( point : ĠG lide Typing Gesture . Detector . Position ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( prefs . glide . enabled . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg lide Data For Drawing . add ( point Ġto ĠSystem . currentTimeMillis ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon G lide Complete ( data : ĠG lide Typing Gesture . Detector . Pointer Data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon G lide Cancelled () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon G lide Cancelled () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( prefs . glide . show Trail . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf ading G lide . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf ading G lide . addAll ( glide Data For Drawing ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanim ator Ġ= ĠValue Animator . of Float ( 2 0 . 0 f , Ġ 0 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . interpol ator Ġ= ĠAccel erate Interpolator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . duration Ġ= Ġprefs . glide . trail Duration . get (). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . add Update Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf ading G lide Radius Ġ= Ġit . animated Value Ġas ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . start () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġg lide Data For Drawing . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Gl iding Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdraw G lide Trail ( ĊĠĠĠĠĠĠĠ Ġdraw Scope : ĠContent Draw Scope , ĊĠĠĠĠĠĠĠ Ġgesture Data : ĠMutable List < Pair < G lide Typing Gesture . Detector . Position , ĠLong >>, ĊĠĠĠĠĠĠĠ Ġtarget Dist : ĠFloat , ĊĠĠĠĠĠĠĠ Ġinitial Radius : ĠFloat , ĊĠĠĠĠĠĠĠ Ġradius Reduction Factor : ĠFloat , ĊĠĠĠĠĠĠĠ Ġcolor : ĠColor , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġradius Ġ= Ġinitial Radius ĊĠĠĠĠĠĠĠ Ġvar Ġdrawn Points Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġprev X Ġ= Ġgesture Data . last OrNull ()?. first ?. x Ġ?: Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġprev Y Ġ= Ġgesture Data . last OrNull ()?. first ?. y Ġ?: Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠ Ġouter @ Ġfor Ġ( i Ġin Ġgesture Data . size Ġ- Ġ 1 Ġdown To Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( time Ġ- Ġgesture Data [ i Ġ- Ġ 1 ]. second Ġ> Ġprefs . glide . trail Duration . get ()) Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdx Ġ= Ġprev X Ġ- Ġgesture Data [ i Ġ- Ġ 1 ]. first . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdy Ġ= Ġprev Y Ġ- Ġgesture Data [ i Ġ- Ġ 1 ]. first . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdist Ġ= Ġsqrt ( dx Ġ* Ġdx Ġ+ Ġdy Ġ* Ġdy ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum Points Ġ= Ġ( dist Ġ/ Ġtarget Dist ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġnum Points ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġradius Ġ*= Ġradius Reduction Factor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintermediate X Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgesture Data [ i ]. first . x Ġ* Ġ( 1 Ġ- Ġj . toFloat () Ġ/ Ġnum Points ) Ġ+ Ġgesture Data [ i Ġ- Ġ 1 ]. first . x Ġ* Ġ( j . toFloat () Ġ/ Ġnum Points ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintermediate Y Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgesture Data [ i ]. first . y Ġ* Ġ( 1 Ġ- Ġj . toFloat () Ġ/ Ġnum Points ) Ġ+ Ġgesture Data [ i Ġ- Ġ 1 ]. first . y Ġ* Ġ( j . toFloat () Ġ/ Ġnum Points ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Scope . draw Circle ( color , Ġradius , Ġcenter Ġ= ĠOffset ( intermediate X , Ġintermediate Y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawn Points Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev X Ġ= Ġintermediate X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Y Ġ= Ġintermediate Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠTouch Pointer Ġ: ĠPointer () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġinitial Key : ĠText Key ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġactive Key : ĠText Key ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġlong Press Job : ĠJob ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġhas Triggered Gesture Move : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġshould Block Next Up : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Key Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactive Key Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlong Press Job ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlong Press Job Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Triggered Gesture Move Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshould Block Next Up Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"${ Touch Pointer :: class . simple Name } Ġ{ Ġid =$ id , Ġindex =$ index , Ġinitial Key =$ initial Key , Ġactive Key =$ active Key Ġ}" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ