diff --git a/android/native/jni/input_android.c b/android/native/jni/input_android.c
index f65fc8eb95..9bf45d69e0 100644
--- a/android/native/jni/input_android.c
+++ b/android/native/jni/input_android.c
@@ -1692,7 +1692,13 @@ static void android_input_poll(void *data)
if (keycode == AKEYCODE_BACK)
{
- if (android->onBackPressed)
+ uint8_t unpacked = (android->keycode_lut[AKEYCODE_BACK] >> ((state_id+1) << 3)) - 1;
+ uint64_t input_state = (1ULL << unpacked);
+ if (type_event == AINPUT_EVENT_TYPE_KEY && input_state < (1ULL << RARCH_FIRST_META_KEY)
+ && input_state > 0)
+ {
+ }
+ else if (android->onBackPressed)
{
RARCH_LOG("Invoke onBackPressed through JNI.\n");
JNIEnv *env = jni_thread_getenv();
@@ -1701,43 +1707,6 @@ static void android_input_poll(void *data)
CALL_VOID_METHOD(env, android_app->activity->clazz, android->onBackPressed);
}
}
-
-#if 1
- uint8_t unpacked = (android->keycode_lut[AKEYCODE_BACK] >> ((state_id+1) << 3)) - 1;
- uint64_t input_state = (1ULL << unpacked);
- // FIXME: all of the below will probably all have to be refactored
- if (g_extern.lifecycle_state & (1ULL << MODE_INPUT_XPERIA_PLAY_HACK))
- {
- int meta = AKeyEvent_getMetaState(event);
- if (!(meta & AMETA_ALT_ON))
- {
- *lifecycle_state |= (1ULL << RARCH_QUIT_KEY);
- AInputQueue_finishEvent(android_app->inputQueue, event, handled);
- break;
- }
- }
- else if (type_event == AINPUT_EVENT_TYPE_KEY && input_state < (1ULL << RARCH_FIRST_META_KEY)
- && input_state > 0)
- {
- }
- else if (g_settings.input.back_behavior == BACK_BUTTON_MENU_TOGGLE)
- {
- int action = AKeyEvent_getAction(event);
- if (action == AKEY_EVENT_ACTION_DOWN)
- *lifecycle_state |= (1ULL << RARCH_MENU_TOGGLE);
- else if (action == AKEY_EVENT_ACTION_UP)
- *lifecycle_state &= ~(1ULL << RARCH_MENU_TOGGLE);
- AInputQueue_finishEvent(android_app->inputQueue, event, handled);
- break;
- }
- else
- {
- // exits the app, so no need to check for up/down action
- *lifecycle_state |= (1ULL << RARCH_QUIT_KEY);
- AInputQueue_finishEvent(android_app->inputQueue, event, handled);
- break;
- }
-#endif
}
if (type_event == AINPUT_EVENT_TYPE_MOTION)
diff --git a/android/phoenix/AndroidManifest.xml b/android/phoenix/AndroidManifest.xml
index 7eeb9b8d5f..ae9207f611 100644
--- a/android/phoenix/AndroidManifest.xml
+++ b/android/phoenix/AndroidManifest.xml
@@ -17,7 +17,7 @@
android:label="@string/app_name"
android:hasCode="true">
-
+
@@ -30,7 +30,7 @@
-
+
diff --git a/android/phoenix/res/values/strings.xml b/android/phoenix/res/values/strings.xml
index 6fede56b46..ae7f54440d 100644
--- a/android/phoenix/res/values/strings.xml
+++ b/android/phoenix/res/values/strings.xml
@@ -13,13 +13,14 @@
RetroArch - Main Menu
- TV Mode
+ Resume Game
Load Core
Load Game
Load Game (History)
Settings
Help
About
+ Quit RetroArch
Select a libretro core
diff --git a/android/phoenix/res/xml/main_menu.xml b/android/phoenix/res/xml/main_menu.xml
index 449babd2d8..1ba0e235fa 100644
--- a/android/phoenix/res/xml/main_menu.xml
+++ b/android/phoenix/res/xml/main_menu.xml
@@ -62,4 +62,9 @@
+
+
+
diff --git a/android/phoenix/src/com/retroarch/browser/HistorySelection.java b/android/phoenix/src/com/retroarch/browser/HistorySelection.java
index ae38e89631..8b1da446e1 100644
--- a/android/phoenix/src/com/retroarch/browser/HistorySelection.java
+++ b/android/phoenix/src/com/retroarch/browser/HistorySelection.java
@@ -106,7 +106,6 @@ public final class HistorySelection extends DialogFragment
retro.putExtra("LIBRETRO", corePath);
retro.putExtra("CONFIGFILE", UserPreferences.getDefaultConfigPath(ctx));
retro.putExtra("IME", current_ime);
- retro.putExtra("USED", "false");
startActivity(retro);
dismiss();
}
diff --git a/android/phoenix/src/com/retroarch/browser/RetroActivity.java b/android/phoenix/src/com/retroarch/browser/RetroActivity.java
index 6fd87dccc9..abb072ee3d 100644
--- a/android/phoenix/src/com/retroarch/browser/RetroActivity.java
+++ b/android/phoenix/src/com/retroarch/browser/RetroActivity.java
@@ -2,10 +2,12 @@ package com.retroarch.browser;
import java.io.IOException;
+import com.retroarch.browser.mainmenu.MainMenuActivity;
import com.retroarch.browser.preferences.util.UserPreferences;
import android.annotation.SuppressLint;
import android.app.NativeActivity;
+import android.content.Intent;
import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.os.Build;
@@ -17,6 +19,7 @@ public final class RetroActivity extends NativeActivity
private long lastTimestamp = 0;
private SurfaceTexture texture;
private Boolean updateSurface = true;
+ private Intent pendingIntent = null;
public void onCameraStart()
{
@@ -114,9 +117,53 @@ public final class RetroActivity extends NativeActivity
{
}
+ @Override
+ public void onNewIntent(Intent intent)
+ {
+ Log.i("RetroActivity", "onNewIntent invoked.");
+ super.onNewIntent(intent);
+ setIntent(intent);
+ pendingIntent = intent;
+ }
+
+ public String getPendingIntentFullPath()
+ {
+ return pendingIntent.getStringExtra("ROM");
+ }
+
+ public String getPendingIntentLibretroPath()
+ {
+ return pendingIntent.getStringExtra("LIBRETRO");
+ }
+
+ public String getPendingIntentConfigPath()
+ {
+ return pendingIntent.getStringExtra("CONFIGFILE");
+ }
+
+ public String getPendingIntentIME()
+ {
+ return pendingIntent.getStringExtra("IME");
+ }
+
+ public boolean hasPendingIntent()
+ {
+ if (pendingIntent == null)
+ return false;
+ return true;
+ }
+
+ public void clearPendingIntent()
+ {
+ pendingIntent = null;
+ }
+
@Override
public void onBackPressed()
{
Log.i("RetroActivity", "onBackKeyPressed");
+ Intent retro = new Intent(this, MainMenuActivity.class);
+ retro.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
+ startActivity(retro);
}
}
diff --git a/android/phoenix/src/com/retroarch/browser/mainmenu/MainMenuFragment.java b/android/phoenix/src/com/retroarch/browser/mainmenu/MainMenuFragment.java
index de66806a8b..b88cf3e77e 100644
--- a/android/phoenix/src/com/retroarch/browser/mainmenu/MainMenuFragment.java
+++ b/android/phoenix/src/com/retroarch/browser/mainmenu/MainMenuFragment.java
@@ -59,6 +59,7 @@ public final class MainMenuFragment extends PreferenceListFragment implements On
findPreference("loadCorePref").setOnPreferenceClickListener(this);
findPreference("loadRomPref").setOnPreferenceClickListener(this);
findPreference("loadRomHistoryPref").setOnPreferenceClickListener(this);
+ findPreference("quitRetroArch").setOnPreferenceClickListener(this);
// Extract assets.
extractAssets();
@@ -341,7 +342,6 @@ public final class MainMenuFragment extends PreferenceListFragment implements On
retro.putExtra("LIBRETRO", libretro_path);
retro.putExtra("CONFIGFILE", UserPreferences.getDefaultConfigPath(ctx));
retro.putExtra("IME", current_ime);
- retro.putExtra("USED", "false");
startActivity(retro);
}
// Load Core Preference
@@ -350,6 +350,12 @@ public final class MainMenuFragment extends PreferenceListFragment implements On
final CoreSelection coreSelection = new CoreSelection();
coreSelection.show(getFragmentManager(), "core_selection");
}
+ // Quit RetroArch preference
+ else if (prefKey.equals("quitRetroArch"))
+ {
+ // TODO - needs to close entire app gracefully - including
+ // NativeActivity if possible
+ }
// Load ROM Preference
else if (prefKey.equals("loadRomPref"))
{
@@ -397,7 +403,6 @@ public final class MainMenuFragment extends PreferenceListFragment implements On
retro.putExtra("LIBRETRO", libretro_path);
retro.putExtra("CONFIGFILE", UserPreferences.getDefaultConfigPath(ctx));
retro.putExtra("IME", current_ime);
- retro.putExtra("USED", "false");
startActivity(retro);
}
}
diff --git a/frontend/menu/menu_common.c b/frontend/menu/menu_common.c
index 12d4111171..b29dc61c5d 100644
--- a/frontend/menu/menu_common.c
+++ b/frontend/menu/menu_common.c
@@ -976,6 +976,20 @@ static void menu_flush_stack_type(void *data, unsigned final_type)
}
}
+void load_menu_game_new_core(void)
+{
+#ifdef HAVE_DYNAMIC
+ libretro_free_system_info(&rgui->info);
+ libretro_get_system_info(g_settings.libretro, &rgui->info,
+ &rgui->load_no_rom);
+
+ g_extern.lifecycle_state |= (1ULL << MODE_LOAD_GAME);
+#else
+ rarch_environment_cb(RETRO_ENVIRONMENT_SET_LIBRETRO_PATH, (void*)g_settings.libretro);
+ rarch_environment_cb(RETRO_ENVIRONMENT_EXEC, (void*)g_extern.fullpath);
+#endif
+}
+
static int menu_iterate_func(void *data, unsigned action)
{
rgui_handle_t *rgui = (rgui_handle_t*)data;
@@ -1118,16 +1132,7 @@ static int menu_iterate_func(void *data, unsigned action)
// FIXME: Add for consoles.
strlcpy(g_settings.libretro, path, sizeof(g_settings.libretro));
strlcpy(g_extern.fullpath, rgui->deferred_path, sizeof(g_extern.fullpath));
-#ifdef HAVE_DYNAMIC
- libretro_free_system_info(&rgui->info);
- libretro_get_system_info(g_settings.libretro, &rgui->info,
- &rgui->load_no_rom);
-
- g_extern.lifecycle_state |= (1ULL << MODE_LOAD_GAME);
-#else
- rarch_environment_cb(RETRO_ENVIRONMENT_SET_LIBRETRO_PATH, (void*)g_settings.libretro);
- rarch_environment_cb(RETRO_ENVIRONMENT_EXEC, (void*)g_extern.fullpath);
-#endif
+ load_menu_game_new_core();
rgui->msg_force = true;
ret = -1;
menu_flush_stack_type(rgui, RGUI_SETTINGS);
diff --git a/frontend/menu/menu_common.h b/frontend/menu/menu_common.h
index 50284dc101..b3cbc42fe4 100644
--- a/frontend/menu/menu_common.h
+++ b/frontend/menu/menu_common.h
@@ -355,6 +355,7 @@ void menu_init_core_info(void *data);
void load_menu_game_prepare(void);
bool load_menu_game(void);
void load_menu_game_history(unsigned game_index);
+extern void load_menu_game_new_core(void);
void menu_rom_history_push(const char *path, const char *core_path,
const char *core_name);
void menu_rom_history_push_current(void);
diff --git a/frontend/platform/platform_android.c b/frontend/platform/platform_android.c
index e2a1a5e194..0c1d704daa 100644
--- a/frontend/platform/platform_android.c
+++ b/frontend/platform/platform_android.c
@@ -22,6 +22,7 @@
#include
#include "platform_android.h"
+#include "../menu/menu_common.h"
#include "../../android/native/jni/jni_macros.h"
#include "../../conf/config_file.h"
@@ -460,13 +461,110 @@ static void get_environment_settings(int argc, char *argv[], void *data)
}
+static void process_pending_intent(void *data)
+{
+ RARCH_LOG("process_pending_intent.\n");
+ JNIEnv *env;
+ struct android_app* android_app = (struct android_app*)data;
+ jstring jstr = NULL;
+ bool valschanged = false;
+ bool startgame = false;
+
+ if (!android_app)
+ return;
+
+ env = jni_thread_getenv();
+ if (!env)
+ return;
+
+ // ROM
+ jstr = (*env)->CallObjectMethod(env, android_app->activity->clazz, android_app->getPendingIntentFullPath);
+ JNI_EXCEPTION(env);
+ RARCH_LOG("Checking arguments passed from intent...\n");
+ if (android_app->getPendingIntentFullPath && jstr)
+ {
+ const char *argv = (*env)->GetStringUTFChars(env, jstr, 0);
+ strlcpy(g_extern.fullpath, argv, sizeof(g_extern.fullpath));
+ (*env)->ReleaseStringUTFChars(env, jstr, argv);
+
+ valschanged = true;
+ startgame = true;
+ RARCH_LOG("ROM Filename: [%s].\n", g_extern.fullpath);
+ }
+
+ // Config file
+ jstr = (*env)->CallObjectMethod(env, android_app->activity->clazz, android_app->getPendingIntentConfigPath);
+ JNI_EXCEPTION(env);
+ if (android_app->getPendingIntentConfigPath && jstr)
+ {
+ const char *argv = (*env)->GetStringUTFChars(env, jstr, 0);
+ strlcpy(g_extern.config_path, argv, sizeof(g_extern.config_path));
+ (*env)->ReleaseStringUTFChars(env, jstr, argv);
+
+ valschanged = true;
+ RARCH_LOG("Config file: [%s].\n", g_extern.config_path);
+ }
+
+ // Current IME
+ jstr = (*env)->CallObjectMethod(env, android_app->activity->clazz, android_app->getPendingIntentIME);
+ JNI_EXCEPTION(env);
+ if (android_app->getPendingIntentIME && jstr)
+ {
+ const char *argv = (*env)->GetStringUTFChars(env, jstr, 0);
+ strlcpy(android_app->current_ime, argv, sizeof(android_app->current_ime));
+ (*env)->ReleaseStringUTFChars(env, jstr, argv);
+
+ valschanged = true;
+ RARCH_LOG("Current IME: [%s].\n", android_app->current_ime);
+ }
+
+ if (valschanged)
+ {
+ g_extern.block_config_read = false;
+ config_load();
+ g_extern.block_config_read = true;
+ }
+
+ //LIBRETRO
+ jstr = (*env)->CallObjectMethod(env, android_app->activity->clazz, android_app->getPendingIntentLibretroPath);
+ JNI_EXCEPTION(env);
+ if (android_app->getPendingIntentLibretroPath && jstr)
+ {
+ const char *argv = (*env)->GetStringUTFChars(env, jstr, 0);
+ strlcpy(g_settings.libretro, argv, sizeof(g_settings.libretro));
+ (*env)->ReleaseStringUTFChars(env, jstr, argv);
+ }
+
+ RARCH_LOG("Libretro path: [%s].\n", g_settings.libretro);
+
+ if (startgame)
+ {
+ RARCH_LOG("Starting new game %s...\n", g_extern.fullpath);
+ g_extern.lifecycle_state &= ~(1ULL << MODE_MENU);
+ g_extern.lifecycle_state &= ~(1ULL << MODE_GAME);
+ load_menu_game_new_core();
+ }
+
+ CALL_VOID_METHOD(env, android_app->activity->clazz, android_app->clearPendingIntent);
+}
+
static int process_events(void *data)
{
+ jboolean hasPendingIntent;
+ JNIEnv *env;
struct android_app* android_app = (struct android_app*)data;
if (input_key_pressed_func(RARCH_PAUSE_TOGGLE))
android_run_events(android_app);
+ env = jni_thread_getenv();
+ if (!env)
+ return -1;
+
+ CALL_BOOLEAN_METHOD(env, hasPendingIntent, android_app->activity->clazz, android_app->hasPendingIntent);
+ if (hasPendingIntent)
+ process_pending_intent(android_app);
+
return 0;
}
@@ -509,6 +607,16 @@ static void system_init(void *data)
GET_OBJECT_CLASS(env, class, android_app->activity->clazz);
GET_METHOD_ID(env, android_app->getIntent, class, "getIntent", "()Landroid/content/Intent;");
CALL_OBJ_METHOD(env, obj, android_app->activity->clazz, android_app->getIntent);
+ GET_METHOD_ID(env, android_app->hasPendingIntent, class, "hasPendingIntent", "()Z");
+ GET_METHOD_ID(env, android_app->clearPendingIntent, class, "clearPendingIntent", "()V");
+ GET_METHOD_ID(env, android_app->getPendingIntentConfigPath, class, "getPendingIntentConfigPath",
+ "()Ljava/lang/String;");
+ GET_METHOD_ID(env, android_app->getPendingIntentLibretroPath, class, "getPendingIntentLibretroPath",
+ "()Ljava/lang/String;");
+ GET_METHOD_ID(env, android_app->getPendingIntentFullPath, class, "getPendingIntentFullPath",
+ "()Ljava/lang/String;");
+ GET_METHOD_ID(env, android_app->getPendingIntentIME, class, "getPendingIntentIME",
+ "()Ljava/lang/String;");
GET_OBJECT_CLASS(env, class, obj);
GET_METHOD_ID(env, android_app->getStringExtra, class, "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
diff --git a/frontend/platform/platform_android.h b/frontend/platform/platform_android.h
index 07aa506301..141e3a3fc1 100644
--- a/frontend/platform/platform_android.h
+++ b/frontend/platform/platform_android.h
@@ -49,6 +49,12 @@ struct android_app
char current_ime[PATH_MAX];
jmethodID getIntent;
jmethodID getStringExtra;
+ jmethodID clearPendingIntent;
+ jmethodID hasPendingIntent;
+ jmethodID getPendingIntentConfigPath;
+ jmethodID getPendingIntentLibretroPath;
+ jmethodID getPendingIntentFullPath;
+ jmethodID getPendingIntentIME;
};
enum {