blob: 15edaaf93af65c425f8060177cedec69593474b3 [file] [log] [blame]
package com.android.server.vr;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.service.vr.IVrStateCallbacks;
import android.service.vr.IVrManager;
import android.util.Log;
import com.android.server.vr.VrManagerService;
/**
* Creates a 2D Virtual Display while VR Mode is enabled. This display will be used to run and
* render 2D app within a VR experience. For example, bringing up the 2D calculator app in VR.
*/
class CompatibilityDisplay {
private final static String TAG = "CompatDisplay";
private final static boolean DEBUG = false;
// TODO: Go over these values and figure out what is best
private final static int HEIGHT = 960;
private final static int WIDTH = 720;
private final static int DPI = 320;
private final DisplayManager mDisplayManager;
private final IVrManager mVrManager;
// TODO: Lock initially created when VrStateCallback was connected through Binder. This may not
// be necessary with the direct access to VrManager.
private final Object vdLock = new Object();
private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() {
@Override
public void onVrStateChanged(boolean enabled) {
if (enabled != mIsVrModeEnabled) {
mIsVrModeEnabled = enabled;
if (enabled) {
// TODO: Consider not creating the display until ActivityManager needs one on
// which to display a 2D application.
startVirtualDisplay();
} else {
stopVirtualDisplay();
}
}
}
};
private VirtualDisplay mVirtualDisplay;
private boolean mIsVrModeEnabled;
public CompatibilityDisplay(DisplayManager displayManager, IVrManager vrManager) {
mDisplayManager = displayManager;
mVrManager = vrManager;
}
/**
* Initializes the compabilitiy display by listening to VR mode changes.
*/
public void init() {
startVrModeListener();
}
private void startVrModeListener() {
if (mVrManager != null) {
try {
mVrManager.registerListener(mVrStateCallbacks);
} catch (RemoteException e) {
Log.e(TAG, "Could not register VR State listener.", e);
}
}
}
private void startVirtualDisplay() {
if (DEBUG) {
Log.d(TAG, "Starting VD, DM:" + mDisplayManager);
}
if (mDisplayManager == null) {
Log.w(TAG, "Cannot create virtual display because mDisplayManager == null");
return;
}
synchronized (vdLock) {
if (mVirtualDisplay != null) {
Log.e(TAG, "Starting the virtual display when one already exists", new Exception());
return;
}
mVirtualDisplay = mDisplayManager.createVirtualDisplay("VR 2D Display", WIDTH, HEIGHT,
DPI,
null /* Surface */, 0 /* flags */);
}
if (DEBUG) {
Log.d(TAG, "VD created: " + mVirtualDisplay);
}
}
private void stopVirtualDisplay() {
if (DEBUG) {
Log.i(TAG, "Santos, stopping VD");
}
synchronized (vdLock) {
if (mVirtualDisplay != null) {
mVirtualDisplay.release();
mVirtualDisplay = null;
}
}
}
}