That fuck shit the fascists are using
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}