Browse Source

Merge pull request #51846 from m4gr3d/delegate_restart_invokation_master

Delegate handling and implementation of the restart functionality to the Godot host
Rémi Verschelde 4 years ago
parent
commit
a619a92e3c

+ 21 - 0
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);

+ 2 - 16
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);
 		}
 	}
 

+ 6 - 0
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) {}
 }