diff options
-rw-r--r-- | make/build.xml | 64 | ||||
-rw-r--r-- | src/java/com/jogamp/common/os/AndroidVersion.java | 45 | ||||
-rw-r--r-- | src/java/com/jogamp/common/util/IOUtil.java | 23 | ||||
-rw-r--r-- | src/java/com/jogamp/common/util/JogampVersion.java | 18 | ||||
-rw-r--r-- | src/java/jogamp/common/os/AndroidUtils.java | 94 | ||||
-rw-r--r-- | src/java/jogamp/common/os/android/AndroidUtilsImpl.java (renamed from src/java/jogamp/common/os/android/PackageInfoUtil.java) | 38 | ||||
-rw-r--r-- | src/java/jogamp/common/os/android/StaticContext.java | 12 |
7 files changed, 231 insertions, 63 deletions
diff --git a/make/build.xml b/make/build.xml index 61e7c86..ded1154 100644 --- a/make/build.xml +++ b/make/build.xml @@ -26,14 +26,31 @@ <property name="gluegen.excludes.nsig" value="com/jogamp/gluegen/runtime/BufferFactoryInternal.java com/jogamp/gluegen/nativesig/**" /> </target> - <target name="set.debug"> - <property name="c.compiler.debug" value="true" /> - <property name="javacdebug" value="true" /> - <property name="javacdebuglevel" value="source,lines,vars" /> + <target name="init.base" depends="jogamp.env.init,gluegen.properties.load.user,gluegen.cpptasks.detect.os,setup.excludes.nsig"/> + + <target name="init.std" unless="isAndroid" > + <!-- Create the classpath for compiling GlueGen. + This requires the user-defined "antlr.jar" property. --> + <path id="gluegencompile.classpath"> + <pathelement location="${antlr.jar}" /> + </path> + </target> + + <target name="init.android" if="isAndroid" > + <!-- Create the classpath for compiling Android only stuff. --> + <path id="android.classpath"> + <pathelement location="${android-min.jar}"/> + </path> + + <!-- Create the classpath for compiling GlueGen. + This requires the user-defined "antlr.jar" property. --> + <path id="gluegencompile.classpath"> + <pathelement location="${antlr.jar}" /> + <pathelement location="${android-min.jar}"/> + </path> </target> - <target name="init.debug" depends="set.debug, init"/> - <target name="init" depends="jogamp.env.init,gluegen.properties.load.user,gluegen.cpptasks.detect.os,setup.excludes.nsig"> + <target name="init" depends="init.base,init.std,init.android"> <!-- Declare all paths and user defined variables. --> <!-- property name="javadoc.link" value="http://java.sun.com/j2se/1.4.2/docs/api/" /--> @@ -103,18 +120,6 @@ <pathelement location="${antlr.jar}" /> </path> - <!-- Create the classpath for compiling Android only stuff. --> - <path id="android.classpath"> - <pathelement location="${android-min.jar}"/> - </path> - - <!-- Create the classpath for compiling GlueGen. - This requires the user-defined "antlr.jar" property. --> - <path id="gluegencompile.classpath"> - <pathelement location="${antlr.jar}" /> - <pathelement location="${android-min.jar}"/> - </path> - <!-- Create the classpath for using GlueGen. --> <path id="gluegen.classpath" > <pathelement location="${classes}" /> @@ -137,12 +142,30 @@ <property name="archive.name" value="gluegen-${gluegen.version}-${os.and.arch}" /> <property name="archive" value="${build}/${archive.name}" /> + <!-- the launcher is compiled and packaged explicit - if android --> <property name="jogamp.android-launcher.classes" value="jogamp/android/launcher/**"/> + + <!-- optional android classes - if android --> + <property name="java.part.android" value="jogamp/common/os/android/**"/> + <property name="jogamp.awt.classes" value="jogamp/common/awt/**"/> - <property name="gluegen.excludes.all" value="${gluegen.excludes.nsig} ${jogamp.android-launcher.classes}" /> <property name="gluegen-rt.classes" value="com/jogamp/gluegen/runtime/**"/> <property name="jogamp.common.classes" value="com/jogamp/common/** jogamp/common/**"/> + + <condition property="java.excludes.android" value="${java.part.android}"> + <not> <isset property="isAndroid"/> </not> + </condition> + + <property name="gluegen.excludes.all" value="${gluegen.excludes.nsig} ${jogamp.android-launcher.classes} ${java.excludes.android}" /> + + </target> + + <target name="set.debug"> + <property name="c.compiler.debug" value="true" /> + <property name="javacdebug" value="true" /> + <property name="javacdebuglevel" value="source,lines,vars" /> </target> + <target name="init.debug" depends="set.debug, init"/> <!-- - Using ANTLR generate the specified Java files. @@ -694,8 +717,8 @@ <jar destfile="${build}/gluegen.jar" manifest="${build}/Manifest.temp"> <fileset dir="${classes}"> <include name="**/*.class" /> - <exclude name="jogamp/common/os/android/**" /> <exclude name="${jogamp.android-launcher.classes}" /> + <exclude name="${java.part.android}" /> </fileset> <fileset dir="resources/assets"> <include name="**" /> @@ -720,6 +743,7 @@ <include name="com/jogamp/common/**" /> <include name="jogamp/common/**" /> <exclude name="${jogamp.android-launcher.classes}" /> + <exclude name="${java.excludes.android}" /> </fileset> <fileset dir="resources/assets"> <include name="**" /> diff --git a/src/java/com/jogamp/common/os/AndroidVersion.java b/src/java/com/jogamp/common/os/AndroidVersion.java index 8886273..cb6c3e5 100644 --- a/src/java/com/jogamp/common/os/AndroidVersion.java +++ b/src/java/com/jogamp/common/os/AndroidVersion.java @@ -1,3 +1,30 @@ +/** + * Copyright 2011 JogAmp Community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of JogAmp Community. + */ package com.jogamp.common.os; import java.lang.reflect.Field; @@ -9,9 +36,6 @@ import com.jogamp.common.util.ReflectionUtil; public class AndroidVersion { public static final boolean isAvailable; - /** All SDK version map, where SDK_INT is the key to the current running version */ - public static final Map<Integer, String> VERSION_CODES; - /** Development codename, or the string "REL" for official release */ public static final String CODENAME; @@ -27,8 +51,8 @@ public class AndroidVersion { /** SDK Version string */ public static final String SDK_NAME; - static final String androidBuildVersion = "android.os.Build$VERSION"; - static final String androidBuildVersionCodes = "android.os.Build$VERSION_CODES"; + private static final String androidBuildVersion = "android.os.Build$VERSION"; + private static final String androidBuildVersionCodes = "android.os.Build$VERSION_CODES"; static { final ClassLoader cl = AndroidVersion.class.getClassLoader(); @@ -41,22 +65,21 @@ public class AndroidVersion { abvObject = abvClass.newInstance(); abvcClass = ReflectionUtil.getClass(androidBuildVersionCodes, true, cl); abvcObject = abvcClass.newInstance(); - } catch (Exception e) { /* n/a */ } - isAvailable = null != abvObject ; + } catch (Exception e) { /* n/a */ } + isAvailable = null != abvObject; if(isAvailable) { CODENAME = getString(abvClass, abvObject, "CODENAME"); INCREMENTAL = getString(abvClass, abvObject, "INCREMENTAL"); RELEASE = getString(abvClass, abvObject, "RELEASE"); SDK_INT = getInt(abvClass, abvObject, "SDK_INT"); - VERSION_CODES = getVersionCodes(abvcClass, abvcObject); - String sdk_name = VERSION_CODES.get(new Integer(SDK_INT)); - SDK_NAME = ( null != sdk_name ) ? sdk_name : "SDK_"+SDK_INT ; + final Map<Integer, String> version_codes = getVersionCodes(abvcClass, abvcObject); + String sdk_name = version_codes.get(new Integer(SDK_INT)); + SDK_NAME = ( null != sdk_name ) ? sdk_name : "SDK_"+SDK_INT ; } else { CODENAME = null; INCREMENTAL = null; RELEASE = null; SDK_INT = -1; - VERSION_CODES = new HashMap<Integer, String>(); SDK_NAME = null; } } diff --git a/src/java/com/jogamp/common/util/IOUtil.java b/src/java/com/jogamp/common/util/IOUtil.java index 5f26c53..ed74fa2 100644 --- a/src/java/com/jogamp/common/util/IOUtil.java +++ b/src/java/com/jogamp/common/util/IOUtil.java @@ -44,13 +44,10 @@ import java.net.URLConnection; import java.nio.ByteBuffer; import jogamp.common.Debug; -import jogamp.common.os.android.StaticContext; - -import android.content.Context; +import jogamp.common.os.AndroidUtils; import com.jogamp.common.net.AssetURLContext; import com.jogamp.common.nio.Buffers; -import com.jogamp.common.os.AndroidVersion; import com.jogamp.common.os.MachineDescription; import com.jogamp.common.os.Platform; @@ -632,7 +629,7 @@ public class IOUtil { * On Android a <code>temp</code> folder relative to the applications local folder * (see {@link Context#getDir(String, int)}) is returned, if * the Android application/activity has registered it's Application Context - * via {@link StaticContext#init(Context, ClassLoader)}. + * via {@link jogamp.common.os.android.StaticContext.StaticContext#init(Context, ClassLoader) StaticContext.init(..)}. * This allows using the temp folder w/o the need for <code>sdcard</code> * access, which would be the <code>java.io.tempdir</code> location on Android! * </p> @@ -642,22 +639,14 @@ public class IOUtil { * @throws RuntimeException is the property <code>java.io.tmpdir</code> or the resulting temp directory is invalid * * @see PropertyAccess#getProperty(String, boolean, java.security.AccessControlContext) - * @see StaticContext#init(Context, ClassLoader) * @see Context#getDir(String, int) */ public static File getTempRoot(AccessControlContext acc) throws SecurityException, RuntimeException { - if(AndroidVersion.isAvailable) { - final Context ctx = StaticContext.getContext(); - if(null != ctx) { - final File tmpRoot = ctx.getDir("temp", Context.MODE_WORLD_READABLE); - if(null==tmpRoot|| !tmpRoot.isDirectory() || !tmpRoot.canWrite()) { - throw new RuntimeException("Not a writable directory: '"+tmpRoot+"', retrieved Android static context"); - } - if(DEBUG) { - System.err.println("IOUtil.getTempRoot(Android): temp dir: "+tmpRoot.getAbsolutePath()); - } + { + final File tmpRoot = AndroidUtils.getTempRoot(acc); // null if ( !Android || no android-ctx ) + if(null != tmpRoot) { return tmpRoot; } } @@ -670,7 +659,7 @@ public class IOUtil { throw new RuntimeException("Not a writable directory: '"+tmpRoot+"', retrieved by propery '"+java_io_tmpdir_propkey+"'"); } if(DEBUG) { - System.err.println("IOUtil.getTempRoot(isAndroid: "+AndroidVersion.isAvailable+"): temp dir: "+tmpRoot.getAbsolutePath()); + System.err.println("IOUtil.getTempRoot(): temp dir: "+tmpRoot.getAbsolutePath()); } return tmpRoot; } diff --git a/src/java/com/jogamp/common/util/JogampVersion.java b/src/java/com/jogamp/common/util/JogampVersion.java index 2461c3e..de65f90 100644 --- a/src/java/com/jogamp/common/util/JogampVersion.java +++ b/src/java/com/jogamp/common/util/JogampVersion.java @@ -29,7 +29,6 @@ package com.jogamp.common.util; import com.jogamp.common.GlueGenVersion; -import com.jogamp.common.os.AndroidVersion; import com.jogamp.common.os.Platform; import java.util.Iterator; @@ -37,7 +36,7 @@ import java.util.Set; import java.util.jar.Attributes; import java.util.jar.Manifest; -import jogamp.common.os.android.PackageInfoUtil; +import jogamp.common.os.AndroidUtils; public class JogampVersion { @@ -48,7 +47,7 @@ public class JogampVersion { private Manifest mf; private int hash; private Attributes mainAttributes; - private Set/*<Attributes.Name>*/ mainAttributeNames; + private Set<?>/*<Attributes.Name>*/ mainAttributeNames; private final String androidPackageVersionName; @@ -58,11 +57,7 @@ public class JogampVersion { this.hash = this.mf.hashCode(); mainAttributes = this.mf.getMainAttributes(); mainAttributeNames = mainAttributes.keySet(); - if(AndroidVersion.isAvailable) { - androidPackageVersionName = PackageInfoUtil.getPackageInfoVersionName(packageName); - } else { - androidPackageVersionName = null; - } + androidPackageVersionName = AndroidUtils.getPackageInfoVersionName(packageName); // null if !Android } @Override @@ -95,7 +90,7 @@ public class JogampVersion { } public final Attributes.Name getAttributeName(String attributeName) { - for (Iterator iter = mainAttributeNames.iterator(); iter.hasNext();) { + for (Iterator<?> iter = mainAttributeNames.iterator(); iter.hasNext();) { Attributes.Name an = (Attributes.Name) iter.next(); if (an.toString().equals(attributeName)) { return an; @@ -104,7 +99,10 @@ public class JogampVersion { return null; } - public final Set getAttributeNames() { + /** + * @return set of type {@link Attributes.Name}, disguised as anonymous + */ + public final Set<?>/*<Attributes.Name>*/ getAttributeNames() { return mainAttributeNames; } diff --git a/src/java/jogamp/common/os/AndroidUtils.java b/src/java/jogamp/common/os/AndroidUtils.java new file mode 100644 index 0000000..743a736 --- /dev/null +++ b/src/java/jogamp/common/os/AndroidUtils.java @@ -0,0 +1,94 @@ +/** + * Copyright 2012 JogAmp Community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of JogAmp Community. + */ +package jogamp.common.os; + +import java.io.File; +import java.lang.reflect.Method; +import java.security.AccessControlContext; + +import com.jogamp.common.os.AndroidVersion; +import com.jogamp.common.util.ReflectionUtil; + +public class AndroidUtils { + + private static final Method androidGetPackageInfoVersionNameMethod; + private static final Method androidGetPackageInfoVersionCodeMethod; + private static final Method androidGetTempRootMethod; + + static { + if(AndroidVersion.isAvailable) { + final ClassLoader cl = AndroidUtils.class.getClassLoader(); + final Class<?> androidAndroidUtilsImplClz = ReflectionUtil.getClass("jogamp.common.os.android.AndroidUtilsImpl", true, cl); + androidGetPackageInfoVersionCodeMethod = ReflectionUtil.getMethod(androidAndroidUtilsImplClz, "getPackageInfoVersionCode", String.class); + androidGetPackageInfoVersionNameMethod = ReflectionUtil.getMethod(androidAndroidUtilsImplClz, "getPackageInfoVersionName", String.class); + androidGetTempRootMethod = ReflectionUtil.getMethod(androidAndroidUtilsImplClz, "getTempRoot", AccessControlContext.class); + } else { + androidGetPackageInfoVersionCodeMethod = null; + androidGetPackageInfoVersionNameMethod = null; + androidGetTempRootMethod = null; + } + } + + /** + * @return null if platform is not Android or no Android Context is registered + * via {@link jogamp.common.os.android.StaticContext#init(android.content.Context) StaticContext.init(..)}, + * otherwise the found package version code of <code>packageName</code> is returned. + */ + public static final int getPackageInfoVersionCode(String packageName) { + if(null != androidGetPackageInfoVersionCodeMethod) { + return ((Integer) ReflectionUtil.callMethod(null, androidGetPackageInfoVersionCodeMethod, packageName)).intValue(); + } + return -1; + } + + /** + * @return null if platform is not Android or no Android Context is registered + * via {@link jogamp.common.os.android.StaticContext#init(android.content.Context) StaticContext.init(..)}, + * otherwise the found package version name of <code>packageName</code> is returned. + */ + public static final String getPackageInfoVersionName(String packageName) { + if(null != androidGetPackageInfoVersionNameMethod) { + return (String) ReflectionUtil.callMethod(null, androidGetPackageInfoVersionNameMethod, packageName); + } + return null; + } + + /** + * @return null if platform is not Android or no Android Context is registered + * via {@link jogamp.common.os.android.StaticContext#init(android.content.Context) StaticContext.init(..)}, + * otherwise the context relative world readable <code>temp</code> directory returned. + */ + public static File getTempRoot(AccessControlContext acc) + throws RuntimeException { + if(null != androidGetTempRootMethod) { + return (File) ReflectionUtil.callMethod(null, androidGetTempRootMethod, acc); + } + return null; + } + +} diff --git a/src/java/jogamp/common/os/android/PackageInfoUtil.java b/src/java/jogamp/common/os/android/AndroidUtilsImpl.java index 28795a1..f6a1444 100644 --- a/src/java/jogamp/common/os/android/PackageInfoUtil.java +++ b/src/java/jogamp/common/os/android/AndroidUtilsImpl.java @@ -27,11 +27,15 @@ */ package jogamp.common.os.android; -import android.content.*; -import android.content.pm.*; +import java.io.File; +import java.security.AccessControlContext; + +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; import android.util.Log; -public class PackageInfoUtil { +public class AndroidUtilsImpl { private static boolean DEBUG = false; public static final PackageInfo getPackageInfo(String packageName) { @@ -53,11 +57,35 @@ public class PackageInfoUtil { public static final int getPackageInfoVersionCode(String packageName) { final PackageInfo pInfo = getPackageInfo(packageName); return ( null != pInfo ) ? pInfo.versionCode : -1 ; - } + } + public static final String getPackageInfoVersionName(String packageName) { final PackageInfo pInfo = getPackageInfo(packageName); final String s = ( null != pInfo ) ? pInfo.versionName : null ; if(DEBUG) Log.d(MD.TAG, "getPackageInfoVersionName("+packageName+"): "+s); return s; - } + } + + /** + * @return null if no Android Context is registered + * via {@link jogamp.common.os.android.StaticContext#init(android.content.Context) StaticContext.init(..)}, + * otherwise the context relative world readable <code>temp</code> directory returned. + */ + public static File getTempRoot(AccessControlContext acc) + throws SecurityException, RuntimeException + { + final Context ctx = StaticContext.getContext(); + if(null != ctx) { + final File tmpRoot = ctx.getDir("temp", Context.MODE_WORLD_READABLE); + if(null==tmpRoot|| !tmpRoot.isDirectory() || !tmpRoot.canWrite()) { + throw new RuntimeException("Not a writable directory: '"+tmpRoot+"', retrieved Android static context"); + } + if(DEBUG) { + System.err.println("IOUtil.getTempRoot(Android): temp dir: "+tmpRoot.getAbsolutePath()); + } + return tmpRoot; + } + return null; + } + } diff --git a/src/java/jogamp/common/os/android/StaticContext.java b/src/java/jogamp/common/os/android/StaticContext.java index 055fa2f..d7f134a 100644 --- a/src/java/jogamp/common/os/android/StaticContext.java +++ b/src/java/jogamp/common/os/android/StaticContext.java @@ -36,7 +36,10 @@ public class StaticContext { private static boolean DEBUG = false; /** + * Register Android application context for static usage. + * * @param appContext mandatory application Context + * @throws RuntimeException if the context is already registered. */ public static final synchronized void init(Context appContext) { if(null != StaticContext.appContext) { @@ -45,10 +48,19 @@ public class StaticContext { if(DEBUG) { Log.d(MD.TAG, "init(appCtx "+appContext+")"); } StaticContext.appContext = appContext; } + + /** + * Unregister the Android application Context + */ public static final synchronized void clear() { if(DEBUG) { Log.d(MD.TAG, "clear()"); } appContext = null; } + + /** + * Return the registered Android application Context + * @return + */ public static final synchronized Context getContext() { return appContext; } |