Skip to content

Commit 610519c

Browse files
committed
Merge pull request #69 from imilka/bugfixes-2
wrapping up GSOC with more bugfixes from Imil
2 parents 07e0383 + 3b71f90 commit 610519c

File tree

9 files changed

+523
-47
lines changed

9 files changed

+523
-47
lines changed

build.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@
4545
${processing.dir}/app/pde.jar;
4646
${processing.dir}/app/lib/ant.jar;
4747
${processing.dir}/app/lib/ant-launcher.jar;
48-
${processing.dir}/app/lib/antlr.jar"
48+
${processing.dir}/app/lib/antlr.jar;
49+
mode/org.eclipse.core.runtime-3.1.0.jar"
4950
debug="on">
5051
<src path="src" />
5152
</javac>
443 KB
Binary file not shown.

src/processing/mode/android/AndroidBuild.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import processing.app.exec.ProcessHelper;
3535
import processing.app.exec.ProcessResult;
3636
import processing.core.PApplet;
37+
import processing.mode.android.signing.JarSigner;
3738
import processing.mode.java.JavaBuild;
3839

3940
import java.io.*;
@@ -304,11 +305,12 @@ private File signPackage(File projectFolder, String keyStorePassword) throws Exc
304305

305306
File unsignedPackage = new File(projectFolder, "bin/" + sketch.getName() + "-release-unsigned.apk");
306307
if (!unsignedPackage.exists()) return null;
308+
File signedPackage = new File(projectFolder, "bin/" + sketch.getName() + "-release-signed.apk");
307309

308-
JarSigner.signJar(unsignedPackage, AndroidKeyStore.ALIAS_STRING, keyStorePassword, keyStore.getAbsolutePath(), keyStorePassword);
310+
JarSigner.signJar(unsignedPackage, signedPackage, AndroidKeyStore.ALIAS_STRING, keyStorePassword, keyStore.getAbsolutePath(), keyStorePassword);
309311

310312
//if (verifySignedPackage(unsignedPackage)) {
311-
File signedPackage = new File(projectFolder, "bin/" + sketch.getName() + "-release-signed.apk");
313+
/*File signedPackage = new File(projectFolder, "bin/" + sketch.getName() + "-release-signed.apk");
312314
if (signedPackage.exists()) {
313315
boolean deleteResult = signedPackage.delete();
314316
if (!deleteResult) {
@@ -323,7 +325,7 @@ private File signPackage(File projectFolder, String keyStorePassword) throws Exc
323325
Base.showWarning("Error during package signing",
324326
"Unable to rename package file");
325327
return null;
326-
}
328+
}*/
327329

328330
File alignedPackage = zipalignPackage(signedPackage, projectFolder);
329331
return alignedPackage;

src/processing/mode/android/AndroidEditor.java

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -482,21 +482,44 @@ public void run() {
482482
* Build the sketch and run it on a device with the debugger connected.
483483
*/
484484
public void handleRunDevice() {
485-
new Thread() {
486-
public void run() {
487-
toolbar.activate(AndroidToolbar.RUN);
488-
startIndeterminate();
489-
prepareRun();
490-
try {
491-
androidMode.handleRunDevice(sketch, AndroidEditor.this);
492-
} catch (SketchException e) {
493-
statusError(e);
494-
} catch (IOException e) {
495-
statusError(e);
496-
}
497-
stopIndeterminate();
485+
if(Base.isWindows() && !Preferences.getBoolean("usbDriverWarningShown")) {
486+
Preferences.setBoolean("usbDriverWarningShown", true);
487+
488+
String message = "";
489+
File usbDriverFile = new File(((AndroidMode) sketch.getMode()).getSDK().getSdkFolder(), "extras/google/usb_driver");
490+
if (usbDriverFile.exists()) {
491+
message = "<html><body>" +
492+
"You might need to install Google USB Driver to run the sketch on your device.<br>" +
493+
"Please follow the guide at <a href='http://developer.android.com/tools/extras/oem-usb.html#InstallingDriver'>http://developer.android.com/tools/extras/oem-usb.html#InstallingDriver</a> to install the driver.<br>" +
494+
"For your reference, the driver is located in: " + usbDriverFile.getAbsolutePath();
495+
} else {
496+
message = "<html><body>" +
497+
"You might need to install Google USB Driver to run the sketch on your device.<br>" +
498+
"Please follow the guide at <a href='http://developer.android.com/tools/extras/oem-usb.html#InstallingDriver'>http://developer.android.com/tools/extras/oem-usb.html#InstallingDriver</a> to install the driver.<br>" +
499+
"You will also need to download the driver from <a href='http://developer.android.com/sdk/win-usb.html'>http://developer.android.com/sdk/win-usb.html</a>";
498500
}
499-
}.start();
501+
502+
Base.showWarning(
503+
"USB Driver warning",
504+
message
505+
);
506+
} else {
507+
new Thread() {
508+
public void run() {
509+
toolbar.activate(AndroidToolbar.RUN);
510+
startIndeterminate();
511+
prepareRun();
512+
try {
513+
androidMode.handleRunDevice(sketch, AndroidEditor.this);
514+
} catch (SketchException e) {
515+
statusError(e);
516+
} catch (IOException e) {
517+
statusError(e);
518+
}
519+
stopIndeterminate();
520+
}
521+
}.start();
522+
}
500523
}
501524

502525

src/processing/mode/android/JarSigner.java

Lines changed: 0 additions & 29 deletions
This file was deleted.

src/processing/mode/android/SDKDownloader.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public class SDKDownloader extends JFrame implements PropertyChangeListener {
3232

3333
private static final String URL_REPOSITORY = "https://dl-ssl.google.com/android/repository/repository-10.xml";
3434
private static final String URL_REPOSITORY_FOLDER = "http://dl-ssl.google.com/android/repository/";
35+
private static final String URL_USB_DRIVER = "https://dl-ssl.google.com//android/repository/latest_usb_driver_windows.zip";
3536

3637
private static final String PLATFORM_API_LEVEL = "10";
3738

@@ -69,6 +70,8 @@ protected Object doInBackground() throws Exception {
6970
if (!platformsFolder.exists()) platformsFolder.mkdir();
7071
File buildToolsFolder = new File(sdkFolder, "build-tools");
7172
if (!buildToolsFolder.exists()) buildToolsFolder.mkdir();
73+
File extrasFolder = new File(sdkFolder, "extras");
74+
if(!extrasFolder.exists()) extrasFolder.mkdir();
7275

7376
// creating temp folder for downloaded zip packages
7477
File tempFolder = new File(modeFolder, "temp");
@@ -95,6 +98,13 @@ protected Object doInBackground() throws Exception {
9598
File downloadedPlatform = new File(tempFolder, downloadUrls.platformFilename);
9699
downloadAndUnpack(downloadUrls.platformUrl, downloadedPlatform, platformsFolder);
97100

101+
// usb driver
102+
if(Base.isWindows()) {
103+
File usbDriverFolder = new File(extrasFolder, "google");
104+
File downloadedFolder = new File(tempFolder, "latest_usb_driver_windows.zip");
105+
downloadAndUnpack(URL_USB_DRIVER, downloadedFolder, usbDriverFolder);
106+
}
107+
98108
if (Base.isLinux() || Base.isMacOS()) {
99109
Runtime.getRuntime().exec("chmod -R 755 " + sdkFolder.getAbsolutePath());
100110
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package processing.mode.android.signing;
2+
3+
import java.io.IOException;
4+
import java.security.GeneralSecurityException;
5+
import java.security.PrivateKey;
6+
import java.security.cert.X509Certificate;
7+
import java.util.jar.JarOutputStream;
8+
9+
public interface IApkSignatureProvider {
10+
11+
public void writeSignatureBlock(byte[] message, String signatureAlgorithm, X509Certificate publicKey,
12+
PrivateKey privateKey,JarOutputStream mOutputJar)throws IOException, GeneralSecurityException;
13+
14+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package processing.mode.android.signing;
2+
3+
import java.io.*;
4+
import java.security.*;
5+
import java.security.cert.CertificateException;
6+
import java.security.cert.X509Certificate;
7+
8+
/**
9+
* Created by ibziy_000 on 17.08.2014.
10+
*/
11+
public class JarSigner {
12+
public static void signJar(File jarToSign, File outputJar, String alias, String keypass, String keystore, String storepass)
13+
throws GeneralSecurityException, IOException, SignedJarBuilder.IZipEntryFilter.ZipAbortException {
14+
15+
PrivateKey mPrivateKey;
16+
X509Certificate mCertificate;
17+
18+
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
19+
FileInputStream fis = new FileInputStream(keystore);
20+
keyStore.load(fis, storepass.toCharArray());
21+
fis.close();
22+
23+
KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(
24+
alias, new KeyStore.PasswordProtection(keypass.toCharArray()));
25+
if (entry != null) {
26+
mPrivateKey = entry.getPrivateKey();
27+
mCertificate = (X509Certificate) entry.getCertificate();
28+
} else {
29+
throw new KeyStoreException("Couldn't get key");
30+
}
31+
32+
SignedJarBuilder builder = new SignedJarBuilder(
33+
new FileOutputStream(outputJar, false), mPrivateKey, mCertificate);
34+
builder.writeZip(new FileInputStream(jarToSign), null);
35+
builder.close();
36+
}
37+
}

0 commit comments

Comments
 (0)