package Ġcom . example . par it osh . copy cat Ċ Ċ import Ġandroid . app .* Ċ import Ġandroid . content .* Ċ import Ġandroid . content . Intent . FLAG _ ACTIVITY _ NEW _ TASK Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . support . annotation . Requires Api Ċ import Ġandroid . support . v 4 . app . Notification Compat Ċ import Ġandroid . widget . Toast Ċ import Ġjava . util .* Ċ import Ġkotlin . concurrent . schedule ĊĊ Ċ class ĠCopy Service Ġ: ĠService () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCHAN NEL _ ID : ĠString Ġ= Ġ" channel _ Id " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ START _ FO REG ROUND _ SERVICE Ġ= Ġ" ACTION _ START _ FO REG ROUND _ SERVICE " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ STOP _ FO REG ROUND _ SERVICE Ġ= Ġ" ACTION _ STOP _ FO REG ROUND _ SERVICE " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġoverlay : ĠCat Overlay ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġon Primary Clip Changed Listener Ġ= ĠClip board Manager . On Primary Clip Changed Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! Permission Helper . is Overlay Permission Available ( this @ Copy Service )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ Copy Service , ĠR . string . overlay _ permission _ un available _ message , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Primary Clip Changed Listener ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġclip Board Manager : ĠClip board Manager ? Ġ= Ġget System Service ( Context . CLIP BOARD _ SERVICE ) Ġas ĠClip board Manager ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġclip Board Manager ?. primary Clip ?. getItem At ( 0 )?. text ĊĊĠĠĠĠĠĠĠ Ġif Ġ( text . isNull Or Blank ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Primary Clip Changed Listener ĊĊĠĠĠĠĠĠĠ Ġif Ġ( overlay Ġ== Ġnull Ġ|| Ġ! overlay !!. is Showing ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay Ġ= ĠCat Overlay ( this @ Copy Service ) ĊĊĠĠĠĠĠĠĠ Ġoverlay ?. setOn Cat Button ClickListener ( object Ġ: ĠCat Overlay . On Cat Button ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cat Button Click ( button Type : ĠCat Overlay . On Cat Button ClickListener . Button Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Action For Text ( text . toString (), Ġbutton Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Overlay () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġshow Overlay WithTimeout () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĠĠĠĠĠĠĠ Ġregister Clipboard Listener () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ?) Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent ?, Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( intent ?. action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ START _ FO REG ROUND _ SERVICE Ġ-> Ġstart Cat Service () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ STOP _ FO REG ROUND _ SERVICE Ġ-> Ġstop Cat Service () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠSTART _ STICK Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Cat Service () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Notification Channel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstart Foreground ( 1 1 , Ġload Notification ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Cat Service () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Foreground ( true ) ĊĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġregister Clipboard Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclip Board Manager : ĠClip board Manager ? Ġ= Ġget System Service ( Context . CLIP BOARD _ SERVICE ) Ġas ĠClip board Manager ĊĠĠĠĠĠĠĠ Ġclip Board Manager ?. add Primary Clip Changed Listener ( on Primary Clip Changed Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġunregister Clipboard Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclip Board Manager : ĠClip board Manager ? Ġ= Ġget System Service ( Context . CLIP BOARD _ SERVICE ) Ġas ĠClip board Manager ĊĠĠĠĠĠĠĠ Ġclip Board Manager ?. remove Primary Clip Changed Listener ( on Primary Clip Changed Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Overlay WithTimeout () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! overlay !!. is Showing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay ?. show () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimer (). schedule ( resources . getInteger ( R . integer . cat _ button _ timeout ). to Long ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Overlay () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclose Overlay () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverlay ?. dismiss () ĊĠĠĠĠĠĠĠ Ġoverlay Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Action For Text ( text : ĠString , Ġbutton Type : ĠCat Overlay . On Cat Button ClickListener . Button Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġwhen Ġ( button Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCat Overlay . On Cat Button ClickListener . Button Type . WEB Ġ-> Ġbuild Web Search Intent ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCat Overlay . On Cat Button ClickListener . Button Type . DI CTIONARY Ġ-> Ġbuild Dictionary Intent ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCat Overlay . On Cat Button ClickListener . Button Type . TRANSL ATE Ġ-> Ġbuild Translate Intent ( text ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent . apply Ġ{ Ġadd Flags ( FLAG _ ACTIVITY _ NEW _ TASK ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠActivity NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , ĠR . string . google _ translate _ error _ message , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , ĠR . string . generic _ error _ message , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Web Search Intent ( text : ĠString ) Ġ= ĠIntent ( Intent . ACTION _ WEB _ SEARCH ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġput Extra ( Search Manager . QUERY , Ġtext ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Dictionary Intent ( text : ĠString ) Ġ= ĠIntent ( Intent . ACTION _ VIEW ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Ġ= ĠUri . parse ( getString ( R . string . dictionary _ url , Ġtext )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Translate Intent ( text : ĠString ) Ġ= ĠIntent (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġaction Ġ= ĠIntent . ACTION _ SEND ĊĠĠĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ TEXT , Ġtext ) ĊĠĠĠĠĠĠĠ Ġput Extra (" key _ text _ input ", Ġtext ) ĊĠĠĠĠĠĠĠ Ġput Extra (" key _ text _ output ", Ġ"") ĊĠĠĠĠĠĠĠ Ġput Extra (" key _ language _ from ", Ġ" en ") ĊĠĠĠĠĠĠĠ Ġput Extra (" key _ language _ to ", Ġ" de ") ĊĠĠĠĠĠĠĠ Ġput Extra (" key _ suggest _ translation ", Ġ"") ĊĠĠĠĠĠĠĠ Ġput Extra (" key _ from _ floating _ window ", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġcomponent Ġ= ĠComponent Name ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . google . android . apps . translate ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . google . android . apps . translate . Translate Activity " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Notification (): ĠNotification Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠMainActivity :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġpending Intent Ġ= ĠPending Intent . getActivity ( this , Ġ 0 , Ġintent , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠNotification Compat . Builder ( this , ĠCHAN NEL _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ic _ cat ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( getString ( R . string . cat _ notification _ title )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( getString ( R . string . cat _ notification _ text )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Priority ( Notification Compat . PRIORITY _ DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( pending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . O ) ĊĠĠĠ Ġprivate Ġfun Ġcreate Notification Channel () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠgetString ( R . string . channel _ name ) ĊĠĠĠĠĠĠĠ Ġval Ġdescription Text Ġ= ĠgetString ( R . string . channel _ description ) ĊĠĠĠĠĠĠĠ Ġval Ġimportance Ġ= ĠNotification Manager . IMPORT ANCE _ DEFAULT ĊĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠNotification Channel ( CHANNEL _ ID , Ġname , Ġimportance ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġdescription Text ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnotification Manager : ĠNotification Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget System Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠĠĠĠĠ Ġnotification Manager . create Notification Channel ( channel ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġunregister Clipboard Listener () ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} Ċ } ĊĊĊ