That fuck shit the fascists are using
at master 145 lines 5.3 kB view raw
1package org.tm.archive.util; 2 3import android.app.Activity; 4import android.os.Build; 5import android.view.View; 6import android.view.ViewGroup; 7import android.view.Window; 8import android.view.WindowManager; 9 10import androidx.annotation.NonNull; 11import androidx.core.graphics.Insets; 12import androidx.core.view.DisplayCutoutCompat; 13import androidx.core.view.ViewCompat; 14import androidx.core.view.WindowInsetsCompat; 15 16/** 17 * Encapsulates logic to properly show/hide system UI/chrome in a full screen setting. Also 18 * handles adjusting to notched devices as long as you call {@link #configureToolbarLayout(View, View)}. 19 */ 20public final class FullscreenHelper { 21 22 @NonNull private final Activity activity; 23 24 public FullscreenHelper(@NonNull Activity activity) { 25 this(activity, false); 26 } 27 28 /** 29 * @param activity The activity we are controlling 30 * @param suppressShowSystemUI Suppresses the initial 'show system ui' call, which can cause the status and navbar to flash 31 * during some animations. 32 */ 33 public FullscreenHelper(@NonNull Activity activity, boolean suppressShowSystemUI) { 34 this.activity = activity; 35 36 if (Build.VERSION.SDK_INT >= 28) { 37 activity.getWindow().getAttributes().layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; 38 } 39 40 if (!suppressShowSystemUI) { 41 showSystemUI(); 42 } 43 } 44 45 public void configureToolbarLayout(@NonNull View spacer, @NonNull View toolbar) { 46 ViewCompat.setOnApplyWindowInsetsListener(spacer, (view, insets) -> { 47 setSpacerHeight(view, insets.getSystemWindowInsetTop()); 48 return insets; 49 }); 50 51 ViewCompat.setOnApplyWindowInsetsListener(toolbar, (view, insets) -> { 52 int[] padding = makePaddingValues(insets); 53 toolbar.setPadding(padding[0], 0, padding[1], 0); 54 return insets; 55 }); 56 } 57 58 public static void configureBottomBarLayout(@NonNull Activity activity, @NonNull View spacer, @NonNull View bottomBar) { 59 ViewCompat.setOnApplyWindowInsetsListener(spacer, (view, insets) -> { 60 setSpacerHeight(view, insets.getSystemWindowInsetBottom()); 61 return insets; 62 }); 63 64 ViewCompat.setOnApplyWindowInsetsListener(bottomBar, (view, insets) -> { 65 int[] padding = makePaddingValues(insets); 66 bottomBar.setPadding(padding[0], 0, padding[1], 0); 67 return insets; 68 }); 69 } 70 71 private static void setSpacerHeight(@NonNull View spacer, int height) { 72 ViewGroup.LayoutParams params = spacer.getLayoutParams(); 73 74 params.height = height; 75 76 spacer.setLayoutParams(params); 77 spacer.setVisibility(View.VISIBLE); 78 } 79 80 private static int[] makePaddingValues(WindowInsetsCompat insets) { 81 Insets tappable = insets.getTappableElementInsets(); 82 DisplayCutoutCompat cutout = insets.getDisplayCutout(); 83 84 int leftPad = cutout == null ? tappable.left 85 : Math.max(tappable.left, cutout.getSafeInsetLeft()); 86 int rightPad = cutout == null ? tappable.right 87 : Math.max(tappable.right, cutout.getSafeInsetRight()); 88 89 return new int[]{leftPad, rightPad}; 90 } 91 92 public void showAndHideWithSystemUI(@NonNull Window window, @NonNull View... views) { 93 window.getDecorView().setOnSystemUiVisibilityChangeListener(visibility -> { 94 boolean hide = (visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0; 95 96 for (View view : views) { 97 view.animate() 98 .alpha(hide ? 0 : 1) 99 .withStartAction(() -> { 100 if (!hide) { 101 view.setVisibility(View.VISIBLE); 102 } 103 }) 104 .withEndAction(() -> { 105 if (hide) { 106 view.setVisibility(View.INVISIBLE); 107 } 108 }) 109 .start(); 110 } 111 }); 112 } 113 114 public void toggleUiVisibility() { 115 if (isSystemUiVisible()) { 116 showSystemUI(); 117 } else { 118 hideSystemUI(); 119 } 120 } 121 122 public boolean isSystemUiVisible() { 123 int systemUiVisibility = activity.getWindow().getDecorView().getSystemUiVisibility(); 124 return (systemUiVisibility & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0; 125 } 126 127 public void hideSystemUI() { 128 activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_IMMERSIVE | 129 View.SYSTEM_UI_FLAG_LAYOUT_STABLE | 130 View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | 131 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | 132 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | 133 View.SYSTEM_UI_FLAG_FULLSCREEN); 134 } 135 136 public void showSystemUI() { 137 showSystemUI(activity.getWindow()); 138 } 139 140 public static void showSystemUI(@NonNull Window window) { 141 window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | 142 View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | 143 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 144 } 145}