diff --git a/sdk/JME3TestsTemplateAndroid/MANIFEST.MF b/sdk/JME3TestsTemplateAndroid/MANIFEST.MF
new file mode 100644
index 000000000..7e1ad4bb1
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/MANIFEST.MF
@@ -0,0 +1 @@
+X-Comment: Created with jMonkeyPlatform
diff --git a/sdk/JME3TestsTemplateAndroid/build.xml b/sdk/JME3TestsTemplateAndroid/build.xml
new file mode 100644
index 000000000..c39ff06f2
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/build.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+ Builds, tests, and runs the project BasicGameTemplate.
+
+
+
+
+
diff --git a/sdk/JME3TestsTemplateAndroid/master-application.jnlp b/sdk/JME3TestsTemplateAndroid/master-application.jnlp
new file mode 100644
index 000000000..49cbb12f2
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/master-application.jnlp
@@ -0,0 +1,22 @@
+
+
+ ${APPLICATION.TITLE}
+ ${APPLICATION.VENDOR}
+
+ ${APPLICATION.DESC}
+ ${APPLICATION.DESC.SHORT}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdk/JME3TestsTemplateAndroid/mobile/AndroidManifest.xml b/sdk/JME3TestsTemplateAndroid/mobile/AndroidManifest.xml
new file mode 100644
index 000000000..cddd3676d
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/mobile/AndroidManifest.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdk/JME3TestsTemplateAndroid/mobile/ant.properties b/sdk/JME3TestsTemplateAndroid/mobile/ant.properties
new file mode 100644
index 000000000..b0971e891
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/mobile/ant.properties
@@ -0,0 +1,17 @@
+# This file is used to override default values used by the Ant build system.
+#
+# This file must be checked into Version Control Systems, as it is
+# integral to the build system of your project.
+
+# This file is only used by the Ant script.
+
+# You can use this to override default values such as
+# 'source.dir' for the location of your java source folder and
+# 'out.dir' for the location of your output folder.
+
+# You can also use it define how the release builds are signed by declaring
+# the following properties:
+# 'key.store' for the location of your keystore and
+# 'key.alias' for the name of the key to use.
+# The password will be asked during the build when you use the 'release' target.
+
diff --git a/sdk/JME3TestsTemplateAndroid/mobile/build.xml b/sdk/JME3TestsTemplateAndroid/mobile/build.xml
new file mode 100644
index 000000000..601ecade7
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/mobile/build.xml
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdk/JME3TestsTemplateAndroid/mobile/proguard-project.txt b/sdk/JME3TestsTemplateAndroid/mobile/proguard-project.txt
new file mode 100644
index 000000000..b60ae7ea0
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/mobile/proguard-project.txt
@@ -0,0 +1,20 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/sdk/JME3TestsTemplateAndroid/mobile/project.properties b/sdk/JME3TestsTemplateAndroid/mobile/project.properties
new file mode 100644
index 000000000..85aac5401
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/mobile/project.properties
@@ -0,0 +1,14 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=android-8
diff --git a/sdk/JME3TestsTemplateAndroid/mobile/res/drawable/monkey256.png b/sdk/JME3TestsTemplateAndroid/mobile/res/drawable/monkey256.png
new file mode 100644
index 000000000..aa43ad6cf
Binary files /dev/null and b/sdk/JME3TestsTemplateAndroid/mobile/res/drawable/monkey256.png differ
diff --git a/sdk/JME3TestsTemplateAndroid/mobile/res/drawable/monkey256_9.9.png b/sdk/JME3TestsTemplateAndroid/mobile/res/drawable/monkey256_9.9.png
new file mode 100644
index 000000000..4c90f34a1
Binary files /dev/null and b/sdk/JME3TestsTemplateAndroid/mobile/res/drawable/monkey256_9.9.png differ
diff --git a/sdk/JME3TestsTemplateAndroid/mobile/res/drawable/monkey512.png b/sdk/JME3TestsTemplateAndroid/mobile/res/drawable/monkey512.png
new file mode 100644
index 000000000..c31857454
Binary files /dev/null and b/sdk/JME3TestsTemplateAndroid/mobile/res/drawable/monkey512.png differ
diff --git a/sdk/JME3TestsTemplateAndroid/mobile/res/drawable/monkey512_9.9.png b/sdk/JME3TestsTemplateAndroid/mobile/res/drawable/monkey512_9.9.png
new file mode 100644
index 000000000..39d45a961
Binary files /dev/null and b/sdk/JME3TestsTemplateAndroid/mobile/res/drawable/monkey512_9.9.png differ
diff --git a/sdk/JME3TestsTemplateAndroid/mobile/res/drawable/nonselected.png b/sdk/JME3TestsTemplateAndroid/mobile/res/drawable/nonselected.png
new file mode 100644
index 000000000..45cafef25
Binary files /dev/null and b/sdk/JME3TestsTemplateAndroid/mobile/res/drawable/nonselected.png differ
diff --git a/sdk/JME3TestsTemplateAndroid/mobile/res/drawable/selected.png b/sdk/JME3TestsTemplateAndroid/mobile/res/drawable/selected.png
new file mode 100644
index 000000000..ba92fce41
Binary files /dev/null and b/sdk/JME3TestsTemplateAndroid/mobile/res/drawable/selected.png differ
diff --git a/sdk/JME3TestsTemplateAndroid/mobile/res/layout/main.xml b/sdk/JME3TestsTemplateAndroid/mobile/res/layout/main.xml
new file mode 100644
index 000000000..8e4ae707d
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/mobile/res/layout/main.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/sdk/JME3TestsTemplateAndroid/mobile/res/layout/test_chooser_layout.xml b/sdk/JME3TestsTemplateAndroid/mobile/res/layout/test_chooser_layout.xml
new file mode 100644
index 000000000..5df242f3e
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/mobile/res/layout/test_chooser_layout.xml
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdk/JME3TestsTemplateAndroid/mobile/res/layout/test_chooser_row.xml b/sdk/JME3TestsTemplateAndroid/mobile/res/layout/test_chooser_row.xml
new file mode 100644
index 000000000..8805363b6
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/mobile/res/layout/test_chooser_row.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sdk/JME3TestsTemplateAndroid/mobile/res/values/strings.xml b/sdk/JME3TestsTemplateAndroid/mobile/res/values/strings.xml
new file mode 100644
index 000000000..c95eae549
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/mobile/res/values/strings.xml
@@ -0,0 +1,4 @@
+
+
+ jMonkeyEngine Test Applications
+
diff --git a/sdk/JME3TestsTemplateAndroid/mobile/src/com/jmonkeyengine/tests/CustomArrayAdapter.java b/sdk/JME3TestsTemplateAndroid/mobile/src/com/jmonkeyengine/tests/CustomArrayAdapter.java
new file mode 100644
index 000000000..72dc2556a
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/mobile/src/com/jmonkeyengine/tests/CustomArrayAdapter.java
@@ -0,0 +1,168 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.jmonkeyengine.tests;
+
+import android.content.Context;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.Filter;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import java.util.ArrayList;
+import java.util.List;
+
+public class CustomArrayAdapter extends ArrayAdapter {
+ private static final String TAG = "CustomArrayAdapter";
+
+ /* List of items */
+ private List entries;
+ private Context activity;
+
+ /* Position of selected answer */
+ private int selectedPosition = -1;
+ /* Background Color of selected item */
+ private int selectedBackgroundColor = 0xffff00;
+ /* Background Color of non selected item */
+ private int nonselectedBackgroundColor = 0x000000;
+ /* Background Drawable Resource ID of selected item */
+ private int selectedBackgroundResource = 0;
+ /* Background Drawable Resource ID of non selected items */
+ private int nonselectedBackgroundResource = 0;
+
+ /* Variables to support list filtering */
+ private ArrayList filteredEntries;
+ private Filter filter;
+
+ public CustomArrayAdapter(Context context, int textViewResourceId, List objects) {
+ super(context, textViewResourceId, objects);
+ activity = context;
+ entries = new ArrayList(objects);
+ filteredEntries = new ArrayList(objects);
+ filter = new ClassNameFilter();
+ }
+
+ /** Setter for selected item position */
+ public void setSelectedPosition(int selectedPosition) {
+ this.selectedPosition = selectedPosition;
+ }
+
+ /** Setter for selected item background color */
+ public void setSelectedBackgroundColor(int selectedBackgroundColor) {
+ this.selectedBackgroundColor = selectedBackgroundColor;
+ }
+
+ /** Setter for non selected background color */
+ public void setNonSelectedBackgroundColor(int nonselectedBackgroundColor) {
+ this.nonselectedBackgroundColor = nonselectedBackgroundColor;
+ }
+
+ /** Setter for selected item background resource id*/
+ public void setSelectedBackgroundResource(int selectedBackgroundResource) {
+ this.selectedBackgroundResource = selectedBackgroundResource;
+ }
+
+ /** Setter for non selected background resource id*/
+ public void setNonSelectedBackgroundResource(int nonselectedBackgroundResource) {
+ this.nonselectedBackgroundResource = nonselectedBackgroundResource;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ Log.i(TAG, "getView for position: " + position + " with selectedItem: " + selectedPosition);
+
+ View v = convertView;
+ ViewHolder holder;
+ if (v == null) {
+ LayoutInflater vi =
+ (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ v = vi.inflate(R.layout.test_chooser_row, null);
+ holder = new ViewHolder();
+ holder.textView = (TextView) v.findViewById(R.id.txtClassName);
+ holder.layoutRow = (LinearLayout) v.findViewById(R.id.layoutTestChooserRow);
+ v.setTag(holder);
+ } else {
+ holder=(ViewHolder)v.getTag();
+ }
+
+ final String itemText = filteredEntries.get(position);
+ if (itemText != null) {
+ holder.textView.setText(itemText);
+ if (position == selectedPosition) {
+ Log.i(TAG, "setting Background Color to: " + selectedBackgroundColor);
+// holder.textView.setBackgroundColor(selectedBackgroundColor);
+// holder.textView.setBackgroundResource(selectedBackgroundResource);
+ holder.layoutRow.setBackgroundResource(selectedBackgroundResource);
+ } else {
+ Log.i(TAG, "setting Background Color to: " + nonselectedBackgroundColor);
+// holder.textView.setBackgroundColor(nonselectedBackgroundColor);
+// holder.textView.setBackgroundResource(nonselectedBackgroundResource);
+ holder.layoutRow.setBackgroundResource(nonselectedBackgroundResource);
+ }
+ }
+ return v;
+
+ }
+
+ @Override
+ public Filter getFilter(){
+ if(filter == null){
+ filter = new ClassNameFilter();
+ }
+ return filter;
+ }
+
+ public static class ViewHolder{
+ public TextView textView;
+ public LinearLayout layoutRow;
+ }
+
+ private class ClassNameFilter extends Filter{
+ @Override
+ protected FilterResults performFiltering(CharSequence constraint){
+ FilterResults results = new FilterResults();
+ String prefix = constraint.toString().toLowerCase();
+ Log.i(TAG, "performFiltering: entries size: " + entries.size());
+ if (prefix == null || prefix.length() == 0){
+ ArrayList list = new ArrayList(entries);
+ results.values = list;
+ results.count = list.size();
+ Log.i(TAG, "clearing filter with size: " + list.size());
+ }else{
+ final ArrayList list = new ArrayList(entries);
+ final ArrayList nlist = new ArrayList();
+ int count = list.size();
+
+ for (int i = 0; i)results.values;
+ notifyDataSetChanged();
+ clear();
+ int count = filteredEntries.size();
+ for(int i = 0; i classNames = new ArrayList();
+ private List exclusions = new ArrayList();
+ private String rootPackage;
+
+ /* ListView that displays the test application class names. */
+ private ListView listClasses;
+
+ /* ArrayAdapter connects the spinner widget to array-based data. */
+ private CustomArrayAdapter arrayAdapter;
+
+ /* Buttons to start application or stop the activity. */
+ private Button btnOK;
+ private Button btnCancel;
+
+ /* Filter Edit Box */
+ EditText editFilterText;
+
+
+ /**
+ * Called when the activity is first created.
+ */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ if (savedInstanceState != null) {
+ Log.i(TAG, "Restoring selections in onCreate: "
+ + "position: " + savedInstanceState.getInt(SELECTED_LIST_POSITION, 0)
+ + "class: " + savedInstanceState.getString(SELECTED_APP_CLASS)
+ );
+ currentPosition = savedInstanceState.getInt(SELECTED_LIST_POSITION, 0);
+ currentSelection = savedInstanceState.getString(SELECTED_APP_CLASS);
+ }
+
+
+ /* Set content view and register views */
+ setContentView(R.layout.test_chooser_layout);
+ btnOK = (Button) findViewById(R.id.btnOK);
+ btnCancel = (Button) findViewById(R.id.btnCancel);
+ listClasses = (ListView) findViewById(R.id.listClasses);
+ editFilterText = (EditText) findViewById(R.id.txtFilter);
+
+
+ /* Define the root package to start with */
+ rootPackage = "jme3test";
+
+ /* Create an array of Strings to define which classes to exclude */
+ exclusions.add("$"); // inner classes
+ exclusions.add("TestChooser"); // Desktop test chooser class
+ exclusions.add("awt"); // Desktop test chooser class
+
+// mExclusions.add("");
+
+ /*
+ * Read the class names from the dex file and filter based on
+ * name and super class.
+ */
+
+ Log.i(TAG, "Composing Test list...");
+
+ ApplicationInfo ai = this.getApplicationInfo();
+ String classPath = ai.sourceDir;
+ DexFile dex = null;
+ Enumeration apkClassNames = null;
+ try {
+ dex = new DexFile(classPath);
+ apkClassNames = dex.entries();
+ while (apkClassNames.hasMoreElements()) {
+ String className = apkClassNames.nextElement();
+ if (checkClassName(className) && checkClassType(className)) {
+ classNames.add(className);
+ }
+// classNames.add(className);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ dex.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /*
+ * Create a backing Adapter for the List View from a list of the
+ * classes. The list is defined by array of class names.
+ */
+ arrayAdapter = new CustomArrayAdapter(
+ this,
+ R.layout.test_chooser_row, // text view to display selection
+ classNames // array of strings to display
+ );
+
+ /* Set the resource id for selected and non selected backgrounds */
+ Log.i(TAG, "Setting Adapter Background Resource IDs");
+ arrayAdapter.setSelectedBackgroundResource(R.drawable.selected);
+ arrayAdapter.setNonSelectedBackgroundResource(R.drawable.nonselected);
+
+ /* Attach the Adapter to the spinner */
+ Log.i(TAG, "Setting ListView Adapter");
+ listClasses.setAdapter(arrayAdapter);
+
+ /* Set initial selection for the list */
+ setSelection(currentPosition);
+
+ /* Set Click and Text Changed listeners */
+ listClasses.setOnItemClickListener(this);
+ btnOK.setOnClickListener(this);
+ btnCancel.setOnClickListener(this);
+ editFilterText.addTextChangedListener(this);
+
+ }
+
+ /**
+ * User selected an application. Sets the current selection and redraws
+ * the list view to highlight the selected item.
+ * @param parent AdapterView tied to the list
+ * @param view The ListView
+ * @param position Selection position in the list of class names
+ * @param id
+ */
+ @Override
+ public void onItemClick(AdapterView> parent, View view, int position, long id) {
+ setSelection(position);
+ }
+
+ /**
+ * User clicked a view on the screen. Check for the OK and Cancel buttons
+ * and either start the applicaiton or exit.
+ * @param view
+ */
+ public void onClick(View view) {
+ if (view.equals(btnOK)) {
+ /* Get selected class, pack it in the intent and start the test app */
+ Log.i(TAG, "User selected OK for class: " + currentSelection);
+ Intent intent = new Intent(this, TestsHarness.class);
+ intent.putExtra(SELECTED_APP_CLASS, currentSelection);
+ startActivity(intent);
+ } else if (view.equals(btnCancel)) {
+ /* Exit */
+ Log.i(TAG, "User selected Cancel");
+ finish();
+ }
+ }
+
+ /**
+ * Check class name to see if the class is in the root package and if it
+ * contains any of the exclusion strings
+ * @param className Class name to check
+ * @return true if the check passes, false otherwise
+ */
+ private boolean checkClassName(String className) {
+ boolean include = true;
+ /* check to see if the class in inside the rootPackage package */
+ if (className.startsWith(rootPackage)) {
+ /* check to see if the class contains any of the exlusion strings */
+ for (int i = 0; i < exclusions.size(); i++) {
+ if (className.contains(exclusions.get(i))) {
+ Log.i(TAG, "Skipping Class " + className + ". Includes exclusion string: " + exclusions.get(i) + ".");
+ include = false;
+ break;
+ }
+ }
+ } else {
+ include = false;
+ Log.i(TAG, "Skipping Class " + className + ". Not in the root package: " + rootPackage + ".");
+ }
+ return include;
+ }
+
+ /**
+ * Check to see if the class extends Application or SimpleApplication
+ * @param className Class name to check
+ * @return true if the check passes, false otherwise
+ */
+ private boolean checkClassType(String className) {
+ boolean include = true;
+ try {
+ Class> clazz = (Class>)Class.forName(className);
+ if (Application.class.isAssignableFrom(clazz)) {
+ Log.i(TAG, "Class " + className + " is a jME Application");
+ } else {
+ include = false;
+ Log.i(TAG, "Skipping Class " + className + ". Not a jME Application");
+ }
+
+ } catch (ClassNotFoundException cnfe) {
+ include = false;
+ Log.i(TAG, "Skipping Class " + className + ". Class not found.");
+ }
+ return include;
+ }
+
+ private void setSelection(int position) {
+ if (position == -1) {
+ arrayAdapter.setSelectedPosition(0);
+ currentPosition = -1;
+ currentSelection = "";
+ listClasses.invalidateViews();
+ } else {
+ arrayAdapter.setSelectedPosition(position);
+ currentPosition = position;
+ currentSelection = arrayAdapter.getItem(position);
+ listClasses.invalidateViews();
+ }
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle savedInstanceState) {
+ super.onSaveInstanceState(savedInstanceState);
+ Log.i(TAG, "Saving selections in onSaveInstanceState: "
+ + "position: " + currentPosition + ", "
+ + "class: " + currentSelection
+ );
+ // Save current selections to the savedInstanceState.
+ // This bundle will be passed to onCreate if the process is
+ // killed and restarted.
+ savedInstanceState.putString(SELECTED_APP_CLASS, currentSelection);
+ savedInstanceState.putInt(SELECTED_LIST_POSITION, currentPosition);
+ }
+
+ @Override
+ public void onRestoreInstanceState(Bundle savedInstanceState) {
+ super.onRestoreInstanceState(savedInstanceState);
+// Log.i(TAG, "Restoring selections in onRestoreInstanceState: "
+// + "position: " + savedInstanceState.getInt(SELECTED_LIST_POSITION, 0)
+// + "class: " + savedInstanceState.getString(SELECTED_APP_CLASS)
+// );
+// //Restore selections from the savedInstanceState.
+// // This bundle has also been passed to onCreate.
+// currentPosition = savedInstanceState.getInt(SELECTED_LIST_POSITION, 0);
+// currentSelection = savedInstanceState.getString(SELECTED_APP_CLASS);
+ }
+
+ public void beforeTextChanged(CharSequence cs, int i, int i1, int i2) {
+ }
+
+ public void onTextChanged(CharSequence cs, int startPos, int beforePos, int count) {
+ Log.i(TAG, "onTextChanged with cs: " + cs + ", startPos: " + startPos + ", beforePos: " + beforePos + ", count: " + count);
+// setSelection(-1);
+ arrayAdapter.getFilter().filter(cs.toString());
+ }
+
+ public void afterTextChanged(Editable edtbl) {
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ editFilterText.removeTextChangedListener(this);
+ }
+
+}
diff --git a/sdk/JME3TestsTemplateAndroid/mobile/src/com/jmonkeyengine/tests/TestsHarness.java b/sdk/JME3TestsTemplateAndroid/mobile/src/com/jmonkeyengine/tests/TestsHarness.java
new file mode 100644
index 000000000..df2147482
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/mobile/src/com/jmonkeyengine/tests/TestsHarness.java
@@ -0,0 +1,50 @@
+package com.jmonkeyengine.tests;
+
+import android.content.Intent;
+import com.jme3.app.AndroidHarness;
+import android.content.pm.ActivityInfo;
+import android.os.Bundle;
+import com.jme3.system.android.AndroidConfigChooser.ConfigType;
+
+public class TestsHarness extends AndroidHarness{
+
+ /*
+ * Note that you can ignore the errors displayed in this file,
+ * the android project will build regardless.
+ * Install the 'Android' plugin under Tools->Plugins->Available Plugins
+ * to get error checks and code completion for the Android project files.
+ */
+
+ public TestsHarness(){
+ // Set the application class to run
+ appClass = "mygame.Main";
+ // Try ConfigType.FASTEST; or ConfigType.LEGACY if you have problems
+ eglConfigType = ConfigType.BEST;
+ // Exit Dialog title & message
+ exitDialogTitle = "Exit?";
+ exitDialogMessage = "Press Yes";
+ // Enable verbose logging
+ eglConfigVerboseLogging = false;
+ // Choose screen orientation
+ screenOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
+ // Invert the MouseEvents X (default = true)
+ mouseEventsInvertX = true;
+ // Invert the MouseEvents Y (default = true)
+ mouseEventsInvertY = true;
+ // Add splash screen drawable resource
+ splashPicID = R.drawable.monkey256_9;
+ // Simulate a joystick with Android device orientation data (default = false)
+ joystickEventsEnabled = false;
+ // Simulate mouse events with Android touch input (default = true)
+ mouseEventsEnabled = true;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ Intent intent = getIntent();
+ appClass = intent.getStringExtra(MainActivity.SELECTED_APP_CLASS);
+
+ super.onCreate(savedInstanceState);
+ }
+
+}
diff --git a/sdk/JME3TestsTemplateAndroid/nbproject/assets-impl.xml b/sdk/JME3TestsTemplateAndroid/nbproject/assets-impl.xml
new file mode 100644
index 000000000..0a47d8d4e
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/nbproject/assets-impl.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdk/JME3TestsTemplateAndroid/nbproject/build-impl.xml b/sdk/JME3TestsTemplateAndroid/nbproject/build-impl.xml
new file mode 100644
index 000000000..e067cf6cc
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/nbproject/build-impl.xml
@@ -0,0 +1,1383 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must set src.dir
+ Must set build.dir
+ Must set dist.dir
+ Must set build.classes.dir
+ Must set dist.javadoc.dir
+ Must set build.test.classes.dir
+ Must set build.test.results.dir
+ Must set build.classes.excludes
+ Must set dist.jar
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must set javac.includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ No tests executed.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must set JVM to use for profiling in profiler.info.jvm
+ Must set profiler agent JVM arguments in profiler.info.jvmargs.agent
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select some files in the IDE or set javac.includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ To run this application from the command line without Ant, try:
+
+
+
+
+
+
+ java -cp "${run.classpath.with.dist.jar}" ${main.class}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ To run this application from the command line without Ant, try:
+
+ java -jar "${dist.jar.resolved}"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set run.class
+
+
+
+ Must select one file in the IDE or set run.class
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set debug.class
+
+
+
+
+ Must select one file in the IDE or set debug.class
+
+
+
+
+ Must set fix.includes
+
+
+
+
+
+
+
+
+
+ This target only works when run from inside the NetBeans IDE.
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set profile.class
+ This target only works when run from inside the NetBeans IDE.
+
+
+
+
+
+
+
+
+ This target only works when run from inside the NetBeans IDE.
+
+
+
+
+
+
+
+
+
+
+
+
+ This target only works when run from inside the NetBeans IDE.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set run.class
+
+
+
+
+
+ Must select some files in the IDE or set test.includes
+
+
+
+
+ Must select one file in the IDE or set run.class
+
+
+
+
+ Must select one file in the IDE or set applet.url
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select some files in the IDE or set javac.includes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Some tests failed; see details above.
+
+
+
+
+
+
+
+
+ Must select some files in the IDE or set test.includes
+
+
+
+ Some tests failed; see details above.
+
+
+
+ Must select some files in the IDE or set test.class
+ Must select some method in the IDE or set test.method
+
+
+
+ Some tests failed; see details above.
+
+
+
+
+ Must select one file in the IDE or set test.class
+
+
+
+ Must select one file in the IDE or set test.class
+ Must select some method in the IDE or set test.method
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set applet.url
+
+
+
+
+
+
+
+
+ Must select one file in the IDE or set applet.url
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdk/JME3TestsTemplateAndroid/nbproject/configs/run-android.properties b/sdk/JME3TestsTemplateAndroid/nbproject/configs/run-android.properties
new file mode 100644
index 000000000..b948d5f59
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/nbproject/configs/run-android.properties
@@ -0,0 +1,4 @@
+$label=Android Device
+$target.clean=clean clean-android
+$target.debug=run-android
+$target.run=run-android
diff --git a/sdk/JME3TestsTemplateAndroid/nbproject/genfiles.properties b/sdk/JME3TestsTemplateAndroid/nbproject/genfiles.properties
new file mode 100644
index 000000000..2fccfbe5e
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=94bf7c61
+build.xml.script.CRC32=79a29eb7
+build.xml.stylesheet.CRC32=958a1d3e@1.32.1.45
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=e2c7a974
+nbproject/build-impl.xml.script.CRC32=0bb68565
+nbproject/build-impl.xml.stylesheet.CRC32=6ddba6b6@1.53.1.46
diff --git a/sdk/JME3TestsTemplateAndroid/nbproject/mobile-impl.xml b/sdk/JME3TestsTemplateAndroid/nbproject/mobile-impl.xml
new file mode 100644
index 000000000..2fe86add3
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/nbproject/mobile-impl.xml
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
+ Building debug android application version.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Copying application libraries to android project.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Adding libraries for android.
+
+
+
+
+
+
+
+
+ Replacing bullet library with android native version.
+
+
+
+
+
+
+
+
+
+
+
+ Unzipping Assets to Android Directories
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Waiting for device to be ready.. Connect your device now if its not connected yet.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Logging android device output, cancel build or disconnect device to stop logging.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdk/JME3TestsTemplateAndroid/nbproject/project.properties b/sdk/JME3TestsTemplateAndroid/nbproject/project.properties
new file mode 100644
index 000000000..e3a940489
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/nbproject/project.properties
@@ -0,0 +1,99 @@
+annotation.processing.enabled=true
+annotation.processing.enabled.in.editor=false
+annotation.processing.processors.list=
+annotation.processing.run.all.processors=true
+ant.customtasks.libs=android-base
+application.homepage=http://jmonkeyenging.org
+application.title=jMonkeyEngine Test Applications
+application.vendor=jMonkeyEngine
+assets.jar.name=assets.jar
+assets.excludes=**/*.j3odata,**/*.mesh.xml,**/*.skeleton.xml,**/*.scene,**/*.material,**/*.obj,**/*.mtl,**/*.blend
+assets.folder.name=assets
+assets.compress=true
+build.classes.dir=${build.dir}/classes
+build.classes.excludes=**/*.java,**/*.form
+# This directory is removed when the project is cleaned:
+build.dir=build
+build.generated.dir=${build.dir}/generated
+build.generated.sources.dir=${build.dir}/generated-sources
+# Only compile against the classpath explicitly listed here:
+build.sysclasspath=ignore
+build.test.classes.dir=${build.dir}/test/classes
+build.test.results.dir=${build.dir}/test/results
+compile.on.save=false
+# Uncomment to specify the preferred debugger connection transport:
+#debug.transport=dt_socket
+debug.classpath=\
+ ${run.classpath}
+debug.test.classpath=\
+ ${run.test.classpath}
+# This directory is removed when the project is cleaned:
+dist.dir=dist
+dist.jar=${dist.dir}/${application.title}.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+endorsed.classpath=
+excludes=
+includes=**
+jar.archive.disabled=${jnlp.enabled}
+jar.compress=false
+jar.index=${jnlp.enabled}
+javac.classpath=\
+ ${libs.jme3.classpath}:\
+ ${libs.jme3-libraries.classpath}:\
+ ${libs.jme3-libraries-blender.classpath}:\
+ ${libs.jme3-test-data.classpath}
+# Space-separated list of extra javac options
+javac.compilerargs=
+javac.deprecation=false
+javac.processorpath=\
+ ${javac.classpath}
+javac.source=1.5
+javac.target=1.5
+javac.test.classpath=\
+ ${javac.classpath}:\
+ ${build.classes.dir}
+javadoc.additionalparam=
+javadoc.author=false
+javadoc.encoding=${source.encoding}
+javadoc.noindex=false
+javadoc.nonavbar=false
+javadoc.notree=false
+javadoc.private=false
+javadoc.splitindex=true
+javadoc.use=true
+javadoc.version=false
+javadoc.windowtitle=
+jaxbwiz.endorsed.dirs="${netbeans.home}/../ide12/modules/ext/jaxb/api"
+jnlp.applet.class=jme3test.awt.AppHarness
+jnlp.applet.height=300
+jnlp.applet.width=300
+jnlp.codebase.type=local
+jnlp.descriptor=application
+jnlp.enabled=false
+jnlp.mixed.code=default
+jnlp.offline-allowed=false
+jnlp.signed=false
+jnlp.signing=
+jnlp.signing.alias=
+jnlp.signing.keystore=
+main.class=jme3test.TestChooser
+meta.inf.dir=${src.dir}/META-INF
+manifest.file=MANIFEST.MF
+mkdist.disabled=false
+mobile.android.enabled=true
+mobile.android.package=com.jmonkeyengine.tests
+mobile.android.target=android-8
+platform.active=default_platform
+run.classpath=\
+ ${javac.classpath}:\
+ ${build.classes.dir}:\
+ ${assets.folder.name}
+# Space-separated list of JVM arguments used when running the project
+# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
+# or test-sys-prop.name=value to set system properties for unit tests):
+run.jvmargs=
+run.test.classpath=\
+ ${javac.test.classpath}:\
+ ${build.test.classes.dir}
+source.encoding=UTF-8
+src.dir=src
diff --git a/sdk/JME3TestsTemplateAndroid/nbproject/project.xml b/sdk/JME3TestsTemplateAndroid/nbproject/project.xml
new file mode 100644
index 000000000..f40643b29
--- /dev/null
+++ b/sdk/JME3TestsTemplateAndroid/nbproject/project.xml
@@ -0,0 +1,21 @@
+
+
+ org.netbeans.modules.java.j2seproject
+
+
+
+
+
+
+
+
+
+
+ jME3TestsTemplateAndroid
+
+
+
+
+
+
+