21
21
22
22
package processing .mode .android ;
23
23
24
+ import processing .app .*;
25
+ import processing .core .PApplet ;
26
+ import processing .mode .java .JavaEditor ;
27
+
28
+ import javax .swing .*;
29
+ import javax .swing .event .ChangeEvent ;
30
+ import javax .swing .event .ChangeListener ;
24
31
import java .awt .event .ActionEvent ;
25
32
import java .awt .event .ActionListener ;
26
33
import java .io .File ;
27
34
import java .io .IOException ;
35
+ import java .util .TimerTask ;
28
36
29
- import javax .swing .JMenu ;
30
- import javax .swing .JMenuItem ;
37
+ @ SuppressWarnings ("serial" )
38
+ public class AndroidEditor extends JavaEditor {
39
+ private AndroidMode androidMode ;
31
40
32
- import processing .app .*;
33
- import processing .mode .java .JavaEditor ;
41
+ class UpdateDeviceListTask extends TimerTask {
34
42
35
- import processing . core . PApplet ;
43
+ private JMenu deviceMenu ;
36
44
45
+ public UpdateDeviceListTask (JMenu deviceMenu ) {
46
+ this .deviceMenu = deviceMenu ;
47
+ }
37
48
38
- public class AndroidEditor extends JavaEditor {
39
- private AndroidMode androidMode ;
49
+ @ Override
50
+ public void run () {
51
+ if (androidMode .getSDK () == null ) return ;
52
+
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
+ if (0 < deviceMenu .getItemCount ()) {
60
+ deviceMenu .removeAll ();
61
+ JMenuItem noDevicesItem = new JMenuItem ("No connected devices" );
62
+ noDevicesItem .setEnabled (false );
63
+ deviceMenu .add (noDevicesItem );
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
+ }
40
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
+ }
41
121
42
122
protected AndroidEditor (Base base , String path , EditorState state , Mode mode ) throws Exception {
43
123
super (base , path , state , mode );
@@ -114,14 +194,28 @@ public void actionPerformed(ActionEvent e) {
114
194
115
195
menu .addSeparator ();
116
196
117
- item = new JMenuItem ("Signing Key Setup" );
197
+ /* item = new JMenuItem("Signing Key Setup");
118
198
item.addActionListener(new ActionListener() {
119
199
public void actionPerformed(ActionEvent e) {
120
200
new Keys(AndroidEditor.this);
121
201
}
122
202
});
123
203
item.setEnabled(false);
124
- 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
+ java .util .Timer timer = new java .util .Timer ();
216
+ timer .schedule (task , 5000 , 5000 );
217
+
218
+ menu .addSeparator ();
125
219
126
220
item = new JMenuItem ("Android SDK Manager" );
127
221
item .addActionListener (new ActionListener () {
@@ -376,27 +470,37 @@ public void run() {
376
470
public void handleExportPackage () {
377
471
// Need to implement an entire signing setup first
378
472
// http://dev.processing.org/bugs/show_bug.cgi?id=1430
379
- statusError ("Exporting signed packages is not yet implemented." );
380
- deactivateExport ();
381
-
382
- // make a release build
383
- // try {
384
- // buildReleaseForExport("release");
385
- // } catch (final MonitorCanceled ok) {
386
- // statusNotice("Canceled.");
387
- // } finally {
388
- // deactivateExport();
389
- // }
390
-
391
- // TODO now sign it... lots of fun signing code mess to go here. yay!
473
+ if (handleExportCheckModified ()) {
474
+ deactivateExport ();
475
+ new KeyStoreManager (this );
476
+ }
477
+ }
392
478
393
- // maybe even send it to the device? mmm?
394
- // try {
395
- // runSketchOnDevice(AndroidEnvironment.getInstance().getHardware(), "release");
396
- // } catch (final MonitorCanceled ok) {
397
- // editor.statusNotice("Canceled.");
398
- // } finally {
399
- // editor.deactivateExport();
400
- // }
479
+ public void startExportPackage (final String keyStorePassword ) {
480
+ new Thread () {
481
+ public void run () {
482
+ startIndeterminate ();
483
+ statusNotice ("Exporting signed package..." );
484
+ AndroidBuild build = new AndroidBuild (sketch , androidMode );
485
+ try {
486
+ File projectFolder = build .exportPackage (keyStorePassword );
487
+ if (projectFolder != null ) {
488
+ statusNotice ("Done with export." );
489
+ Base .openFolder (projectFolder );
490
+ } else {
491
+ statusError ("Error with export" );
492
+ }
493
+ } catch (IOException e ) {
494
+ statusError (e );
495
+ } catch (SketchException e ) {
496
+ statusError (e );
497
+ } catch (InterruptedException e ) {
498
+ e .printStackTrace ();
499
+ } catch (Exception e ) {
500
+ e .printStackTrace ();
501
+ }
502
+ stopIndeterminate ();
503
+ }
504
+ }.start ();
401
505
}
402
506
}
0 commit comments