Merge "update OWNERS file to include members of the apps team" into sc-v2-dev
diff --git a/service/src/com/android/car/evs/CarEvsService.java b/service/src/com/android/car/evs/CarEvsService.java
index 7af1adb..961707f 100644
--- a/service/src/com/android/car/evs/CarEvsService.java
+++ b/service/src/com/android/car/evs/CarEvsService.java
@@ -24,6 +24,7 @@
 import static android.car.evs.CarEvsManager.SERVICE_STATE_REQUESTED;
 import static android.car.evs.CarEvsManager.SERVICE_STATE_UNAVAILABLE;
 import static android.car.evs.CarEvsManager.STREAM_EVENT_STREAM_STOPPED;
+import static android.hardware.display.DisplayManager.DisplayListener;
 
 import static com.android.car.CarLog.TAG_EVS;
 import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
@@ -51,6 +52,7 @@
 import android.hardware.automotive.vehicle.V2_0.VehicleArea;
 import android.hardware.automotive.vehicle.V2_0.VehicleGear;
 import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
+import android.hardware.display.DisplayManager;
 import android.os.Binder;
 import android.os.Build;
 import android.os.Handler;
@@ -64,6 +66,7 @@
 import android.util.IndentingPrintWriter;
 import android.util.Log;
 import android.util.Slog;
+import android.view.Display;
 
 import com.android.car.CarPropertyService;
 import com.android.car.CarServiceBase;
@@ -159,6 +162,7 @@
     private final Context mContext;
     private final EvsHalService mEvsHalService;
     private final CarPropertyService mPropertyService;
+    private final DisplayManager mDisplayManager;       // To monitor the default display's state
     private final Object mLock = new Object();
 
     private final ComponentName mEvsCameraActivity;
@@ -224,6 +228,48 @@
                 }
             };
 
+    private final DisplayManager.DisplayListener mDisplayListener =
+            new DisplayManager.DisplayListener() {
+                @Override
+                public void onDisplayAdded(int displayId) {
+                    // Nothing to do
+                }
+
+                @Override
+                public void onDisplayRemoved(int displayId) {
+                    // Nothing to do
+                }
+
+                @Override
+                public void onDisplayChanged(int displayId) {
+                    if (displayId != Display.DEFAULT_DISPLAY) {
+                        // We are interested only in the default display.
+                        return;
+                    }
+
+                    Display display = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
+                    switch (display.getState()) {
+                        case Display.STATE_ON:
+                            // We may want to request the system viewer.
+                            if (!requestActivityIfNecessaryLocked()) {
+                                Slog.e(TAG_EVS, "Failed to request the system viewer");
+                            }
+                            break;
+
+                        case Display.STATE_OFF:
+                            // Stop an active client
+                            if (mStreamCallback != null) {
+                                stopVideoStream(mStreamCallback);
+                            }
+                            break;
+
+                        default:
+                            // Nothing to do for all other state changes
+                            break;
+                    }
+                }
+            };
+
     // CarEvsService state machine implementation to handle all state transitions.
     private final class StateMachine {
         // Current state
@@ -444,10 +490,13 @@
                     throw new IllegalStateException("CarEvsService is in the unknown state.");
             }
 
-            // Arms the timer
-            mHandler.sendMessageDelayed(obtainMessage(CarEvsService::handleActivityRequestTimeout,
-                    CarEvsService.this).setWhat(MSG_CHECK_ACTIVITY_REQUEST_TIMEOUT),
-                    STREAM_START_REQUEST_TIMEOUT_MS);
+            // Arms the timer for the high-priority request
+            if (priority == REQUEST_PRIORITY_HIGH) {
+                mHandler.sendMessageDelayed(obtainMessage(
+                        CarEvsService::handleActivityRequestTimeout,
+                        CarEvsService.this).setWhat(MSG_CHECK_ACTIVITY_REQUEST_TIMEOUT),
+                        STREAM_START_REQUEST_TIMEOUT_MS);
+            }
 
             mState = SERVICE_STATE_REQUESTED;
             mServiceType = service;
@@ -626,8 +675,9 @@
 
     @GuardedBy("mLock")
     private boolean requestActivityIfNecessaryLocked() {
-        if (!mStateEngine.checkCurrentStateRequiresActivityLocked() || mLastEvsHalEvent == null ||
-                !mLastEvsHalEvent.isRequestingToStartActivity()) {
+        // TODO(b/202398413): add a test case to verify below logic
+        if (!mStateEngine.checkCurrentStateRequiresActivityLocked() &&
+                (mLastEvsHalEvent == null || !mLastEvsHalEvent.isRequestingToStartActivity())) {
             return false;
         }
 
@@ -704,6 +754,9 @@
             mEvsCameraActivity = null;
         }
         if (DBG) Slog.d(TAG_EVS, "evsCameraActivity=" + mEvsCameraActivity);
+
+        mDisplayManager = context.getSystemService(DisplayManager.class);
+        mDisplayManager.registerDisplayListener(mDisplayListener, mHandler);
     }
 
     /** Implements EvsHalService.EvsHalEventListener to monitor VHAL properties. */