From eb893efa0db1013ca073b6d8a1d10f70c6ddf26c Mon Sep 17 00:00:00 2001 From: Christian Weiske Date: Sat, 12 Sep 2015 02:08:44 +0200 Subject: [PATCH] initial version --- .gitignore | 6 + AndroidManifest.xml | 21 ++++ README.rst | 24 ++++ ant.properties | 17 +++ assets/game/.keep | 0 build.xml | 107 ++++++++++++++++++ project.properties | 15 +++ res/drawable-xhdpi/ouya_icon.png | Bin 0 -> 15005 bytes .../ouya/gamelauncher/LaunchGameActivity.java | 103 +++++++++++++++++ 9 files changed, 293 insertions(+) create mode 100644 .gitignore create mode 100644 AndroidManifest.xml create mode 100644 README.rst create mode 100644 ant.properties create mode 100644 assets/game/.keep create mode 100644 build.xml create mode 100644 project.properties create mode 100644 res/drawable-xhdpi/ouya_icon.png create mode 100644 src/de/cweiske/ouya/gamelauncher/LaunchGameActivity.java 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 0000000000000000000000000000000000000000..ba4d0414290d968d69a9abcc471d094e50bdc048 GIT binary patch literal 15005 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 literal 0 HcmV?d00001 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); + } + } +} -- 2.30.2