From 1aff9c849dab0a202a10ee21bbbf19504d0bf456 Mon Sep 17 00:00:00 2001 From: srowen Date: Thu, 26 Jun 2008 15:35:39 +0000 Subject: [PATCH] Implemented Paul's solution to the basic/regular build problem -- a sort of pseudo-reflection approach that works in J2ME. Now we have only a build target, not separate products for the basic version. git-svn-id: http://zxing.googlecode.com/svn/trunk@481 59b500cc-1b3d-0410-9834-0bbf25fbcc57 --- AUTHORS | 1 + build.xml | 1 - javame/build.xml | 67 +++--------------- .../j2me/AdvancedMultimediaManager.java | 23 ++----- .../client/j2me/DefaultMultimediaManager.java | 69 +++++++++++++++++++ .../zxing/client/j2me/MultimediaManager.java} | 31 +++------ .../zxing/client/j2me/SnapshotThread.java | 4 +- .../google/zxing/client/j2me/ZXingMIDlet.java | 5 +- 8 files changed, 104 insertions(+), 97 deletions(-) create mode 100644 javame/src/com/google/zxing/client/j2me/DefaultMultimediaManager.java rename javame/{src-basic/com/google/zxing/client/j2me/AdvancedMultimediaManager.java => src/com/google/zxing/client/j2me/MultimediaManager.java} (53%) diff --git a/AUTHORS b/AUTHORS index 040e6fd4..93a7370b 100644 --- a/AUTHORS +++ b/AUTHORS @@ -9,5 +9,6 @@ Daniel Switkin (Google) David Albert (Bug Labs) John Connolly (Bug Labs) Matthew Schulkind (Google) +Paul Hackenberger Sean Owen (Google) Vince Francis \ No newline at end of file diff --git a/build.xml b/build.xml index 6d985017..79daf24e 100644 --- a/build.xml +++ b/build.xml @@ -26,7 +26,6 @@ - diff --git a/javame/build.xml b/javame/build.xml index 78b7d47a..7eeda6d4 100644 --- a/javame/build.xml +++ b/javame/build.xml @@ -65,7 +65,7 @@ - + - - - - - - - - - - - - - - - @@ -128,24 +96,27 @@ - + - + - + - + + + + @@ -154,34 +125,18 @@ - + - + - + - - Builds the main reader .jar file - - - - - - - - Builds the basic reader .jar file - - - - - - diff --git a/javame/src/com/google/zxing/client/j2me/AdvancedMultimediaManager.java b/javame/src/com/google/zxing/client/j2me/AdvancedMultimediaManager.java index c8adc97d..36573728 100644 --- a/javame/src/com/google/zxing/client/j2me/AdvancedMultimediaManager.java +++ b/javame/src/com/google/zxing/client/j2me/AdvancedMultimediaManager.java @@ -23,29 +23,20 @@ import javax.microedition.media.Controllable; import javax.microedition.media.MediaException; /** - *

This odd class encapsulates all access to functionality exposed by JSR-234, - * which provides access to things like focus and zoom. Not all phones support this though. - * Normally we might handle loading of code like this via reflection but this is - * not available to us in Java ME. So, we create two implementations of the same class -- - * this one, and another found under source root "src-basic". This one actually calls - * JSR-234 methods. The other does nothing. The build script creates two build products then - * one compiled with this class and one with other, to create both the JSR-234 version - * and the "basic" non-JSR-234 version.

+ *

See {@link DefaultMultimediaManager} documentation for details.

+ * + *

This class should never be directly imported or reference in the code.

* * @author Sean Owen (srowen@google.com) */ -final class AdvancedMultimediaManager { +final class AdvancedMultimediaManager implements MultimediaManager { private static final int NO_ZOOM = 100; private static final int MAX_ZOOM = 200; private static final long FOCUS_TIME_MS = 750L; private static final String DESIRED_METERING = "center-weighted"; - private AdvancedMultimediaManager() { - // do nothing - } - - static void setFocus(Controllable player) { + public void setFocus(Controllable player) { FocusControl focusControl = (FocusControl) player.getControl("javax.microedition.amms.control.camera.FocusControl"); if (focusControl != null) { @@ -68,7 +59,7 @@ final class AdvancedMultimediaManager { } } - static void setZoom(Controllable player) { + public void setZoom(Controllable player) { ZoomControl zoomControl = (ZoomControl) player.getControl("javax.microedition.amms.control.camera.ZoomControl"); if (zoomControl != null) { // We zoom in if possible to encourage the viewer to take a snapshot from a greater distance. @@ -86,7 +77,7 @@ final class AdvancedMultimediaManager { } } - static void setExposure(Controllable player) { + public void setExposure(Controllable player) { ExposureControl exposureControl = (ExposureControl) player.getControl("javax.microedition.amms.control.camera.ExposureControl"); if (exposureControl != null) { diff --git a/javame/src/com/google/zxing/client/j2me/DefaultMultimediaManager.java b/javame/src/com/google/zxing/client/j2me/DefaultMultimediaManager.java new file mode 100644 index 00000000..c73abccd --- /dev/null +++ b/javame/src/com/google/zxing/client/j2me/DefaultMultimediaManager.java @@ -0,0 +1,69 @@ +/* + * Copyright 2007 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.j2me; + +import javax.microedition.media.Controllable; + +/** + *

This class encapsulates optional multimedia-related operations that the device + * may support, like setting focus and zoom. This implementation itself will do nothing. + * It will attempt to dynamically instantiate {@link com.google.zxing.client.j2me.AdvancedMultimediaManager} + * which has methods that call JSR-234 APIs to actually set focus, zoom, etc. If successful, + * this class will delegate to that implementation. But if the phone does not support these + * APIs, instantiation will simply fail and this implementation will do nothing.

+ * + *

Credit to Paul Hackenberger for the nice workaround

+ * + * @author Sean Owen (srowen@google.com) + * @author Paul Hackenberger + */ +class DefaultMultimediaManager implements MultimediaManager { + + private MultimediaManager advancedMultimediaManager; + + DefaultMultimediaManager() { + try { + advancedMultimediaManager = (MultimediaManager) + Class.forName("com.google.zxing.client.j2me.AdvancedMultimediaManager").newInstance(); + } catch (ClassNotFoundException cnfe) { + // continue + } catch (IllegalAccessException iae) { + // continue + } catch (InstantiationException ie) { + // continue + } + } + + public void setFocus(Controllable player) { + if (advancedMultimediaManager != null) { + advancedMultimediaManager.setFocus(player); + } + } + + public void setZoom(Controllable player) { + if (advancedMultimediaManager != null) { + advancedMultimediaManager.setZoom(player); + } + } + + public void setExposure(Controllable player) { + if (advancedMultimediaManager != null) { + advancedMultimediaManager.setExposure(player); + } + } + +} \ No newline at end of file diff --git a/javame/src-basic/com/google/zxing/client/j2me/AdvancedMultimediaManager.java b/javame/src/com/google/zxing/client/j2me/MultimediaManager.java similarity index 53% rename from javame/src-basic/com/google/zxing/client/j2me/AdvancedMultimediaManager.java rename to javame/src/com/google/zxing/client/j2me/MultimediaManager.java index 7394c261..6643608b 100644 --- a/javame/src-basic/com/google/zxing/client/j2me/AdvancedMultimediaManager.java +++ b/javame/src/com/google/zxing/client/j2me/MultimediaManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2007 ZXing authors + * Copyright 2008 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,30 +19,19 @@ package com.google.zxing.client.j2me; import javax.microedition.media.Controllable; /** - *

See this exact same class under the "src" source root for a full explanation. - * This is a "no-op" version of the class that gets built into the .jar file - * which is suitable for non-JSR-234 devices.

- * + *

Implemented by {@link com.google.zxing.client.j2me.DefaultMultimediaManager} and + * {@link com.google.zxing.client.j2me.AdvancedMultimediaManager} in order to dynamically + * load support for JSR-234 APIs where possible.

+ * * @author Sean Owen (srowen@google.com) + * @author Paul Hackenberger */ -final class AdvancedMultimediaManager { - - private AdvancedMultimediaManager() { - // do nothing - } - - // These signatures must match those in the other class exactly +interface MultimediaManager { - static void setFocus(Controllable player) { - // do nothing - } + void setFocus(Controllable player); - static void setZoom(Controllable player) { - // do nothing - } + void setZoom(Controllable player); - static void setExposure(Controllable player) { - // do nothing - } + void setExposure(Controllable player); } \ No newline at end of file diff --git a/javame/src/com/google/zxing/client/j2me/SnapshotThread.java b/javame/src/com/google/zxing/client/j2me/SnapshotThread.java index 99322dce..b6c3e398 100644 --- a/javame/src/com/google/zxing/client/j2me/SnapshotThread.java +++ b/javame/src/com/google/zxing/client/j2me/SnapshotThread.java @@ -37,11 +37,13 @@ final class SnapshotThread implements Runnable { private final ZXingMIDlet zXingMIDlet; private final Object waitLock; private boolean done; + private final MultimediaManager multimediaManager; SnapshotThread(ZXingMIDlet zXingMIDlet) { this.zXingMIDlet = zXingMIDlet; waitLock = new Object(); done = false; + multimediaManager = new DefaultMultimediaManager(); } void continueRun() { @@ -70,7 +72,7 @@ final class SnapshotThread implements Runnable { do { waitForSignal(); try { - AdvancedMultimediaManager.setFocus(player); + multimediaManager.setFocus(player); byte[] snapshot = takeSnapshot(); Image capturedImage = Image.createImage(snapshot, 0, snapshot.length); MonochromeBitmapSource source = new LCDUIImageMonochromeBitmapSource(capturedImage); diff --git a/javame/src/com/google/zxing/client/j2me/ZXingMIDlet.java b/javame/src/com/google/zxing/client/j2me/ZXingMIDlet.java index 9f633d46..99418140 100644 --- a/javame/src/com/google/zxing/client/j2me/ZXingMIDlet.java +++ b/javame/src/com/google/zxing/client/j2me/ZXingMIDlet.java @@ -72,8 +72,9 @@ public final class ZXingMIDlet extends MIDlet { try { player = createPlayer(); player.realize(); - AdvancedMultimediaManager.setZoom(player); - AdvancedMultimediaManager.setExposure(player); + MultimediaManager multimediaManager = new DefaultMultimediaManager(); + multimediaManager.setZoom(player); + multimediaManager.setExposure(player); videoControl = (VideoControl) player.getControl("VideoControl"); canvas = new VideoCanvas(this); canvas.setFullScreenMode(true); -- 2.20.1