/* Ċ Ġ* ĠCopyright Ġ 2 0 0 0 - 2 0 1 0 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* Ġ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 . developer phil . adb idea . ui Ċ Ċ import Ġcom . android . dd m lib . Android Debug Bridge Ċ import Ġcom . android . dd m lib . I Device Ċ import Ġcom . android . dd m lib . I Device . Hardware Feature Ċ import Ġcom . android . tools . idea . run . Connected Android Device Ċ import Ġcom . android . tools . idea . run . Launch Compatibility Ċ import Ġcom . android . tools . idea . run . Launch Compatibility Checker Impl Ċ import Ġcom . intellij . openapi . Disposable Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . application . Modal ity State Ċ import Ġcom . intellij . openapi . util . Condition Ċ import Ġcom . intellij . openapi . util . text . StringUtil Ċ import Ġcom . intellij . ui . Colo red TableCell Renderer Ċ import Ġcom . intellij . ui . Double ClickListener Ċ import Ġcom . intellij . ui . ScrollPane Factory Ċ import Ġcom . intellij . ui . Simple Text Attributes Ċ import Ġcom . intellij . ui . table . JB Table Ċ import Ġcom . intellij . util . Alarm Ċ import Ġcom . intellij . util . Three State Ċ import Ġcom . intellij . util . containers . Container Util Ċ import Ġg nu . tro ve . T Int ArrayList Ċ import Ġorg . jetbrains . android . dom . manifest . Uses Feature Ċ import Ġorg . jetbrains . android . facet . Android Facet Ċ import Ġorg . jetbrains . android . sdk . Android Sdk Utils Ċ import Ġjava . awt . Dimension Ċ import Ġjava . awt . event . Key Adapter Ċ import Ġjava . awt . event . KeyEvent Ċ import Ġjava . awt . event . MouseEvent Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ import Ġjavax . swing . Action Ċ import Ġjavax . swing . J Component Ċ import Ġjavax . swing . J Table Ċ import Ġjavax . swing . List Selection Model Ċ import Ġjavax . swing . table . Abstract TableModel Ċ Ċ /** Ċ Ġ* Ġ@ author ĠE ug ene . K ude lev sky Ċ Ġ* Ċ Ġ* Ġhttps :// android . google source . com / platform / tools / adt / idea / +/ refs / heads / mirror - goog - studio - master - dev / android / src / com / android / tools / idea / run / Device Chooser . java Ċ Ġ*/ Ċ class ĠMy Device Chooser ( multiple Selection : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok Action : ĠAction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy Facet : ĠAndroid Facet , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy Filter : ĠCondition < I Device > ?) Ġ: ĠDis posable Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmy Listeners Ġ= ĠContainer Util . create Lock Free Copy On Write List < Device Chooser Listener >() ĊĠĠĠ Ġprivate Ġval Ġmy Refresh ing Alarm : ĠAlarm ĊĠĠĠ Ġprivate Ġval Ġmy Bridge : ĠAndroid Debug Bridge ? ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġmy Process Selection Flag Ġ= Ġtrue ĊĠĠĠ Ġ/** ĠThe Ġcurrent Ġlist Ġof Ġdevices Ġthat Ġis Ġdisplayed Ġin Ġthe Ġtable . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġmy Displayed Devices Ġ= ĠEMPTY _ DEVICE _ ARRAY ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcurrent Ġlist Ġof Ġdevices Ġobtained Ġfrom Ġthe Ġdebug Ġbridge . ĠThis Ġis Ġupdated Ġin Ġa Ġbackground Ġthread . ĊĠĠĠĠ Ġ* ĠIf Ġit Ġis Ġdifferent Ġthan Ġ[. my Displayed Devices ], Ġthen Ġa Ġ[. refresh Table ] Ġinvocation Ġin Ġthe ĠE DT Ġthread ĊĠĠĠĠ Ġ* Ġwill Ġupdate Ġthe Ġdisplayed Ġlist Ġto Ġmatch Ġthe Ġdetected Ġlist . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġmy Detected Devices Ref Ġ= ĠAtomic Reference ( EMPTY _ DEVICE _ ARRAY ) ĊĠĠĠ Ġprivate Ġval Ġmy Panel : ĠJ Component ĊĠĠĠ Ġprivate Ġval Ġmy Device Table : ĠJ B Table ĊĠĠĠ Ġprivate Ġvar Ġmy Selected Rows : ĠInt Array ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġhad User Interaction Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġpreviously Selected Serial s : ĠArray < String >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġfun Ġset Column Width ( device Table : ĠJ B Table , ĠcolumnIndex : ĠInt , Ġsample Text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġget Width ( device Table , Ġsample Text ) ĊĠĠĠĠĠĠĠ Ġdevice Table . column Model . getColumn ( column Index ). preferred Width Ġ= Ġwidth ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Width ( device Table : ĠJ B Table , Ġsample Text : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmetrics Ġ= Ġdevice Table . getFont Metrics ( device Table . font ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmetrics . string Width ( sample Text ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinit ( selected Serial s : ĠArray < String > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġpreviously Selected Serial s Ġ= Ġselected Serial s ĊĠĠĠĠĠĠĠ Ġupdate Table () ĊĠĠĠĠĠĠĠ Ġadd Updating Request () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinit ( selected Serial s : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( selected Serial s . to Typed Array ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Previous ly Selected Serial s () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( previous ly Selected Serial s Ġ!= Ġnull Ġ&& Ġ! had User Interaction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Selection ( previous ly Selected Serial s !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmy Update Request Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Table () ĊĠĠĠĠĠĠĠ Ġadd Updating Request () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Updating Request () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( my Refresh ing Alarm . is Disposed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmy Refresh ing Alarm . cancel All Requests () ĊĠĠĠĠĠĠĠ Ġmy Refresh ing Alarm . add Request ( my Update Request , ĠREF RESH _ INTERVAL _ MS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Selection ( selected Serial s : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġmy Device Table . model Ġas ĠMy Device TableModel ĊĠĠĠĠĠĠĠ Ġval Ġselected Serial s Set Ġ= Ġmutable Set Of < String >() ĊĠĠĠĠĠĠĠ ĠCollections . addAll ( selected Serial s Set , Ġ* selected Serial s ) ĊĠĠĠĠĠĠĠ Ġval Ġmy Devices Ġ= Ġmodel . my Devices ĊĠĠĠĠĠĠĠ Ġval Ġselection Model Ġ= Ġmy Device Table . selection Model ĊĠĠĠĠĠĠĠ Ġvar Ġcleared Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġmy Devices . size ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserial Number Ġ= Ġmy Devices [ i ]. serial Number ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected Serial s Set . contains ( serial Number )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! cleared ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Model . clear Selection () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcleared Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Model . add Selection Interval ( i , Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Table () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdevices Ġ= Ġmy Bridge ?. let Ġ{ Ġget Filtered Devices ( it ) Ġ} Ġ?: ĠEMPTY _ DEVICE _ ARRAY ĊĠĠĠĠĠĠĠ Ġif Ġ( devices . size Ġ> Ġ 1 ) Ġ{ Ġ// Ġsort Ġby ĠAPI Ġlevel ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArrays . sort ( devices , Ġobject Ġ: ĠComparator < I Device > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompare ( device 1 : ĠI Device , Ġdevice 2 : ĠI Device ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Level 1 Ġ= Ġsafe Get Api Level ( device 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Level 2 Ġ= Ġsafe Get Api Level ( device 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġapi Level 2 Ġ- Ġapi Level 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġsafe Get Api Level ( device : ĠI Device ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġdevice . getProperty ( I Device . PROP _ BUILD _ API _ LEVEL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( StringUtil . isNotEmpty ( s )) Ġs . toInt () Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! Arrays . equals ( my Displayed Devices , Ġdevices )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Detected Devices Ref . set ( devices ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke Later ({ Ġrefresh Table () Ġ}, ĠMod ality State . state For Component ( my Device Table )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrefresh Table () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdevices Ġ= Ġmy Detected Devices Ref . get () ĊĠĠĠĠĠĠĠ Ġmy Displayed Devices Ġ= Ġdevices ĊĠĠĠĠĠĠĠ Ġval Ġselected Devices Ġ= Ġselected Devices ĊĠĠĠĠĠĠĠ Ġval Ġselected Rows Ġ= ĠT Int ArrayList () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġdevices . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected Devices . contains ( devices [ i ])) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Rows . add ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmy Process Selection Flag Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġmy Device Table . setModel ( My Device TableModel ( devices )) ĊĠĠĠĠĠĠĠ Ġif Ġ( selected Rows . size () Ġ== Ġ 0 Ġ&& Ġdevices . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Device Table . selection Model . setSelection Interval ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( selected Row Ġin Ġselected Rows . to Native Array ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected Row Ġ< Ġdevices . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Device Table . selection Model . add Selection Interval ( selected Row , Ġselected Row ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfire Selected Devices Changed () ĊĠĠĠĠĠĠĠ Ġmy Process Selection Flag Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġupdate Previous ly Selected Serial s () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Devices (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmy Detected Devices Ref . get (). isNotEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpreferred Focus Component : ĠJ Component ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmy Device Table ĊĊĠĠĠ Ġval Ġpanel : ĠJ Component ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmy Panel ĊĊĠĠĠ Ġval Ġselected Devices : ĠArray < I Device > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrows Ġ= Ġif Ġ( my Selected Rows Ġ!= Ġnull ) Ġmy Selected Rows !! Ġelse Ġmy Device Table . selected Rows ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < I Device >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( row Ġin Ġrows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( row Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserial Ġ= Ġmy Device Table . getValue At ( row , ĠSERIAL _ COLUMN _ INDEX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbridge Ġ= ĠAndroid Sdk Utils . get Debug Bridge ( my Facet . module . project ) Ġ?: Ġreturn ĠEMPTY _ DEVICE _ ARRAY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevices Ġ= Ġget Filtered Devices ( bridge ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( device Ġin Ġdevices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( device . serial Number Ġ== Ġserial . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult . to Typed Array () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Filtered Devices ( bridge : ĠAndroid Debug Bridge ): ĠArray < I Device > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfiltered Devices : ĠMutable List < I Device > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġfor Ġ( device Ġin Ġbridge . devices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( my Filter Ġ== Ġnull Ġ|| Ġmy Filter . value ( device )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Devices . add ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġfilter Ġlaunch ing Ġcloud Ġdevices Ġas Ġthey Ġare Ġjust Ġun selectable Ġprogress Ġmarkers Ċ // Ġthat Ġare Ġreplaced Ġwith Ġthe Ġactual Ġcloud Ġdevices Ġas Ġsoon Ġas Ġthey Ġare Ġup Ġand Ġthe Ġactual Ġcloud Ġdevices Ġwill Ġbe Ġfiltered Ġabove . ĊĠĠĠĠĠĠĠ Ġreturn Ġfiltered Devices . to Typed Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfinish () Ġ{ ĊĠĠĠĠĠĠĠ Ġmy Selected Rows Ġ= Ġmy Device Table . selected Rows ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{} ĊĠĠĠ Ġfun Ġset Enabled ( enabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmy Device Table . isEnabled Ġ= Ġenabled ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfire Selected Devices Changed () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( listener Ġin Ġmy Listeners ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . selected Devices Changed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Listener ( listener : ĠDevice Chooser Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmy Listeners . add ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠMy Device TableModel ( val Ġmy Devices : ĠArray < I Device >) Ġ: ĠAbstract TableModel () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget ColumnName ( column : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCOLUMN _ TIT LES [ column ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget RowCount (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmy Devices . size ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Column Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCOLUMN _ TIT LES . size ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetValue At ( rowIndex : ĠInt , ĠcolumnIndex : ĠInt ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rowIndex Ġ>= Ġmy Devices . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġmy Devices [ rowIndex ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( column Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDEVICE _ NAME _ COLUMN _ INDEX Ġ-> Ġreturn Ġgenerate Device Name ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSERIAL _ COLUMN _ INDEX Ġ-> Ġreturn Ġdevice . serial Number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDEVICE _ STATE _ COLUMN _ INDEX Ġ-> Ġreturn Ġget Device State ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCOMP AT IBILITY _ COLUMN _ INDEX Ġ-> Ġreturn ĠLaunch Compatibility Checker Impl . create ( my Facet , Ġnull , Ġnull )?. validate ( Connected Android Device ( device , Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġgenerate Device Name ( device : ĠI Device ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdevice . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( device . serial Number , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace (" [- _] ". to Regex (), Ġ" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("[ \\ [ \\ ]] ". to Regex (), Ġ"") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Column Class ( column Index : ĠInt ): ĠClass < *> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( column Index Ġ== ĠCOMP AT IBILITY _ COLUMN _ INDEX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLaunch Compatibility :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( column Index Ġ== ĠDEVICE _ NAME _ COLUMN _ INDEX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI Device :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠLaunch Compatibility Renderer Ġ: ĠCo lo red TableCell Renderer () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcustomize Cell Renderer ( table : ĠJ Table , Ġvalue : ĠAny ?, Ġselected : ĠBoolean , Ġhas Focus : ĠBoolean , Ġrow : ĠInt , Ġcolumn : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ! is ĠLaunch Compatibility ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompatible Ġ= Ġvalue . state ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( compatible Ġ== ĠLaunch Compatibility . State . OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Yes ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( compatible Ġ== ĠLaunch Compatibility . State . ERROR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" No ", ĠSimple Text Attributes . ERROR _ ATTRIBUTES ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Maybe ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreason Ġ= Ġvalue . reason ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( reason Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( reason ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠError ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExpected Ġon ĠInt ellij Ġ 2 0 2 1 . 2 . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShould Ġbe Ġremoved Ġonce Ġthe Ġandroid Ġplugin Ġis Ġupgraded Ġto Ġ 7 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠCOLUMN _ TIT LES Ġ= ĠarrayOf (" Device ", Ġ" Serial ĠNumber ", Ġ" State ", Ġ" Compatible ") ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEVICE _ NAME _ COLUMN _ INDEX Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSERIAL _ COLUMN _ INDEX Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEVICE _ STATE _ COLUMN _ INDEX Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCOMP AT IBILITY _ COLUMN _ INDEX Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠREF RESH _ INTERVAL _ MS Ġ= Ġ 5 0 0 ĊĠĠĠĠĠĠĠ Ġval ĠEMPTY _ DEVICE _ ARRAY Ġ= ĠarrayOf < I Device >() ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Required Hardware Features ( required Features : ĠList < Uses Feature >): ĠEnum Set < Hardware Feature > Ġ{ Ġ// ĠCurrently , Ġthis Ġmethod Ġis Ġhardcoded Ġto Ġonly Ġsearch Ġif Ġthe Ġlist Ġof Ġrequired Ġfeatures Ġincludes Ġa Ġwatch . Ċ // ĠWe Ġmay Ġnot Ġwant Ġto Ġsearch Ġthe Ġdevice Ġfor Ġevery Ġpossible Ġfeature , Ġbut Ġonly Ġa Ġsmall Ġsubset Ġof Ġimportant Ċ // Ġfeatures , Ġstarting Ġwith Ġhardware Ġtype Ġwatch .. ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( feature Ġin Ġrequired Features ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġfeature . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġnull Ġ&& ĠUses Feature . HARD WARE _ TYPE _ WATCH Ġ== Ġname . stringValue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠEnum Set . of ( Hardware Feature . WATCH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠEnum Set . none Of ( Hardware Feature :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Device State ( device : ĠI Device ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġdevice . state ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( state Ġ!= Ġnull ) ĠString Util . capitalize ( state . name . toLowerCase ()) Ġelse Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġmy Device Table Ġ= ĠJ B Table () ĊĠĠĠĠĠĠĠ Ġmy Panel Ġ= ĠScroll Pane Factory . create ScrollPane ( my Device Table ) ĊĠĠĠĠĠĠĠ Ġmy Panel . preferred Size Ġ= ĠDimension ( 4 5 0 , Ġ 2 2 0 ) ĊĠĠĠĠĠĠĠ Ġmy Device Table . model Ġ= ĠMy Device TableModel ( EMPTY _ DEVICE _ ARRAY ) ĊĠĠĠĠĠĠĠ Ġmy Device Table . setSelection Mode ( if Ġ( multiple Selection ) ĠList Selection Model . MULTIPLE _ INTERVAL _ SELECTION Ġelse ĠList Selection Model . SINGLE _ SELECTION ) ĊĠĠĠĠĠĠĠ Ġmy Device Table . selection Model . add List Selection Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( my Process Selection Flag ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhad User Interaction Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfire Selected Devices Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠDouble ClickListener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon DoubleClick ( e : ĠMouseEvent ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( my Device Table . isEnabled Ġ&& Ġok Action . isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok Action . action Performed ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. install On ( my Device Table ) ĊĠĠĠĠĠĠĠ Ġmy Device Table . setDefault Renderer ( Launch Compatibility :: class . java , ĠLaunch Compatibility Renderer ()) ĊĠĠĠĠĠĠĠ Ġmy Device Table . add Key Listener ( object Ġ: ĠKey Adapter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġkey Pressed ( e : ĠKeyEvent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . keyCode Ġ== ĠKeyEvent . VK _ ENTER Ġ&& Ġok Action . isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok Action . action Performed ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġset Column Width ( my Device Table , ĠDEVICE _ NAME _ COLUMN _ INDEX , Ġ" S amsung ĠGalaxy ĠN exus ĠAndroid Ġ 4 . 1 Ġ( API Ġ 1 7 )") ĊĠĠĠĠĠĠĠ Ġset Column Width ( my Device Table , ĠSERIAL _ COLUMN _ INDEX , Ġ" 0 0 0 0 - 0 0 0 0 - 0 0 0 0 0 ") ĊĠĠĠĠĠĠĠ Ġset Column Width ( my Device Table , ĠDEVICE _ STATE _ COLUMN _ INDEX , Ġ" offline ") ĊĠĠĠĠĠĠĠ Ġset Column Width ( my Device Table , ĠCOMP AT IBILITY _ COLUMN _ INDEX , Ġ" yes ") ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġrecreate Ġcolumns Ġon Ġevery Ġmodel Ġupdate Ġ- Ġthis Ġshould Ġhelp Ġmaintain Ġthe Ġcolumn Ġsizes Ġset Ġabove ĊĠĠĠĠĠĠĠ Ġmy Device Table . auto Create Columns From Model Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ// ĠAllow Ġsorting Ġby Ġcolumns Ġ( in Ġlex ico graphic Ġorder ) ĊĠĠĠĠĠĠĠ Ġmy Device Table . auto Create Row Sorter Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġmy Refresh ing Alarm Ġ= ĠAlarm ( Alarm . Thread ToUse . PO O LED _ THREAD , Ġthis ) ĊĠĠĠĠĠĠĠ Ġmy Bridge Ġ= ĠAndroid Sdk Utils . get Debug Bridge ( my Facet . module . project ) ĊĠĠĠ Ġ} Ċ }