Merge "Revert "Adding public API to expose DisplayInfo.deviceProductInfo"" into sc-dev
diff --git a/core/api/current.txt b/core/api/current.txt
index ef18999..24a6c4a 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -18559,23 +18559,6 @@
 
 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);
@@ -46704,7 +46687,6 @@
     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 9457d8f1..41126b7 100644
--- a/core/java/android/hardware/display/DeviceProductInfo.java
+++ b/core/java/android/hardware/display/DeviceProductInfo.java
@@ -16,69 +16,40 @@
 
 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.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
+import java.util.Arrays;
 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 @ConnectionToSinkType int mConnectionToSinkType;
+    private final int[] mRelativeAddress;
 
-    /** @hide */
     public DeviceProductInfo(
             String name,
             String manufacturerPnpId,
             String productId,
             Integer modelYear,
             ManufactureDate manufactureDate,
-            int connectionToSinkType) {
+            int[] relativeAddress) {
         this.mName = name;
         this.mManufacturerPnpId = manufacturerPnpId;
         this.mProductId = productId;
         this.mModelYear = modelYear;
         this.mManufactureDate = manufactureDate;
-        this.mConnectionToSinkType = connectionToSinkType;
+        this.mRelativeAddress = relativeAddress;
     }
 
     private DeviceProductInfo(Parcel in) {
@@ -87,13 +58,12 @@
         mProductId = (String) in.readValue(null);
         mModelYear = (Integer) in.readValue(null);
         mManufactureDate = (ManufactureDate) in.readValue(null);
-        mConnectionToSinkType = in.readInt();
+        mRelativeAddress = in.createIntArray();
     }
 
     /**
      * @return Display name.
      */
-    @Nullable
     public String getName() {
         return mName;
     }
@@ -101,7 +71,6 @@
     /**
      * @return Manufacturer Plug and Play ID.
      */
-    @NonNull
     public String getManufacturerPnpId() {
         return mManufacturerPnpId;
     }
@@ -109,58 +78,32 @@
     /**
      * @return Manufacturer product ID.
      */
-    @NonNull
     public String getProductId() {
         return mProductId;
     }
 
     /**
-     * @return Model year of the device. Return -1 if not available. Typically,
-     * one of model year or manufacture year is available.
+     * @return Model year of the device. Typically exactly one of model year or
+     *      manufacture date will be present.
      */
-    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;
+    public Integer getModelYear() {
+        return mModelYear;
     }
 
     /**
      * @return Manufacture date. Typically exactly one of model year or manufacture
      * date will be present.
-     *
-     * @hide
      */
     public ManufactureDate getManufactureDate() {
         return mManufactureDate;
     }
 
     /**
-     * @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.
+     * @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].
      */
-    @ConnectionToSinkType
-    public int getConnectionToSinkType() {
-        return mConnectionToSinkType;
+    public int[] getRelativeAddress() {
+        return mRelativeAddress;
     }
 
     @Override
@@ -176,8 +119,8 @@
                 + mModelYear
                 + ", manufactureDate="
                 + mManufactureDate
-                + ", connectionToSinkType="
-                + mConnectionToSinkType
+                + ", relativeAddress="
+                + Arrays.toString(mRelativeAddress)
                 + '}';
     }
 
@@ -191,16 +134,16 @@
                 && Objects.equals(mProductId, that.mProductId)
                 && Objects.equals(mModelYear, that.mModelYear)
                 && Objects.equals(mManufactureDate, that.mManufactureDate)
-                && mConnectionToSinkType == that.mConnectionToSinkType;
+                && Arrays.equals(mRelativeAddress, that.mRelativeAddress);
     }
 
     @Override
     public int hashCode() {
         return Objects.hash(mName, mManufacturerPnpId, mProductId, mModelYear, mManufactureDate,
-                mConnectionToSinkType);
+            Arrays.hashCode(mRelativeAddress));
     }
 
-    @NonNull public static final Creator<DeviceProductInfo> CREATOR =
+    public static final Creator<DeviceProductInfo> CREATOR =
             new Creator<DeviceProductInfo>() {
                 @Override
                 public DeviceProductInfo createFromParcel(Parcel in) {
@@ -219,13 +162,13 @@
     }
 
     @Override
-    public void writeToParcel(@NonNull Parcel dest, int flags) {
+    public void writeToParcel(Parcel dest, int flags) {
         dest.writeString(mName);
         dest.writeString(mManufacturerPnpId);
         dest.writeValue(mProductId);
         dest.writeValue(mModelYear);
         dest.writeValue(mManufactureDate);
-        dest.writeInt(mConnectionToSinkType);
+        dest.writeIntArray(mRelativeAddress);
     }
 
     /**
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 8117c96..0ba1dfe 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -34,7 +34,6 @@
 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;
@@ -1182,18 +1181,6 @@
     }
 
     /**
-     * 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 cbf4481..451ea93 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -27,7 +27,6 @@
 #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>
@@ -1023,24 +1022,16 @@
     } else {
         LOG_FATAL("Unknown alternative for variant DeviceProductInfo::ManufactureOrModelDate");
     }
-    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;
+    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];
     }
+    env->ReleaseIntArrayElements(relativeAddress, relativeAddressData, 0);
 
     return env->NewObject(gDeviceProductInfoClassInfo.clazz, gDeviceProductInfoClassInfo.ctor, name,
                           manufacturerPnpId, productId, modelYear, manufactureDate,
-                          connectionToSinkType);
+                          relativeAddress);
 }
 
 static jobject nativeGetStaticDisplayInfo(JNIEnv* env, jclass clazz, jobject tokenObj) {
@@ -1979,7 +1970,7 @@
                              "Ljava/lang/String;"
                              "Ljava/lang/Integer;"
                              "Landroid/hardware/display/DeviceProductInfo$ManufactureDate;"
-                             "I)V");
+                             "[I)V");
 
     jclass deviceProductInfoManufactureDateClazz =
             FindClassOrDie(env, "android/hardware/display/DeviceProductInfo$ManufactureDate");