Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8c7ecc8b authored by Santos Cordon's avatar Santos Cordon Committed by Android (Google) Code Review
Browse files

Merge "Add a Virtual 2D Display creator."

parents 513dc541 c14513d8
Loading
Loading
Loading
Loading
+119 −0
Original line number Diff line number Diff line

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;
            }
        }
    }
}
+8 −0
Original line number Diff line number Diff line
@@ -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;