/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠAC IN Q ĠSAS Ċ Ġ* Ċ Ġ* Ġ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 Ġfr . ac in q . phoenix . legacy . utils . custom views Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Message Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . H aptic Feedback Constants Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Configuration Ċ import Ġandroidx . constraint layout . widget . Constraint Layout Ċ import Ġandroidx . databinding . Data Binding Util Ċ import Ġfr . ac in q . phoenix . legacy . R Ċ import Ġfr . ac in q . phoenix . legacy . databinding . Custom Virtual Keyboard View Binding Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . lang . ref . Weak Reference Ċ Ċ /** Ċ Ġ* ĠThis Ġis Ġa Ġvirtual Ġkeyboard Ġcontaining Ġthe Ġ[ A - Z Ġ] Ġkeys Ġ( i . e . Ġ 2 7 Ġkeys ). ĠThe Ġspace Ġcharacter Ġis Ġallowed . ĠIt 's Ġbasically Ċ Ġ* Ġa Ġgrid Ġof Ġbuttons . ĠPress ing Ġa Ġbutton Ġon Ġthis Ġkeyboard Ġwill Ġdispatch Ġan Ġevent Ġthat Ġyou Ġcan Ġlisten Ġto Ġby Ġimplementing Ċ Ġ* Ġa Ġ[ Virtual Keyboard . On Key Pressed Listener ]. Ċ Ġ*/ Ċ Ċ // Ċ class ĠVirtual Keyboard View Ġ@ Jvm Over loads Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ? Ġ= Ġnull , Ġdef Style : ĠInt Ġ= ĠR . style . default _ theme ) Ġ: ĠConstraint Layout ( context , Ġattrs , Ġdef Style ) Ġ{ ĊĊĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Virtual Keyboard View :: class . java ) ĊĊĠ Ġ// Ġfield Ġto Ġhandle Ġkey Ġrepet ition Ġ( long Ġpress Ġon Ġdelete Ġfor Ġexample ) ĊĠ Ġprivate Ġvar Ġm Handler : ĠHandler ? Ġ= Ġnull ĊĊĠ Ġprivate Ġvar Ġm Listener : ĠOn Key Pressed Listener ? Ġ= Ġnull ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠListener Ġfor Ġthe Ġvirtual Ġkey Ġpress Ġevent . ĠImplement Ġthis Ġto Ġreact Ġwhen Ġa Ġkey Ġis Ġpressed . ĊĠĠ Ġ*/ ĊĠ Ġinterface ĠOn Key Pressed Listener Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġa Ġvirtual Ġkey Ġof Ġthe Ġvirtual Ġkeyboard Ġis Ġpressed . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠkeyCode ĠUnicode Ġvalue Ġof Ġthe Ġcharacter Ġfor Ġthe Ġkey . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Event ( keyCode : ĠInt ) ĊĠ Ġ} ĊĊĠ Ġfun Ġset On Key Pressed Listener ( event Listener : ĠOn Key Pressed Listener ) Ġ{ ĊĠĠĠ Ġm Listener Ġ= Ġevent Listener ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġdispatch Char Event ( keyCode : ĠInt ) Ġ{ ĊĠĠĠ Ġm Handler ?. remove Messages ( MSG _ REPEAT ) ĊĠĠĠ Ġif Ġ( m Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( keyCode Ġ!= ĠKEY _ DELETE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis H aptic Feedback Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġperform H aptic Feedback ( H aptic Feedback Constants . VIRTUAL _ KEY , ĠH aptic Feedback Constants . FLAG _ IGNORE _ GLOBAL _ SETTING ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġm Listener ?. on Event ( keyCode ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġval Ġm Binding : ĠCustom Virtual Keyboard View Binding Ġ= ĠData Binding Util . inflate ( LayoutInflater . from ( getContext ()), ĠR . layout . custom _ virtual _ keyboard _ view , Ġthis , Ġtrue ) ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġm Binding . key A . setOnClickListener Ġ{ Ġdispatch Char Event (' a '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key B . setOnClickListener Ġ{ Ġdispatch Char Event (' b '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key C . setOnClickListener Ġ{ Ġdispatch Char Event (' c '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key D . setOnClickListener Ġ{ Ġdispatch Char Event (' d '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key E . setOnClickListener Ġ{ Ġdispatch Char Event (' e '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key F . setOnClickListener Ġ{ Ġdispatch Char Event (' f '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key G . setOnClickListener Ġ{ Ġdispatch Char Event (' g '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key H . setOnClickListener Ġ{ Ġdispatch Char Event (' h '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key I . setOnClickListener Ġ{ Ġdispatch Char Event (' i '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key J . setOnClickListener Ġ{ Ġdispatch Char Event (' j '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key K . setOnClickListener Ġ{ Ġdispatch Char Event (' k '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key L . setOnClickListener Ġ{ Ġdispatch Char Event (' l '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key M . setOnClickListener Ġ{ Ġdispatch Char Event (' m '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key N . setOnClickListener Ġ{ Ġdispatch Char Event (' n '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key O . setOnClickListener Ġ{ Ġdispatch Char Event (' o '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key P . setOnClickListener Ġ{ Ġdispatch Char Event (' p '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key Q . setOnClickListener Ġ{ Ġdispatch Char Event (' q '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key R . setOnClickListener Ġ{ Ġdispatch Char Event (' r '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key S . setOnClickListener Ġ{ Ġdispatch Char Event (' s '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key T . setOnClickListener Ġ{ Ġdispatch Char Event (' t '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key U . setOnClickListener Ġ{ Ġdispatch Char Event (' u '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key V . setOnClickListener Ġ{ Ġdispatch Char Event (' v '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key W . setOnClickListener Ġ{ Ġdispatch Char Event (' w '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key X . setOnClickListener Ġ{ Ġdispatch Char Event (' x '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key Y . setOnClickListener Ġ{ Ġdispatch Char Event (' y '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key Z . setOnClickListener Ġ{ Ġdispatch Char Event (' z '. toInt ()) Ġ} ĊĠĠĠ Ġm Binding . key Space . setOnClickListener Ġ{ Ġdispatch Char Event (' Ġ'. toInt ()) Ġ} ĊĠĠĠ Ġhandle Delete () ĊĠ Ġ} ĊĊĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠ Ġprivate Ġfun Ġhandle Delete () Ġ{ ĊĠĠĠ Ġm Binding . key Delete . setOn Touch Listener Ġ{ Ġ_, Ġevent Ġ-> ĊĠĠĠĠĠ Ġwhen Ġ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġdispatch Char Event ( KEY _ DELETE ) ĊĠĠĠĠĠĠĠĠĠ Ġm Handler ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Messages ( MSG _ LONG PRESS ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsendMessage Delayed ( obtain Message ( MSG _ LONG PRESS , ĠKEY _ DELETE ), ĠLONG PRESS _ TIMEOUT . to Long ()) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġm Handler ?. remove Messages ( MSG _ REPEAT ) ĊĠĠĠĠĠĠĠĠĠ Ġm Handler ?. remove Messages ( MSG _ LONG PRESS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġm Handler ?. remove Messages ( MSG _ REPEAT ) ĊĠĠĠĠĠĠĠĠĠ Ġm Handler ?. remove Messages ( MSG _ LONG PRESS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġnothing ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Attached To Window () Ġ{ ĊĠĠĠ Ġsuper . on Attached To Window () ĊĠĠĠ Ġif Ġ( m Handler Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġm Handler Ġ= ĠRepeat Key Handler ( this ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinternal Ġclass ĠRepeat Key Handler ( keyboard : ĠVirtual Keyboard View ) Ġ: ĠHandler () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Repeat Key Handler :: class . java ) ĊĊĠĠĠ Ġprivate Ġval Ġm Keyboard : ĠWeak Reference < Virtual Keyboard View > Ġ= ĠWeak Reference ( keyboard ) ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Message ( msg : ĠMessage ) Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ( msg . what ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMSG _ LONG PRESS Ġ-> ĠsendMessage ( obtain Message ( MSG _ REPEAT , Ġmsg . obj )) ĊĠĠĠĠĠĠĠ ĠMSG _ REPEAT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġm Keyboard . get ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠkeyCode Ġ= Ġmsg . obj Ġas ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . dispatch Char Event ( keyCode ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsendMessage Delayed ( obtain Message ( MSG _ REPEAT , ĠkeyCode ), ĠRE PEAT _ INTERVAL . to Long ()) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġconst Ġval ĠKEY _ DELETE Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġconst Ġval ĠRE PEAT _ INTERVAL Ġ= Ġ 5 0 Ġ// Ġ~ 2 0 Ġkeys Ġper Ġsecond ĊĠĠĠ Ġprivate Ġconst Ġval ĠMSG _ LONG PRESS Ġ= Ġ 4 ĊĠĠĠ Ġprivate Ġconst Ġval ĠMSG _ REPEAT Ġ= Ġ 3 ĊĠĠĠ Ġprivate Ġval ĠLONG PRESS _ TIMEOUT Ġ= ĠView Configuration . getLong Press Timeout () ĊĠ Ġ} Ċ } Ċ