From 6a4705a659042fbb4b8d36b499a6c922f98f1bb6 Mon Sep 17 00:00:00 2001 From: Arif Burak Demiray Date: Thu, 26 Feb 2026 15:23:04 +0300 Subject: [PATCH] fix: top on 35 and bottom below 30 --- CHANGELOG.md | 3 ++ .../count/android/sdk/SafeAreaCalculator.java | 32 ++++++++----------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83f4b4384..8de226225 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## XX.XX.XX +* Improved content display positioning in safe area mode + ## 26.1.0 * Extended server configuration capabilities with server-controlled listing filters: * Event filters (blacklist/whitelist) to control which events are recorded. diff --git a/sdk/src/main/java/ly/count/android/sdk/SafeAreaCalculator.java b/sdk/src/main/java/ly/count/android/sdk/SafeAreaCalculator.java index 705b80bbf..fb2528a6a 100644 --- a/sdk/src/main/java/ly/count/android/sdk/SafeAreaCalculator.java +++ b/sdk/src/main/java/ly/count/android/sdk/SafeAreaCalculator.java @@ -11,7 +11,6 @@ import android.util.DisplayMetrics; import android.view.Display; import android.view.DisplayCutout; -import android.view.View; import android.view.WindowInsets; import android.view.WindowManager; import android.view.WindowMetrics; @@ -77,9 +76,9 @@ private static SafeAreaDimensions calculateSafeAreaDimensionsR(@NonNull Context L.d("[SafeAreaCalculator] calculateSafeAreaDimensionsR, mapped orientation dimensions (px) - Portrait: [" + portraitWidth + "x" + portraitHeight + "] Landscape: [" + landscapeWidth + "x" + landscapeHeight + "]"); SafeAreaInsets portraitInsets = calculateInsetsForOrientation( - context, windowInsets, true, density, portraitWidth, portraitHeight, L); + windowInsets, true, density, portraitWidth, portraitHeight, L); SafeAreaInsets landscapeInsets = calculateInsetsForOrientation( - context, windowInsets, false, density, landscapeWidth, landscapeHeight, L); + windowInsets, false, density, landscapeWidth, landscapeHeight, L); SafeAreaDimensions result = new SafeAreaDimensions( portraitInsets.width, @@ -144,8 +143,7 @@ private static SafeAreaDimensions calculateSafeAreaDimensionsLegacy(@NonNull Con } @TargetApi(Build.VERSION_CODES.R) - private static SafeAreaInsets calculateInsetsForOrientation(@NonNull Context context, - @NonNull WindowInsets windowInsets, boolean isPortrait, float density, + private static SafeAreaInsets calculateInsetsForOrientation(@NonNull WindowInsets windowInsets, boolean isPortrait, float density, int widthForOrientation, int heightForOrientation, @NonNull ModuleLog L) { String orientationStr = isPortrait ? "portrait" : "landscape"; @@ -159,15 +157,13 @@ private static SafeAreaInsets calculateInsetsForOrientation(@NonNull Context con int cutoutInset = 0; int navBarInset = 0; - boolean isActivity = context instanceof Activity; - boolean statusBarVisible = windowInsets.isVisible(WindowInsets.Type.statusBars()); boolean navBarVisible = windowInsets.isVisible(WindowInsets.Type.navigationBars()); boolean cutoutVisible = windowInsets.isVisible(WindowInsets.Type.displayCutout()); - L.d("[SafeAreaCalculator] calculateInsetsForOrientation [" + orientationStr + "], context type: [" + (isActivity ? "Activity" : "Non-Activity") + "], visibility - statusBar=[" + statusBarVisible + "], navBar=[" + navBarVisible + "], cutout=[" + cutoutVisible + "]"); + L.d("[SafeAreaCalculator] calculateInsetsForOrientation [" + orientationStr + "], visibility - statusBar=[" + statusBarVisible + "], navBar=[" + navBarVisible + "], cutout=[" + cutoutVisible + "]"); - if (statusBarVisible && isActivity) { + if (statusBarVisible) { Insets statusBarInsets = windowInsets.getInsets(WindowInsets.Type.statusBars()); statusBarInset = statusBarInsets.top; topInset = Math.max(topInset, statusBarInset); @@ -194,12 +190,12 @@ private static SafeAreaInsets calculateInsetsForOrientation(@NonNull Context con if (navBarVisible) { Insets navBarInsets = windowInsets.getInsets(WindowInsets.Type.navigationBars()); - + boolean isGestureNav = isGestureNavigation(navBarInsets, density); String navType = isGestureNav ? "gesture" : "button"; - + L.d("[SafeAreaCalculator] calculateInsetsForOrientation [" + orientationStr + "], nav bar type: [" + navType + "], raw insets (px) - top=[" + navBarInsets.top + "], bottom=[" + navBarInsets.bottom + "], left=[" + navBarInsets.left + "], right=[" + navBarInsets.right + "]"); - + if (isPortrait) { navBarInset = navBarInsets.bottom; if (navBarInset == 0) { @@ -237,7 +233,7 @@ private static SafeAreaInsets calculateInsetsForOrientation(@NonNull Context con if (!isPortrait) { Insets navBarInsets = navBarVisible ? windowInsets.getInsets(WindowInsets.Type.navigationBars()) : Insets.NONE; Insets cutoutInsets = cutoutVisible ? windowInsets.getInsets(WindowInsets.Type.displayCutout()) : Insets.NONE; - + if (navBarInsets.left > 0) { leftOffset = navBarInsets.left; L.d("[SafeAreaCalculator] calculateInsetsForOrientation [" + orientationStr + "], nav bar at left - leftOffset=[" + leftOffset + "] (navBar=" + navBarInsets.left + ")"); @@ -296,14 +292,14 @@ private static SafeAreaInsets calculateInsetsLegacy(@NonNull Context context, L.d("[SafeAreaCalculator] calculateInsetsLegacy [" + orientationStr + "], top inset (px) - using MAX(statusBar=" + statusBarInset + ", cutout=" + cutoutInset + ") = [" + topInset + "]"); int navBarHeightFromResource = getNavigationBarHeight(context, isPortrait); - + boolean navBarVisible = isNavigationBarVisible(context); L.d("[SafeAreaCalculator] calculateInsetsLegacy [" + orientationStr + "], nav bar visible: [" + navBarVisible + "], resource height (px): [" + navBarHeightFromResource + "]"); - + if (navBarVisible) { boolean isGestureNav = navBarHeightFromResource < (int) (density * 40); // < 40dp likely gesture String navType = isGestureNav ? "gesture" : "button"; - + navBarInset = navBarHeightFromResource; if (navBarInset == 0) { navBarInset = getDefaultNavBarInset(isGestureNav, density); @@ -311,11 +307,11 @@ private static SafeAreaInsets calculateInsetsLegacy(@NonNull Context context, } else { L.d("[SafeAreaCalculator] calculateInsetsLegacy [" + orientationStr + "], nav bar type: [" + navType + "], height (px): [" + navBarInset + "]"); } - + if (isPortrait) { bottomInset = Math.max(bottomInset, navBarInset); } else { - bottomInset = Math.max(bottomInset, navBarInset); + bottomInset = Math.min(bottomInset, navBarInset); } }