diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
index 7b9dc7cf..e9915a46 100644
--- a/android/AndroidManifest.xml
+++ b/android/AndroidManifest.xml
@@ -16,5 +16,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/build-manual.sh b/android/build-manual.sh
index 34b828b2..db7f32a4 100644
--- a/android/build-manual.sh
+++ b/android/build-manual.sh
@@ -2,12 +2,15 @@ ANDROID_JAR=../android-13.jar
AAPT=./../aapt
DX=./../dx
APKBUILDER=./../apkbuilder
-NAME=mod
+NAME=gravgun
mkdir bin
mkdir bin/classes
+mkdir assets/
$AAPT package -M AndroidManifest.xml -m -S res -I $ANDROID_JAR
-$JAVA_HOME/bin/javac -d bin/classes -s bin/classes -cp $ANDROID_JAR src/in/celest/xash3d/LauncherActivity.java
+$JAVA_HOME/bin/javac -d bin/classes -s bin/classes -cp $ANDROID_JAR src/in/celest/xash3d/*
$DX --dex --output=bin/classes.dex bin/classes/
$AAPT package -f -M AndroidManifest.xml -S res -I $ANDROID_JAR -F bin/$NAME.apk.unaligned
+python2 makepak.py pak/ assets/extras.pak
+zip -r bin/$NAME.apk.unaligned assets/
$APKBUILDER bin/$NAME.apk -u -nf libs/ -rj libs -f bin/classes.dex -z bin/$NAME.apk.unaligned
#java -jar /mnt/app/apktool/signapk.jar /mnt/app/apktool/testkey.x509.pem /mnt/app/apktool/testkey.pk8 bin/$NAME.apk bin/$NAME-signed.apk
diff --git a/android/pak/models/p_gravcannon.mdl b/android/pak/models/p_gravcannon.mdl
new file mode 100644
index 00000000..53ebfe0e
Binary files /dev/null and b/android/pak/models/p_gravcannon.mdl differ
diff --git a/android/pak/models/v_gravcannon.mdl b/android/pak/models/v_gravcannon.mdl
new file mode 100644
index 00000000..dd886c31
Binary files /dev/null and b/android/pak/models/v_gravcannon.mdl differ
diff --git a/android/pak/models/w_gravcannon.mdl b/android/pak/models/w_gravcannon.mdl
new file mode 100644
index 00000000..a024326e
Binary files /dev/null and b/android/pak/models/w_gravcannon.mdl differ
diff --git a/android/pak/models/w_gravcannont.mdl b/android/pak/models/w_gravcannont.mdl
new file mode 100644
index 00000000..c999697c
Binary files /dev/null and b/android/pak/models/w_gravcannont.mdl differ
diff --git a/android/pak/sprites/weapon_gravgun.txt b/android/pak/sprites/weapon_gravgun.txt
new file mode 100644
index 00000000..632ffa04
--- /dev/null
+++ b/android/pak/sprites/weapon_gravgun.txt
@@ -0,0 +1,9 @@
+8
+weapon 320 320hud1 80 120 80 20
+weapon_s 320 320hud1 80 140 80 20
+ammo 320 320hud2 0 34 18 18
+crosshair 320 crosshairs 72 48 24 24
+weapon 640 640hud2 0 135 170 45
+weapon_s 640 640hud5 0 135 170 45
+ammo 640 640hud7 0 96 24 24
+crosshair 640 crosshairs 72 48 24 24
\ No newline at end of file
diff --git a/android/src/in/celest/xash3d/InstallReceiver.java b/android/src/in/celest/xash3d/InstallReceiver.java
new file mode 100644
index 00000000..7aee5cf3
--- /dev/null
+++ b/android/src/in/celest/xash3d/InstallReceiver.java
@@ -0,0 +1,14 @@
+package in.celest.xash3d;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+public class InstallReceiver extends BroadcastReceiver {
+private static final String TAG = "MOD_LAUNCHER";
+@Override
+public void onReceive(Context context, Intent arg1) {
+ Log.d( TAG, "Install received, extracting PAK" );
+ LauncherActivity.extractPAK( context, true );
+ }
+}
diff --git a/android/src/in/celest/xash3d/LauncherActivity.java b/android/src/in/celest/xash3d/LauncherActivity.java
index 91619ee3..2271a7c1 100644
--- a/android/src/in/celest/xash3d/LauncherActivity.java
+++ b/android/src/in/celest/xash3d/LauncherActivity.java
@@ -16,10 +16,19 @@ import android.widget.TextView;
import android.content.ComponentName;
import android.content.pm.PackageManager;
import android.content.SharedPreferences;
+import java.lang.reflect.Method;
+import java.io.FileOutputStream;
+import java.io.File;
+import java.io.InputStream;
+import android.content.Context;
+import android.util.Log;
public class LauncherActivity extends Activity {
+ private static final int PAK_VERSION = 1;
+ static Boolean isExtracting = false;
static EditText cmdArgs;
static SharedPreferences mPref;
+ private static final String TAG = "MOD_LAUNCHER";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -51,6 +60,7 @@ public class LauncherActivity extends Activity {
launcher.addView(startButton);
setContentView(launcher);
mPref = getSharedPreferences("mod", 0);
+ extractPAK(this, false);
cmdArgs.setText(mPref.getString("argv","-dev 3 -log"));
}
@@ -68,6 +78,83 @@ public class LauncherActivity extends Activity {
// Uncomment to set gamedir here
// intent.putExtra("gamedir", "mod" );
intent.putExtra("gamelibdir", getFilesDir().getAbsolutePath().replace("/files","/lib"));
+ intent.putExtra("pakfile", getFilesDir().getAbsolutePath() + "/extras.pak" );
startActivity(intent);
}
+ private static int chmod(String path, int mode) {
+ int ret = -1;
+ try
+ {
+ ret = Runtime.getRuntime().exec("chmod " + Integer.toOctalString(mode) + " " + path).waitFor();
+ Log.d(TAG, "chmod " + Integer.toOctalString(mode) + " " + path + ": " + ret );
+ }
+ catch(Exception e)
+ {
+ ret = -1;
+ Log.d(TAG, "chmod: Runtime not worked: " + e.toString() );
+ }
+ try
+ {
+ Class fileUtils = Class.forName("android.os.FileUtils");
+ Method setPermissions = fileUtils.getMethod("setPermissions",
+ String.class, int.class, int.class, int.class);
+ ret = (Integer) setPermissions.invoke(null, path,
+ mode, -1, -1);
+ }
+ catch(Exception e)
+ {
+ ret = -1;
+ Log.d(TAG, "chmod: FileUtils not worked: " + e.toString() );
+ }
+ return ret;
+ }
+
+ private static void extractFile(Context context, String path) {
+ try
+ {
+ InputStream is = null;
+ FileOutputStream os = null;
+ is = context.getAssets().open(path);
+ File out = new File(context.getFilesDir().getPath()+'/'+path);
+ out.getParentFile().mkdirs();
+ chmod( out.getParent(), 0777 );
+ os = new FileOutputStream(out);
+ byte[] buffer = new byte[1024];
+ int length;
+ while ((length = is.read(buffer)) > 0) {
+ os.write(buffer, 0, length);
+ }
+ os.close();
+ is.close();
+ chmod( context.getFilesDir().getPath()+'/'+path, 0777 );
+ } catch( Exception e )
+ {
+ Log.e( TAG, "Failed to extract file:" + e.toString() );
+ e.printStackTrace();
+ }
+
+ }
+
+ public static void extractPAK(Context context, Boolean force) {
+ if(isExtracting)
+ return;
+ isExtracting = true;
+ try {
+ if( mPref == null )
+ mPref = context.getSharedPreferences("mod", 0);
+ if( mPref.getInt( "pakversion", 0 ) == PAK_VERSION && !force )
+ return;
+ extractFile(context, "extras.pak");
+
+ SharedPreferences.Editor editor = mPref.edit();
+ editor.putInt( "pakversion", PAK_VERSION );
+ editor.commit();
+ editor.apply();
+ } catch( Exception e )
+ {
+ Log.e( TAG, "Failed to extract PAK:" + e.toString() );
+ }
+ isExtracting = false;
+ }
+
}