3838import javax .swing .*;
3939import javax .swing .event .ChangeEvent ;
4040import javax .swing .event .ChangeListener ;
41+ import javax .swing .event .MenuEvent ;
42+ import javax .swing .event .MenuListener ;
4143
4244import java .awt .event .ActionEvent ;
4345import java .awt .event .ActionListener ;
@@ -63,8 +65,6 @@ public class AndroidEditor extends JavaEditor {
6365
6466 private List <AndroidTool > androidTools ;
6567
66- private java .util .Timer updateDevicesTimer ;
67-
6868 private JCheckBoxMenuItem fragmentItem ;
6969 private JCheckBoxMenuItem wallpaperItem ;
7070 private JCheckBoxMenuItem watchfaceItem ;
@@ -89,97 +89,6 @@ public PdePreprocessor createPreprocessor(final String sketchName) {
8989 return new AndroidPreprocessor (sketchName );
9090 }
9191
92- class UpdateDeviceListTask extends TimerTask {
93-
94- private JMenu deviceMenu ;
95-
96- public UpdateDeviceListTask (JMenu deviceMenu ) {
97- this .deviceMenu = deviceMenu ;
98- }
99-
100- private Device selectFirstDevice (java .util .List <Device > deviceList ) {
101- if (0 < deviceList .size ()) return deviceList .get (0 );
102- return null ;
103- }
104-
105- @ Override
106- public void run () {
107- if (androidMode == null || androidMode .getSDK () == null ) return ;
108-
109- final Devices devices = Devices .getInstance ();
110-
111- if (appComponent == AndroidBuild .WATCHFACE ) {
112- devices .enableBluetoothDebugging ();
113- }
114-
115- java .util .List <Device > deviceList = devices .findMultiple (false );
116- Device selectedDevice = devices .getSelectedDevice ();
117-
118- if (deviceList .size () == 0 ) {
119- //if (deviceMenu.getItem(0).isEnabled()) {
120- if (0 < deviceMenu .getItemCount ()) {
121- deviceMenu .removeAll ();
122- JMenuItem noDevicesItem = new JMenuItem ("No connected devices" );
123- noDevicesItem .setEnabled (false );
124- deviceMenu .add (noDevicesItem );
125- }
126- devices .setSelectedDevice (null );
127- } else {
128- deviceMenu .removeAll ();
129-
130- if (selectedDevice == null ) {
131- selectedDevice = selectFirstDevice (deviceList );
132- devices .setSelectedDevice (selectedDevice );
133- } else {
134- // check if selected device is still connected
135- boolean found = false ;
136- for (Device device : deviceList ) {
137- if (device .equals (selectedDevice )) {
138- found = true ;
139- break ;
140- }
141- }
142-
143- if (!found ) {
144- selectedDevice = selectFirstDevice (deviceList );
145- devices .setSelectedDevice (selectedDevice );
146- }
147- }
148-
149- for (final Device device : deviceList ) {
150- final JCheckBoxMenuItem deviceItem = new JCheckBoxMenuItem (device .getName ());
151- deviceItem .setEnabled (true );
152-
153- if (device .equals (selectedDevice )) deviceItem .setState (true );
154-
155- // prevent checkboxmenuitem automatic state changing onclick
156- deviceItem .addChangeListener (new ChangeListener () {
157- @ Override
158- public void stateChanged (ChangeEvent e ) {
159- if (device .equals (devices .getSelectedDevice ())) deviceItem .setState (true );
160- else deviceItem .setState (false );
161- }
162- });
163-
164- deviceItem .addActionListener (new ActionListener () {
165- @ Override
166- public void actionPerformed (ActionEvent e ) {
167- devices .setSelectedDevice (device );
168-
169- for (int i = 0 ; i < deviceMenu .getItemCount (); i ++) {
170- ((JCheckBoxMenuItem ) deviceMenu .getItem (i )).setState (false );
171- }
172-
173- deviceItem .setState (true );
174- }
175- });
176-
177- deviceMenu .add (deviceItem );
178- }
179- }
180- }
181- }
182-
18392
18493 public EditorToolbar createToolbar () {
18594 return new AndroidToolbar (this , base );
@@ -322,21 +231,35 @@ public void actionPerformed(ActionEvent e) {
322231
323232 androidMenu .addSeparator ();
324233
325- final JMenu mobDeveMenu = new JMenu ("Devices" );
234+ final JMenu devicesMenu = new JMenu ("Devices" );
326235
327- JMenuItem noMobDevItem = new JMenuItem ("No connected devices" );
328- noMobDevItem .setEnabled (false );
329- mobDeveMenu .add (noMobDevItem );
330- androidMenu .add (mobDeveMenu );
236+ JMenuItem noDevicesItem = new JMenuItem ("No connected devices" );
237+ noDevicesItem .setEnabled (false );
238+ devicesMenu .add (noDevicesItem );
239+ androidMenu .add (devicesMenu );
331240
332- // start updating device menus
333- UpdateDeviceListTask task = new UpdateDeviceListTask (mobDeveMenu );
334- if (updateDevicesTimer == null ) {
335- updateDevicesTimer = new java .util .Timer ();
336- } else {
337- updateDevicesTimer .cancel ();
338- }
339- updateDevicesTimer .schedule (task , 5000 , 5000 );
241+ // Update the device list only when the Android menu is selected.
242+ androidMenu .addMenuListener (new MenuListener () {
243+ UpdateDeviceListTask task ;
244+ java .util .Timer timer ;
245+
246+ @ Override
247+ public void menuSelected (MenuEvent e ) {
248+ task = new UpdateDeviceListTask (devicesMenu );
249+ timer = new java .util .Timer ();
250+ timer .schedule (task , 400 , 3000 );
251+ }
252+
253+ @ Override
254+ public void menuDeselected (MenuEvent e ) {
255+ timer .cancel ();
256+ }
257+
258+ @ Override
259+ public void menuCanceled (MenuEvent e ) {
260+ timer .cancel ();
261+ }
262+ });
340263
341264 androidMenu .addSeparator ();
342265
@@ -401,15 +324,6 @@ public void showReference(String filename) {
401324 File file = new File (javaReferenceFolder , filename );
402325 Platform .openURL (file .toURI ().toString ());
403326 }
404-
405-
406- @ Override
407- public void dispose () {
408- if (updateDevicesTimer != null ) {
409- updateDevicesTimer .cancel ();
410- }
411- super .dispose ();
412- }
413327
414328
415329 public void statusError (String what ) {
@@ -636,8 +550,100 @@ public void actionPerformed(ActionEvent e) {
636550// editor.statusNotice("Resetting the Android Debug Bridge server.");
637551 final Devices devices = Devices .getInstance ();
638552 devices .killAdbServer ();
553+ devices .startAdbServer ();
639554 }
640555 });
641- androidMenu .add (item );
556+ androidMenu .add (item );
557+ }
558+
559+
560+ class UpdateDeviceListTask extends TimerTask {
561+
562+ private JMenu deviceMenu ;
563+
564+ public UpdateDeviceListTask (JMenu deviceMenu ) {
565+ this .deviceMenu = deviceMenu ;
566+ }
567+
568+ private Device selectFirstDevice (java .util .List <Device > deviceList ) {
569+ if (0 < deviceList .size ()) return deviceList .get (0 );
570+ return null ;
571+ }
572+
573+ @ Override
574+ public void run () {
575+ if (androidMode == null || androidMode .getSDK () == null ) return ;
576+
577+ final Devices devices = Devices .getInstance ();
578+
579+ if (appComponent == AndroidBuild .WATCHFACE ) {
580+ devices .enableBluetoothDebugging ();
581+ }
582+
583+ java .util .List <Device > deviceList = devices .findMultiple (false );
584+ Device selectedDevice = devices .getSelectedDevice ();
585+
586+ if (deviceList .size () == 0 ) {
587+ if (0 < deviceMenu .getItemCount ()) {
588+ deviceMenu .removeAll ();
589+ JMenuItem noDevicesItem = new JMenuItem ("No connected devices" );
590+ noDevicesItem .setEnabled (false );
591+ deviceMenu .add (noDevicesItem );
592+ }
593+ devices .setSelectedDevice (null );
594+ } else {
595+ deviceMenu .removeAll ();
596+
597+ if (selectedDevice == null ) {
598+ selectedDevice = selectFirstDevice (deviceList );
599+ devices .setSelectedDevice (selectedDevice );
600+ } else {
601+ // check if selected device is still connected
602+ boolean found = false ;
603+ for (Device device : deviceList ) {
604+ if (device .equals (selectedDevice )) {
605+ found = true ;
606+ break ;
607+ }
608+ }
609+
610+ if (!found ) {
611+ selectedDevice = selectFirstDevice (deviceList );
612+ devices .setSelectedDevice (selectedDevice );
613+ }
614+ }
615+
616+ for (final Device device : deviceList ) {
617+ final JCheckBoxMenuItem deviceItem = new JCheckBoxMenuItem (device .getName ());
618+ deviceItem .setEnabled (true );
619+
620+ if (device .equals (selectedDevice )) deviceItem .setState (true );
621+
622+ // prevent checkboxmenuitem automatic state changing onclick
623+ deviceItem .addChangeListener (new ChangeListener () {
624+ @ Override
625+ public void stateChanged (ChangeEvent e ) {
626+ if (device .equals (devices .getSelectedDevice ())) deviceItem .setState (true );
627+ else deviceItem .setState (false );
628+ }
629+ });
630+
631+ deviceItem .addActionListener (new ActionListener () {
632+ @ Override
633+ public void actionPerformed (ActionEvent e ) {
634+ devices .setSelectedDevice (device );
635+
636+ for (int i = 0 ; i < deviceMenu .getItemCount (); i ++) {
637+ ((JCheckBoxMenuItem ) deviceMenu .getItem (i )).setState (false );
638+ }
639+
640+ deviceItem .setState (true );
641+ }
642+ });
643+
644+ deviceMenu .add (deviceItem );
645+ }
646+ }
647+ }
642648 }
643649}
0 commit comments