package Ġcom . developer phil . adb idea . debugger Ċ Ċ import Ġcom . android . dd m lib . Client Ċ import Ġcom . android . dd m lib . I Device Ċ import Ġcom . android . tools . idea . run . Android Process Handler Ċ import Ġcom . android . tools . idea . run . editor . Android Debugger Ċ import Ġcom . developer phil . adb idea . compatibility . Backward Compatible Getter Ċ import Ġcom . developer phil . adb idea . invoke Later Ċ import Ġcom . developer phil . adb idea . on Ċ import Ġcom . developer phil . adb idea . wait Until Ċ import Ġcom . intellij . execution . Execution Manager Ċ import Ġcom . intellij . execution . process . Process Handler Ċ import Ġcom . intellij . execution . process . Process Output Types Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġorg . jo or . Reflect . on Ċ Ċ class ĠDebugger ( private Ġval Ġproject : ĠProject , Ġprivate Ġval Ġdevice : ĠI Device , Ġprivate Ġval ĠpackageName : ĠString ) Ġ{ ĊĊĠĠĠ Ġfun Ġattach () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġclient : ĠClient ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġwait Until Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Ġ= Ġdevice . getClient ( packageName ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAndroid Debugger . EP _ NAME . extensions . isNotEmpty () Ġ&& Ġclient Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( android Debugger Ġin ĠAndroid Debugger . EP _ NAME . extensions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( android Debugger . supports Project ( project )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke Later Ġ{ Ġclose Old Session And Run ( android Debugger , Ġdevice . getClient ( packageName ) Ġ?: Ġclient !! ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclose Old Session And Run ( android Debugger : ĠAndroid Debugger <* >, Ġclient : ĠClient ) Ġ{ ĊĠĠĠĠĠĠĠ Ġterminate Run Sessions ( client ) ĊĠĠĠĠĠĠĠ ĠAttach To Client ( android Debugger , Ġproject , Ġclient ). get () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠDis connect Ġany Ġactive Ġrun Ġsessions Ġto Ġthe Ġsame Ġclient ĊĠĠĠ Ġprivate Ġfun Ġterminate Run Sessions ( selected Client : ĠClient ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTermin ate Run Session ( selected Client , Ġproject ). get () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠTermin ate Run Session ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġselected Client : ĠClient , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġproject : ĠProject Ċ ) Ġ: ĠBack ward Compatible Getter < Unit >() Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠgetCurrent Implementation () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpid Ġ= Ġselected Client . client Data . pid ĊĠĠĠĠĠĠĠ Ġ// Ġfind Ġif Ġthere Ġare Ġany Ġactive Ġrun Ġsessions Ġto Ġthe Ġsame Ġclient , Ġand Ġterminate Ġthem Ġif Ġso ĊĠĠĠĠĠĠĠ Ġfor Ġ( handler Ġin ĠExecution Manager . getInstance ( project ). get Running Processes ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( handler Ġis ĠAndroid Process Handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Ġ= Ġhandler . getClient ( selected Client . device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( client Ġ!= Ġnull Ġ&& Ġclient . client Data . pid Ġ== Ġpid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . detach Process () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . notify Text Available (" Disconnect ing Ġrun Ġsession : Ġa Ġnew Ġdebug Ġsession Ġwill Ġbe Ġestablished .\ n ", ĠProcess Output Types . STDOUT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Previous Implementation () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpid Ġ= Ġpid From ( selected Client ) ĊĠĠĠĠĠĠĠ Ġ// Ġfind Ġif Ġthere Ġare Ġany Ġactive Ġrun Ġsessions Ġto Ġthe Ġsame Ġclient , Ġand Ġterminate Ġthem Ġif Ġso ĊĠĠĠĠĠĠĠ Ġfor Ġ( handler Ġin ĠRunning Processes Getter ( project ). get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( handler Ġis ĠAndroid Process Handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġon ( selected Client ). call (" getDevice "). get < I Device >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Ġ= Ġhandler . getClient ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( client Ġ!= Ġnull Ġ&& Ġpid From ( client ) Ġ== Ġpid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . detach Process () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . notify Text Available (" Disconnect ing Ġrun Ġsession : Ġa Ġnew Ġdebug Ġsession Ġwill Ġbe Ġestablished .\ n ", ĠProcess Output Types . STDOUT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpid From ( client : ĠClient ) Ġ= Ġon ( client ). call (" getClient Data "). call (" get Pid "). get < Int >() !! Ċ } Ċ Ċ class ĠAttach To Client ( private Ġval Ġandroid Debugger : ĠAndroid Debugger <* >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġproject : ĠProject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġclient : ĠClient ) Ġ: ĠBack ward Compatible Getter < Unit >() Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠgetCurrent Implementation () Ġ{ ĊĠĠĠĠĠĠĠ Ġandroid Debugger . attach To Client ( project , Ġclient , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Previous Implementation () Ġ{ ĊĠĠĠĠĠĠĠ Ġon ( android Debugger ). call (" attach To Client ", Ġproject , Ġclient , Ġnull ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠRunning Processes Getter ( ĊĠĠĠĠĠĠĠ Ġval Ġproject : ĠProject Ċ ) Ġ: ĠBack ward Compatible Getter < Array < Process Handler >>() Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠgetCurrent Implementation (): ĠArray < Process Handler > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠExecution Manager . getInstance ( project ). get Running Processes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Previous Implementation (): ĠArray < Process Handler > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġon < Execution Manager >(). call (" getInstance ", Ġproject ). call (" get Running Processes "). get < Array < Process Handler >>() ĊĠĠĠ Ġ} Ċ } Ċ