blob: bf62c95cf6db5d93ea8f20e0041d8a3eb0ddfd89 [file] [log] [blame]
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.hardware.display;
import android.view.Display;
import android.view.Surface;
/**
* Represents a virtual display. The content of a virtual display is rendered to a
* {@link android.view.Surface} that you must provide to {@link DisplayManager#createVirtualDisplay
* createVirtualDisplay()}.
* <p>
* Because a virtual display renders to a surface provided by the application, it will be
* released automatically when the process terminates and all remaining windows on it will
* be forcibly removed. However, you should also explicitly call {@link #release} when
* you're done with it.
* </p>
*
* @see DisplayManager#createVirtualDisplay
*/
public final class VirtualDisplay {
private final DisplayManagerGlobal mGlobal;
private final Display mDisplay;
private IVirtualDisplayCallback mToken;
private Surface mSurface;
VirtualDisplay(DisplayManagerGlobal global, Display display,
IVirtualDisplayCallback token, Surface surface) {
mGlobal = global;
mDisplay = display;
mToken = token;
mSurface = surface;
}
/**
* Gets the virtual display.
*/
public Display getDisplay() {
return mDisplay;
}
/**
* Gets the surface that backs the virtual display.
*/
public Surface getSurface() {
return mSurface;
}
/**
* Sets the surface that backs the virtual display.
* <p>
* Detaching the surface that backs a virtual display has a similar effect to
* turning off the screen.
* </p><p>
* It is still the caller's responsibility to destroy the surface after it has
* been detached.
* </p>
*
* @param surface The surface to set, or null to detach the surface from the virtual display.
*/
public void setSurface(Surface surface) {
if (mSurface != surface) {
mGlobal.setVirtualDisplaySurface(mToken, surface);
mSurface = surface;
}
}
/**
* Asks the virtual display to resize.
*<p>
* This is really just a convenience to allow applications using
* virtual displays to adapt to changing conditions without having
* to tear down and recreate the display.
* </p>
*/
public void resize(int width, int height, int densityDpi) {
mGlobal.resizeVirtualDisplay(mToken, width, height, densityDpi);
}
/**
* Releases the virtual display and destroys its underlying surface.
* <p>
* All remaining windows on the virtual display will be forcibly removed
* as part of releasing the virtual display.
* </p>
*/
public void release() {
if (mToken != null) {
mGlobal.releaseVirtualDisplay(mToken);
mToken = null;
}
}
/**
* Sets the on/off state for a virtual display.
*
* @param isOn Whether the display should be on or off.
* @hide
*/
public void setDisplayState(boolean isOn) {
if (mToken != null) {
mGlobal.setVirtualDisplayState(mToken, isOn);
}
}
@Override
public String toString() {
return "VirtualDisplay{display=" + mDisplay + ", token=" + mToken
+ ", surface=" + mSurface + "}";
}
/**
* Interface for receiving information about a {@link VirtualDisplay}'s state changes.
*/
public static abstract class Callback {
/**
* Called when the virtual display video projection has been
* paused by the system or when the surface has been detached
* by the application by calling setSurface(null).
* The surface will not receive any more buffers while paused.
*/
public void onPaused() { }
/**
* Called when the virtual display video projection has been
* resumed after having been paused.
*/
public void onResumed() { }
/**
* Called when the virtual display video projection has been
* stopped by the system. It will no longer receive frames
* and it will never be resumed. It is still the responsibility
* of the application to release() the virtual display.
*/
public void onStopped() { }
}
}