Skip to content

Commit befa46f

Browse files
committed
properly reset manifest and ignore watch devices
1 parent b597e54 commit befa46f

File tree

3 files changed

+96
-41
lines changed

3 files changed

+96
-41
lines changed

src/processing/mode/android/AndroidBuild.java

Lines changed: 57 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ public File build(String target) throws IOException, SketchException {
130130
}
131131
}
132132

133-
File folder = createHandheldProject(wearFolder);
133+
File folder = createHandheldProject(wearFolder, null);
134134
if (folder != null) {
135135
if (!antBuild()) {
136136
return null;
@@ -357,7 +357,7 @@ public File createProject(boolean wear) throws IOException, SketchException {
357357
// This creates the special activity project only needed to serve as the
358358
// (invisible) app on the handheld that allows to uninstall the watchface
359359
// from the watch.
360-
public File createHandheldProject(File wearFolder)
360+
public File createHandheldProject(File wearFolder, File wearPackage)
361361
throws IOException, SketchException {
362362
// According to these instructions:
363363
// https://developer.android.com/training/wearables/apps/packaging.html#PackageManually
@@ -418,9 +418,22 @@ public File createHandheldProject(File wearFolder)
418418
writeIconFiles(sketchFolder, resFolder);
419419

420420
// Copy the wearable apk
421-
String apkName = sketch.getName().toLowerCase() + "_debug";
421+
String apkName = "";
422+
if (wearPackage == null) {
423+
String suffix = target.equals("release") ? "release_unsigned" : "debug";
424+
apkName = sketch.getName().toLowerCase() + "_" + suffix;
425+
} else {
426+
String name = wearPackage.getName();
427+
int dot = name.lastIndexOf('.');
428+
if (dot == -1) {
429+
apkName = name;
430+
} else {
431+
apkName = name.substring(0, dot);
432+
}
433+
}
434+
422435
File rawFolder = mkdirs(resFolder, "raw");
423-
File wearApk = new File(wearFolder, "bin/" + apkName + ".apk"); // TODO TODO should be an argument, to support the release situation.
436+
File wearApk = new File(wearFolder, "bin/" + apkName + ".apk");
424437
Util.copyFile(wearApk, new File(rawFolder, apkName + ".apk"));
425438

426439
// Create dummy layout/activity_handheld.xml
@@ -597,12 +610,16 @@ public int getAppComponent() {
597610
return appComponent;
598611
}
599612

600-
public void setAppComponent(int opt) {
601-
if (appComponent != opt) {
602-
appComponent = opt;
603-
resetManifest = true;
604-
}
605-
}
613+
// public void setAppComponent(int opt) {
614+
// if (appComponent != opt) {
615+
// appComponent = opt;
616+
// resetManifest = true;
617+
// }
618+
// }
619+
620+
public void resetManifest() {
621+
resetManifest = true;
622+
}
606623

607624
protected boolean usesGPU() {
608625
return renderer != null && (renderer.equals("P2D") || renderer.equals("P3D"));
@@ -662,20 +679,14 @@ public File exportProject() throws IOException, SketchException {
662679
// this will set debuggable to true in the .xml file
663680
target = "debug";
664681

665-
if (appComponent == WATCHFACE && !runOnEmulator) {
682+
if (appComponent == WATCHFACE) {
666683
// We are building a watchface not to run on the emulator. We need the
667684
// handheld app:
668-
// https://developer.android.com/training/wearables/apps/creating.html
669-
// so the watchface can be uninstalled from the phone, and can be
670-
// published on Google Play.
671685
File wearFolder = createProject(true);
672-
if (wearFolder != null) {
673-
if (!antBuild()) {
674-
return null;
675-
}
676-
}
686+
if (wearFolder == null) return null;
687+
if (!antBuild()) return null;
677688

678-
File projectFolder = createHandheldProject(wearFolder);
689+
File projectFolder = createHandheldProject(wearFolder, null);
679690
if (projectFolder != null) {
680691
File exportFolder = createExportFolder();
681692
Util.copyDir(projectFolder, exportFolder);
@@ -694,16 +705,35 @@ public File exportProject() throws IOException, SketchException {
694705
}
695706

696707
public File exportPackage(String keyStorePassword) throws Exception {
697-
// TODO TODO
698-
File projectFolder = build("release");
699-
if (projectFolder == null) return null;
700-
701-
File signedPackage = signPackage(projectFolder, keyStorePassword);
702-
if (signedPackage == null) return null;
708+
File projectFolder = null;
709+
if (appComponent == WATCHFACE) {
710+
this.target = "release";
711+
// We need to sign and align the wearable and handheld apps:
712+
File wearFolder = createProject(true);
713+
if (wearFolder == null) return null;
714+
if (!antBuild()) return null;
715+
File signedWearPackage = signPackage(wearFolder, keyStorePassword);
716+
if (signedWearPackage == null) return null;
717+
718+
// Handheld package
719+
projectFolder = createHandheldProject(wearFolder, signedWearPackage);
720+
if (projectFolder == null) return null;
721+
if (!antBuild()) return null;
722+
723+
File signedPackage = signPackage(projectFolder, keyStorePassword);
724+
if (signedPackage == null) return null;
725+
} else {
726+
projectFolder = build("release");
727+
if (projectFolder == null) return null;
703728

729+
File signedPackage = signPackage(projectFolder, keyStorePassword);
730+
if (signedPackage == null) return null;
731+
}
732+
733+
// Final export folder
704734
File exportFolder = createExportFolder();
705735
Util.copyDir(projectFolder, exportFolder);
706-
return new File(exportFolder, "/bin/");
736+
return new File(exportFolder, "/bin/");
707737
}
708738

709739
private File signPackage(File projectFolder, String keyStorePassword) throws Exception {

src/processing/mode/android/AndroidEditor.java

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
@SuppressWarnings("serial")
5151
public class AndroidEditor extends JavaEditor {
5252
private int appComponent = AndroidBuild.FRAGMENT;
53+
private boolean resetManifest = false;
5354

5455
private AndroidMode androidMode;
5556

@@ -75,6 +76,18 @@ class UpdateDeviceListTask extends TimerTask {
7576
public UpdateDeviceListTask(JMenu deviceMenu) {
7677
this.deviceMenu = deviceMenu;
7778
}
79+
80+
private Device selectFirstNonWatchDevice(java.util.List<Device> deviceList) {
81+
for (Device device : deviceList) {
82+
if (device.hasFeature("watch")) {
83+
// Don't include the watch devices to the list, they get their watch
84+
// faces through the handheld they are paired with.
85+
continue;
86+
}
87+
return device;
88+
}
89+
return null;
90+
}
7891

7992
@Override
8093
public void run() {
@@ -101,8 +114,8 @@ public void run() {
101114
deviceMenu.removeAll();
102115

103116
if (selectedDevice == null) {
104-
selectedDevice = deviceList.get(0);
105-
devices.setSelectedDevice(selectedDevice);
117+
selectedDevice = selectFirstNonWatchDevice(deviceList);
118+
devices.setSelectedDevice(selectedDevice);
106119
} else {
107120
// check if selected device is still connected
108121
boolean found = false;
@@ -114,8 +127,8 @@ public void run() {
114127
}
115128

116129
if (!found) {
117-
selectedDevice = deviceList.get(0);
118-
devices.setSelectedDevice(selectedDevice);
130+
selectedDevice = selectFirstNonWatchDevice(deviceList);
131+
devices.setSelectedDevice(selectedDevice);
119132
}
120133
}
121134

@@ -235,7 +248,7 @@ public void actionPerformed(ActionEvent e) {
235248
fragmentItem.addActionListener(new ActionListener() {
236249
@Override
237250
public void actionPerformed(ActionEvent e) {
238-
appComponent = AndroidBuild.FRAGMENT;
251+
setAppComponent(AndroidBuild.FRAGMENT);
239252
fragmentItem.setState(true);
240253
wallpaperItem.setState(false);
241254
watchfaceItem.setSelected(false);
@@ -246,7 +259,7 @@ public void actionPerformed(ActionEvent e) {
246259
wallpaperItem.addActionListener(new ActionListener() {
247260
@Override
248261
public void actionPerformed(ActionEvent e) {
249-
appComponent = AndroidBuild.WALLPAPER;
262+
setAppComponent(AndroidBuild.WALLPAPER);
250263
fragmentItem.setState(false);
251264
wallpaperItem.setState(true);
252265
watchfaceItem.setSelected(false);
@@ -257,7 +270,7 @@ public void actionPerformed(ActionEvent e) {
257270
watchfaceItem.addActionListener(new ActionListener() {
258271
@Override
259272
public void actionPerformed(ActionEvent e) {
260-
appComponent = AndroidBuild.WATCHFACE;
273+
setAppComponent(AndroidBuild.WATCHFACE);
261274
fragmentItem.setState(false);
262275
wallpaperItem.setState(false);
263276
watchfaceItem.setSelected(true);
@@ -268,7 +281,7 @@ public void actionPerformed(ActionEvent e) {
268281
cardboardItem.addActionListener(new ActionListener() {
269282
@Override
270283
public void actionPerformed(ActionEvent e) {
271-
appComponent = AndroidBuild.CARDBOARD;
284+
setAppComponent(AndroidBuild.CARDBOARD);
272285
fragmentItem.setState(false);
273286
wallpaperItem.setState(false);
274287
watchfaceItem.setSelected(false);
@@ -438,6 +451,13 @@ public void actionPerformed(ActionEvent e) {
438451
}
439452
*/
440453

454+
private void setAppComponent(int opt) {
455+
if (appComponent != opt) {
456+
appComponent = opt;
457+
resetManifest = true;
458+
}
459+
}
460+
441461
/**
442462
* Uses the main help menu, and adds a few extra options. If/when there's
443463
* Android-specific documentation, we'll switch to that.
@@ -579,7 +599,9 @@ public void run() {
579599
startIndeterminate();
580600
prepareRun();
581601
try {
582-
androidMode.handleRunEmulator(sketch, AndroidEditor.this, AndroidEditor.this);
602+
androidMode.handleRunEmulator(sketch, AndroidEditor.this, AndroidEditor.this,
603+
resetManifest);
604+
resetManifest = false;
583605
} catch (SketchException e) {
584606
statusError(e);
585607
} catch (IOException e) {
@@ -621,7 +643,9 @@ public void run() {
621643
startIndeterminate();
622644
prepareRun();
623645
try {
624-
androidMode.handleRunDevice(sketch, AndroidEditor.this, AndroidEditor.this);
646+
androidMode.handleRunDevice(sketch, AndroidEditor.this, AndroidEditor.this,
647+
resetManifest);
648+
resetManifest = false;
625649
} catch (SketchException e) {
626650
statusError(e);
627651
} catch (IOException e) {

src/processing/mode/android/AndroidMode.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -257,15 +257,15 @@ static public String getDateStamp(long stamp) {
257257
// }
258258
// }
259259
public void handleRunEmulator(Sketch sketch, AndroidEditor editor,
260-
RunnerListener listener) throws SketchException, IOException {
260+
RunnerListener listener, boolean resetManifest) throws SketchException, IOException {
261261
listener.startIndeterminate();
262262
listener.statusNotice("Starting build...");
263263
AndroidBuild build = new AndroidBuild(sketch, this,
264264
editor.getAppComponent(), true);
265+
if (resetManifest) build.resetManifest();
265266

266267
listener.statusNotice("Building Android project...");
267268
build.build("debug");
268-
269269

270270
boolean avd = AVD.ensureProperAVD(editor, this, sdk, build.isWear());
271271
if (!avd) {
@@ -283,7 +283,7 @@ public void handleRunEmulator(Sketch sketch, AndroidEditor editor,
283283

284284

285285
public void handleRunDevice(Sketch sketch, AndroidEditor editor,
286-
RunnerListener listener)
286+
RunnerListener listener, boolean resetManifest)
287287
throws SketchException, IOException {
288288

289289
final Devices devices = Devices.getInstance();
@@ -302,6 +302,7 @@ public void handleRunDevice(Sketch sketch, AndroidEditor editor,
302302
listener.statusNotice("Starting build...");
303303
AndroidBuild build = new AndroidBuild(sketch, this,
304304
editor.getAppComponent(), false);
305+
if (resetManifest) build.resetManifest();
305306

306307
listener.statusNotice("Building Android project...");
307308
build.build("debug");
@@ -317,7 +318,7 @@ public void showSelectComponentMessage(int appComp) {
317318
if (showBluetoothDebugMessage && appComp == AndroidBuild.WATCHFACE) {
318319
Messages.showMessage("Is Debugging over Bluetooth enabled?",
319320
"Processing will access the wearable through the handheld paired to it.\n" +
320-
"Your watch won't show up the device list, select the paired handheld.\n" +
321+
"Your watch won't show up in the device list, select the paired handheld.\n" +
321322
"Make sure to enable \"Debugging over Bluetooth\" for this to work:\n" +
322323
"http://developer.android.com/training/wearables/apps/bt-debugging.html");
323324
showBluetoothDebugMessage = false;

0 commit comments

Comments
 (0)