|
8 | 8 | import android.database.Cursor; |
9 | 9 | import android.graphics.Bitmap; |
10 | 10 | import android.graphics.Color; |
| 11 | +import android.graphics.Insets; |
11 | 12 | import android.graphics.Paint; |
12 | 13 | import android.graphics.Paint.Style; |
13 | 14 | import android.graphics.Point; |
14 | 15 | import android.net.Uri; |
| 16 | +import android.os.Build; |
15 | 17 | import android.os.ParcelFileDescriptor; |
16 | 18 | import android.provider.DocumentsContract; |
17 | 19 | import android.util.DisplayMetrics; |
18 | 20 | import android.util.Log; |
19 | 21 | import android.util.TypedValue; |
20 | 22 | import android.view.View; |
21 | 23 | import android.view.ViewGroup; |
| 24 | +import android.view.WindowInsets; |
22 | 25 | import android.widget.Button; |
23 | 26 | import android.widget.RelativeLayout; |
24 | 27 | import android.widget.RelativeLayout.LayoutParams; |
@@ -68,17 +71,41 @@ public static int getPixels(Activity v, double dipValue) { |
68 | 71 | * Y position from 0 to 1 |
69 | 72 | */ |
70 | 73 | public static void setLayoutPosition(Activity a, View view, double x, double y) { |
71 | | - DisplayMetrics displayMetrics = a.getResources().getDisplayMetrics(); |
72 | | - float screenWidthDp = displayMetrics.widthPixels / displayMetrics.density; |
73 | | - float screenHeightDp = displayMetrics.heightPixels / displayMetrics.density; |
| 74 | + int padW = 0; |
| 75 | + int padH = 0; |
| 76 | + |
| 77 | + // Consider the display cut out when calculating the button position to avoid that they are |
| 78 | + // rendered out of bounds. |
| 79 | + // Starting from Android 15 (SDK35) the reported display metrics are of the entire screen |
| 80 | + // including the system bar but our activity has insets configured |
| 81 | + // Substract the size of the display cutout to prevent that our buttons are displayed out of |
| 82 | + // bounds. |
| 83 | + if (Build.VERSION.SDK_INT >= 35) { |
| 84 | + WindowInsets insets = a.getWindow().getDecorView().getRootWindowInsets(); |
| 85 | + if (insets != null) { |
| 86 | + Insets systemBar = insets.getInsets(WindowInsets.Type.displayCutout()); |
| 87 | + |
| 88 | + padW = systemBar.left + systemBar.right; |
| 89 | + padH = systemBar.top + systemBar.bottom; |
| 90 | + } |
| 91 | + } |
| 92 | + |
| 93 | + DisplayMetrics displayMetrics = a.getResources().getDisplayMetrics(); |
| 94 | + float screenWidthDp = (displayMetrics.widthPixels) / displayMetrics.density; |
| 95 | + float screenHeightDp = (displayMetrics.heightPixels) / displayMetrics.density; |
| 96 | + |
| 97 | + float screenWidthDpFit = (displayMetrics.widthPixels - padW) / displayMetrics.density; |
| 98 | + float screenHeightDpFit = (displayMetrics.heightPixels - padH) / displayMetrics.density; |
| 99 | + |
| 100 | + float widthRatio = screenWidthDpFit / screenWidthDp; |
| 101 | + float heightRatio = screenHeightDpFit / screenHeightDp; |
74 | 102 |
|
75 | | - RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, |
76 | | - LayoutParams.WRAP_CONTENT); |
| 103 | + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); |
77 | 104 |
|
78 | | - params.leftMargin = Helper.getPixels(a, screenWidthDp * x); |
79 | | - params.topMargin = Helper.getPixels(a, screenHeightDp * y); |
| 105 | + params.leftMargin = Helper.getPixels(a, screenWidthDpFit * x * widthRatio); |
| 106 | + params.topMargin = Helper.getPixels(a, screenHeightDpFit * y * heightRatio); |
80 | 107 |
|
81 | | - view.setLayoutParams(params); |
| 108 | + view.setLayoutParams(params); |
82 | 109 | } |
83 | 110 |
|
84 | 111 | public static Paint getUIPainter() { |
|
0 commit comments