Skip to content

Commit c1a71e3

Browse files
authored
Merge pull request #498 from Countly/fix_28_29_notch
fix: 28,29 notched phones
2 parents cc03c7a + c388889 commit c1a71e3

File tree

2 files changed

+70
-3
lines changed

2 files changed

+70
-3
lines changed

sdk/src/main/java/ly/count/android/sdk/ModuleContent.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ly.count.android.sdk;
22

3+
import android.app.Activity;
34
import android.content.Intent;
45
import android.content.res.Configuration;
56
import android.content.res.Resources;
@@ -58,6 +59,13 @@ void initFinished(@NotNull CountlyConfig config) {
5859
}
5960
}
6061

62+
@Override
63+
void onActivityStarted(Activity activity, int updatedActivityCount) {
64+
if (UtilsDevice.cutout == null && activity != null) {
65+
UtilsDevice.getCutout(activity);
66+
}
67+
}
68+
6169
void fetchContentsInternal(@NonNull String[] categories) {
6270
L.d("[ModuleContent] fetchContentsInternal, shouldFetchContents: [" + shouldFetchContents + "], categories: [" + Arrays.toString(categories) + "]");
6371

sdk/src/main/java/ly/count/android/sdk/UtilsDevice.java

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,24 @@
33
import android.annotation.TargetApi;
44
import android.app.Activity;
55
import android.content.Context;
6+
import android.content.res.Configuration;
67
import android.graphics.Insets;
78
import android.graphics.Rect;
89
import android.os.Build;
910
import android.util.DisplayMetrics;
1011
import android.view.Display;
12+
import android.view.DisplayCutout;
13+
import android.view.View;
14+
import android.view.Window;
1115
import android.view.WindowInsets;
1216
import android.view.WindowManager;
1317
import android.view.WindowMetrics;
1418
import androidx.annotation.NonNull;
1519

1620
class UtilsDevice {
21+
22+
static DisplayCutout cutout = null;
23+
1724
private UtilsDevice() {
1825
}
1926

@@ -25,7 +32,7 @@ static DisplayMetrics getDisplayMetrics(@NonNull final Context context) {
2532
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
2633
applyWindowMetrics(context, wm, metrics);
2734
} else {
28-
applyLegacyMetrics(wm, metrics);
35+
applyLegacyMetrics(context, wm, metrics);
2936
}
3037
return metrics;
3138
}
@@ -84,11 +91,63 @@ private static void applyWindowMetrics(@NonNull Context context,
8491
}
8592
}
8693

94+
/**
95+
* Tries to extract cutout information from the activity for api level 28-29
96+
*
97+
* @param activity Activity to extract cutout from
98+
*/
99+
static void getCutout(@NonNull Activity activity) {
100+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
101+
Window window = activity.getWindow();
102+
if (window == null) return;
103+
104+
View decorView = window.getDecorView();
105+
if (decorView == null) return;
106+
107+
decorView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
108+
@Override
109+
public void onViewAttachedToWindow(View v) {
110+
WindowInsets insets = v.getRootWindowInsets();
111+
if (insets != null) {
112+
DisplayCutout cutout1 = insets.getDisplayCutout();
113+
if (cutout1 != null && !cutout1.getBoundingRects().isEmpty()) {
114+
cutout = cutout1;
115+
}
116+
}
117+
v.removeOnAttachStateChangeListener(this);
118+
}
119+
120+
@Override
121+
public void onViewDetachedFromWindow(View v) {
122+
}
123+
});
124+
}
125+
}
126+
87127
@SuppressWarnings("deprecation")
88-
private static void applyLegacyMetrics(@NonNull WindowManager wm,
128+
private static void applyLegacyMetrics(@NonNull Context context,
129+
@NonNull WindowManager wm,
89130
@NonNull DisplayMetrics outMetrics) {
90131
final Display display = wm.getDefaultDisplay();
91132
display.getRealMetrics(outMetrics);
92-
//getMetrics gives us size minus navigation bar
133+
134+
if (context instanceof Activity) {
135+
getCutout((Activity) context);
136+
}
137+
138+
boolean isLandscape = context.getResources().getConfiguration().orientation
139+
== Configuration.ORIENTATION_LANDSCAPE;
140+
141+
if (cutout != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
142+
if (isLandscape) {
143+
// In landscape, top/bottom insets become width, left/right become height
144+
outMetrics.widthPixels -= (cutout.getSafeInsetTop() + cutout.getSafeInsetBottom());
145+
outMetrics.heightPixels -= (cutout.getSafeInsetLeft() + cutout.getSafeInsetRight());
146+
} else {
147+
// Portrait
148+
outMetrics.heightPixels -= (cutout.getSafeInsetTop() + cutout.getSafeInsetBottom());
149+
outMetrics.widthPixels -= (cutout.getSafeInsetLeft() + cutout.getSafeInsetRight());
150+
}
151+
}
93152
}
94153
}

0 commit comments

Comments
 (0)