From f4222733cae534b33e431f6bdb25a2a866bf80b5 Mon Sep 17 00:00:00 2001
From: Fredia Huya-Kouadio <fhuyakou@gmail.com>
Date: Wed, 18 Aug 2021 10:23:31 -0700
Subject: Delegate handling and implementation of the restart functionality to
 the Godot host.

---
 .../org/godotengine/godot/FullScreenGodotApp.java   | 21 +++++++++++++++++++++
 .../java/lib/src/org/godotengine/godot/Godot.java   | 18 ++----------------
 .../lib/src/org/godotengine/godot/GodotHost.java    |  6 ++++++
 3 files changed, 29 insertions(+), 16 deletions(-)

(limited to 'platform/android/java/lib/src/org')

diff --git a/platform/android/java/lib/src/org/godotengine/godot/FullScreenGodotApp.java b/platform/android/java/lib/src/org/godotengine/godot/FullScreenGodotApp.java
index ad7048cbf3..3600706c7c 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/FullScreenGodotApp.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/FullScreenGodotApp.java
@@ -30,6 +30,7 @@
 
 package org.godotengine.godot;
 
+import android.content.ComponentName;
 import android.content.Intent;
 import android.os.Bundle;
 import android.util.Log;
@@ -85,6 +86,26 @@ public abstract class FullScreenGodotApp extends FragmentActivity implements God
 		}
 	}
 
+	@Override
+	public final void onGodotRestartRequested(Godot instance) {
+		if (instance == godotFragment) {
+			// HACK:
+			//
+			// Currently it's very hard to properly deinitialize Godot on Android to restart the game
+			// from scratch. Therefore, we need to kill the whole app process and relaunch it.
+			//
+			// Restarting only the activity, wouldn't be enough unless it did proper cleanup (including
+			// releasing and reloading native libs or resetting their state somehow and clearing statics).
+			//
+			// Using instrumentation is a way of making the whole app process restart, because Android
+			// will kill any process of the same package which was already running.
+			//
+			Bundle args = new Bundle();
+			args.putParcelable("intent", getIntent());
+			startInstrumentation(new ComponentName(this, GodotInstrumentation.class), null, args);
+		}
+	}
+
 	@Override
 	public void onNewIntent(Intent intent) {
 		super.onNewIntent(intent);
diff --git a/platform/android/java/lib/src/org/godotengine/godot/Godot.java b/platform/android/java/lib/src/org/godotengine/godot/Godot.java
index 317175858b..2926031bcc 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/Godot.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/Godot.java
@@ -331,22 +331,8 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC
 	}
 
 	public void restart() {
-		// HACK:
-		//
-		// Currently it's very hard to properly deinitialize Godot on Android to restart the game
-		// from scratch. Therefore, we need to kill the whole app process and relaunch it.
-		//
-		// Restarting only the activity, wouldn't be enough unless it did proper cleanup (including
-		// releasing and reloading native libs or resetting their state somehow and clearing statics).
-		//
-		// Using instrumentation is a way of making the whole app process restart, because Android
-		// will kill any process of the same package which was already running.
-		//
-		final Activity activity = getActivity();
-		if (activity != null) {
-			Bundle args = new Bundle();
-			args.putParcelable("intent", mCurrentIntent);
-			activity.startInstrumentation(new ComponentName(activity, GodotInstrumentation.class), null, args);
+		if (godotHost != null) {
+			godotHost.onGodotRestartRequested(this);
 		}
 	}
 
diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotHost.java b/platform/android/java/lib/src/org/godotengine/godot/GodotHost.java
index 58e982c569..7b22895994 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/GodotHost.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/GodotHost.java
@@ -58,4 +58,10 @@ public interface GodotHost {
 	 * Invoked on the UI thread as the last step of the Godot instance clean up phase.
 	 */
 	default void onGodotForceQuit(Godot instance) {}
+
+	/**
+	 * Invoked on the GL thread when the Godot instance wants to be restarted. It's up to the host
+	 * to perform the appropriate action(s).
+	 */
+	default void onGodotRestartRequested(Godot instance) {}
 }
-- 
cgit v1.2.3