summaryrefslogtreecommitdiff
path: root/platform/android/java/src
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2014-06-27 23:21:45 -0300
committerJuan Linietsky <reduzio@gmail.com>2014-06-27 23:21:45 -0300
commit2af2a84a03fd707cfa4c682aff34d722343d8985 (patch)
tree50d064e8bba7d5efb5974e3fa3a67e076fb5ef8b /platform/android/java/src
parent1cc96a4d7440d9e8a20f7dbf17cf5771170de83d (diff)
Misc Fixes
========== -NOTIFICATION_WM_QUIT fixed on android (seems tha way this is reported changed in newer sdk) -WIP implementation of APK Expansion APIs for publishing games larger than 50mb in Play Store -Feaures in the new tutorials are all present in the sourcecode -This (hopefully) should get rid of the animation list order getting corrupted -Improved 3D Scene Importer (Skeletons, Animations and other stuff were not being merged). Anything missing? -In code editor, the automatic syntax checker will only use file_exists() to check preload() else it might freeze the editor too much while typing if the preload is a big resource -Fixed bugs in PolygonPathFinder, stil pending to do a node and a demo
Diffstat (limited to 'platform/android/java/src')
-rw-r--r--platform/android/java/src/com/android/godot/Godot.java232
-rw-r--r--platform/android/java/src/com/android/godot/GodotDownloaderAlarmReceiver.java27
-rw-r--r--platform/android/java/src/com/android/godot/GodotDownloaderService.java47
3 files changed, 264 insertions, 42 deletions
diff --git a/platform/android/java/src/com/android/godot/Godot.java b/platform/android/java/src/com/android/godot/Godot.java
index 9cadeb4231..16a5a17cbb 100644
--- a/platform/android/java/src/com/android/godot/Godot.java
+++ b/platform/android/java/src/com/android/godot/Godot.java
@@ -63,6 +63,10 @@ import com.android.godot.input.*;
import java.io.InputStream;
import javax.microedition.khronos.opengles.GL10;
+import java.security.MessageDigest;
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.LinkedList;
public class Godot extends Activity implements SensorEventListener
{
@@ -138,7 +142,11 @@ public class Godot extends Activity implements SensorEventListener
*/
+ private String[] command_line;
+
public GodotView mView;
+ private boolean godot_initialized=false;
+
private SensorManager mSensorManager;
private Sensor mAccelerometer;
@@ -190,9 +198,9 @@ public class Godot extends Activity implements SensorEventListener
// GodotEditText layout
GodotEditText edittext = new GodotEditText(this);
- edittext.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
+ edittext.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
// ...add to FrameLayout
- layout.addView(edittext);
+ layout.addView(edittext);
mView = new GodotView(getApplication(),io,use_gl2, this);
layout.addView(mView,new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
@@ -216,71 +224,206 @@ public class Godot extends Activity implements SensorEventListener
private String[] getCommandLine() {
-
- InputStream is;
- try {
- is = getAssets().open("/_cl_");
- byte[] len = new byte[4];
- int r = is.read(len);
- if (r<4) {
- System.out.printf("**ERROR** Wrong cmdline length.\n");
- return new String[0];
- }
- int argc=((int)(len[3])<<24) | ((int)(len[2])<<16) | ((int)(len[1])<<8) | ((int)(len[0]));
- String[] cmdline = new String[argc];
- for(int i=0;i<argc;i++) {
- r = is.read(len);
- if (r<4) {
- System.out.printf("**ERROR** Wrong cmdline param lenght.\n");
- return new String[0];
- }
- int strlen=((int)(len[3])<<24) | ((int)(len[2])<<16) | ((int)(len[1])<<8) | ((int)(len[0]));
- if (strlen>65535) {
- System.out.printf("**ERROR** Wrong command len\n");
- return new String[0];
- }
- byte[] arg = new byte[strlen];
- r = is.read(arg);
- if (r!=strlen) {
- cmdline[i]=new String(arg,"UTF-8");
- }
-
+ InputStream is;
+ try {
+ is = getAssets().open("_cl_");
+ byte[] len = new byte[4];
+ int r = is.read(len);
+ if (r<4) {
+ System.out.printf("**ERROR** Wrong cmdline length.\n");
+ Log.d("GODOT", "**ERROR** Wrong cmdline length.\n");
+ return new String[0];
+ }
+ int argc=((int)(len[3]&0xFF)<<24) | ((int)(len[2]&0xFF)<<16) | ((int)(len[1]&0xFF)<<8) | ((int)(len[0]&0xFF));
+ String[] cmdline = new String[argc];
+
+ for(int i=0;i<argc;i++) {
+ r = is.read(len);
+ if (r<4) {
+
+ Log.d("GODOT", "**ERROR** Wrong cmdline param lenght.\n");
+ return new String[0];
+ }
+ int strlen=((int)(len[3]&0xFF)<<24) | ((int)(len[2]&0xFF)<<16) | ((int)(len[1]&0xFF)<<8) | ((int)(len[0]&0xFF));
+ if (strlen>65535) {
+ Log.d("GODOT", "**ERROR** Wrong command len\n");
+ return new String[0];
+ }
+ byte[] arg = new byte[strlen];
+ r = is.read(arg);
+ if (r==strlen) {
+ cmdline[i]=new String(arg,"UTF-8");
+ }
}
-
return cmdline;
} catch (Exception e) {
-
+ e.printStackTrace();
+ System.out.printf("**ERROR** No commandline.\n");
+ Log.d("GODOT", "**ERROR** Exception " + e.getClass().getName() + ":" + e.getMessage());
return new String[0];
}
}
- @Override protected void onCreate(Bundle icicle) {
- System.out.printf("** GODOT ACTIVITY CREATED HERE ***\n");
+ String expansion_pack_path;
- super.onCreate(icicle);
- _self = this;
- Window window = getWindow();
- window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
- | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ private void initializeGodot() {
+ if (expansion_pack_path!=null) {
+ String[] new_cmdline;
+ int cll=0;
+ if (command_line!=null) {
+ new_cmdline = new String[ command_line.length + 2 ];
+ cll=command_line.length;
+ for(int i=0;i<command_line.length;i++) {
+ new_cmdline[i]=command_line[i];
+ }
+ } else {
+ new_cmdline = new String[ 2 ];
+ }
+
+ new_cmdline[cll]="-main_pack";
+ new_cmdline[cll+1]=expansion_pack_path;
+ command_line=new_cmdline;
+ }
io = new GodotIO(this);
io.unique_id = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
GodotLib.io=io;
- GodotLib.initialize(this,io.needsReloadHooks(),getCommandLine());
+ GodotLib.initialize(this,io.needsReloadHooks(),command_line);
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
result_callback = null;
-
+
mPaymentsManager = PaymentsManager.createManager(this).initService();
+ godot_initialized=true;
+
+ }
+
+
+ @Override protected void onCreate(Bundle icicle) {
+
+ System.out.printf("** GODOT ACTIVITY CREATED HERE ***\n");
+
+ super.onCreate(icicle);
+ _self = this;
+ Window window = getWindow();
+ window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
+ | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+
+ //check for apk expansion API
+ if (true) {
+ command_line = getCommandLine();
+ boolean use_apk_expansion=false;
+ String main_pack_md5=null;
+ String main_pack_key=null;
+
+ List<String> new_args = new LinkedList<String>();
+
+
+ for(int i=0;i<command_line.length;i++) {
+
+ boolean has_extra = i< command_line.length -1;
+ if (command_line[i].equals("-use_apk_expansion")) {
+ use_apk_expansion=true;
+ } else if (has_extra && command_line[i].equals("-apk_expansion_md5")) {
+ main_pack_md5=command_line[i+1];
+ i++;
+ } else if (has_extra && command_line[i].equals("-apk_expansion_key")) {
+ main_pack_key=command_line[i+1];
+ i++;
+ } else if (command_line[i].trim().length()!=0){
+ new_args.add(command_line[i]);
+ }
+ }
+
+ if (new_args.isEmpty())
+ command_line=null;
+ else
+ command_line = new_args.toArray(new String[new_args.size()]);
+
+ if (use_apk_expansion && main_pack_md5!=null && main_pack_key!=null) {
+ //check that environment is ok!
+ if (!Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED )) {
+ Log.d("GODOT", "**ERROR! No media mounted!");
+ //show popup and die
+ }
+
+ // Build the full path to the app's expansion files
+ try {
+ expansion_pack_path = Environment.getExternalStorageDirectory().toString() + "/Android/obb/"+this.getPackageName();
+ expansion_pack_path+="/"+"main."+getPackageManager().getPackageInfo(getPackageName(), 0).versionCode+"."+this.getPackageName()+".obb";
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ File f = new File(expansion_pack_path);
+
+ boolean pack_valid = true;
+ Log.d("GODOT","**PACK** - Path "+expansion_pack_path);
+
+ if (!f.exists()) {
+
+ pack_valid=false;
+ Log.d("GODOT","**PACK** - File does not exist");
+
+ } else {
+ try {
+
+ InputStream fis = new FileInputStream(expansion_pack_path);
+
+ // Create MD5 Hash
+ byte[] buffer = new byte[16384];
+
+ MessageDigest complete = MessageDigest.getInstance("MD5");
+ int numRead;
+ do {
+ numRead = fis.read(buffer);
+ if (numRead > 0) {
+ complete.update(buffer, 0, numRead);
+ }
+ } while (numRead != -1);
+
+
+ fis.close();
+ byte[] messageDigest = complete.digest();
+
+ // Create Hex String
+ StringBuffer hexString = new StringBuffer();
+ for (int i=0; i<messageDigest.length; i++)
+ hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
+ String md5str = hexString.toString();
+
+ Log.d("GODOT","**PACK** - My MD5: "+hexString+" - APK md5: "+main_pack_md5);
+ if (!hexString.equals(main_pack_md5)) {
+ pack_valid=false;
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ Log.d("GODOT","**PACK FAIL**");
+ pack_valid=false;
+ }
+
+
+ }
+
+ if (!pack_valid) {
+
+
+
+ }
+
+ }
+ }
+
+ initializeGodot();
// instanceSingleton( new GodotFacebook(this) );
@@ -299,6 +442,8 @@ public class Godot extends Activity implements SensorEventListener
@Override protected void onPause() {
super.onPause();
+ if (!godot_initialized)
+ return;
mView.onPause();
mSensorManager.unregisterListener(this);
GodotLib.focusout();
@@ -310,6 +455,9 @@ public class Godot extends Activity implements SensorEventListener
@Override protected void onResume() {
super.onResume();
+ if (!godot_initialized)
+ return;
+
mView.onResume();
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
GodotLib.focusin();
diff --git a/platform/android/java/src/com/android/godot/GodotDownloaderAlarmReceiver.java b/platform/android/java/src/com/android/godot/GodotDownloaderAlarmReceiver.java
new file mode 100644
index 0000000000..d945a8b192
--- /dev/null
+++ b/platform/android/java/src/com/android/godot/GodotDownloaderAlarmReceiver.java
@@ -0,0 +1,27 @@
+package com.android.godot;
+
+import com.google.android.vending.expansion.downloader.DownloaderClientMarshaller;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager.NameNotFoundException;
+
+/**
+ * You should start your derived downloader class when this receiver gets the message
+ * from the alarm service using the provided service helper function within the
+ * DownloaderClientMarshaller. This class must be then registered in your AndroidManifest.xml
+ * file with a section like this:
+ * <receiver android:name=".GodotDownloaderAlarmReceiver"/>
+ */
+public class GodotDownloaderAlarmReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ try {
+ DownloaderClientMarshaller.startDownloadServiceIfRequired(context, intent, GodotDownloaderService.class);
+ } catch (NameNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/platform/android/java/src/com/android/godot/GodotDownloaderService.java b/platform/android/java/src/com/android/godot/GodotDownloaderService.java
new file mode 100644
index 0000000000..e0fe95ad96
--- /dev/null
+++ b/platform/android/java/src/com/android/godot/GodotDownloaderService.java
@@ -0,0 +1,47 @@
+package com.android.godot;
+
+import com.google.android.vending.expansion.downloader.impl.DownloaderService;
+
+/**
+ * This class demonstrates the minimal client implementation of the
+ * DownloaderService from the Downloader library.
+ */
+public class GodotDownloaderService extends DownloaderService {
+ // stuff for LVL -- MODIFY FOR YOUR APPLICATION!
+ private static final String BASE64_PUBLIC_KEY = "REPLACE THIS WITH YOUR PUBLIC KEY";
+ // used by the preference obfuscater
+ private static final byte[] SALT = new byte[] {
+ 1, 43, -12, -1, 54, 98,
+ -100, -12, 43, 2, -8, -4, 9, 5, -106, -108, -33, 45, -1, 84
+ };
+
+ /**
+ * This public key comes from your Android Market publisher account, and it
+ * used by the LVL to validate responses from Market on your behalf.
+ */
+ @Override
+ public String getPublicKey() {
+ return BASE64_PUBLIC_KEY;
+ }
+
+ /**
+ * This is used by the preference obfuscater to make sure that your
+ * obfuscated preferences are different than the ones used by other
+ * applications.
+ */
+ @Override
+ public byte[] getSALT() {
+ return SALT;
+ }
+
+ /**
+ * Fill this in with the class name for your alarm receiver. We do this
+ * because receivers must be unique across all of Android (it's a good idea
+ * to make sure that your receiver is in your unique package)
+ */
+ @Override
+ public String getAlarmReceiverClassName() {
+ return GodotDownloaderAlarmReceiver.class.getName();
+ }
+
+}