From: Christian Weiske Date: Sat, 12 Sep 2015 00:08:44 +0000 (+0200) Subject: initial version X-Git-Url: https://git.cweiske.de/ouya-romlauncher.git/commitdiff_plain/eb893efa0db1013ca073b6d8a1d10f70c6ddf26c initial version --- eb893efa0db1013ca073b6d8a1d10f70c6ddf26c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..082c52d --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +/bin/ +/assets/game/ +/gen/ +/.classpath +/.project +/.settings diff --git a/AndroidManifest.xml b/AndroidManifest.xml new file mode 100644 index 0000000..138cdfd --- /dev/null +++ b/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..5d53ba7 --- /dev/null +++ b/README.rst @@ -0,0 +1,24 @@ +******************************* +Generic OUYA SNES game launcher +******************************* +Based on this code you can pack up a SNES game and make it +available in the OUYA launcher, just as a normal game. + +When running it, the game file is extracted and +`Snes9x EX+`__ is started with it. + +__ http://www.explusalpha.com/home/snes9x-ex + + +Configuring +=========== +Things to adjust: + +- Put the game file into ``assets/game/`` +- Replace ``FIXME_ASSETFILENAME`` in + ``src/de/cweiske/ouya/gamelauncher/LaunchGameActivity.java`` + with the game file name (name, not path). +- Replace ``FIXME_GAMETITLE`` in ``AndroidManifest.xml`` with + the game's name. +- You should also adjust the package path, otherwise one game + overwrites the other diff --git a/ant.properties b/ant.properties new file mode 100644 index 0000000..b0971e8 --- /dev/null +++ b/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/assets/game/.keep b/assets/game/.keep new file mode 100644 index 0000000..e69de29 diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..93a7cf9 --- /dev/null +++ b/build.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/project.properties b/project.properties new file mode 100644 index 0000000..b476582 --- /dev/null +++ b/project.properties @@ -0,0 +1,15 @@ +# 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-16 + diff --git a/res/drawable-xhdpi/ouya_icon.png b/res/drawable-xhdpi/ouya_icon.png new file mode 100644 index 0000000..ba4d041 Binary files /dev/null and b/res/drawable-xhdpi/ouya_icon.png differ diff --git a/src/de/cweiske/ouya/gamelauncher/LaunchGameActivity.java b/src/de/cweiske/ouya/gamelauncher/LaunchGameActivity.java new file mode 100644 index 0000000..085b5e9 --- /dev/null +++ b/src/de/cweiske/ouya/gamelauncher/LaunchGameActivity.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2012 OUYA, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package de.cweiske.ouya.gamelauncher; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import android.app.Activity; +import android.content.ComponentName; +import android.content.Intent; +import android.content.res.AssetManager; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; + +public class LaunchGameActivity extends Activity +{ + String assetFilename = "FIXME_ASSETFILENAME"; + + /** + * Called when the activity is first created. + */ + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + + File extractedFile = extractFile(this.assetFilename); + if (extractedFile == null) { + System.err.println("Failed to extract file " + this.assetFilename); + finish(); + return; + } + + Intent intent = new Intent(); + intent.setComponent(new ComponentName("com.explusalpha.Snes9xPlus", "com.imagine.BaseActivity")); + intent.setAction("android.intent.action.VIEW"); + intent.setData(Uri.fromFile(extractedFile)); + + startActivity(intent); + finish(); + return; + } + + protected File extractFile(String assetFilename) + { + //File cacheDir = this.getExternalCacheDir(); + //File cacheDir = getExternalFilesDir(null); + File cacheDir = Environment.getExternalStorageDirectory(); + if (cacheDir == null) { + return null; + } + File dir = new File( + cacheDir.toString() + + File.separator + + "gamelauncher" + ); + if (!dir.exists()) { + dir.mkdirs(); + } + + File targetFile = new File(dir.toString() + File.separator + assetFilename); + if (targetFile.exists()) { + return targetFile; + } + + AssetManager assetManager = this.getAssets(); + try { + InputStream in = assetManager.open("game/" + assetFilename); + copyFile(in, new FileOutputStream(targetFile)); + return targetFile; + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + protected void copyFile(InputStream in, OutputStream out) throws IOException + { + byte[] buffer = new byte[1024]; + int read; + while((read = in.read(buffer)) != -1){ + out.write(buffer, 0, read); + } + } +}