package Ġcom . github . jk 1 . y tpl ugin . time Tracker Ċ Ċ import Ġcom . github . jk 1 . y tpl ugin . Component Aware Ċ import Ġcom . github . jk 1 . y tpl ugin . logger Ċ import Ġcom . github . jk 1 . y tpl ugin . tasks . No Active You Track Task Exception Ċ import Ġcom . github . jk 1 . y tpl ugin . time Tracker . actions . Start Tracker Action Ċ import Ġcom . github . jk 1 . y tpl ugin . time Tracker . actions . Stop Tracker Action Ċ import Ġcom . intellij . ide . Ide EventQueue Ċ import Ġcom . intellij . ide . util . Properties Component Ċ import Ġcom . intellij . notification . Notification Type Ċ import Ġcom . intellij . openapi . Disposable Ċ import Ġcom . intellij . openapi . editor . Editor Ċ import Ġcom . intellij . openapi . file Editor . ex . File Editor Manager Ex Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . util . Dis poser Ċ import Ġcom . intellij . openapi . wm . Ide Focus Manager Ċ import Ġcom . intellij . openapi . wm . ex . WindowManager Ex Ċ import Ġjava . awt . AW T Event Ċ import Ġjava . awt . Component Ċ import Ġjava . awt . event . KeyEvent Ċ import Ġjava . awt . event . MouseEvent Ċ import Ġjava . awt . event . Mouse Wheel Event Ċ import Ġjava . lang . System . currentTimeMillis Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġjavax . swing . J Frame Ċ Ċ class ĠActivity Tracker ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġparent Disposable : ĠDis posable , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtimer : ĠTime Tracker , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġin activity Period : ĠLong , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġproject : ĠProject Ċ ) Ġ: ĠDis posable , ĠComponent Aware Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġtracking Disposable : ĠDis posable ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġstart In activity Time : ĠLong Ġ= ĠcurrentTime Millis () ĊĠĠĠ Ġprivate Ġvar Ġis Posted On Close Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġstart Tracking () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tracking Disposable Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtracker Note Ġ= ĠTracker Notification () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracker Note . notify (" Could Ġnot Ġstart Ġaut onomous Ġtracking Ġat Ġthe Ġmoment ", ĠNotification Type . WARNING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Activity Ġtracker Ġis Ġunable Ġto Ġstart Ġtracking Ġat Ġthe Ġmoment : Ġtracking Disposable Ġis Ġnot Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtracking Disposable Ġ= Ġnew Disposable ( parent Disposable ) ĊĠĠĠĠĠĠĠ Ġstart IDE Listener ( tracking Disposable !! ) ĊĠĠĠĠĠĠĠ Ġschedule Listener ( tracking Disposable !! ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġnew Disposable ( var arg Ġparents : ĠDis posable , Ġcallback : Ġ() Ġ-> ĠAny Ġ= Ġ{} ): ĠDis posable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Disposed Ġ= ĠAtomic Boolean ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdis posable Ġ= ĠDis posable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Disposed . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Disposed . set ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparents . forEach Ġ{ Ġparent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcan 't Ġuse Ġhere Ġ" Dis poser . register ( parent , Ġdis posable )" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbecause ĠDis poser Ġonly Ġallows Ġone Ġparent Ġto Ġone Ġchild Ġregistration Ġof ĠDis posable Ġobjects ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDis poser . register ( parent , ĠDis posable Ġ{ ĠDis poser . dispose ( dis posable ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdis posable ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tracking Disposable Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDis poser . dispose ( tracking Disposable !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracking Disposable Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġschedule Listener ( parent Disposable : ĠDis posable ) Ġ{ ĊĠĠĠĠĠĠĠ ĠIde EventQueue . getInstance (). add Post processor ( Ide EventQueue . EventDispatcher Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcurrentTime Ġ= ĠLocalDateTime . now () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatter Ġ= ĠSimpleDateFormat (" mm ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhour Ġ= Ġformatter . format ( SimpleDateFormat (" mm "). parse ( currentTime . hour . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġminute Ġ= Ġformatter . format ( SimpleDateFormat (" mm "). parse ( currentTime . minute . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġhour Ġ+ Ġ":" Ġ+ Ġminute Ġ+ Ġ":" Ġ+ ĠcurrentTime . second . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( timer . is Scheduled Enabled Ġ&& Ġtime Ġ== Ġtimer . scheduled Period ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! timer . is Posted Scheduled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtracker Note Ġ= ĠTracker Notification () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtracker Note . notify (" Scheduled Ġtime Ġposting Ġat Ġ${ time } 0 ", ĠNotification Type . INFORMATION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . is Posted Scheduled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStop Tracker Action (). stop Timer ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . is Posted Scheduled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" schedule Listener : Ġstop Ġthe Ġpropagation Ġof Ġan Ġevent Ġto Ġother Ġlisteners ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ}, Ġparent Disposable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart IDE Listener ( parent Disposable : ĠDis posable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlast MouseMove Timestamp Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġval Ġmouse Move Events Threshold Ms Ġ= Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ ĠIde EventQueue . getInstance (). add Post processor ( Ide EventQueue . EventDispatcher Ġ{ Ġa wt Event : ĠA WT Event Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstore : ĠProperties Component Ġ= ĠProperties Component . getInstance ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Posted On Close Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( timer . is Paused ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . paused Time Ġ= ĠcurrentTime Millis () Ġ- Ġtimer . startTime Ġ- Ġtimer . time In M ills ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . time In M ills Ġ= ĠcurrentTime Millis () Ġ- Ġtimer . startTime Ġ- Ġtimer . paused Time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . re corded Time Ġ= Ġtimer . format Time Period ( timer . time In M ills ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinstant Ġcaching ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstore . save Fields ( timer ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Mouse Or Keyboard Active Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( awt Event Ġis ĠMouseEvent Ġ&& Ġa wt Event . id Ġ== ĠMouseEvent . MOUSE _ CLICK ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Mouse Or Keyboard Active Ġ= Ġcapture Ide State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" state ĠMO USE _ CLICK ED Ġ$ is Mouse Or Keyboard Active ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( awt Event Ġis ĠMouseEvent Ġ&& Ġa wt Event . id Ġ== ĠMouseEvent . MOUSE _ MOVED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠcurrentTime Millis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( now Ġ- Ġlast MouseMove Timestamp Ġ> Ġmouse Move Events Threshold Ms ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Mouse Or Keyboard Active Ġ= Ġcapture Ide State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast MouseMove Timestamp Ġ= Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" state ĠMO USE _ MOVED $ is Mouse Or Keyboard Active ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( awt Event Ġis ĠMouse Wheel Event Ġ&& Ġa wt Event . id Ġ== ĠMouseEvent . MOUSE _ W HE EL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠcurrentTime Millis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( now Ġ- Ġlast MouseMove Timestamp Ġ> Ġmouse Move Events Threshold Ms ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Mouse Or Keyboard Active Ġ= Ġcapture Ide State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast MouseMove Timestamp Ġ= Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" state ĠMO USE _ W HE EL Ġ$ is Mouse Or Keyboard Active ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( awt Event Ġis ĠKeyEvent Ġ&& Ġa wt Event . id Ġ== ĠKeyEvent . KEY _ PRES SED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Mouse Or Keyboard Active Ġ= Ġcapture Ide State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" state ĠKEY BOARD Ġ$ is Mouse Or Keyboard Active ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Mouse Or Keyboard Active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentTimeMillis () Ġ- Ġstart In activity Time Ġ> Ġin activity Period Ġ&& Ġtimer . isRunning Ġ&& Ġ! timer . is Paused Ġ&& Ġtimer . is Auto Tracking Enable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . pause (" Work Ġtimer Ġpaused Ġdue Ġto Ġin activity ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is Mouse Or Keyboard Active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart In activity Time Ġ= ĠcurrentTime Millis () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask Manager Component . getActive You Track Task () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! timer . isRunning Ġ|| Ġtimer . is Paused ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStart Tracker Action (). start Autom ated Tracking ( project , Ġtimer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNo Active You Track Task Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Active Ġtask Ġis Ġnot Ġvalid ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" start IDE Listener : Ġstop Ġthe Ġpropagation Ġof Ġan Ġevent Ġto Ġother Ġlisteners ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ}, Ġparent Disposable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcapture Ide State (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġide Focus Manager Ġ= ĠIde Focus Manager . getGlobal Instance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfocus Owner Ġ= Ġide Focus Manager . focus Owner ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġmight Ġalso Ġwork : ĠApplication Manager . application . isActive (), ĠApplication Activation Listener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġide Has Focus Ġ= ĠWindow Manager Ex . getInstance Ex (). most Recent Focused Window ?. isActive ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġfind Parent Frame ( focus Owner )?. isActive ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġide Has Focus Ġ&& Ġcurrent Editor In ( project ) Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" IDE Ġstate Ġexception : Ġ${ e . message }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Parent Frame ( component : ĠComponent ?): ĠJ Frame ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( component ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJ Frame Ġ-> Ġcomponent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfind Parent Frame ( component . parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcurrent Editor In ( project : ĠProject ): ĠEditor ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( File Editor Manager Ex . getInstance ( project ) Ġas ĠFile Editor Manager Ex ). selected Text Editor Ċ Ċ }