/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 7 ĠD uck Duck Go Ċ Ġ* Ċ Ġ* Ġ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 . duck duck go . app . browser . om nib ar Ċ Ċ import Ġandroid . content . Clip Data Ċ import Ġandroid . content . Clipboard Manager Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . os . Build Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Selection Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Patterns Ċ import Ġandroid . view . KeyEvent Ċ import Ġandroidx . appcompat . widget . AppCompat EditText Ċ import Ġcom . duck duck go . mobile . android . ui . view . show Keyboard Ċ Ċ /** Ċ Ġ* ĠVariant Ġof ĠEditText Ġwhich Ġdetect s Ġwhen Ġthe Ġuser Ġhas Ġdis missed Ġthe Ġsoft Ġkeyboard Ċ Ġ* Ċ Ġ* ĠRegister Ġas Ġa Ġlistener Ġusing Ġthe Ġ` on Back Key Listener ` Ġproperty . Ċ Ġ*/ Ċ class ĠKeyboard Aware EditText Ġ: ĠAppCompat EditText Ġ{ ĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġthis ( context , Ġnull ) ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġattrs : ĠAttributeSet ? ĊĠĠĠ Ġ) Ġ: Ġthis ( context , Ġattrs , Ġ 0 ) ĊĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġattrs : ĠAttributeSet ?, ĊĠĠĠĠĠĠĠ Ġdef Style Attr : ĠInt ĊĠĠĠ Ġ) Ġ: Ġsuper ( context , Ġattrs , Ġdef Style Attr ) ĊĊĠĠĠ Ġprivate Ġvar Ġdid Select Query First Time Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġfun ĠEdit able . is Web Url (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPattern s . WEB _ URL . matcher ( this . toString ()). matches () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Focus Changed ( ĊĠĠĠĠĠĠĠ Ġfocused : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġdirection : ĠInt , ĊĠĠĠĠĠĠĠ Ġpreviously Focused Rect : ĠRect ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Focus Changed ( focused , Ġdirection , Ġpreviously Focused Rect ) ĊĠĠĠĠĠĠĠ Ġif Ġ( focused ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text Ġ!= Ġnull Ġ&& Ġtext ?. is Web Url () Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( did Select Query First Time ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtrigger Ġthe Ġtext Ġchange Ġlistener Ġso Ġthat Ġwe Ġcan Ġshow Ġautocomplete ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġtext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcursor Ġat Ġthe Ġend Ġof Ġthe Ġword ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Selection ( text !!. length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdid Select Query First Time Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ{ ĠSelection . selectAll ( text ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( text ?. is Web Url () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġalways Ġwant ĠURLs Ġto Ġbe Ġselected ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġneed Ġto Ġpost Ġfor Ġthe Ġselect All Ġto Ġtake Ġeffect . ĠThe Ġw ond ers Ġof ĠAndroid Ġlayout Ġ! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ{ ĠSelection . selectAll ( text ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġtriggering Ġmultiple Ġkeyboard Ġshows , Ġwhich Ġis Ġunnecessary ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġshow Keyboard () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġon Back Key Listener : ĠOn Back Key Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġon Key Pre I me ( ĊĠĠĠĠĠĠĠ ĠkeyCode : ĠInt , ĊĠĠĠĠĠĠĠ Ġevent : ĠKeyEvent ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( keyCode Ġ== ĠKeyEvent . KEYCODE _ BACK Ġ&& Ġevent . action Ġ== ĠKeyEvent . ACTION _ UP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġon Back Key Listener ?. on Back Key () Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Key Pre I me ( keyCode , Ġevent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Layout ( ĊĠĠĠĠĠĠĠ Ġchanged : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġleft : ĠInt , ĊĠĠĠĠĠĠĠ Ġtop : ĠInt , ĊĠĠĠĠĠĠĠ Ġright : ĠInt , ĊĠĠĠĠĠĠĠ Ġbottom : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Layout ( changed , Ġleft , Ġtop , Ġright , Ġbottom ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Focused ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Keyboard () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOverrides Ġto Ġpaste Ġclip Ġdata Ġwithout Ġrich Ġtext Ġformatting . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Text Context MenuItem ( id : ĠInt ): ĠBoolean Ġ= Ġwhen Ġ( id ) Ġ{ ĊĠĠĠĠĠĠĠ Ġandroid . R . id . paste Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Text Context MenuItem ( android . R . id . paste As Plain Text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . get Clipboard Manager (). convert Clip To Plain Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Text Context MenuItem ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Text Context MenuItem ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠContext . get Clipboard Manager (): ĠClip board Manager Ġ= ĊĠĠĠĠĠĠĠ Ġget System Service ( Context . CLIP BOARD _ SERVICE ) Ġas ĠClip board Manager ĊĊĠĠĠ Ġprivate Ġfun ĠClip board Manager . convert Clip To Plain Text () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclip Ġ= Ġprimary Clip Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġclip . item Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġclip . getItem At ( i ). coerce ToText ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Primary Clip ( Clip Data . new Plain Text ( null , Ġtext )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOn Back Key Listener Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Back Key (): ĠBoolean ĊĠĠĠ Ġ} Ċ } Ċ