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);
+ }
+ }
}