Merge "Adding public API to expose DisplayInfo.deviceProductInfo" into sc-dev am: bcd8ea64de

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/13554285

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I0089a089eca3e4b13a83a6b1f1b221b527fb3e41
This commit is contained in:
Kriti Dang
2021-02-22 13:38:33 +00:00
committed by Automerger Merge Worker
4 changed files with 125 additions and 28 deletions

View File

@@ -18537,6 +18537,23 @@ package android.hardware.camera2.params {
package android.hardware.display { package android.hardware.display {
public final class DeviceProductInfo implements android.os.Parcelable {
method public int describeContents();
method public int getConnectionToSinkType();
method public int getManufactureWeek();
method public int getManufactureYear();
method @NonNull public String getManufacturerPnpId();
method public int getModelYear();
method @Nullable public String getName();
method @NonNull public String getProductId();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field public static final int CONNECTION_TO_SINK_BUILT_IN = 1; // 0x1
field public static final int CONNECTION_TO_SINK_DIRECT = 2; // 0x2
field public static final int CONNECTION_TO_SINK_TRANSITIVE = 3; // 0x3
field public static final int CONNECTION_TO_SINK_UNKNOWN = 0; // 0x0
field @NonNull public static final android.os.Parcelable.Creator<android.hardware.display.DeviceProductInfo> CREATOR;
}
public final class DisplayManager { public final class DisplayManager {
method public android.hardware.display.VirtualDisplay createVirtualDisplay(@NonNull String, int, int, int, @Nullable android.view.Surface, int); method public android.hardware.display.VirtualDisplay createVirtualDisplay(@NonNull String, int, int, int, @Nullable android.view.Surface, int);
method public android.hardware.display.VirtualDisplay createVirtualDisplay(@NonNull String, int, int, int, @Nullable android.view.Surface, int, @Nullable android.hardware.display.VirtualDisplay.Callback, @Nullable android.os.Handler); method public android.hardware.display.VirtualDisplay createVirtualDisplay(@NonNull String, int, int, int, @Nullable android.view.Surface, int, @Nullable android.hardware.display.VirtualDisplay.Callback, @Nullable android.os.Handler);
@@ -46613,6 +46630,7 @@ package android.view {
method public long getAppVsyncOffsetNanos(); method public long getAppVsyncOffsetNanos();
method public void getCurrentSizeRange(android.graphics.Point, android.graphics.Point); method public void getCurrentSizeRange(android.graphics.Point, android.graphics.Point);
method @Nullable public android.view.DisplayCutout getCutout(); method @Nullable public android.view.DisplayCutout getCutout();
method @Nullable public android.hardware.display.DeviceProductInfo getDeviceProductInfo();
method public int getDisplayId(); method public int getDisplayId();
method public int getFlags(); method public int getFlags();
method public android.view.Display.HdrCapabilities getHdrCapabilities(); method public android.view.Display.HdrCapabilities getHdrCapabilities();

View File

@@ -16,40 +16,69 @@
package android.hardware.display; package android.hardware.display;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import java.util.Arrays; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Objects; import java.util.Objects;
/** /**
* Product-specific information about the display or the directly connected device on the * Product-specific information about the display or the directly connected device on the
* display chain. For example, if the display is transitively connected, this field may contain * display chain. For example, if the display is transitively connected, this field may contain
* product information about the intermediate device. * product information about the intermediate device.
* @hide
*/ */
public final class DeviceProductInfo implements Parcelable { public final class DeviceProductInfo implements Parcelable {
/** @hide */
@IntDef(prefix = {"CONNECTION_TO_SINK_"}, value = {
CONNECTION_TO_SINK_UNKNOWN,
CONNECTION_TO_SINK_BUILT_IN,
CONNECTION_TO_SINK_DIRECT,
CONNECTION_TO_SINK_TRANSITIVE
})
@Retention(RetentionPolicy.SOURCE)
public @interface ConnectionToSinkType { }
/** The device connection to the display sink is unknown. */
public static final int CONNECTION_TO_SINK_UNKNOWN =
IDeviceProductInfoConstants.CONNECTION_TO_SINK_UNKNOWN;
/** The display sink is built-in to the device */
public static final int CONNECTION_TO_SINK_BUILT_IN =
IDeviceProductInfoConstants.CONNECTION_TO_SINK_BUILT_IN;
/** The device is directly connected to the display sink. */
public static final int CONNECTION_TO_SINK_DIRECT =
IDeviceProductInfoConstants.CONNECTION_TO_SINK_DIRECT;
/** The device is transitively connected to the display sink. */
public static final int CONNECTION_TO_SINK_TRANSITIVE =
IDeviceProductInfoConstants.CONNECTION_TO_SINK_TRANSITIVE;
private final String mName; private final String mName;
private final String mManufacturerPnpId; private final String mManufacturerPnpId;
private final String mProductId; private final String mProductId;
private final Integer mModelYear; private final Integer mModelYear;
private final ManufactureDate mManufactureDate; private final ManufactureDate mManufactureDate;
private final int[] mRelativeAddress; private final @ConnectionToSinkType int mConnectionToSinkType;
/** @hide */
public DeviceProductInfo( public DeviceProductInfo(
String name, String name,
String manufacturerPnpId, String manufacturerPnpId,
String productId, String productId,
Integer modelYear, Integer modelYear,
ManufactureDate manufactureDate, ManufactureDate manufactureDate,
int[] relativeAddress) { int connectionToSinkType) {
this.mName = name; this.mName = name;
this.mManufacturerPnpId = manufacturerPnpId; this.mManufacturerPnpId = manufacturerPnpId;
this.mProductId = productId; this.mProductId = productId;
this.mModelYear = modelYear; this.mModelYear = modelYear;
this.mManufactureDate = manufactureDate; this.mManufactureDate = manufactureDate;
this.mRelativeAddress = relativeAddress; this.mConnectionToSinkType = connectionToSinkType;
} }
private DeviceProductInfo(Parcel in) { private DeviceProductInfo(Parcel in) {
@@ -58,12 +87,13 @@ public final class DeviceProductInfo implements Parcelable {
mProductId = (String) in.readValue(null); mProductId = (String) in.readValue(null);
mModelYear = (Integer) in.readValue(null); mModelYear = (Integer) in.readValue(null);
mManufactureDate = (ManufactureDate) in.readValue(null); mManufactureDate = (ManufactureDate) in.readValue(null);
mRelativeAddress = in.createIntArray(); mConnectionToSinkType = in.readInt();
} }
/** /**
* @return Display name. * @return Display name.
*/ */
@Nullable
public String getName() { public String getName() {
return mName; return mName;
} }
@@ -71,6 +101,7 @@ public final class DeviceProductInfo implements Parcelable {
/** /**
* @return Manufacturer Plug and Play ID. * @return Manufacturer Plug and Play ID.
*/ */
@NonNull
public String getManufacturerPnpId() { public String getManufacturerPnpId() {
return mManufacturerPnpId; return mManufacturerPnpId;
} }
@@ -78,32 +109,58 @@ public final class DeviceProductInfo implements Parcelable {
/** /**
* @return Manufacturer product ID. * @return Manufacturer product ID.
*/ */
@NonNull
public String getProductId() { public String getProductId() {
return mProductId; return mProductId;
} }
/** /**
* @return Model year of the device. Typically exactly one of model year or * @return Model year of the device. Return -1 if not available. Typically,
* manufacture date will be present. * one of model year or manufacture year is available.
*/ */
public Integer getModelYear() { public int getModelYear() {
return mModelYear; return mModelYear != null ? mModelYear : -1;
}
/**
* @return The year of manufacture, or -1 it is not available. Typically,
* one of model year or manufacture year is available.
*/
public int getManufactureYear() {
if (mManufactureDate == null) {
return -1;
}
return mManufactureDate.mYear != null ? mManufactureDate.mYear : -1;
}
/**
* @return The week of manufacture, or -1 it is not available. Typically,
* not present if model year is available.
*/
public int getManufactureWeek() {
if (mManufactureDate == null) {
return -1;
}
return mManufactureDate.mWeek != null ? mManufactureDate.mWeek : -1;
} }
/** /**
* @return Manufacture date. Typically exactly one of model year or manufacture * @return Manufacture date. Typically exactly one of model year or manufacture
* date will be present. * date will be present.
*
* @hide
*/ */
public ManufactureDate getManufactureDate() { public ManufactureDate getManufactureDate() {
return mManufactureDate; return mManufactureDate;
} }
/** /**
* @return Relative address in the display network. For example, for HDMI connected devices this * @return How the current device is connected to the display sink. For example, the display
* can be its physical address. Each component of the address is in the range [0, 255]. * can be connected immediately to the device or there can be a receiver in between.
*/ */
public int[] getRelativeAddress() { @ConnectionToSinkType
return mRelativeAddress; public int getConnectionToSinkType() {
return mConnectionToSinkType;
} }
@Override @Override
@@ -119,8 +176,8 @@ public final class DeviceProductInfo implements Parcelable {
+ mModelYear + mModelYear
+ ", manufactureDate=" + ", manufactureDate="
+ mManufactureDate + mManufactureDate
+ ", relativeAddress=" + ", connectionToSinkType="
+ Arrays.toString(mRelativeAddress) + mConnectionToSinkType
+ '}'; + '}';
} }
@@ -134,16 +191,16 @@ public final class DeviceProductInfo implements Parcelable {
&& Objects.equals(mProductId, that.mProductId) && Objects.equals(mProductId, that.mProductId)
&& Objects.equals(mModelYear, that.mModelYear) && Objects.equals(mModelYear, that.mModelYear)
&& Objects.equals(mManufactureDate, that.mManufactureDate) && Objects.equals(mManufactureDate, that.mManufactureDate)
&& Arrays.equals(mRelativeAddress, that.mRelativeAddress); && mConnectionToSinkType == that.mConnectionToSinkType;
} }
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hash(mName, mManufacturerPnpId, mProductId, mModelYear, mManufactureDate, return Objects.hash(mName, mManufacturerPnpId, mProductId, mModelYear, mManufactureDate,
Arrays.hashCode(mRelativeAddress)); mConnectionToSinkType);
} }
public static final Creator<DeviceProductInfo> CREATOR = @NonNull public static final Creator<DeviceProductInfo> CREATOR =
new Creator<DeviceProductInfo>() { new Creator<DeviceProductInfo>() {
@Override @Override
public DeviceProductInfo createFromParcel(Parcel in) { public DeviceProductInfo createFromParcel(Parcel in) {
@@ -162,13 +219,13 @@ public final class DeviceProductInfo implements Parcelable {
} }
@Override @Override
public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeString(mName); dest.writeString(mName);
dest.writeString(mManufacturerPnpId); dest.writeString(mManufacturerPnpId);
dest.writeValue(mProductId); dest.writeValue(mProductId);
dest.writeValue(mModelYear); dest.writeValue(mModelYear);
dest.writeValue(mManufactureDate); dest.writeValue(mManufactureDate);
dest.writeIntArray(mRelativeAddress); dest.writeInt(mConnectionToSinkType);
} }
/** /**

View File

@@ -34,6 +34,7 @@ import android.graphics.ColorSpace;
import android.graphics.PixelFormat; import android.graphics.PixelFormat;
import android.graphics.Point; import android.graphics.Point;
import android.graphics.Rect; import android.graphics.Rect;
import android.hardware.display.DeviceProductInfo;
import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManagerGlobal; import android.hardware.display.DisplayManagerGlobal;
import android.os.Build; import android.os.Build;
@@ -1180,6 +1181,18 @@ public final class Display {
} }
} }
/**
* Returns the product-specific information about the display or the directly connected
* device on the display chain.
* For example, if the display is transitively connected, this field may contain product
* information about the intermediate device.
* Returns {@code null} if product information is not available.
*/
@Nullable
public DeviceProductInfo getDeviceProductInfo() {
return mDisplayInfo.deviceProductInfo;
}
/** /**
* Gets display metrics that describe the size and density of this display. * Gets display metrics that describe the size and density of this display.
* The size returned by this method does not necessarily represent the * The size returned by this method does not necessarily represent the

View File

@@ -27,6 +27,7 @@
#include <android-base/chrono_utils.h> #include <android-base/chrono_utils.h>
#include <android/graphics/region.h> #include <android/graphics/region.h>
#include <android/gui/BnScreenCaptureListener.h> #include <android/gui/BnScreenCaptureListener.h>
#include <android/hardware/display/IDeviceProductInfoConstants.h>
#include <android/os/IInputConstants.h> #include <android/os/IInputConstants.h>
#include <android_runtime/AndroidRuntime.h> #include <android_runtime/AndroidRuntime.h>
#include <android_runtime/android_hardware_HardwareBuffer.h> #include <android_runtime/android_hardware_HardwareBuffer.h>
@@ -999,16 +1000,24 @@ static jobject convertDeviceProductInfoToJavaObject(
} else { } else {
LOG_FATAL("Unknown alternative for variant DeviceProductInfo::ManufactureOrModelDate"); LOG_FATAL("Unknown alternative for variant DeviceProductInfo::ManufactureOrModelDate");
} }
auto relativeAddress = env->NewIntArray(info->relativeAddress.size()); jint connectionToSinkType;
auto relativeAddressData = env->GetIntArrayElements(relativeAddress, nullptr); // Relative address maps to HDMI physical address. All addresses are 4 digits long allowing
for (int i = 0; i < info->relativeAddress.size(); i++) { // for a 5–device-deep hierarchy. For more information, refer:
relativeAddressData[i] = info->relativeAddress[i]; // Section 8.7 - Physical Address of HDMI Specification Version 1.3a
using android::hardware::display::IDeviceProductInfoConstants;
if (info->relativeAddress.size() != 4) {
connectionToSinkType = IDeviceProductInfoConstants::CONNECTION_TO_SINK_UNKNOWN;
} else if (info->relativeAddress[0] == 0) {
connectionToSinkType = IDeviceProductInfoConstants::CONNECTION_TO_SINK_BUILT_IN;
} else if (info->relativeAddress[1] == 0) {
connectionToSinkType = IDeviceProductInfoConstants::CONNECTION_TO_SINK_DIRECT;
} else {
connectionToSinkType = IDeviceProductInfoConstants::CONNECTION_TO_SINK_TRANSITIVE;
} }
env->ReleaseIntArrayElements(relativeAddress, relativeAddressData, 0);
return env->NewObject(gDeviceProductInfoClassInfo.clazz, gDeviceProductInfoClassInfo.ctor, name, return env->NewObject(gDeviceProductInfoClassInfo.clazz, gDeviceProductInfoClassInfo.ctor, name,
manufacturerPnpId, productId, modelYear, manufactureDate, manufacturerPnpId, productId, modelYear, manufactureDate,
relativeAddress); connectionToSinkType);
} }
static jobject nativeGetDisplayInfo(JNIEnv* env, jclass clazz, jobject tokenObj) { static jobject nativeGetDisplayInfo(JNIEnv* env, jclass clazz, jobject tokenObj) {
@@ -1948,7 +1957,7 @@ int register_android_view_SurfaceControl(JNIEnv* env)
"Ljava/lang/String;" "Ljava/lang/String;"
"Ljava/lang/Integer;" "Ljava/lang/Integer;"
"Landroid/hardware/display/DeviceProductInfo$ManufactureDate;" "Landroid/hardware/display/DeviceProductInfo$ManufactureDate;"
"[I)V"); "I)V");
jclass deviceProductInfoManufactureDateClazz = jclass deviceProductInfoManufactureDateClazz =
FindClassOrDie(env, "android/hardware/display/DeviceProductInfo$ManufactureDate"); FindClassOrDie(env, "android/hardware/display/DeviceProductInfo$ManufactureDate");