@@ -627,9 +627,11 @@ private void updateOverlayDecision() {
627627 return ;
628628 }
629629
630- if ((previousMode == 1 || previousMode == 2 ) && nextMode == 0 ) {
630+ if ((previousMode == 1 || previousMode == 2 ) && ( nextMode == 0 || nextMode == 4 ) ) {
631631 currentMode = -2 ;
632- long delayMs = computeOverlayHideDelayMs ();
632+ // For mode 0: respect both hideDelay and minShowTime.
633+ // For mode 4 (rearview): only respect minShowTime — no artificial gap before the mirror.
634+ long delayMs = nextMode == 4 ? computeRemainingMinShowMs () : computeOverlayHideDelayMs ();
633635 mainHandler .removeCallbacks (hideRunnable );
634636 mainHandler .postDelayed (hideRunnable , delayMs );
635637 Log .i (TAG , "Signal/gear off => will reapply overlay state after " + delayMs + "ms" );
@@ -741,6 +743,18 @@ private long computeOverlayHideDelayMs() {
741743 return Math .max (hideDelayMs , remainingMinShowMs );
742744 }
743745
746+ // Only the remaining min-show time, without adding the regular hide delay.
747+ // Used when transitioning from a signal overlay to rearview (mode 4).
748+ private long computeRemainingMinShowMs () {
749+ long minShowMs = readOverlayMinShowMs ();
750+ long shownAtMs = overlayShownAtMs ;
751+ if (shownAtMs <= 0L || minShowMs <= 0L ) {
752+ return 0L ;
753+ }
754+ long elapsedVisibleMs = Math .max (0L , SystemClock .elapsedRealtime () - shownAtMs );
755+ return Math .max (0L , minShowMs - elapsedVisibleMs );
756+ }
757+
744758 private boolean isOemAvmInForeground () {
745759 try {
746760 ActivityManager am = (ActivityManager ) getSystemService (Context .ACTIVITY_SERVICE );
0 commit comments