/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 . android . tools . idea . test artifacts . instrument ed . tests uite . view Ċ Ċ import Ġcom . android . annotations . concurrency . Ui Thread Ċ import Ġcom . android . tools . idea . test artifacts . instrument ed . tests uite . api . Android Test Results Ċ import Ġcom . android . tools . idea . test artifacts . instrument ed . tests uite . api . get Rounded Duration Ċ import Ġcom . android . tools . idea . test artifacts . instrument ed . tests uite . model . Android Device Ċ import Ġcom . android . tools . idea . test artifacts . instrument ed . tests uite . model . Android DeviceType Ċ import Ġcom . android . tools . idea . test artifacts . instrument ed . tests uite . model . getName Ċ import Ġcom . google . common . annotations . Visible ForTesting Ċ import Ġcom . google . common . html . Html Esc apers Ċ import Ġcom . intellij . large Files Editor . Gui Utils Ċ import Ġcom . intellij . openapi . util . text . StringUtil Ċ import Ġcom . intellij . ui . Animated Icon Ċ import Ġcom . intellij . ui . Color Util Ċ import Ġcom . intellij . ui . Simple Text Attributes Ċ import Ġcom . intellij . ui . components . JB List Ċ import Ġcom . intellij . ui . layout . panel Ċ import Ġcom . intellij . util . ui . J BU I Ċ import Ġcom . intellij . util . ui . UI Util Ċ import Ġicons . Studio Icons Ċ import Ġjava . awt . Border Layout Ċ import Ġjava . awt . Component Ċ import Ġjava . awt . Dimension Ċ import Ġjava . util . Locale Ċ import Ġjavax . swing . BoxLayout Ċ import Ġjavax . swing . Default List Cell Renderer Ċ import Ġjavax . swing . Default ListModel Ċ import Ġjavax . swing . Icon Ċ import Ġjavax . swing . JLabel Ċ import Ġjavax . swing . J List Ċ import Ġjavax . swing . JPanel Ċ import Ġjavax . swing . List Selection Model Ċ import Ġjavax . swing . border . Empty Border Ċ Ċ /** Ċ Ġ* ĠShows Ġa Ġlist Ġof Ġdevices . ĠThis Ġview Ġis Ġintended Ġto Ġbe Ġused Ġin ĠAndroid Ġtest Ġsuite Ġdetails Ġpage Ċ Ġ* Ġin Ġconjunction Ġwith Ġ[ Details View ContentView ]. Ċ Ġ* ĠA Ġuser Ġcan Ġclick Ġon Ġa Ġdevice Ġitem Ġto Ġlook Ġup Ġdetailed Ġtest Ġresults Ġfor Ġa Ġselected Ġdevice . Ċ Ġ*/ Ċ class ĠDetails View Device Selector ListView ( listener : ĠDetails View Device Selector ListView Listener ) Ġ{ ĊĠ Ġ/** ĊĠĠ Ġ* ĠInterface Ġto Ġlisten Ġevents Ġoccurred Ġin Ġ[ Details View Device Selector ListView ]. ĊĠĠ Ġ*/ ĊĠ Ġinterface ĠDetails View Device Selector ListView Listener Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġa Ġuser Ġselects Ġa Ġdevice Ġfor Ġlooking Ġup Ġtest Ġresults Ġfor Ġthe Ġdevice . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġfun Ġon Device Selected ( selected Device : ĠAndroid Device ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġa Ġuser Ġselects Ġa Ġspecial Ġitem , Ġ" Raw ĠOutput ", Ġin Ġthe Ġlist . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġfun Ġon Raw Output Selected () ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġmy Device ListModel : ĠDefault ListModel < Any > Ġ= ĠDefault ListModel () ĊĠ Ġprivate Ġval Ġmy Cell Renderer : ĠAndroid Device List Cell Renderer Ġ= ĠAndroid Device List Cell Renderer () ĊĠ Ġ@ Visible ForTesting Ġobject ĠRaw Output Item ĊĊĠ Ġ@ get : Visible ForTesting ĊĠ Ġval Ġdevice List : ĠJ B List < Any > Ġ= ĠJ B List ( my Device ListModel ). apply Ġ{ ĊĠĠĠ Ġselection Mode Ġ= ĠList Selection Model . SINGLE _ INTERVAL _ SELECTION ĊĠĠĠ Ġput Client Property ( Animated Icon . ANIM ATION _ IN _ RENDER ER _ ALLOWED , Ġtrue ) ĊĠĠĠ Ġcell Renderer Ġ= Ġmy Cell Renderer ĊĠĠĠ Ġfixed Cell Height Ġ= Ġ 5 0 ĊĠĠĠ Ġselection Model . selection Mode Ġ= ĠList Selection Model . SINGLE _ SELECTION ĊĠĠĠ Ġborder Ġ= ĠEmpty Border ( 0 , 0 , 0 , 0 ) ĊĠĠĠ Ġadd List Selection Listener Ġ{ ĊĠĠĠĠĠ Ġval Ġselected Item Ġ= Ġselected Value ĊĠĠĠĠĠ Ġif Ġ( selected Item Ġis ĠAndroid Device ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlistener . on Device Selected ( selected Item ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġif Ġ( selected Item Ġis ĠRaw Output Item ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlistener . on Raw Output Selected () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġval Ġroot Panel : ĠJPanel Ġ= Ġpanel Ġ{ ĊĠĠĠ Ġrow Ġ{ ĊĠĠĠĠĠ Ġscroll Pane ( device List ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠAdds Ġa Ġgiven Ġdevice Ġto Ġthe Ġlist . ĊĠĠ Ġ*/ ĊĠ Ġ@ Ui Thread ĊĠ Ġfun Ġadd Device ( device : ĠAndroid Device ) Ġ{ ĊĠĠĠ Ġmy Device ListModel . addElement ( device ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSelect Ġa Ġgiven Ġdevice Ġin Ġthe Ġlist . ĊĠĠ Ġ* Ġ@ param Ġdevice Ġa Ġdevice Ġto Ġbe Ġselected ĊĠĠ Ġ*/ ĊĠ Ġ@ Ui Thread ĊĠ Ġfun Ġselect Device ( device : ĠAndroid Device ?) Ġ{ ĊĠĠĠ Ġdevice List . setSelected Value ( device , Ġtrue ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSelect Ġthe Ġraw Ġoutput Ġitem Ġin Ġthe Ġlist . ĊĠĠ Ġ*/ ĊĠ Ġ@ Ui Thread ĊĠ Ġfun Ġselect Raw Output Item () Ġ{ ĊĠĠĠ ĠsetShow Raw Output Item ( true ) ĊĠĠĠ Ġdevice List . setSelected Value ( Raw Output Item , Ġtrue ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠUpdates Ġthe Ġview Ġwith Ġa Ġgiven ĠAndroid Test Results . ĊĠĠ Ġ*/ ĊĠ Ġ@ Ui Thread ĊĠ Ġfun Ġset Android Test Results ( results : ĠAndroid Test Results ) Ġ{ ĊĠĠĠ Ġmy Cell Renderer . set Android Test Results ( results ) ĊĠ Ġ} ĊĊĠ Ġ@ Ui Thread ĊĠ Ġfun ĠsetShow Raw Output Item ( show Raw Output Item : ĠBoolean ) Ġ{ ĊĠĠĠ Ġif Ġ( show Raw Output Item ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( my Device ListModel . indexOf ( Raw Output Item ) Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmy Device ListModel . add ( 0 , ĠRaw Output Item ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġmy Device ListModel . remove Element ( Raw Output Item ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġclass ĠAndroid Device List Cell Renderer Ġ: ĠDefault List Cell Renderer () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmy Empty Border : ĠEmpty Border Ġ= ĠJ BU I . B orders . empty ( 5 , Ġ 1 0 ) ĊĠĠĠ Ġprivate Ġval Ġmy Cell Renderer Component Ġ= ĠJPanel ( Border Layout ()) ĊĠĠĠ Ġprivate Ġval Ġmy Device Label Panel Ġ= ĠJPanel () ĊĠĠĠ Ġprivate Ġval Ġmy Device Label Ġ= ĠJLabel () ĊĠĠĠ Ġprivate Ġval Ġmy TestResult Label Ġ= ĠJLabel () ĊĠĠĠ Ġprivate Ġvar Ġmy Test Results : ĠAndroid Test Results ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠ Ġmy Device Label Panel . layout Ġ= ĠBox Layout ( my Device Label Panel , ĠBox Layout . X _ AXIS ) ĊĠĠĠĠĠ Ġmaximum Size Ġ= ĠDimension ( Int . MAX _ VALUE , ĠInt . MAX _ VALUE ) ĊĠĠĠĠĠ Ġmy Device Label Panel . add ( this ) ĊĠĠĠĠĠ Ġmy Device Label Panel . add ( my Device Label ) ĊĠĠĠĠĠ Ġmy Cell Renderer Component . add ( my Device Label Panel , ĠBorderLayout . WEST ) ĊĠĠĠĠĠ Ġmy Cell Renderer Component . add ( my TestResult Label , ĠBorderLayout . EAST ) ĊĠĠĠĠĠ ĠGui Utils . set Standard Line Border To Panel ( my Cell Renderer Component , Ġ 0 , Ġ 0 , Ġ 1 , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Android Test Results ( results : ĠAndroid Test Results ) Ġ{ ĊĠĠĠĠĠ Ġmy Test Results Ġ= Ġresults ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetList Cell Renderer Component ( list : ĠJ List <* >, Ġvalue : ĠAny , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex : ĠInt , Ġis Selected : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell Has Focus : ĠBoolean ): ĠComponent Ġ{ ĊĠĠĠĠĠ Ġsuper . getList Cell Renderer Component ( list , Ġ" Ġ", Ġindex , Ġis Selected , Ġcell Has Focus ) ĊĠĠĠĠĠ Ġbackground Ġ= ĠUI Util . getTable Background ( isSelected , Ġlist . has Focus ()) ĊĠĠĠĠĠ Ġmy Cell Renderer Component . background Ġ= Ġlist . background ĊĠĠĠĠĠ Ġmy Cell Renderer Component . foreground Ġ= Ġlist . foreground ĊĠĠĠĠĠ Ġmy Device Label Panel . background Ġ= Ġlist . background ĊĠĠĠĠĠ Ġmy Device Label Panel . foreground Ġ= Ġlist . foreground ĊĠĠĠĠĠ Ġif Ġ( value Ġis ĠAndroid Device ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtest Duration Text Ġ= Ġmy Test Results ?. get Rounded Duration ( value )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠString Util . format Duration ( it . to Millis (), Ġ"\ u 2 0 0 9 ") ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġif Ġ( StringUtil . isNotEmpty ( test Duration Text )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġmy Device Label . text Ġ= ĠString . format ( Locale . US , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"< html >% s < br >< font Ġcolor ='# % s '> API Ġ% d Ġ- Ġ% s </ font ></ html >", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . getName (). html Escape (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColor Util . to Hex ( Simple Text Attributes . GRAY ED _ ATTRIBUTES . fg Color ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . version . api Level , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Duration Text . html Escape ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġmy Device Label . text Ġ= ĠString . format ( Locale . US , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"< html >% s < br >< font Ġcolor ='# % s '> API Ġ% d </ font ></ html >", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . getName (). html Escape (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColor Util . to Hex ( Simple Text Attributes . GRAY ED _ ATTRIBUTES . fg Color ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . version . api Level ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmy Device Label . icon Ġ= Ġget Icon For DeviceType ( value . device Type ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġif Ġ( value Ġis ĠRaw Output Item ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmy Device Label . text Ġ= Ġ" Raw ĠOutput " ĊĠĠĠĠĠĠĠ Ġmy Device Label . icon Ġ= Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġmy Device Label . icon Text Gap Ġ= Ġ 1 0 ĊĠĠĠĠĠ Ġmy Device Label . border Ġ= Ġmy Empty Border ĊĠĠĠĠĠ Ġmy Device Label . background Ġ= Ġlist . background ĊĠĠĠĠĠ Ġmy Device Label . foreground Ġ= Ġlist . foreground ĊĠĠĠĠĠ Ġif Ġ( value Ġis ĠAndroid Device ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmy TestResult Label . icon Ġ Ġ= Ġmy Test Results ?. get TestCase Result ( value )?. let Ġ{ Ġget Icon For ( it ) Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġif Ġ( value Ġis ĠRaw Output Item ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmy TestResult Label . icon Ġ= Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġmy TestResult Label . border Ġ= Ġmy Empty Border ĊĠĠĠĠĠ Ġmy TestResult Label . background Ġ= Ġlist . background ĊĠĠĠĠĠ Ġmy TestResult Label . foreground Ġ= Ġlist . foreground ĊĠĠĠĠĠ Ġreturn Ġmy Cell Renderer Component ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġget Icon For DeviceType ( device Type : ĠAndroid DeviceType ): ĠIcon ? Ġ{ ĊĠ Ġreturn Ġwhen Ġ( device Type ) Ġ{ ĊĠĠĠ ĠAndroid DeviceType . LOCAL _ EM UL ATOR , ĠAndroid DeviceType . LOCAL _ GRAD LE _ MAN AG ED _ EM UL ATOR Ġ-> ĠStudio Icons . Device Explorer . VIRTUAL _ DEVICE _ PHONE ĊĠĠĠ ĠAndroid DeviceType . LOCAL _ PHYSICAL _ DEVICE Ġ-> ĠStudio Icons . Device Explorer . PHYSICAL _ DEVICE _ PHONE ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠString . html Escape (): ĠString Ġ= ĠHtml Esc apers . html Esc aper (). escape ( this ) Ċ