Merge pull request #51586 from m4gr3d/investigate_godot_resume_stalls_master
Resolve issue where the Godot app remains stuck when resuming.
This commit is contained in:
commit
af70288ee0
@ -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.");
|
|
||||||
}
|
|
||||||
|
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.godot_fragment_container, godotFragment).setPrimaryNavigationFragment(godotFragment).commitNowAllowingStateLoss();
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
onGodotForceQuit(godotFragment);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final void onGodotForceQuit(Godot instance) {
|
||||||
|
if (instance == godotFragment) {
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -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();
|
// TODO: This is a temp solution. The proper fix will involve tracking down and properly shutting down each
|
||||||
System.exit(0);
|
// 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) {
|
||||||
|
@ -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) {}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user