Rely on SDL for Android fullscreen window behavior

This commit is contained in:
Joshua Granick
2019-10-08 13:41:36 -07:00
parent 274ae5fe3b
commit bb2af5eed1
2 changed files with 203 additions and 241 deletions

View File

@@ -45,7 +45,11 @@ namespace lime {
int sdlWindowFlags = 0;
#ifdef ANDROID
if (flags & WINDOW_FLAG_FULLSCREEN) sdlWindowFlags |= SDL_WINDOW_FULLSCREEN;
#else
if (flags & WINDOW_FLAG_FULLSCREEN) sdlWindowFlags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
#endif
if (flags & WINDOW_FLAG_RESIZABLE) sdlWindowFlags |= SDL_WINDOW_RESIZABLE;
if (flags & WINDOW_FLAG_BORDERLESS) sdlWindowFlags |= SDL_WINDOW_BORDERLESS;
if (flags & WINDOW_FLAG_HIDDEN) sdlWindowFlags |= SDL_WINDOW_HIDDEN;
@@ -163,6 +167,7 @@ namespace lime {
if (!sdlWindow) {
printf ("Could not create SDL window: %s.\n", SDL_GetError ());
return;
}
@@ -289,6 +294,14 @@ namespace lime {
}
#ifdef ANDROID
// TODO: Is this extra call needed?
if (flags & WINDOW_FLAG_FULLSCREEN)
{
SetFullscreen(true);
}
#endif
}
@@ -925,6 +938,9 @@ namespace lime {
if (fullscreen) {
#ifdef ANDROID
SDL_SetWindowFullscreen (sdlWindow, SDL_WINDOW_FULLSCREEN);
#else
if (displayModeSet) {
SDL_SetWindowFullscreen (sdlWindow, SDL_WINDOW_FULLSCREEN);
@@ -934,6 +950,7 @@ namespace lime {
SDL_SetWindowFullscreen (sdlWindow, SDL_WINDOW_FULLSCREEN_DESKTOP);
}
#endif
} else {

View File

@@ -24,431 +24,376 @@ import java.util.List;
public class GameActivity extends SDLActivity {
private static AssetManager assetManager;
private static List<Extension> extensions;
private static DisplayMetrics metrics;
public Handler handler;
public static double getDisplayXDPI () {
if (metrics == null) {
metrics = new DisplayMetrics ();
Extension.mainActivity.getWindowManager ().getDefaultDisplay ().getMetrics (metrics);
}
return metrics.xdpi;
}
protected String[] getLibraries () {
return new String[] {
::foreach ndlls::"::name::",
::end::"ApplicationMain"
};
}
@Override protected String getMainSharedObject () {
return "libApplicationMain.so";
}
@Override protected String getMainFunction () {
return "hxcpp_main";
}
@Override protected void onActivityResult (int requestCode, int resultCode, Intent data) {
for (Extension extension : extensions) {
if (!extension.onActivityResult (requestCode, resultCode, data)) {
return;
}
}
super.onActivityResult (requestCode, resultCode, data);
}
@Override public void onBackPressed () {
for (Extension extension : extensions) {
if (!extension.onBackPressed ()) {
return;
}
}
super.onBackPressed ();
}
protected void onCreate (Bundle state) {
super.onCreate (state);
assetManager = getAssets ();
handler = new Handler ();
Extension.assetManager = assetManager;
Extension.callbackHandler = handler;
Extension.mainActivity = this;
Extension.mainContext = this;
Extension.mainView = mLayout;
Extension.packageName = getApplicationContext ().getPackageName ();
if (Build.VERSION.SDK_INT >= 16 && Build.VERSION.SDK_INT < 19) {
View decorView = getWindow ().getDecorView ();
decorView.setOnSystemUiVisibilityChangeListener (new View.OnSystemUiVisibilityChangeListener () {
@Override public void onSystemUiVisibilityChange (int visibility) {
updateSystemUI ();
}
});
}
if (extensions == null) {
extensions = new ArrayList<Extension> ();
::if (ANDROID_EXTENSIONS != null)::::foreach ANDROID_EXTENSIONS::
extensions.add (new ::__current__:: ());::end::::end::
}
for (Extension extension : extensions) {
extension.onCreate (state);
}
}
@Override protected void onDestroy () {
for (Extension extension : extensions) {
extension.onDestroy ();
}
super.onDestroy ();
}
@Override public void onLowMemory () {
super.onLowMemory ();
for (Extension extension : extensions) {
extension.onLowMemory ();
}
}
@Override protected void onNewIntent (final Intent intent) {
for (Extension extension : extensions) {
extension.onNewIntent (intent);
}
super.onNewIntent (intent);
}
@Override protected void onPause () {
super.onPause ();
for (Extension extension : extensions) {
extension.onPause ();
}
}
::if (ANDROID_TARGET_SDK_VERSION >= 23)::
@Override public void onRequestPermissionsResult (int requestCode, String permissions[], int[] grantResults) {
for (Extension extension : extensions) {
if (!extension.onRequestPermissionsResult (requestCode, permissions, grantResults)) {
return;
}
}
super.onRequestPermissionsResult (requestCode, permissions, grantResults);
}
::end::
@Override protected void onRestart () {
super.onRestart ();
for (Extension extension : extensions) {
extension.onRestart ();
}
}
@Override protected void onResume () {
super.onResume ();
updateSystemUI ();
for (Extension extension : extensions) {
extension.onResume ();
}
}
@Override protected void onRestoreInstanceState (Bundle savedState) {
super.onRestoreInstanceState (savedState);
for (Extension extension : extensions) {
extension.onRestoreInstanceState (savedState);
}
}
@Override protected void onSaveInstanceState (Bundle outState) {
super.onSaveInstanceState (outState);
for (Extension extension : extensions) {
extension.onSaveInstanceState (outState);
}
}
@Override protected void onStart () {
super.onStart ();
updateSystemUI ();
for (Extension extension : extensions) {
extension.onStart ();
}
}
@Override protected void onStop () {
super.onStop ();
for (Extension extension : extensions) {
extension.onStop ();
}
}
::if (ANDROID_TARGET_SDK_VERSION >= 14)::
@Override public void onTrimMemory (int level) {
if (Build.VERSION.SDK_INT >= 14) {
super.onTrimMemory (level);
for (Extension extension : extensions) {
extension.onTrimMemory (level);
}
}
}
::end::
@Override public void onWindowFocusChanged (boolean hasFocus) {
super.onWindowFocusChanged (hasFocus);
updateSystemUI ();
}
public static void openFile (String path) {
try {
String extension = path;
int index = path.lastIndexOf ('.');
if (index > 0) {
extension = path.substring (index + 1);
}
String mimeType = MimeTypeMap.getSingleton ().getMimeTypeFromExtension (extension);
File file = new File (path);
Intent intent = new Intent ();
intent.setAction (Intent.ACTION_VIEW);
intent.setDataAndType (Uri.fromFile (file), mimeType);
Extension.mainActivity.startActivity (intent);
} catch (Exception e) {
Log.e ("GameActivity", e.toString ());
return;
}
}
public static void openURL (String url, String target) {
Intent browserIntent = new Intent (Intent.ACTION_VIEW).setData (Uri.parse (url));
try {
Extension.mainActivity.startActivity (browserIntent);
} catch (Exception e) {
Log.e ("GameActivity", e.toString ());
return;
}
}
public static void postUICallback (final long handle) {
Extension.callbackHandler.post (new Runnable () {
@Override public void run () {
Lime.onCallback (handle);
}
});
}
public static void updateSystemUI () {
::if WIN_FULLSCREEN::::if (ANDROID_TARGET_SDK_VERSION >= 19)::
boolean hasBackKey = KeyCharacterMap.deviceHasKey (KeyEvent.KEYCODE_BACK);
boolean hasHomeKey = KeyCharacterMap.deviceHasKey (KeyEvent.KEYCODE_HOME);
View decorView = Extension.mainActivity.getWindow ().getDecorView ();
if (Build.VERSION.SDK_INT >= 19) {
decorView.setSystemUiVisibility (View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
} else if (hasBackKey && hasHomeKey && Build.VERSION.SDK_INT >= 16) {
decorView.setSystemUiVisibility (View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_LOW_PROFILE);
} else if (Build.VERSION.SDK_INT >= 15) {
decorView.setSystemUiVisibility (View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_LOW_PROFILE);
}
::end::::end::
}
public static void vibrate (int period, int duration) {
Vibrator v = (Vibrator)mSingleton.getSystemService (Context.VIBRATOR_SERVICE);
if (period == 0) {
v.vibrate (duration);
} else {
int periodMS = (int)Math.ceil (period / 2);
int count = (int)Math.ceil ((duration / period) * 2);
long[] pattern = new long[count];
for (int i = 0; i < count; i++) {
pattern[i] = periodMS;
}
v.vibrate (pattern, -1);
}
}
}