diff --git a/android/todo.txt b/android/todo.txt index 41a2995c2..cdee71fb2 100644 --- a/android/todo.txt +++ b/android/todo.txt @@ -74,6 +74,7 @@ X http://code.google.com/p/processing/issues/detail?id=232 X prevent adding the opengl library when it's not needed X preprocessor removes the code by before export X added a note to the wiki +X implement android menu earlier X if sketchRenderer() et al are used in android, need to add to desktop @@ -256,8 +257,7 @@ W/System.err( 242): at android.app.ApplicationContext.openFileOutput(Applicati W/System.err( 242): at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:158) W/System.err( 242): at processing.core.PApplet.createOutput(PApplet.java:3677) -android menu (need to discuss) -_ reset adb +android menu _ something to bring up the full console window _ signing tool _ selection of which avd (emulator), or plugged-in devices (if multiple) diff --git a/android/tool/src/processing/app/tools/android/AndroidEnvironment.java b/android/tool/src/processing/app/tools/android/AndroidEnvironment.java index 4cd4cf0e7..210d35d54 100644 --- a/android/tool/src/processing/app/tools/android/AndroidEnvironment.java +++ b/android/tool/src/processing/app/tools/android/AndroidEnvironment.java @@ -55,7 +55,7 @@ class AndroidEnvironment { private AndroidEnvironment() { - if (AndroidTool.DEBUG) { + if (AndroidMode.DEBUG) { System.out.println("Starting up AndroidEnvironment"); } // killAdbServer(); diff --git a/android/tool/src/processing/app/tools/android/AndroidTool.java b/android/tool/src/processing/app/tools/android/AndroidMode.java similarity index 84% rename from android/tool/src/processing/app/tools/android/AndroidTool.java rename to android/tool/src/processing/app/tools/android/AndroidMode.java index de548d2ac..4179f6978 100644 --- a/android/tool/src/processing/app/tools/android/AndroidTool.java +++ b/android/tool/src/processing/app/tools/android/AndroidMode.java @@ -22,6 +22,10 @@ package processing.app.tools.android; import java.awt.Frame; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; import java.io.*; import java.net.URL; import java.text.SimpleDateFormat; @@ -29,9 +33,13 @@ import java.util.*; import java.util.concurrent.*; import java.util.regex.*; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; + import processing.app.*; import processing.app.debug.*; -import processing.app.tools.Tool; import processing.core.PApplet; @@ -39,7 +47,7 @@ import processing.core.PApplet; // http://dl.google.com/android/android-sdk_r3-mac.zip // http://dl.google.com/android/repository/tools_r03-macosx.zip -public class AndroidTool implements Tool, DeviceListener { +public class AndroidMode implements DeviceListener { private AndroidSDK sdk; private Editor editor; private Build build; @@ -55,15 +63,95 @@ public class AndroidTool implements Tool, DeviceListener { // "http://processing.googlecode.com/svn" + // "/tags/processing-" + Base.VERSION_NAME + "/android/core.zip"; - public String getMenuTitle() { - return "Android Mode"; - } +// public String getMenuTitle() { +// return "Android Mode"; +// } - public void init(final Editor parent) { +// public void init(final Editor parent) { +// this.editor = parent; +// } + + JCheckBoxMenuItem toggleItem; + + public void init(final Editor parent, final JMenuBar menubar) { this.editor = parent; + + + JMenu menu = new JMenu("Android"); + JMenuItem item; + + toggleItem = Base.newJCheckBoxMenuItem("Android Mode", 'D'); + toggleItem.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + System.out.println("maybe?"); + updateMode(); + } + }); + menu.add(toggleItem); + + item = new JMenuItem("Wiki..."); + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + Base.openURL("http://wiki.processing.org/w/Android"); + } + }); + menu.add(item); + + menu.addSeparator(); + + item = new JMenuItem("Options"); + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + //new Permissions(editor); + } + }); + menu.add(item); + + item = new JMenuItem("Permissions"); + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + new Permissions(editor); + } + }); + menu.add(item); + + menu.addSeparator(); + + item = new JMenuItem("Reset"); + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + AndroidEnvironment.killAdbServer(); + } + }); + menu.add(item); + + menubar.add(menu); + } + + + protected void updateMode() { + // When the selection is made, the menu will update itself + boolean active = toggleItem.isSelected(); + if (active) { + boolean rolling = true; + if (sdk == null) { + rolling = loadAndroid(); + } + if (rolling) { + editor.setHandlers(new RunHandler(), new PresentHandler(), + new StopHandler(), + new ExportHandler(), new ExportAppHandler()); + build = new Build(editor, sdk); + editor.statusNotice("Android mode enabled for this editor window."); + } + } else { + editor.resetHandlers(); + editor.statusNotice("Android mode disabled."); + } } - public void run() { + + protected boolean loadAndroid() { editor.statusNotice("Loading Android tools."); try { @@ -71,19 +159,17 @@ public class AndroidTool implements Tool, DeviceListener { } catch (final Exception e) { Base.showWarning("Android Tools Error", e.getMessage(), null); editor.statusNotice("Android mode canceled."); - return; + return false; } // Make sure that the processing.android.core.* classes are available if (!checkCore()) { editor.statusNotice("Android mode canceled."); - return; + return false; } - editor.setHandlers(new RunHandler(), new PresentHandler(), - new StopHandler(), new ExportHandler(), new ExportAppHandler()); - build = new Build(editor, sdk); editor.statusNotice("Done loading Android tools."); + return true; } diff --git a/android/tool/src/processing/app/tools/android/Build.java b/android/tool/src/processing/app/tools/android/Build.java index 307922a53..9541cca01 100644 --- a/android/tool/src/processing/app/tools/android/Build.java +++ b/android/tool/src/processing/app/tools/android/Build.java @@ -113,7 +113,7 @@ class Build { // Create the 'src' folder with the preprocessed code. final File srcFolder = new File(tempBuildFolder, "src"); - if (AndroidTool.DEBUG) Base.openFolder(tempBuildFolder); + if (AndroidMode.DEBUG) Base.openFolder(tempBuildFolder); try { manifest = new Manifest(editor); @@ -158,7 +158,7 @@ class Build { final File assetsFolder = mkdirs(tempBuildFolder, "assets"); final InputStream input = - PApplet.createInput(AndroidTool.getCoreZipLocation()); + PApplet.createInput(AndroidMode.getCoreZipLocation()); PApplet.saveStream(new File(libsFolder, "processing-core.jar"), input); try { @@ -214,7 +214,7 @@ class Build { File androidFolder = new File(sketch.getFolder(), "android"); if (androidFolder.exists()) { // Date mod = new Date(androidFolder.lastModified()); - String stamp = AndroidTool.getDateStamp(androidFolder.lastModified()); + String stamp = AndroidMode.getDateStamp(androidFolder.lastModified()); File dest = new File(sketch.getFolder(), "android." + stamp); boolean result = androidFolder.renameTo(dest); if (!result) { diff --git a/android/tool/src/processing/app/tools/android/Manifest.java b/android/tool/src/processing/app/tools/android/Manifest.java index 7dc5b1be8..fd7046249 100644 --- a/android/tool/src/processing/app/tools/android/Manifest.java +++ b/android/tool/src/processing/app/tools/android/Manifest.java @@ -230,7 +230,7 @@ public class Manifest { // remove the old manifest file, rename it with date stamp long lastModified = manifestFile.lastModified(); - String stamp = AndroidTool.getDateStamp(lastModified); + String stamp = AndroidMode.getDateStamp(lastModified); File dest = new File(sketch.getFolder(), MANIFEST_XML + "." + stamp); boolean moved = manifestFile.renameTo(dest); if (!moved) { diff --git a/android/tool/src/processing/app/tools/android/Permissions.java b/android/tool/src/processing/app/tools/android/Permissions.java index ba544abb1..2b28d4cda 100644 --- a/android/tool/src/processing/app/tools/android/Permissions.java +++ b/android/tool/src/processing/app/tools/android/Permissions.java @@ -12,12 +12,9 @@ import javax.swing.event.*; import processing.app.Base; import processing.app.Editor; import processing.app.Preferences; -import processing.app.tools.Tool; -//import processing.core.*; -//import processing.core.PApplet; -public class Permissions extends JFrame implements Tool { +public class Permissions extends JFrame { static final String GUIDE_URL = "http://developer.android.com/guide/topics/security/security.html#permissions"; @@ -32,10 +29,10 @@ public class Permissions extends JFrame implements Tool { Editor editor; - public Permissions() { + public Permissions(Editor editor) { //public Permissions(Editor editor) { super("Android Permissions Selector"); -// this.editor = editor; + this.editor = editor; // XMLElement xml = @@ -268,7 +265,12 @@ public class Permissions extends JFrame implements Tool { setLocation((screen.width - windowSize.width) / 2, (screen.height - windowSize.height) / 2); -// setVisible(true); + + Manifest mf = new Manifest(editor); + setSelections(mf.getPermissions()); + + // show the window and get to work + setVisible(true); } @@ -312,19 +314,19 @@ public class Permissions extends JFrame implements Tool { } - public void init(Editor editor) { - this.editor = editor; - } +// public void init(Editor editor) { +// this.editor = editor; +// } - public void run() { - // parse the manifest file here and figure out what permissions are set - Manifest mf = new Manifest(editor); - setSelections(mf.getPermissions()); - - // show the window and get to work - setVisible(true); - } +// public void run() { +// // parse the manifest file here and figure out what permissions are set +// Manifest mf = new Manifest(editor); +// setSelections(mf.getPermissions()); +// +// // show the window and get to work +// setVisible(true); +// } /** diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index c00b6dfdb..e6bd809e7 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -450,6 +450,14 @@ public class Base { menuItem.setAccelerator(KeyStroke.getKeyStroke(what, SHORTCUT_ALT_KEY_MASK)); return menuItem; } + + + static public JCheckBoxMenuItem newJCheckBoxMenuItem(String title, int what) { + JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem(title); + int modifiers = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); + menuItem.setAccelerator(KeyStroke.getKeyStroke(what, modifiers)); + return menuItem; + } // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index f5c08cca4..d19275ee0 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -32,6 +32,7 @@ import java.awt.datatransfer.*; import java.awt.event.*; import java.awt.print.*; import java.io.*; +import java.lang.reflect.Method; import java.net.*; import java.util.*; import java.util.zip.*; @@ -421,6 +422,21 @@ public class Editor extends JFrame implements RunnerListener { menubar.add(buildEditMenu()); menubar.add(buildSketchMenu()); menubar.add(buildToolsMenu()); + + // These are temporary entries while Android mode is being worked out. + // The mode will not be in the tools menu, and won't involve a cmd-key + if (!Base.RELEASE) { + try { + Class clazz = Class.forName("processing.app.tools.android.AndroidMode"); + Object mode = clazz.newInstance(); + Method m = clazz.getMethod("init", new Class[] { Editor.class, JMenuBar.class }); + //String libraryPath = (String) m.invoke(null, new Object[] { }); + m.invoke(mode, new Object[] { this, menubar }); + } catch (Exception e) { + e.printStackTrace(); + } + } + menubar.add(buildHelpMenu()); setJMenuBar(menubar); } @@ -674,15 +690,15 @@ public class Editor extends JFrame implements RunnerListener { menu.add(createToolMenuItem("processing.app.tools.Archiver")); menu.add(createToolMenuItem("processing.app.tools.FixEncoding")); - // These are temporary entries while Android mode is being worked out. - // The mode will not be in the tools menu, and won't involve a cmd-key - if (!Base.RELEASE) { - item = createToolMenuItem("processing.app.tools.android.AndroidTool"); - item.setAccelerator(KeyStroke.getKeyStroke('D', modifiers)); - menu.add(item); - menu.add(createToolMenuItem("processing.app.tools.android.Permissions")); - menu.add(createToolMenuItem("processing.app.tools.android.Reset")); - } +// // These are temporary entries while Android mode is being worked out. +// // The mode will not be in the tools menu, and won't involve a cmd-key +// if (!Base.RELEASE) { +// item = createToolMenuItem("processing.app.tools.android.AndroidTool"); +// item.setAccelerator(KeyStroke.getKeyStroke('D', modifiers)); +// menu.add(item); +// menu.add(createToolMenuItem("processing.app.tools.android.Permissions")); +// menu.add(createToolMenuItem("processing.app.tools.android.Reset")); +// } return menu; } diff --git a/todo.txt b/todo.txt index e77797678..3573818a1 100644 --- a/todo.txt +++ b/todo.txt @@ -3,6 +3,8 @@ X be more specific about linux/sun/java error messages X allow 'oracle' in java version name string X the open button on the toolbar is goofed up X http://code.google.com/p/processing/issues/detail?id=323 +X changed how "Save As" works, now copies everything in the folder +X but ignores applet, application.*, screen-* files/folders earlier X add warning message when not using a version of sun java w/ p5 on linux