Skip to content

Commit 56bdaa2

Browse files
committed
Merge branch 'imilka-deviceSelector'
2 parents 87cc349 + b19bc06 commit 56bdaa2

File tree

4 files changed

+168
-32
lines changed

4 files changed

+168
-32
lines changed

src/processing/mode/android/AndroidEditor.java

Lines changed: 98 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,97 @@
2727

2828
import javax.swing.*;
2929

30+
import javax.swing.event.ChangeEvent;
31+
import javax.swing.event.ChangeListener;
3032
import java.awt.event.ActionEvent;
3133
import java.awt.event.ActionListener;
3234
import java.io.File;
3335
import java.io.IOException;
34-
36+
import java.util.Timer;
37+
import java.util.TimerTask;
3538

3639
@SuppressWarnings("serial")
3740
public class AndroidEditor extends JavaEditor {
3841
private AndroidMode androidMode;
3942

43+
class UpdateDeviceListTask extends TimerTask {
44+
45+
private JMenu deviceMenu;
46+
47+
public UpdateDeviceListTask(JMenu deviceMenu) {
48+
this.deviceMenu = deviceMenu;
49+
}
50+
51+
@Override
52+
public void run() {
53+
final Devices devices = Devices.getInstance();
54+
java.util.List<Device> deviceList = devices.findMultiple(false);
55+
Device selectedDevice = devices.getSelectedDevice();
56+
57+
if(deviceList.size() == 0) {
58+
if(deviceMenu.getItem(0).isEnabled()) {
59+
deviceMenu.removeAll();
60+
JMenuItem noDevicesItem = new JMenuItem("No connected devices");
61+
noDevicesItem.setEnabled(false);
62+
deviceMenu.add(noDevicesItem);
63+
}
64+
65+
devices.setSelectedDevice(null);
66+
} else {
67+
deviceMenu.removeAll();
68+
69+
if(selectedDevice == null) {
70+
selectedDevice = deviceList.get(0);
71+
devices.setSelectedDevice(selectedDevice);
72+
} else {
73+
// check if selected device is still connected
74+
boolean found = false;
75+
for (Device device : deviceList) {
76+
if(device.equals(selectedDevice)) {
77+
found = true;
78+
break;
79+
}
80+
}
81+
82+
if(!found) {
83+
selectedDevice = deviceList.get(0);
84+
devices.setSelectedDevice(selectedDevice);
85+
}
86+
}
87+
88+
for (final Device device : deviceList) {
89+
final JCheckBoxMenuItem deviceItem = new JCheckBoxMenuItem(device.getName());
90+
deviceItem.setEnabled(true);
91+
92+
if(device.equals(selectedDevice)) deviceItem.setState(true);
93+
94+
// prevent checkboxmenuitem automatic state changing onclick
95+
deviceItem.addChangeListener(new ChangeListener() {
96+
@Override
97+
public void stateChanged(ChangeEvent e) {
98+
if(device.equals(devices.getSelectedDevice())) deviceItem.setState(true);
99+
else deviceItem.setState(false);
100+
}
101+
});
102+
103+
deviceItem.addActionListener(new ActionListener() {
104+
@Override
105+
public void actionPerformed(ActionEvent e) {
106+
devices.setSelectedDevice(device);
107+
108+
for(int i = 0; i < deviceMenu.getItemCount(); i++) {
109+
((JCheckBoxMenuItem) deviceMenu.getItem(i)).setState(false);
110+
}
111+
112+
deviceItem.setState(true);
113+
}
114+
});
115+
116+
deviceMenu.add(deviceItem);
117+
}
118+
}
119+
}
120+
}
40121

41122
protected AndroidEditor(Base base, String path, EditorState state, Mode mode) throws Exception {
42123
super(base, path, state, mode);
@@ -113,14 +194,28 @@ public void actionPerformed(ActionEvent e) {
113194

114195
menu.addSeparator();
115196

116-
item = new JMenuItem("Signing Key Setup");
197+
/*item = new JMenuItem("Signing Key Setup");
117198
item.addActionListener(new ActionListener() {
118199
public void actionPerformed(ActionEvent e) {
119200
new Keys(AndroidEditor.this);
120201
}
121202
});
122203
item.setEnabled(false);
123-
menu.add(item);
204+
menu.add(item); */
205+
206+
final JMenu deviceMenu = new JMenu("Select device");
207+
208+
JMenuItem noDevicesItem = new JMenuItem("No connected devices");
209+
noDevicesItem.setEnabled(false);
210+
deviceMenu.add(noDevicesItem);
211+
menu.add(deviceMenu);
212+
213+
// start updating device menus
214+
UpdateDeviceListTask task = new UpdateDeviceListTask(deviceMenu);
215+
Timer timer = new Timer();
216+
timer.schedule(task, 0, 5000);
217+
218+
menu.addSeparator();
124219

125220
item = new JMenuItem("Android SDK Manager");
126221
item.addActionListener(new ActionListener() {

src/processing/mode/android/AndroidMode.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,14 @@
2121

2222
package processing.mode.android;
2323

24+
import processing.app.*;
25+
import processing.mode.java.JavaMode;
26+
2427
import java.io.File;
2528
import java.io.IOException;
2629
import java.text.SimpleDateFormat;
2730
import java.util.Date;
2831

29-
import processing.app.Base;
30-
import processing.app.Editor;
31-
import processing.app.EditorState;
32-
import processing.app.Library;
33-
import processing.app.RunnerListener;
34-
import processing.app.Sketch;
35-
import processing.app.SketchException;
36-
import processing.mode.java.JavaMode;
37-
3832

3933
public class AndroidMode extends JavaMode {
4034
private AndroidSDK sdk;

src/processing/mode/android/Device.java

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,5 @@
11
package processing.mode.android;
22

3-
import java.io.IOException;
4-
import java.util.ArrayList;
5-
import java.util.Collections;
6-
import java.util.HashSet;
7-
import java.util.List;
8-
import java.util.Set;
9-
import java.util.regex.Matcher;
10-
import java.util.regex.Pattern;
11-
123
import processing.app.Base;
134
import processing.app.RunnerListener;
145
import processing.app.exec.LineProcessor;
@@ -18,6 +9,11 @@
189
import processing.core.PApplet;
1910
import processing.mode.android.LogEntry.Severity;
2011

12+
import java.io.IOException;
13+
import java.util.*;
14+
import java.util.regex.Matcher;
15+
import java.util.regex.Pattern;
16+
2117

2218
class Device {
2319
private final Devices env;
@@ -47,6 +43,28 @@ public void bringLauncherToFront() {
4743
}
4844
}
4945

46+
public String getName() {
47+
String name = "";
48+
49+
try {
50+
ProcessResult result = AndroidSDK.runADB("-s", id, "shell", "getprop", "ro.product.brand");
51+
if(result.succeeded()) {
52+
name += result.getStdout() + " ";
53+
}
54+
55+
result = AndroidSDK.runADB("-s", id, "shell", "getprop", "ro.product.model");
56+
if(result.succeeded()) {
57+
name += result.getStdout();
58+
}
59+
} catch (InterruptedException e) {
60+
e.printStackTrace();
61+
} catch (IOException e) {
62+
e.printStackTrace();
63+
}
64+
65+
return name + " [" + id + "]";
66+
}
67+
5068
// adb -s emulator-5556 install helloWorld.apk
5169

5270
// : adb -s HT91MLC00031 install bin/Brightness-debug.apk
@@ -299,4 +317,8 @@ public String toString() {
299317
return "[AndroidDevice " + getId() + "]";
300318
}
301319

320+
@Override
321+
public boolean equals(Object obj) {
322+
return ((Device) obj).getId().equals(getId());
323+
}
302324
}

src/processing/mode/android/Devices.java

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
11
package processing.mode.android;
22

3+
import processing.app.exec.ProcessResult;
4+
import processing.mode.android.EmulatorController.State;
5+
36
import java.io.IOException;
47
import java.util.ArrayList;
58
import java.util.Collections;
69
import java.util.List;
710
import java.util.Map;
8-
import java.util.concurrent.Callable;
9-
import java.util.concurrent.ConcurrentHashMap;
10-
import java.util.concurrent.ExecutorService;
11-
import java.util.concurrent.Executors;
12-
import java.util.concurrent.Future;
13-
import java.util.concurrent.FutureTask;
11+
import java.util.concurrent.*;
1412

1513
//import processing.app.EditorConsole;
16-
import processing.app.exec.ProcessResult;
17-
import processing.mode.android.EmulatorController.State;
1814

1915
/**
2016
* <pre> AndroidEnvironment env = AndroidEnvironment.getInstance();
@@ -30,6 +26,8 @@ class Devices {
3026

3127
private static final Devices INSTANCE = new Devices();
3228

29+
private Device selectedDevice;
30+
3331
public static Devices getInstance() {
3432
return INSTANCE;
3533
}
@@ -39,6 +37,13 @@ public static Devices getInstance() {
3937
private final ExecutorService deviceLaunchThread =
4038
Executors.newSingleThreadExecutor();
4139

40+
public Device getSelectedDevice() {
41+
return selectedDevice;
42+
}
43+
44+
public void setSelectedDevice(Device selectedDevice) {
45+
this.selectedDevice = selectedDevice;
46+
}
4247

4348
public static void killAdbServer() {
4449
System.out.println("Shutting down any existing adb server...");
@@ -152,23 +157,43 @@ private Device find(final boolean wantEmulator) {
152157
return null;
153158
}
154159

160+
public List<Device> findMultiple(final boolean wantEmulator) {
161+
List<Device> deviceList = new ArrayList<Device>();
162+
163+
refresh();
164+
synchronized (devices) {
165+
for (final Device device : devices.values()) {
166+
final boolean isEmulator = device.getId().contains("emulator");
167+
if ((isEmulator && wantEmulator) || (!isEmulator && !wantEmulator)) {
168+
deviceList.add(device);
169+
}
170+
}
171+
}
172+
173+
return deviceList;
174+
}
155175

156176
/**
157177
* @return the first Android hardware device known to be running, or null if there are none.
158178
*/
159179
public Future<Device> getHardware() {
180+
Device device = getSelectedDevice();
181+
if(device == null || !device.isAlive()) device = blockingGetHardware();
182+
return getHardware(device);
183+
}
184+
185+
public Future<Device> getHardware(final Device device) {
160186
final Callable<Device> androidFinder = new Callable<Device>() {
161187
public Device call() throws Exception {
162-
return blockingGetHardware();
188+
return device;
163189
}
164190
};
165191
final FutureTask<Device> task =
166-
new FutureTask<Device>(androidFinder);
192+
new FutureTask<Device>(androidFinder);
167193
deviceLaunchThread.execute(task);
168194
return task;
169195
}
170196

171-
172197
private final Device blockingGetHardware() {
173198
Device hardware = find(false);
174199
if (hardware != null) {

0 commit comments

Comments
 (0)