66import android .app .Service ;
77import android .content .Context ;
88import android .content .Intent ;
9+ import android .graphics .Rect ;
910import android .graphics .SurfaceTexture ;
1011import android .graphics .PixelFormat ;
12+ import android .os .Build ;
1113import android .os .IBinder ;
1214import android .view .Gravity ;
1315import 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