Merge "Add special mirroring modes for demonstration purposes." into jb-mr1-dev

This commit is contained in:
Jeff Brown
2012-10-18 00:06:47 -07:00
committed by Android (Google) Code Review
5 changed files with 70 additions and 12 deletions

View File

@@ -299,6 +299,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
int mCarDockRotation;
int mDeskDockRotation;
int mHdmiRotation;
boolean mHdmiRotationLock;
int mUserRotationMode = WindowManagerPolicy.USER_ROTATION_FREE;
int mUserRotation = Surface.ROTATION_0;
@@ -1035,11 +1036,14 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mCanHideNavigationBar = false;
}
// For demo purposes, allow the rotation of the HDMI display to be controlled.
// By default, HDMI locks rotation to landscape.
if ("portrait".equals(SystemProperties.get("persist.demo.hdmirotation"))) {
mHdmiRotation = mPortraitRotation;
} else {
mHdmiRotation = mLandscapeRotation;
}
mHdmiRotationLock = SystemProperties.getBoolean("persist.demo.hdmirotationlock", true);
}
public void updateSettings() {
@@ -3873,7 +3877,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// enable 180 degree rotation while docked.
preferredRotation = mDeskDockEnablesAccelerometer
? sensorRotation : mDeskDockRotation;
} else if (mHdmiPlugged) {
} else if (mHdmiPlugged && mHdmiRotationLock) {
// Ignore sensor when plugged into HDMI.
// Note that the dock orientation overrides the HDMI orientation.
preferredRotation = mHdmiRotation;
@@ -4538,5 +4542,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
pw.print(" mSeascapeRotation="); pw.println(mSeascapeRotation);
pw.print(prefix); pw.print("mPortraitRotation="); pw.print(mPortraitRotation);
pw.print(" mUpsideDownRotation="); pw.println(mUpsideDownRotation);
pw.print(prefix); pw.print("mHdmiRotation="); pw.print(mHdmiRotation);
pw.print(" mHdmiRotationLock="); pw.println(mHdmiRotationLock);
}
}

View File

@@ -17,6 +17,7 @@
package com.android.server.display;
import android.util.DisplayMetrics;
import android.view.Surface;
import libcore.util.Objects;
@@ -31,11 +32,21 @@ final class DisplayDeviceInfo {
public static final int FLAG_DEFAULT_DISPLAY = 1 << 0;
/**
* Flag: Indicates that this display device can rotate to show contents in a
* different orientation. Otherwise the rotation is assumed to be fixed in the
* natural orientation and the display manager should transform the content to fit.
* Flag: Indicates that the orientation of this display device is coupled to the
* rotation of its associated logical display.
* <p>
* This flag should be applied to the default display to indicate that the user
* physically rotates the display when content is presented in a different orientation.
* The display manager will apply a coordinate transformation assuming that the
* physical orientation of the display matches the logical orientation of its content.
* </p><p>
* The flag should not be set when the display device is mounted in a fixed orientation
* such as on a desk. The display manager will apply a coordinate transformation
* such as a scale and translation to letterbox or pillarbox format under the
* assumption that the physical orientation of the display is invariant.
* </p>
*/
public static final int FLAG_SUPPORTS_ROTATION = 1 << 1;
public static final int FLAG_ROTATES_WITH_CONTENT = 1 << 1;
/**
* Flag: Indicates that this display device has secure video output, such as HDCP.
@@ -116,6 +127,17 @@ final class DisplayDeviceInfo {
*/
public int touch;
/**
* The additional rotation to apply to all content presented on the display device
* relative to its physical coordinate system. Default is {@link Surface#ROTATION_0}.
* <p>
* This field can be used to compensate for the fact that the display has been
* physically rotated relative to its natural orientation such as an HDMI monitor
* that has been mounted sideways to appear to be portrait rather than landscape.
* </p>
*/
public int rotation = Surface.ROTATION_0;
public void setAssumedDensityForExternalDisplay(int width, int height) {
densityDpi = Math.min(width, height) * DisplayMetrics.DENSITY_XHIGH / 1080;
// Technically, these values should be smaller than the apparent density
@@ -139,7 +161,8 @@ final class DisplayDeviceInfo {
&& xDpi == other.xDpi
&& yDpi == other.yDpi
&& flags == other.flags
&& touch == other.touch;
&& touch == other.touch
&& rotation == other.rotation;
}
@Override
@@ -157,14 +180,18 @@ final class DisplayDeviceInfo {
yDpi = other.yDpi;
flags = other.flags;
touch = other.touch;
rotation = other.rotation;
}
// For debugging purposes
@Override
public String toString() {
return "DisplayDeviceInfo{\"" + name + "\": " + width + " x " + height + ", " + refreshRate + " fps, "
return "DisplayDeviceInfo{\"" + name + "\": " + width + " x " + height + ", "
+ refreshRate + " fps, "
+ "density " + densityDpi + ", " + xDpi + " x " + yDpi + " dpi"
+ ", touch " + touchToString(touch) + flagsToString(flags) + "}";
+ ", touch " + touchToString(touch) + flagsToString(flags)
+ ", rotation " + rotation
+ "}";
}
private static String touchToString(int touch) {
@@ -185,8 +212,8 @@ final class DisplayDeviceInfo {
if ((flags & FLAG_DEFAULT_DISPLAY) != 0) {
msg.append(", FLAG_DEFAULT_DISPLAY");
}
if ((flags & FLAG_SUPPORTS_ROTATION) != 0) {
msg.append(", FLAG_SUPPORTS_ROTATION");
if ((flags & FLAG_ROTATES_WITH_CONTENT) != 0) {
msg.append(", FLAG_ROTATES_WITH_CONTENT");
}
if ((flags & FLAG_SECURE) != 0) {
msg.append(", FLAG_SECURE");

View File

@@ -127,6 +127,13 @@ public final class DisplayManagerService extends IDisplayManager.Stub {
// services should be started. This option may disable certain display adapters.
public boolean mOnlyCore;
// True if the display manager service should pretend there is only one display
// and only tell applications about the existence of the default logical display.
// The display manager can still mirror content to secondary displays but applications
// cannot present unique content on those displays.
// Used for demonstration purposes only.
private final boolean mSingleDisplayDemoMode;
// All callback records indexed by calling process id.
public final SparseArray<CallbackRecord> mCallbacks =
new SparseArray<CallbackRecord>();
@@ -182,6 +189,7 @@ public final class DisplayManagerService extends IDisplayManager.Stub {
mHandler = new DisplayManagerHandler(mainHandler.getLooper());
mUiHandler = uiHandler;
mDisplayAdapterListener = new DisplayAdapterListener();
mSingleDisplayDemoMode = SystemProperties.getBoolean("persist.demo.singledisplay", false);
mHandler.sendEmptyMessage(MSG_REGISTER_DEFAULT_DISPLAY_ADAPTER);
}
@@ -631,6 +639,12 @@ public final class DisplayManagerService extends IDisplayManager.Stub {
isDefault = false;
}
if (!isDefault && mSingleDisplayDemoMode) {
Slog.i(TAG, "Not creating a logical display for a secondary display "
+ " because single display demo mode is enabled: " + deviceInfo);
return;
}
final int displayId = assignDisplayIdLocked(isDefault);
final int layerStack = assignLayerStackLocked(displayId);
@@ -857,6 +871,7 @@ public final class DisplayManagerService extends IDisplayManager.Stub {
pw.println(" mNextNonDefaultDisplayId=" + mNextNonDefaultDisplayId);
pw.println(" mDefaultViewport=" + mDefaultViewport);
pw.println(" mExternalTouchViewport=" + mExternalTouchViewport);
pw.println(" mSingleDisplayDemoMode=" + mSingleDisplayDemoMode);
IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
ipw.increaseIndent();

View File

@@ -20,6 +20,7 @@ import android.content.Context;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.SystemProperties;
import android.util.SparseArray;
import android.view.DisplayEventReceiver;
import android.view.Surface;
@@ -135,7 +136,7 @@ final class LocalDisplayAdapter extends DisplayAdapter {
mInfo.name = getContext().getResources().getString(
com.android.internal.R.string.display_manager_built_in_display_name);
mInfo.flags |= DisplayDeviceInfo.FLAG_DEFAULT_DISPLAY
| DisplayDeviceInfo.FLAG_SUPPORTS_ROTATION;
| DisplayDeviceInfo.FLAG_ROTATES_WITH_CONTENT;
mInfo.densityDpi = (int)(mPhys.density * 160 + 0.5f);
mInfo.xDpi = mPhys.xDpi;
mInfo.yDpi = mPhys.yDpi;
@@ -145,6 +146,12 @@ final class LocalDisplayAdapter extends DisplayAdapter {
com.android.internal.R.string.display_manager_hdmi_display_name);
mInfo.touch = DisplayDeviceInfo.TOUCH_EXTERNAL;
mInfo.setAssumedDensityForExternalDisplay(mPhys.width, mPhys.height);
// For demonstration purposes, allow rotation of the external display.
// In the future we might allow the user to configure this directly.
if ("portrait".equals(SystemProperties.get("persist.demo.hdmirotation"))) {
mInfo.rotation = Surface.ROTATION_270;
}
}
}
return mInfo;

View File

@@ -241,10 +241,13 @@ final class LogicalDisplay {
// is rotated when the contents of the logical display are rendered.
int orientation = Surface.ROTATION_0;
if (device == mPrimaryDisplayDevice
&& (displayDeviceInfo.flags & DisplayDeviceInfo.FLAG_SUPPORTS_ROTATION) != 0) {
&& (displayDeviceInfo.flags & DisplayDeviceInfo.FLAG_ROTATES_WITH_CONTENT) != 0) {
orientation = displayInfo.rotation;
}
// Apply the physical rotation of the display device itself.
orientation = (orientation + displayDeviceInfo.rotation) % 4;
// Set the frame.
// The frame specifies the rotated physical coordinates into which the viewport
// is mapped. We need to take care to preserve the aspect ratio of the viewport.