Fix Immersive Mode On Older Android

This commit is contained in:
TheBrokenRail
2023-11-05 16:11:09 -05:00
committed by iProgramInCpp
parent 5bb20dae24
commit ec12755632
2 changed files with 92 additions and 24 deletions

View File

@@ -0,0 +1,88 @@
package io.github.reminecraftpe;
import android.annotation.TargetApi;
import android.app.Activity;
import android.os.Build;
import android.view.View;
import android.view.Window;
import android.view.WindowInsets;
import android.view.WindowInsetsController;
import android.view.WindowManager;
public abstract class ImmersiveModeStrategy {
protected final Activity activity;
private ImmersiveModeStrategy(Activity activity) {
this.activity = activity;
}
public abstract void onCreate();
public abstract void onWindowFocusChanged(boolean hasFocus);
static ImmersiveModeStrategy create(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
return new Modern(activity);
} else {
return new Legacy(activity);
}
}
@TargetApi(Build.VERSION_CODES.R)
private static class Modern extends ImmersiveModeStrategy {
private Modern(Activity activity) {
super(activity);
}
@Override
public void onCreate() {
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
if (hasFocus) {
activity.getWindow().setDecorFitsSystemWindows(false);
WindowInsetsController controller = activity.getWindow().getInsetsController();
if (controller != null) {
controller.hide(WindowInsets.Type.systemBars());
controller.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
}
}
}
}
@SuppressWarnings("deprecation")
private static class Legacy extends ImmersiveModeStrategy implements View.OnSystemUiVisibilityChangeListener {
private Legacy(Activity activity) {
super(activity);
}
@Override
public void onCreate() {
activity.getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(this);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
if (hasFocus) {
Window window = activity.getWindow();
window.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 |
View.INVISIBLE
);
window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
window.clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
}
}
@Override
public void onSystemUiVisibilityChange(int visibility) {
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0 || (visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) {
onWindowFocusChanged(true);
}
}
}
}

View File

@@ -2,14 +2,13 @@ package io.github.reminecraftpe;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.WindowInsets;
import android.view.WindowInsetsController;
import android.view.WindowManager;
import org.libsdl.app.LimitedSDLActivity;
public class MainActivity extends LimitedSDLActivity {
private final ImmersiveModeStrategy immersiveModeStrategy = ImmersiveModeStrategy.create(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -18,33 +17,14 @@ public class MainActivity extends LimitedSDLActivity {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
getWindow().getAttributes().layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
}
immersiveModeStrategy.onCreate();
}
@Override
@SuppressWarnings("deprecation")
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
// Fullscreen
if (hasFocus) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
getWindow().setDecorFitsSystemWindows(false);
WindowInsetsController controller = getWindow().getInsetsController();
if (controller != null) {
controller.hide(WindowInsets.Type.systemBars());
controller.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
}
} else {
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 |
View.INVISIBLE
);
}
}
immersiveModeStrategy.onWindowFocusChanged(hasFocus);
}
}