Skip to content

Commit 0824eb5

Browse files
committed
fix: Android Auto Overlay fix
1 parent ac049e6 commit 0824eb5

2 files changed

Lines changed: 26 additions & 10 deletions

File tree

‎app/build.gradle‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ android {
1515
minSdk 28
1616
targetSdk 36
1717
versionCode 1
18-
versionName "0.6"
18+
versionName "0.6.1"
1919
buildConfigField "boolean", "IS_BETA", "false"
2020

2121
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

‎app/src/main/java/com/drivehub/kamera/OverlayService.java‎

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
import android.app.Service;
77
import android.content.Context;
88
import android.content.Intent;
9+
import android.graphics.Rect;
910
import android.graphics.SurfaceTexture;
1011
import android.graphics.PixelFormat;
12+
import android.os.Build;
1113
import android.os.IBinder;
1214
import android.view.Gravity;
1315
import android.view.MotionEvent;
@@ -274,11 +276,10 @@ private int[] clampOverlaySize(int w) {
274276
float aspect = (float) DEFAULT_OVERLAY_WIDTH_PX / (float) DEFAULT_OVERLAY_HEIGHT_PX;
275277
int maxW = OVERLAY_MAX_WIDTH_PX;
276278
int maxH = OVERLAY_MAX_WIDTH_PX;
277-
if (windowManager != null) {
278-
android.util.DisplayMetrics dm = new android.util.DisplayMetrics();
279-
windowManager.getDefaultDisplay().getMetrics(dm);
280-
maxW = Math.min(maxW, dm.widthPixels);
281-
maxH = Math.min(maxH, dm.heightPixels);
279+
int[] screenSize = getAvailableScreenSizePx();
280+
if (screenSize != null) {
281+
maxW = Math.min(maxW, screenSize[0]);
282+
maxH = Math.min(maxH, screenSize[1]);
282283
}
283284
if (w < OVERLAY_MIN_WIDTH_PX) {
284285
w = OVERLAY_MIN_WIDTH_PX;
@@ -303,16 +304,31 @@ private int[] clampOverlaySize(int w) {
303304

304305
private void clampOverlayPositionToScreen() {
305306
if (windowManager == null || overlayParams == null) return;
306-
android.util.DisplayMetrics dm = new android.util.DisplayMetrics();
307-
windowManager.getDefaultDisplay().getMetrics(dm);
308-
int maxX = Math.max(0, dm.widthPixels - overlayParams.width);
309-
int maxY = Math.max(0, dm.heightPixels - overlayParams.height);
307+
int[] screenSize = getAvailableScreenSizePx();
308+
if (screenSize == null) return;
309+
int maxX = Math.max(0, screenSize[0] - overlayParams.width);
310+
int maxY = Math.max(0, screenSize[1] - overlayParams.height);
310311
if (overlayParams.x < 0) overlayParams.x = 0;
311312
if (overlayParams.y < 0) overlayParams.y = 0;
312313
if (overlayParams.x > maxX) overlayParams.x = maxX;
313314
if (overlayParams.y > maxY) overlayParams.y = maxY;
314315
}
315316

317+
// Android Auto can expose a smaller "current" app viewport than the actual interactive
318+
// overlay space. Maximum window metrics are a better fit for drag/resize bounds here.
319+
private int[] getAvailableScreenSizePx() {
320+
if (windowManager == null) return null;
321+
322+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
323+
Rect bounds = windowManager.getMaximumWindowMetrics().getBounds();
324+
return new int[]{bounds.width(), bounds.height()};
325+
}
326+
327+
android.util.DisplayMetrics dm = new android.util.DisplayMetrics();
328+
windowManager.getDefaultDisplay().getRealMetrics(dm);
329+
return new int[]{dm.widthPixels, dm.heightPixels};
330+
}
331+
316332
private void saveOverlayLayoutPrefs() {
317333
if (overlayParams == null) return;
318334
try {

0 commit comments

Comments
 (0)