Add type to DisplayViewport
Refactor DisplayViewport to treat internal, external, and virtual
display viewports more equally. Now stored in single array, and mLocked
contains the most up-to-date copy of these. Still enforce the
requirement that there can only be 1 internal and 1 external viewport.
We should remove this requirement in the future.
Bug: 111108021
Test: atest DisplayManagerServiceTest
Change-Id: I6fca9725f6e4180063c86f3c2bc34906ac1d0024
diff --git a/core/java/android/hardware/display/DisplayViewport.java b/core/java/android/hardware/display/DisplayViewport.java
index 496f34c..df0d46b 100644
--- a/core/java/android/hardware/display/DisplayViewport.java
+++ b/core/java/android/hardware/display/DisplayViewport.java
@@ -16,9 +16,14 @@
package android.hardware.display;
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
+import android.annotation.IntDef;
import android.graphics.Rect;
import android.text.TextUtils;
+import java.lang.annotation.Retention;
+
/**
* Describes how the pixels of physical display device reflects the content of
* a logical display.
@@ -35,6 +40,10 @@
public static final int VIEWPORT_INTERNAL = 1;
public static final int VIEWPORT_EXTERNAL = 2;
public static final int VIEWPORT_VIRTUAL = 3;
+ @IntDef(prefix = { "VIEWPORT_" }, value = {
+ VIEWPORT_INTERNAL, VIEWPORT_EXTERNAL, VIEWPORT_VIRTUAL})
+ @Retention(SOURCE)
+ public @interface ViewportType {};
// True if this viewport is valid.
public boolean valid;
@@ -62,6 +71,8 @@
// The ID used to uniquely identify this display.
public String uniqueId;
+ public @ViewportType int type;
+
public void copyFrom(DisplayViewport viewport) {
valid = viewport.valid;
displayId = viewport.displayId;
@@ -71,6 +82,7 @@
deviceWidth = viewport.deviceWidth;
deviceHeight = viewport.deviceHeight;
uniqueId = viewport.uniqueId;
+ type = viewport.type;
}
/**
@@ -100,7 +112,8 @@
&& physicalFrame.equals(other.physicalFrame)
&& deviceWidth == other.deviceWidth
&& deviceHeight == other.deviceHeight
- && TextUtils.equals(uniqueId, other.uniqueId);
+ && TextUtils.equals(uniqueId, other.uniqueId)
+ && type == other.type;
}
@Override
@@ -115,13 +128,15 @@
result += prime * result + deviceWidth;
result += prime * result + deviceHeight;
result += prime * result + uniqueId.hashCode();
+ result += prime * result + type;
return result;
}
// For debugging purposes.
@Override
public String toString() {
- return "DisplayViewport{valid=" + valid
+ return "DisplayViewport{type=" + typeToString(type)
+ + ", valid=" + valid
+ ", displayId=" + displayId
+ ", uniqueId='" + uniqueId + "'"
+ ", orientation=" + orientation
@@ -131,4 +146,20 @@
+ ", deviceHeight=" + deviceHeight
+ "}";
}
+
+ /**
+ * Human-readable viewport type.
+ */
+ public static String typeToString(@ViewportType int viewportType) {
+ switch (viewportType) {
+ case VIEWPORT_INTERNAL:
+ return "INTERNAL";
+ case VIEWPORT_EXTERNAL:
+ return "EXTERNAL";
+ case VIEWPORT_VIRTUAL:
+ return "VIRTUAL";
+ default:
+ return "UNKNOWN (" + viewportType + ")";
+ }
+ }
}
diff --git a/core/java/android/hardware/input/InputManagerInternal.java b/core/java/android/hardware/input/InputManagerInternal.java
index c4d7e40..d8da548 100644
--- a/core/java/android/hardware/input/InputManagerInternal.java
+++ b/core/java/android/hardware/input/InputManagerInternal.java
@@ -40,8 +40,7 @@
* Called by the display manager to set information about the displays as needed
* by the input system. The input system must copy this information to retain it.
*/
- public abstract void setDisplayViewports(DisplayViewport defaultViewport,
- DisplayViewport externalTouchViewport, List<DisplayViewport> virtualTouchViewports);
+ public abstract void setDisplayViewports(List<DisplayViewport> viewports);
/**
* Called by the power manager to tell the input manager whether it should start
diff --git a/core/jni/android_hardware_display_DisplayViewport.cpp b/core/jni/android_hardware_display_DisplayViewport.cpp
index ab8e685..05f6556 100644
--- a/core/jni/android_hardware_display_DisplayViewport.cpp
+++ b/core/jni/android_hardware_display_DisplayViewport.cpp
@@ -40,6 +40,7 @@
jfieldID deviceWidth;
jfieldID deviceHeight;
jfieldID uniqueId;
+ jfieldID type;
} gDisplayViewportClassInfo;
static struct {
@@ -64,6 +65,9 @@
viewport->uniqueId = ScopedUtfChars(env, uniqueId).c_str();
}
+ viewport->type = static_cast<ViewportType>(env->GetIntField(viewportObj,
+ gDisplayViewportClassInfo.type));
+
jobject logicalFrameObj =
env->GetObjectField(viewportObj, gDisplayViewportClassInfo.logicalFrame);
viewport->logicalLeft = env->GetIntField(logicalFrameObj, gRectClassInfo.left);
@@ -108,6 +112,9 @@
gDisplayViewportClassInfo.uniqueId = GetFieldIDOrDie(env,
gDisplayViewportClassInfo.clazz, "uniqueId", "Ljava/lang/String;");
+ gDisplayViewportClassInfo.type = GetFieldIDOrDie(env,
+ gDisplayViewportClassInfo.clazz, "type", "I");
+
clazz = FindClassOrDie(env, "android/graphics/Rect");
gRectClassInfo.left = GetFieldIDOrDie(env, clazz, "left", "I");
gRectClassInfo.top = GetFieldIDOrDie(env, clazz, "top", "I");