Skip to content

Commit a926095

Browse files
committed
simplify logic for getCutoutandStatusBarInsets and use immersive mode
1 parent fdc65b1 commit a926095

File tree

5 files changed

+39
-14
lines changed

5 files changed

+39
-14
lines changed

Examples/OneSignalDemo/app/src/main/java/com/onesignal/sdktest/activity/MainActivity.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.onesignal.sdktest.activity;
22

3-
import android.os.Build;
43
import android.os.Bundle;
5-
import android.view.WindowManager;
64

75
import androidx.appcompat.app.AppCompatActivity;
86

OneSignalSDK/onesignal/src/main/java/com/onesignal/InAppMessageView.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import android.view.Gravity;
1919
import android.view.View;
2020
import android.view.ViewGroup;
21+
import android.view.WindowInsets;
2122
import android.view.WindowManager;
2223
import android.view.animation.Animation;
2324
import android.webkit.WebView;
@@ -278,12 +279,15 @@ public void run() {
278279
* @param parentRelativeLayout root layout to attach to the pop up window
279280
*/
280281
private void createPopupWindow(@NonNull RelativeLayout parentRelativeLayout) {
282+
281283
popupWindow = new PopupWindow(
282284
parentRelativeLayout,
283285
hasBackground ? WindowManager.LayoutParams.MATCH_PARENT : pageWidth,
284286
hasBackground ? WindowManager.LayoutParams.MATCH_PARENT : WindowManager.LayoutParams.WRAP_CONTENT,
285287
true
286288
);
289+
290+
OSViewUtils.getWindowHeight(currentActivity);
287291
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
288292
popupWindow.setTouchable(true);
289293
// NOTE: This seems like the key to getting fullscreen under notches working?!

OneSignalSDK/onesignal/src/main/java/com/onesignal/OSInAppMessageController.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,6 @@
22

33
import android.app.AlertDialog;
44
import android.content.DialogInterface;
5-
import android.graphics.Insets;
6-
import android.graphics.Rect;
7-
import android.view.View;
8-
import android.view.Window;
95

106
import androidx.annotation.NonNull;
117
import androidx.annotation.Nullable;

OneSignalSDK/onesignal/src/main/java/com/onesignal/OSViewUtils.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import android.os.Build;
1010
import androidx.annotation.NonNull;
1111
import android.util.DisplayMetrics;
12+
import android.view.DisplayCutout;
1213
import android.view.View;
1314
import android.view.Window;
1415
import android.view.WindowInsets;
@@ -75,16 +76,33 @@ void available(@NonNull Activity currentActivity) {
7576
return rect;
7677
}
7778

78-
static int[] getWindowInsets(@NonNull Activity activity) {
79+
static int[] getCutoutAndStatusBarInsets(@NonNull Activity activity) {
7980
Rect frame = getWindowVisibleDisplayFrame(activity);
8081
View contentView = activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT);
82+
float rightInset = 0;
83+
float leftInset = 0;
8184
float topInset = (frame.top - contentView.getTop()) / Resources.getSystem().getDisplayMetrics().density;
8285
float bottomInset = (contentView.getBottom() - frame.bottom) / Resources.getSystem().getDisplayMetrics().density;
83-
float rightInset = (frame.right - contentView.getRight()) / Resources.getSystem().getDisplayMetrics().density;
84-
float leftInset = (contentView.getLeft() - frame.left) / Resources.getSystem().getDisplayMetrics().density;
86+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
87+
DisplayCutout cutout = activity.getWindowManager().getDefaultDisplay().getCutout();
88+
if (cutout != null) {
89+
rightInset = cutout.getSafeInsetRight() / Resources.getSystem().getDisplayMetrics().density;
90+
leftInset = cutout.getSafeInsetLeft() / Resources.getSystem().getDisplayMetrics().density;
91+
}
92+
}
8593
return new int[]{Math.round(topInset), Math.round(bottomInset), Math.round(rightInset), Math.round(leftInset)};
8694
}
8795

96+
static int getFullbleedWindowWidth (@NonNull Activity activity) {
97+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
98+
View decorView = activity.getWindow().getDecorView();
99+
return decorView.getWidth();
100+
} else {
101+
return getWindowWidth(activity);
102+
}
103+
}
104+
105+
88106
static int getWindowWidth(@NonNull Activity activity) {
89107
return getWindowVisibleDisplayFrame(activity).width();
90108
}

OneSignalSDK/onesignal/src/main/java/com/onesignal/WebViewManager.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.io.UnsupportedEncodingException;
2323

2424
import static com.onesignal.OSViewUtils.dpToPx;
25+
import static com.onesignal.OSViewUtils.getFullbleedWindowWidth;
2526

2627
// Manages WebView instances by pre-loading them, displaying them, and closing them when dismissed.
2728
// Includes a static map for pre-loading, showing, and dismissed so these events can't be duplicated.
@@ -136,7 +137,7 @@ static void dismissCurrentInAppMessage() {
136137
private static void setContentSafeAreaInsets(OSInAppMessageContent content, @NonNull final Activity activity) {
137138
String html = content.getContentHtml();
138139
String safeAreaInsetsScript = OSJavaScriptInterface.SET_SAFE_AREA_INSETS_SCRIPT;
139-
int[] insets = OSViewUtils.getWindowInsets(activity);
140+
int[] insets = OSViewUtils.getCutoutAndStatusBarInsets(activity);
140141
String safeAreaJSObject = String.format(OSJavaScriptInterface.SAFE_AREA_JS_OBJECT, insets[0] ,insets[1],insets[2],insets[3]);
141142
safeAreaInsetsScript = String.format(safeAreaInsetsScript, safeAreaJSObject);
142143
html += safeAreaInsetsScript;
@@ -321,7 +322,7 @@ private int pageRectToViewHeight(final @NonNull Activity activity, @NonNull JSON
321322
}
322323

323324
private void updateSafeAreaInsets() {
324-
int[] insets = OSViewUtils.getWindowInsets(activity);
325+
int[] insets = OSViewUtils.getCutoutAndStatusBarInsets(activity);
325326
String safeAreaInsetsObject = String.format(OSJavaScriptInterface.SAFE_AREA_JS_OBJECT, insets[0], insets[1], insets[2], insets[3]);
326327
String safeAreaInsetsFunction = String.format(OSJavaScriptInterface.SET_SAFE_AREA_INSETS_JS_FUNCTION, safeAreaInsetsObject);
327328
webView.evaluateJavascript(safeAreaInsetsFunction, null);
@@ -433,8 +434,11 @@ private void setupWebView(@NonNull final Activity currentActivity, final @NonNul
433434
webView.addJavascriptInterface(new OSJavaScriptInterface(), OSJavaScriptInterface.JS_OBJ_NAME);
434435
if (isFullScreen) {
435436
webView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
436-
View.SYSTEM_UI_FLAG_IMMERSIVE |
437-
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
437+
View.SYSTEM_UI_FLAG_IMMERSIVE |
438+
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
439+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
440+
webView.setFitsSystemWindows(false);
441+
}
438442
}
439443
blurryRenderingWebViewForKitKatWorkAround(webView);
440444

@@ -508,7 +512,12 @@ private static void enableWebViewRemoteDebugging() {
508512
}
509513

510514
private int getWebViewMaxSizeX(Activity activity) {
511-
int margin = messageContent.isFullScreen() ? 0 : (MARGIN_PX_SIZE * 2);
515+
if (messageContent.isFullScreen()) {
516+
return getFullbleedWindowWidth(activity);
517+
} else {
518+
519+
}
520+
int margin = (MARGIN_PX_SIZE * 2);
512521
return OSViewUtils.getWindowWidth(activity) - margin;
513522
}
514523

0 commit comments

Comments
 (0)