diff --git a/love/src/main/java/org/love2d/android/GameActivity.java b/love/src/main/java/org/love2d/android/GameActivity.java index 62253a9e..c934a862 100644 --- a/love/src/main/java/org/love2d/android/GameActivity.java +++ b/love/src/main/java/org/love2d/android/GameActivity.java @@ -36,6 +36,10 @@ public class GameActivity extends SDLActivity { public static final int EXTERNAL_STORAGE_REQUEST_CODE = 1; private static boolean immersiveActive = false; private static boolean mustCacheArchive = false; + public int safeAreaTop = 0; + public int safeAreaLeft = 0; + public int safeAreaBottom = 0; + public int safeAreaRight = 0; @Override protected String[] getLibraries() { @@ -66,6 +70,10 @@ public class GameActivity extends SDLActivity { super.onCreate(savedInstanceState); getWindowManager().getDefaultDisplay().getMetrics(metrics); + + if (android.os.Build.VERSION.SDK_INT >= 28) { + getWindow().getAttributes().layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; + } } @Override @@ -94,6 +102,8 @@ public class GameActivity extends SDLActivity { } else { gamePath = game.getPath(); } + // FIXME: Add support for "content://" URI, which is mandatory in Android Nougat + // as using "file://" protocol in that (and later) version is forbidden! } else { Log.e("GameActivity", "Unsupported scheme: '" + game.getScheme() + "'."); @@ -171,13 +181,19 @@ public class GameActivity extends SDLActivity { super.onResume(); if (immersiveActive) { - getWindow().getDecorView().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); + int flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; + + if (android.os.Build.VERSION.SDK_INT >= 16) { + flags |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE | + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | + View.SYSTEM_UI_FLAG_FULLSCREEN; + } + if (android.os.Build.VERSION.SDK_INT >= 19) { + flags |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + } + + getWindow().getDecorView().setSystemUiVisibility(flags); } } @@ -199,17 +215,22 @@ public class GameActivity extends SDLActivity { public void run() { synchronized (lock) { if (immersive_enabled) { + int flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; + + if (android.os.Build.VERSION.SDK_INT >= 16) { + flags |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE | + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | + View.SYSTEM_UI_FLAG_FULLSCREEN; + } + if (android.os.Build.VERSION.SDK_INT >= 19) { + flags |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + } + getWindow().getDecorView().setSystemUiVisibility(flags); + } else if (android.os.Build.VERSION.SDK_INT >= 16) { getWindow().getDecorView().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 { - getWindow().getDecorView().setSystemUiVisibility( - View.SYSTEM_UI_FLAG_LAYOUT_STABLE - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + View.SYSTEM_UI_FLAG_LAYOUT_STABLE | + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN ); } @@ -391,4 +412,21 @@ public class GameActivity extends SDLActivity { return ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; } + + @Keep + public boolean initializeSafeArea() { + if (android.os.Build.VERSION.SDK_INT >= 28) { + DisplayCutout cutout = getWindow().getDecorView().getRootWindowInsets().getDisplayCutout(); + + if (cutout != null) { + safeAreaTop = cutout.getSafeInsetTop(); + safeAreaLeft = cutout.getSafeInsetLeft(); + safeAreaBottom = cutout.getSafeInsetBottom(); + safeAreaRight = cutout.getSafeInsetRight(); + return true; + } + } + + return false; + } }