Merge "Add a Virtual 2D Display creator."

This commit is contained in:
Santos Cordon
2017-01-20 00:21:33 +00:00
committed by Android (Google) Code Review
2 changed files with 127 additions and 0 deletions

View File

@@ -0,0 +1,119 @@
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;
}
}
}
}

View File

@@ -31,6 +31,7 @@ import android.content.pm.FeatureInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.hardware.display.DisplayManager;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
@@ -51,6 +52,7 @@ import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
import android.util.SparseArray;
import com.android.internal.R;
import com.android.server.LocalServices;
import com.android.server.SystemConfig;
@@ -136,6 +138,7 @@ public class VrManagerService extends SystemService implements EnabledComponentC
private final NotificationAccessManager mNotifAccessManager = new NotificationAccessManager();
/** Tracks the state of the screen and keyguard UI.*/
private int mSystemSleepFlags = FLAG_NONE;
private CompatibilityDisplay mCompatibilityDisplay;
private static final int MSG_VR_STATE_CHANGE = 0;
private static final int MSG_PENDING_VR_STATE_CHANGE = 1;
@@ -493,6 +496,11 @@ public class VrManagerService extends SystemService implements EnabledComponentC
mComponentObserver.rebuildAll();
}
DisplayManager dm =
(DisplayManager) getContext().getSystemService(Context.DISPLAY_SERVICE);
mCompatibilityDisplay = new CompatibilityDisplay(dm, mVrManager);
mCompatibilityDisplay.init();
} else if (phase == SystemService.PHASE_THIRD_PARTY_APPS_CAN_START) {
synchronized (mLock) {
mVrModeAllowed = true;