package org.andengine;
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLContext;
import javax.microedition.khronos.egl.EGLDisplay;
import org.andengine.engine.options.ConfigChooserOptions;
import org.andengine.opengl.view.ConfigChooser;
import org.andengine.util.exception.DeviceNotSupportedException;
import org.andengine.util.exception.DeviceNotSupportedException.DeviceNotSupportedCause;
import org.andengine.util.system.SystemUtils;
import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.ConfigurationInfo;
import android.os.Build;
/**
* (c) 2012 Zynga Inc.
*
* @author Nicolas Gramlich <ngramlich@zynga.com>
* @since 14:03:59 - 19.03.2012
*/
public final class AndEngine {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
// ===========================================================
// Constructors
// ===========================================================
private AndEngine() {
}
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
// ===========================================================
// Methods
// ===========================================================
public static boolean isDeviceSupported(final Context pContext) {
try {
AndEngine.checkDeviceSupported(pContext);
return true;
} catch (final DeviceNotSupportedException e) {
return false;
}
}
public static void checkDeviceSupported(final Context pContext) throws DeviceNotSupportedException {
AndEngine.checkCodePathSupport();
AndEngine.checkOpenGLSupport(pContext);
}
private static void checkCodePathSupport() throws DeviceNotSupportedException {
if (SystemUtils.isAndroidVersionOrLower(Build.VERSION_CODES.FROYO)) {
try {
System.loadLibrary("andengine");
} catch (final UnsatisfiedLinkError e) {
throw new DeviceNotSupportedException(DeviceNotSupportedCause.CODEPATH_INCOMPLETE, e);
}
}
}
private static void checkOpenGLSupport(final Context pContext) throws DeviceNotSupportedException {
AndEngine.checkGLES20Support(pContext);
AndEngine.checkEGLConfigChooserSupport();
}
private static void checkGLES20Support(final Context pContext) throws DeviceNotSupportedException {
final ActivityManager activityManager = (ActivityManager) pContext.getSystemService(Context.ACTIVITY_SERVICE);
final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
if (configurationInfo.reqGlEsVersion < 0x20000) {
throw new DeviceNotSupportedException(DeviceNotSupportedCause.GLES2_UNSUPPORTED);
}
}
private static void checkEGLConfigChooserSupport() throws DeviceNotSupportedException {
/* Get an EGL instance. */
final EGL10 egl = (EGL10) EGLContext.getEGL();
/* Get to the default display. */
final EGLDisplay eglDisplay = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
/* We can now initialize EGL for that display. */
final int[] version = new int[2];
egl.eglInitialize(eglDisplay, version);
final ConfigChooser configChooser = new ConfigChooser(new ConfigChooserOptions());
try {
configChooser.chooseConfig(egl, eglDisplay);
} catch (final IllegalArgumentException e) {
throw new DeviceNotSupportedException(DeviceNotSupportedCause.EGLCONFIG_NOT_FOUND, e);
}
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}