2121
2222package processing .mode .android ;
2323
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 ;
2431import java .awt .event .ActionEvent ;
2532import java .awt .event .ActionListener ;
2633import java .io .File ;
2734import java .io .IOException ;
35+ import java .util .TimerTask ;
2836
29- import javax .swing .JMenu ;
30- import javax .swing .JMenuItem ;
37+ @ SuppressWarnings ("serial" )
38+ public class AndroidEditor extends JavaEditor {
39+ private AndroidMode androidMode ;
3140
32- import processing .app .*;
33- import processing .mode .java .JavaEditor ;
41+ class UpdateDeviceListTask extends TimerTask {
3442
35- import processing . core . PApplet ;
43+ private JMenu deviceMenu ;
3644
45+ public UpdateDeviceListTask (JMenu deviceMenu ) {
46+ this .deviceMenu = deviceMenu ;
47+ }
3748
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+ }
4081
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+ }
41121
42122 protected AndroidEditor (Base base , String path , EditorState state , Mode mode ) throws Exception {
43123 super (base , path , state , mode );
@@ -114,14 +194,28 @@ public void actionPerformed(ActionEvent e) {
114194
115195 menu .addSeparator ();
116196
117- item = new JMenuItem ("Signing Key Setup" );
197+ /* item = new JMenuItem("Signing Key Setup");
118198 item.addActionListener(new ActionListener() {
119199 public void actionPerformed(ActionEvent e) {
120200 new Keys(AndroidEditor.this);
121201 }
122202 });
123203 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 ();
125219
126220 item = new JMenuItem ("Android SDK Manager" );
127221 item .addActionListener (new ActionListener () {
@@ -376,27 +470,37 @@ public void run() {
376470 public void handleExportPackage () {
377471 // Need to implement an entire signing setup first
378472 // 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+ }
392478
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 ();
401505 }
402506}
0 commit comments