Browse Source

Merge pull request #51586 from m4gr3d/investigate_godot_resume_stalls_master

Resolve issue where the Godot app remains stuck when resuming.
Rémi Verschelde 4 years ago
parent
commit
af70288ee0

+ 29 - 5
platform/android/java/lib/src/org/godotengine/godot/FullScreenGodotApp.java

@@ -32,11 +32,12 @@ package org.godotengine.godot;
 
 
 import android.content.Intent;
 import android.content.Intent;
 import android.os.Bundle;
 import android.os.Bundle;
-import android.view.KeyEvent;
+import android.util.Log;
 
 
 import androidx.annotation.CallSuper;
 import androidx.annotation.CallSuper;
 import androidx.annotation.NonNull;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentActivity;
 import androidx.fragment.app.FragmentActivity;
 
 
 /**
 /**
@@ -46,6 +47,8 @@ import androidx.fragment.app.FragmentActivity;
  * within an Android app.
  * within an Android app.
  */
  */
 public abstract class FullScreenGodotApp extends FragmentActivity implements GodotHost {
 public abstract class FullScreenGodotApp extends FragmentActivity implements GodotHost {
+	private static final String TAG = FullScreenGodotApp.class.getSimpleName();
+
 	@Nullable
 	@Nullable
 	private Godot godotFragment;
 	private Godot godotFragment;
 
 
@@ -53,12 +56,33 @@ public abstract class FullScreenGodotApp extends FragmentActivity implements God
 	public void onCreate(Bundle savedInstanceState) {
 	public void onCreate(Bundle savedInstanceState) {
 		super.onCreate(savedInstanceState);
 		super.onCreate(savedInstanceState);
 		setContentView(R.layout.godot_app_layout);
 		setContentView(R.layout.godot_app_layout);
-		godotFragment = initGodotInstance();
-		if (godotFragment == null) {
-			throw new IllegalStateException("Godot instance must be non-null.");
+
+		Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.godot_fragment_container);
+		if (currentFragment instanceof Godot) {
+			Log.v(TAG, "Reusing existing Godot fragment instance.");
+			godotFragment = (Godot)currentFragment;
+		} else {
+			Log.v(TAG, "Creating new Godot fragment instance.");
+			godotFragment = initGodotInstance();
+			if (godotFragment == null) {
+				throw new IllegalStateException("Godot instance must be non-null.");
+			}
+
+			getSupportFragmentManager().beginTransaction().replace(R.id.godot_fragment_container, godotFragment).setPrimaryNavigationFragment(godotFragment).commitNowAllowingStateLoss();
 		}
 		}
+	}
 
 
-		getSupportFragmentManager().beginTransaction().replace(R.id.godot_fragment_container, godotFragment).setPrimaryNavigationFragment(godotFragment).commitNowAllowingStateLoss();
+	@Override
+	public void onDestroy() {
+		super.onDestroy();
+		onGodotForceQuit(godotFragment);
+	}
+
+	@Override
+	public final void onGodotForceQuit(Godot instance) {
+		if (instance == godotFragment) {
+			System.exit(0);
+		}
 	}
 	}
 
 
 	@Override
 	@Override

+ 5 - 4
platform/android/java/lib/src/org/godotengine/godot/Godot.java

@@ -657,8 +657,6 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC
 
 
 		super.onDestroy();
 		super.onDestroy();
 
 
-		// TODO: This is a temp solution. The proper fix will involve tracking down and properly shutting down each
-		// native Godot components that is started in Godot#onVideoInit.
 		forceQuit();
 		forceQuit();
 	}
 	}
 
 
@@ -842,8 +840,11 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC
 	}
 	}
 
 
 	private void forceQuit() {
 	private void forceQuit() {
-		getActivity().finish();
-		System.exit(0);
+		// TODO: This is a temp solution. The proper fix will involve tracking down and properly shutting down each
+		// native Godot components that is started in Godot#onVideoInit.
+		if (godotHost != null) {
+			godotHost.onGodotForceQuit(this);
+		}
 	}
 	}
 
 
 	private boolean obbIsCorrupted(String f, String main_pack_md5) {
 	private boolean obbIsCorrupted(String f, String main_pack_md5) {

+ 5 - 0
platform/android/java/lib/src/org/godotengine/godot/GodotHost.java

@@ -53,4 +53,9 @@ public interface GodotHost {
 	 * Invoked on the render thread when the Godot main loop has started.
 	 * Invoked on the render thread when the Godot main loop has started.
 	 */
 	 */
 	default void onGodotMainLoopStarted() {}
 	default void onGodotMainLoopStarted() {}
+
+	/**
+	 * Invoked on the UI thread as the last step of the Godot instance clean up phase.
+	 */
+	default void onGodotForceQuit(Godot instance) {}
 }
 }