Set ui mode in UiModeManagerService to vrheadset when VR mode is enabled.

Bug: 30989383
Test: Manual check on device using dumpsys and a test service
Change-Id: I8e59546a5ee816bb92e68f68d0914bd977edfc2e
diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java
index 5e1e1e0..440ac90 100644
--- a/services/core/java/com/android/server/UiModeManagerService.java
+++ b/services/core/java/com/android/server/UiModeManagerService.java
@@ -38,10 +38,13 @@
 import android.os.IBinder;
 import android.os.PowerManager;
 import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.service.dreams.Sandman;
+import android.service.vr.IVrManager;
+import android.service.vr.IVrStateCallbacks;
 import android.util.Slog;
 import android.view.WindowManagerInternal;
 import android.view.WindowManagerPolicy;
@@ -77,6 +80,7 @@
     private boolean mDeskModeKeepsScreenOn;
     private boolean mTelevision;
     private boolean mWatch;
+    private boolean mVrHeadset;
     private boolean mComputedNightMode;
     private int mCarModeEnableFlags;
 
@@ -170,6 +174,18 @@
         }
     };
 
+    private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() {
+        @Override
+        public void onVrStateChanged(boolean enabled) {
+            synchronized (mLock) {
+                mVrHeadset = enabled;
+                if (mSystemReady) {
+                    updateLocked(0, 0);
+                }
+            }
+        }
+    };
+
     @Override
     public void onStart() {
         final Context context = getContext();
@@ -394,6 +410,7 @@
                 mSystemReady = true;
                 mCarModeEnabled = mDockState == Intent.EXTRA_DOCK_STATE_CAR;
                 updateComputedNightModeLocked();
+                registerVrStateListener();
                 updateLocked(0, 0);
             }
         }
@@ -441,6 +458,8 @@
             uiMode = Configuration.UI_MODE_TYPE_CAR;
         } else if (isDeskDockState(mDockState)) {
             uiMode = Configuration.UI_MODE_TYPE_DESK;
+        } else if (mVrHeadset) {
+            uiMode = Configuration.UI_MODE_TYPE_VR_HEADSET;
         }
 
         if (mNightMode == UiModeManager.MODE_NIGHT_AUTO) {
@@ -721,5 +740,15 @@
         }
     }
 
+    private void registerVrStateListener() {
+        IVrManager vrManager = IVrManager.Stub.asInterface(ServiceManager.getService("vrmanager"));
+        try {
+            if (vrManager != null) {
+                vrManager.registerListener(mVrStateCallbacks);
+            }
+        } catch (RemoteException e) {
+            Slog.e(TAG, "Failed to register VR mode state listener: " + e);
+        }
+    }
 
 }