diff options
| author | 2021-02-22 13:31:42 +0000 | |
|---|---|---|
| committer | 2021-02-22 13:31:42 +0000 | |
| commit | bcd8ea64deb846bbeba600f29fad13dd960326f9 (patch) | |
| tree | b8742cc6599d2c8fcd6dddceb422f0dc5c292de2 | |
| parent | fc39b029a185c4c5aaf7e1fdd83a454230a9a286 (diff) | |
| parent | 0a40860bc190609c0150c7e19fba5a32f1a6b811 (diff) | |
Merge "Adding public API to expose DisplayInfo.deviceProductInfo" into sc-dev
| -rw-r--r-- | core/api/current.txt | 18 | ||||
| -rw-r--r-- | core/java/android/hardware/display/DeviceProductInfo.java | 99 | ||||
| -rw-r--r-- | core/java/android/view/Display.java | 13 | ||||
| -rw-r--r-- | core/jni/android_view_SurfaceControl.cpp | 23 |
4 files changed, 125 insertions, 28 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index d6c783dc71b0..0f777b7db857 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -18537,6 +18537,23 @@ package android.hardware.camera2.params { 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 { 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); @@ -46613,6 +46630,7 @@ package android.view { method public long getAppVsyncOffsetNanos(); method public void getCurrentSizeRange(android.graphics.Point, android.graphics.Point); method @Nullable public android.view.DisplayCutout getCutout(); + method @Nullable public android.hardware.display.DeviceProductInfo getDeviceProductInfo(); method public int getDisplayId(); method public int getFlags(); method public android.view.Display.HdrCapabilities getHdrCapabilities(); diff --git a/core/java/android/hardware/display/DeviceProductInfo.java b/core/java/android/hardware/display/DeviceProductInfo.java index 41126b70c89f..9457d8f1aac4 100644 --- a/core/java/android/hardware/display/DeviceProductInfo.java +++ b/core/java/android/hardware/display/DeviceProductInfo.java @@ -16,40 +16,69 @@ package android.hardware.display; +import android.annotation.IntDef; +import android.annotation.NonNull; import android.annotation.Nullable; import android.os.Parcel; import android.os.Parcelable; -import java.util.Arrays; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Objects; /** * 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. - * @hide */ 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 mManufacturerPnpId; private final String mProductId; private final Integer mModelYear; private final ManufactureDate mManufactureDate; - private final int[] mRelativeAddress; + private final @ConnectionToSinkType int mConnectionToSinkType; + /** @hide */ public DeviceProductInfo( String name, String manufacturerPnpId, String productId, Integer modelYear, ManufactureDate manufactureDate, - int[] relativeAddress) { + int connectionToSinkType) { this.mName = name; this.mManufacturerPnpId = manufacturerPnpId; this.mProductId = productId; this.mModelYear = modelYear; this.mManufactureDate = manufactureDate; - this.mRelativeAddress = relativeAddress; + this.mConnectionToSinkType = connectionToSinkType; } private DeviceProductInfo(Parcel in) { @@ -58,12 +87,13 @@ public final class DeviceProductInfo implements Parcelable { mProductId = (String) in.readValue(null); mModelYear = (Integer) in.readValue(null); mManufactureDate = (ManufactureDate) in.readValue(null); - mRelativeAddress = in.createIntArray(); + mConnectionToSinkType = in.readInt(); } /** * @return Display name. */ + @Nullable public String getName() { return mName; } @@ -71,6 +101,7 @@ public final class DeviceProductInfo implements Parcelable { /** * @return Manufacturer Plug and Play ID. */ + @NonNull public String getManufacturerPnpId() { return mManufacturerPnpId; } @@ -78,32 +109,58 @@ public final class DeviceProductInfo implements Parcelable { /** * @return Manufacturer product ID. */ + @NonNull public String getProductId() { return mProductId; } /** - * @return Model year of the device. Typically exactly one of model year or - * manufacture date will be present. + * @return Model year of the device. Return -1 if not available. Typically, + * one of model year or manufacture year is available. */ - public Integer getModelYear() { - return mModelYear; + public int getModelYear() { + 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 * date will be present. + * + * @hide */ public ManufactureDate getManufactureDate() { return mManufactureDate; } /** - * @return Relative address in the display network. For example, for HDMI connected devices this - * can be its physical address. Each component of the address is in the range [0, 255]. + * @return How the current device is connected to the display sink. For example, the display + * can be connected immediately to the device or there can be a receiver in between. */ - public int[] getRelativeAddress() { - return mRelativeAddress; + @ConnectionToSinkType + public int getConnectionToSinkType() { + return mConnectionToSinkType; } @Override @@ -119,8 +176,8 @@ public final class DeviceProductInfo implements Parcelable { + mModelYear + ", manufactureDate=" + mManufactureDate - + ", relativeAddress=" - + Arrays.toString(mRelativeAddress) + + ", connectionToSinkType=" + + mConnectionToSinkType + '}'; } @@ -134,16 +191,16 @@ public final class DeviceProductInfo implements Parcelable { && Objects.equals(mProductId, that.mProductId) && Objects.equals(mModelYear, that.mModelYear) && Objects.equals(mManufactureDate, that.mManufactureDate) - && Arrays.equals(mRelativeAddress, that.mRelativeAddress); + && mConnectionToSinkType == that.mConnectionToSinkType; } @Override public int hashCode() { 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>() { @Override public DeviceProductInfo createFromParcel(Parcel in) { @@ -162,13 +219,13 @@ public final class DeviceProductInfo implements Parcelable { } @Override - public void writeToParcel(Parcel dest, int flags) { + public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeString(mName); dest.writeString(mManufacturerPnpId); dest.writeValue(mProductId); dest.writeValue(mModelYear); dest.writeValue(mManufactureDate); - dest.writeIntArray(mRelativeAddress); + dest.writeInt(mConnectionToSinkType); } /** diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java index 0ba1dfee16f3..8117c963b959 100644 --- a/core/java/android/view/Display.java +++ b/core/java/android/view/Display.java @@ -34,6 +34,7 @@ import android.graphics.ColorSpace; import android.graphics.PixelFormat; import android.graphics.Point; import android.graphics.Rect; +import android.hardware.display.DeviceProductInfo; import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManagerGlobal; import android.os.Build; @@ -1181,6 +1182,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. * The size returned by this method does not necessarily represent the * actual raw size (native resolution) of the display. diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 7a3366acce27..961d4cb23679 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -27,6 +27,7 @@ #include <android-base/chrono_utils.h> #include <android/graphics/region.h> #include <android/gui/BnScreenCaptureListener.h> +#include <android/hardware/display/IDeviceProductInfoConstants.h> #include <android/os/IInputConstants.h> #include <android_runtime/AndroidRuntime.h> #include <android_runtime/android_hardware_HardwareBuffer.h> @@ -999,16 +1000,24 @@ static jobject convertDeviceProductInfoToJavaObject( } else { LOG_FATAL("Unknown alternative for variant DeviceProductInfo::ManufactureOrModelDate"); } - auto relativeAddress = env->NewIntArray(info->relativeAddress.size()); - auto relativeAddressData = env->GetIntArrayElements(relativeAddress, nullptr); - for (int i = 0; i < info->relativeAddress.size(); i++) { - relativeAddressData[i] = info->relativeAddress[i]; + jint connectionToSinkType; + // Relative address maps to HDMI physical address. All addresses are 4 digits long allowing + // for a 5–device-deep hierarchy. For more information, refer: + // 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, manufacturerPnpId, productId, modelYear, manufactureDate, - relativeAddress); + connectionToSinkType); } 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/Integer;" "Landroid/hardware/display/DeviceProductInfo$ManufactureDate;" - "[I)V"); + "I)V"); jclass deviceProductInfoManufactureDateClazz = FindClassOrDie(env, "android/hardware/display/DeviceProductInfo$ManufactureDate"); |