| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package android.hardware.hdmi; |
| |
| import android.annotation.NonNull; |
| import android.annotation.Nullable; |
| import android.annotation.SystemApi; |
| import android.hardware.hdmi.HdmiControlManager.HdmiCecVersion; |
| import android.os.Parcel; |
| import android.os.Parcelable; |
| |
| /** |
| * A class to encapsulate device information for HDMI devices including CEC and MHL. In terms of |
| * CEC, this container includes basic information such as logical address, physical address and |
| * device type, and additional information like vendor id and osd name. In terms of MHL device, this |
| * container includes adopter id and device type. Otherwise, it keeps the information of other type |
| * devices for which only port ID, physical address are meaningful. |
| * |
| * @hide |
| */ |
| @SystemApi |
| public class HdmiDeviceInfo implements Parcelable { |
| |
| /** TV device type. */ |
| public static final int DEVICE_TV = 0; |
| |
| /** Recording device type. */ |
| public static final int DEVICE_RECORDER = 1; |
| |
| /** Device type reserved for future usage. */ |
| public static final int DEVICE_RESERVED = 2; |
| |
| /** Tuner device type. */ |
| public static final int DEVICE_TUNER = 3; |
| |
| /** Playback device type. */ |
| public static final int DEVICE_PLAYBACK = 4; |
| |
| /** Audio system device type. */ |
| public static final int DEVICE_AUDIO_SYSTEM = 5; |
| |
| /** @hide Pure CEC switch device type. */ |
| public static final int DEVICE_PURE_CEC_SWITCH = 6; |
| |
| /** @hide Video processor device type. */ |
| public static final int DEVICE_VIDEO_PROCESSOR = 7; |
| |
| // Value indicating the device is not an active source. |
| public static final int DEVICE_INACTIVE = -1; |
| |
| /** |
| * Logical address used to indicate the source comes from internal device. The logical address |
| * of TV(0) is used. |
| */ |
| public static final int ADDR_INTERNAL = 0; |
| |
| /** Invalid or uninitialized logical address */ |
| public static final int ADDR_INVALID = -1; |
| |
| /** |
| * Physical address used to indicate the source comes from internal device. The physical address |
| * of TV(0) is used. |
| */ |
| public static final int PATH_INTERNAL = 0x0000; |
| |
| /** Invalid physical address (routing path) */ |
| public static final int PATH_INVALID = 0xFFFF; |
| |
| /** Invalid port ID */ |
| public static final int PORT_INVALID = -1; |
| |
| /** Invalid device ID */ |
| public static final int ID_INVALID = 0xFFFF; |
| |
| /** Unknown vendor ID */ |
| public static final int VENDOR_ID_UNKNOWN = 0xFFFFFF; |
| |
| /** |
| * Instance that represents an inactive device. |
| * Can be passed to an input change listener to indicate that the active source |
| * yielded its status, allowing the listener to take an appropriate action such as |
| * switching to another input. |
| */ |
| public static final HdmiDeviceInfo INACTIVE_DEVICE = new HdmiDeviceInfo(); |
| |
| private static final int HDMI_DEVICE_TYPE_CEC = 0; |
| private static final int HDMI_DEVICE_TYPE_MHL = 1; |
| private static final int HDMI_DEVICE_TYPE_HARDWARE = 2; |
| |
| // Type used to indicate the device that has relinquished its active source status. |
| private static final int HDMI_DEVICE_TYPE_INACTIVE = 100; |
| |
| // Offset used for id value. MHL devices, for instance, will be assigned the value from |
| // ID_OFFSET_MHL. |
| private static final int ID_OFFSET_CEC = 0x0; |
| private static final int ID_OFFSET_MHL = 0x80; |
| private static final int ID_OFFSET_HARDWARE = 0xC0; |
| |
| // Common parameters for all device. |
| private final int mId; |
| private final int mHdmiDeviceType; |
| private final int mPhysicalAddress; |
| private final int mPortId; |
| |
| // CEC only parameters. |
| private final int mLogicalAddress; |
| private final int mDeviceType; |
| @HdmiCecVersion |
| private final int mCecVersion; |
| private final int mVendorId; |
| private final String mDisplayName; |
| private final int mDevicePowerStatus; |
| private final DeviceFeatures mDeviceFeatures; |
| |
| // MHL only parameters. |
| private final int mDeviceId; |
| private final int mAdopterId; |
| |
| /** |
| * A helper class to deserialize {@link HdmiDeviceInfo} for a parcel. |
| */ |
| public static final @android.annotation.NonNull Parcelable.Creator<HdmiDeviceInfo> CREATOR = |
| new Parcelable.Creator<HdmiDeviceInfo>() { |
| @Override |
| public HdmiDeviceInfo createFromParcel(Parcel source) { |
| int hdmiDeviceType = source.readInt(); |
| int physicalAddress = source.readInt(); |
| int portId = source.readInt(); |
| |
| switch (hdmiDeviceType) { |
| case HDMI_DEVICE_TYPE_CEC: |
| int logicalAddress = source.readInt(); |
| int deviceType = source.readInt(); |
| int vendorId = source.readInt(); |
| int powerStatus = source.readInt(); |
| String displayName = source.readString(); |
| int cecVersion = source.readInt(); |
| return cecDeviceBuilder() |
| .setLogicalAddress(logicalAddress) |
| .setPhysicalAddress(physicalAddress) |
| .setPortId(portId) |
| .setDeviceType(deviceType) |
| .setVendorId(vendorId) |
| .setDisplayName(displayName) |
| .setDevicePowerStatus(powerStatus) |
| .setCecVersion(cecVersion) |
| .build(); |
| case HDMI_DEVICE_TYPE_MHL: |
| int deviceId = source.readInt(); |
| int adopterId = source.readInt(); |
| return mhlDevice(physicalAddress, portId, adopterId, deviceId); |
| case HDMI_DEVICE_TYPE_HARDWARE: |
| return hardwarePort(physicalAddress, portId); |
| case HDMI_DEVICE_TYPE_INACTIVE: |
| return HdmiDeviceInfo.INACTIVE_DEVICE; |
| default: |
| return null; |
| } |
| } |
| |
| @Override |
| public HdmiDeviceInfo[] newArray(int size) { |
| return new HdmiDeviceInfo[size]; |
| } |
| }; |
| |
| /** |
| * Constructor. Initializes the instance representing an inactive device. |
| * Can be passed to an input change listener to indicate that the active source |
| * yielded its status, allowing the listener to take an appropriate action such as |
| * switching to another input. |
| * |
| * @deprecated Use {@link #INACTIVE_DEVICE} instead. |
| */ |
| @Deprecated |
| public HdmiDeviceInfo() { |
| mHdmiDeviceType = HDMI_DEVICE_TYPE_INACTIVE; |
| mPhysicalAddress = PATH_INVALID; |
| mId = ID_INVALID; |
| |
| mLogicalAddress = ADDR_INVALID; |
| mDeviceType = DEVICE_INACTIVE; |
| mCecVersion = HdmiControlManager.HDMI_CEC_VERSION_1_4_B; |
| mPortId = PORT_INVALID; |
| mDevicePowerStatus = HdmiControlManager.POWER_STATUS_UNKNOWN; |
| mDisplayName = "Inactive"; |
| mVendorId = 0; |
| mDeviceFeatures = DeviceFeatures.ALL_FEATURES_SUPPORT_UNKNOWN; |
| |
| mDeviceId = -1; |
| mAdopterId = -1; |
| } |
| |
| /** |
| * Converts an instance to a builder. |
| * |
| * @hide |
| */ |
| public Builder toBuilder() { |
| return new Builder(this); |
| } |
| |
| private HdmiDeviceInfo(Builder builder) { |
| this.mHdmiDeviceType = builder.mHdmiDeviceType; |
| this.mPhysicalAddress = builder.mPhysicalAddress; |
| this.mPortId = builder.mPortId; |
| this.mLogicalAddress = builder.mLogicalAddress; |
| this.mDeviceType = builder.mDeviceType; |
| this.mCecVersion = builder.mCecVersion; |
| this.mVendorId = builder.mVendorId; |
| this.mDisplayName = builder.mDisplayName; |
| this.mDevicePowerStatus = builder.mDevicePowerStatus; |
| this.mDeviceFeatures = builder.mDeviceFeatures; |
| this.mDeviceId = builder.mDeviceId; |
| this.mAdopterId = builder.mAdopterId; |
| |
| switch (mHdmiDeviceType) { |
| case HDMI_DEVICE_TYPE_MHL: |
| this.mId = idForMhlDevice(mPortId); |
| break; |
| case HDMI_DEVICE_TYPE_HARDWARE: |
| this.mId = idForHardware(mPortId); |
| break; |
| case HDMI_DEVICE_TYPE_CEC: |
| this.mId = idForCecDevice(mLogicalAddress); |
| break; |
| case HDMI_DEVICE_TYPE_INACTIVE: |
| default: |
| this.mId = ID_INVALID; |
| } |
| } |
| |
| /** |
| * Creates a Builder for an {@link HdmiDeviceInfo} representing a CEC device. |
| * |
| * @hide |
| */ |
| public static Builder cecDeviceBuilder() { |
| return new Builder(HDMI_DEVICE_TYPE_CEC); |
| } |
| |
| /** |
| * Creates an {@link HdmiDeviceInfo} representing an MHL device. |
| * |
| * @param physicalAddress physical address of HDMI device |
| * @param portId portId HDMI port ID (1 for HDMI1) |
| * @param adopterId adopter id of MHL |
| * @param deviceId device id of MHL |
| * @hide |
| */ |
| public static HdmiDeviceInfo mhlDevice( |
| int physicalAddress, int portId, int adopterId, int deviceId) { |
| return new Builder(HDMI_DEVICE_TYPE_MHL) |
| .setPhysicalAddress(physicalAddress) |
| .setPortId(portId) |
| .setVendorId(0) |
| .setDisplayName("Mobile") |
| .setDeviceId(adopterId) |
| .setAdopterId(deviceId) |
| .build(); |
| } |
| |
| /** |
| * Creates an {@link HdmiDeviceInfo} representing a hardware port. |
| * |
| * @param physicalAddress physical address of the port |
| * @param portId HDMI port ID (1 for HDMI1) |
| * @hide |
| */ |
| public static HdmiDeviceInfo hardwarePort(int physicalAddress, int portId) { |
| return new Builder(HDMI_DEVICE_TYPE_HARDWARE) |
| .setPhysicalAddress(physicalAddress) |
| .setPortId(portId) |
| .setVendorId(0) |
| .setDisplayName("HDMI" + portId) |
| .build(); |
| } |
| |
| /** |
| * Returns the id of the device. |
| */ |
| public int getId() { |
| return mId; |
| } |
| |
| /** |
| * Returns the CEC features that this device supports. |
| * |
| * @hide |
| */ |
| public DeviceFeatures getDeviceFeatures() { |
| return mDeviceFeatures; |
| } |
| |
| /** |
| * Returns the id to be used for CEC device. |
| * |
| * @param address logical address of CEC device |
| * @return id for CEC device |
| */ |
| public static int idForCecDevice(int address) { |
| // The id is generated based on the logical address. |
| return ID_OFFSET_CEC + address; |
| } |
| |
| /** |
| * Returns the id to be used for MHL device. |
| * |
| * @param portId port which the MHL device is connected to |
| * @return id for MHL device |
| */ |
| public static int idForMhlDevice(int portId) { |
| // The id is generated based on the port id since there can be only one MHL device per port. |
| return ID_OFFSET_MHL + portId; |
| } |
| |
| /** |
| * Returns the id to be used for hardware port. |
| * |
| * @param portId port id |
| * @return id for hardware port |
| */ |
| public static int idForHardware(int portId) { |
| return ID_OFFSET_HARDWARE + portId; |
| } |
| |
| /** |
| * Returns the CEC logical address of the device. |
| */ |
| public int getLogicalAddress() { |
| return mLogicalAddress; |
| } |
| |
| /** |
| * Returns the physical address of the device. |
| */ |
| public int getPhysicalAddress() { |
| return mPhysicalAddress; |
| } |
| |
| /** |
| * Returns the port ID. |
| */ |
| public int getPortId() { |
| return mPortId; |
| } |
| |
| /** |
| * Returns CEC type of the device. For more details, refer constants between {@link #DEVICE_TV} |
| * and {@link #DEVICE_INACTIVE}. |
| */ |
| public int getDeviceType() { |
| return mDeviceType; |
| } |
| |
| /** |
| * Returns the CEC version the device supports. |
| * |
| * @hide |
| */ |
| @HdmiCecVersion |
| public int getCecVersion() { |
| return mCecVersion; |
| } |
| |
| /** |
| * Returns device's power status. It should be one of the following values. |
| * <ul> |
| * <li>{@link HdmiControlManager#POWER_STATUS_ON} |
| * <li>{@link HdmiControlManager#POWER_STATUS_STANDBY} |
| * <li>{@link HdmiControlManager#POWER_STATUS_TRANSIENT_TO_ON} |
| * <li>{@link HdmiControlManager#POWER_STATUS_TRANSIENT_TO_STANDBY} |
| * <li>{@link HdmiControlManager#POWER_STATUS_UNKNOWN} |
| * </ul> |
| */ |
| public int getDevicePowerStatus() { |
| return mDevicePowerStatus; |
| } |
| |
| /** |
| * Returns MHL device id. Return -1 for non-MHL device. |
| */ |
| public int getDeviceId() { |
| return mDeviceId; |
| } |
| |
| /** |
| * Returns MHL adopter id. Return -1 for non-MHL device. |
| */ |
| public int getAdopterId() { |
| return mAdopterId; |
| } |
| |
| /** |
| * Returns {@code true} if the device is of a type that can be an input source. |
| */ |
| public boolean isSourceType() { |
| if (isCecDevice()) { |
| return mDeviceType == DEVICE_PLAYBACK |
| || mDeviceType == DEVICE_RECORDER |
| || mDeviceType == DEVICE_TUNER; |
| } else if (isMhlDevice()) { |
| return true; |
| } else { |
| return false; |
| } |
| } |
| |
| /** |
| * Returns {@code true} if the device represents an HDMI-CEC device. {@code false} if the device |
| * is either MHL or other device. |
| */ |
| public boolean isCecDevice() { |
| return mHdmiDeviceType == HDMI_DEVICE_TYPE_CEC; |
| } |
| |
| /** |
| * Returns {@code true} if the device represents an MHL device. {@code false} if the device is |
| * either CEC or other device. |
| */ |
| public boolean isMhlDevice() { |
| return mHdmiDeviceType == HDMI_DEVICE_TYPE_MHL; |
| } |
| |
| /** |
| * Return {@code true} if the device represents an inactivated device that relinquishes |
| * its status as active source by <Active Source> (HDMI-CEC) or Content-off (MHL). |
| */ |
| public boolean isInactivated() { |
| return mHdmiDeviceType == HDMI_DEVICE_TYPE_INACTIVE; |
| } |
| |
| /** |
| * Returns display (OSD) name of the device. |
| */ |
| public String getDisplayName() { |
| return mDisplayName; |
| } |
| |
| /** |
| * Returns vendor id of the device. Vendor id is used to distinguish devices built by other |
| * manufactures. This is required for vendor-specific command on CEC standard. |
| */ |
| public int getVendorId() { |
| return mVendorId; |
| } |
| |
| /** |
| * Describes the kinds of special objects contained in this Parcelable's marshalled |
| * representation. |
| */ |
| @Override |
| public int describeContents() { |
| return 0; |
| } |
| |
| /** |
| * Serializes this object into a {@link Parcel}. |
| * |
| * @param dest The Parcel in which the object should be written. |
| * @param flags Additional flags about how the object should be written. May be 0 or |
| * {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE}. |
| */ |
| @Override |
| public void writeToParcel(Parcel dest, int flags) { |
| dest.writeInt(mHdmiDeviceType); |
| dest.writeInt(mPhysicalAddress); |
| dest.writeInt(mPortId); |
| switch (mHdmiDeviceType) { |
| case HDMI_DEVICE_TYPE_CEC: |
| dest.writeInt(mLogicalAddress); |
| dest.writeInt(mDeviceType); |
| dest.writeInt(mVendorId); |
| dest.writeInt(mDevicePowerStatus); |
| dest.writeString(mDisplayName); |
| dest.writeInt(mCecVersion); |
| break; |
| case HDMI_DEVICE_TYPE_MHL: |
| dest.writeInt(mDeviceId); |
| dest.writeInt(mAdopterId); |
| break; |
| case HDMI_DEVICE_TYPE_INACTIVE: |
| // flow through |
| default: |
| // no-op |
| } |
| } |
| |
| @NonNull |
| @Override |
| public String toString() { |
| StringBuilder s = new StringBuilder(); |
| switch (mHdmiDeviceType) { |
| case HDMI_DEVICE_TYPE_CEC: |
| s.append("CEC: "); |
| s.append("logical_address: ").append(String.format("0x%02X", mLogicalAddress)); |
| s.append(" "); |
| s.append("device_type: ").append(mDeviceType).append(" "); |
| s.append("cec_version: ").append(mCecVersion).append(" "); |
| s.append("vendor_id: ").append(mVendorId).append(" "); |
| s.append("display_name: ").append(mDisplayName).append(" "); |
| s.append("power_status: ").append(mDevicePowerStatus).append(" "); |
| break; |
| case HDMI_DEVICE_TYPE_MHL: |
| s.append("MHL: "); |
| s.append("device_id: ").append(String.format("0x%04X", mDeviceId)).append(" "); |
| s.append("adopter_id: ").append(String.format("0x%04X", mAdopterId)).append(" "); |
| break; |
| |
| case HDMI_DEVICE_TYPE_HARDWARE: |
| s.append("Hardware: "); |
| break; |
| case HDMI_DEVICE_TYPE_INACTIVE: |
| s.append("Inactivated: "); |
| break; |
| default: |
| return ""; |
| } |
| s.append("physical_address: ").append(String.format("0x%04X", mPhysicalAddress)); |
| s.append(" "); |
| s.append("port_id: ").append(mPortId); |
| |
| if (mHdmiDeviceType == HDMI_DEVICE_TYPE_CEC) { |
| s.append("\n ").append(mDeviceFeatures.toString()); |
| } |
| |
| return s.toString(); |
| } |
| |
| @Override |
| public boolean equals(@Nullable Object obj) { |
| if (!(obj instanceof HdmiDeviceInfo)) { |
| return false; |
| } |
| |
| HdmiDeviceInfo other = (HdmiDeviceInfo) obj; |
| return mHdmiDeviceType == other.mHdmiDeviceType |
| && mPhysicalAddress == other.mPhysicalAddress |
| && mPortId == other.mPortId |
| && mLogicalAddress == other.mLogicalAddress |
| && mDeviceType == other.mDeviceType |
| && mCecVersion == other.mCecVersion |
| && mVendorId == other.mVendorId |
| && mDevicePowerStatus == other.mDevicePowerStatus |
| && mDisplayName.equals(other.mDisplayName) |
| && mDeviceId == other.mDeviceId |
| && mAdopterId == other.mAdopterId; |
| } |
| |
| @Override |
| public int hashCode() { |
| return java.util.Objects.hash( |
| mHdmiDeviceType, |
| mPhysicalAddress, |
| mPortId, |
| mLogicalAddress, |
| mDeviceType, |
| mCecVersion, |
| mVendorId, |
| mDevicePowerStatus, |
| mDisplayName, |
| mDeviceId, |
| mAdopterId); |
| } |
| |
| /** |
| * Builder for {@link HdmiDeviceInfo} instances. |
| * |
| * @hide |
| */ |
| public static final class Builder { |
| // Required parameters |
| private final int mHdmiDeviceType; |
| |
| // Common parameters |
| private int mPhysicalAddress = PATH_INVALID; |
| private int mPortId = PORT_INVALID; |
| |
| // CEC parameters |
| private int mLogicalAddress = ADDR_INVALID; |
| private int mDeviceType = DEVICE_RESERVED; |
| @HdmiCecVersion |
| private int mCecVersion = HdmiControlManager.HDMI_CEC_VERSION_1_4_B; |
| private int mVendorId = VENDOR_ID_UNKNOWN; |
| private String mDisplayName = ""; |
| private int mDevicePowerStatus = HdmiControlManager.POWER_STATUS_UNKNOWN; |
| private DeviceFeatures mDeviceFeatures; |
| |
| // MHL parameters |
| private int mDeviceId = -1; |
| private int mAdopterId = -1; |
| |
| private Builder(int hdmiDeviceType) { |
| mHdmiDeviceType = hdmiDeviceType; |
| if (hdmiDeviceType == HDMI_DEVICE_TYPE_CEC) { |
| mDeviceFeatures = DeviceFeatures.ALL_FEATURES_SUPPORT_UNKNOWN; |
| } else { |
| mDeviceFeatures = DeviceFeatures.NO_FEATURES_SUPPORTED; |
| } |
| } |
| |
| private Builder(@NonNull HdmiDeviceInfo hdmiDeviceInfo) { |
| mHdmiDeviceType = hdmiDeviceInfo.mHdmiDeviceType; |
| mPhysicalAddress = hdmiDeviceInfo.mPhysicalAddress; |
| mPortId = hdmiDeviceInfo.mPortId; |
| mLogicalAddress = hdmiDeviceInfo.mLogicalAddress; |
| mDeviceType = hdmiDeviceInfo.mDeviceType; |
| mCecVersion = hdmiDeviceInfo.mCecVersion; |
| mVendorId = hdmiDeviceInfo.mVendorId; |
| mDisplayName = hdmiDeviceInfo.mDisplayName; |
| mDevicePowerStatus = hdmiDeviceInfo.mDevicePowerStatus; |
| mDeviceId = hdmiDeviceInfo.mDeviceId; |
| mAdopterId = hdmiDeviceInfo.mAdopterId; |
| mDeviceFeatures = hdmiDeviceInfo.mDeviceFeatures; |
| } |
| |
| /** |
| * Create a new {@link HdmiDeviceInfo} object. |
| */ |
| @NonNull |
| public HdmiDeviceInfo build() { |
| return new HdmiDeviceInfo(this); |
| } |
| |
| /** |
| * Sets the value for {@link #getPhysicalAddress()}. |
| */ |
| @NonNull |
| public Builder setPhysicalAddress(int physicalAddress) { |
| mPhysicalAddress = physicalAddress; |
| return this; |
| } |
| |
| /** |
| * Sets the value for {@link #getPortId()}. |
| */ |
| @NonNull |
| public Builder setPortId(int portId) { |
| mPortId = portId; |
| return this; |
| } |
| |
| /** |
| * Sets the value for {@link #getLogicalAddress()}. |
| */ |
| @NonNull |
| public Builder setLogicalAddress(int logicalAddress) { |
| mLogicalAddress = logicalAddress; |
| return this; |
| } |
| |
| /** |
| * Sets the value for {@link #getDeviceType()}. |
| */ |
| @NonNull |
| public Builder setDeviceType(int deviceType) { |
| mDeviceType = deviceType; |
| return this; |
| } |
| |
| /** |
| * Sets the value for {@link #getCecVersion()}. |
| */ |
| @NonNull |
| public Builder setCecVersion(int hdmiCecVersion) { |
| mCecVersion = hdmiCecVersion; |
| return this; |
| } |
| |
| /** |
| * Sets the value for {@link #getVendorId()}. |
| */ |
| @NonNull |
| public Builder setVendorId(int vendorId) { |
| mVendorId = vendorId; |
| return this; |
| } |
| |
| /** |
| * Sets the value for {@link #getDisplayName()}. |
| */ |
| @NonNull |
| public Builder setDisplayName(@NonNull String displayName) { |
| mDisplayName = displayName; |
| return this; |
| } |
| |
| /** |
| * Sets the value for {@link #getDevicePowerStatus()}. |
| */ |
| @NonNull |
| public Builder setDevicePowerStatus(int devicePowerStatus) { |
| mDevicePowerStatus = devicePowerStatus; |
| return this; |
| } |
| |
| /** |
| * Sets the value for {@link #getDeviceFeatures()}. |
| */ |
| @NonNull |
| public Builder setDeviceFeatures(DeviceFeatures deviceFeatures) { |
| this.mDeviceFeatures = deviceFeatures; |
| return this; |
| } |
| |
| /** |
| * Sets the value for {@link #getDeviceId()}. |
| */ |
| @NonNull |
| public Builder setDeviceId(int deviceId) { |
| mDeviceId = deviceId; |
| return this; |
| } |
| |
| /** |
| * Sets the value for {@link #getAdopterId()}. |
| */ |
| @NonNull |
| public Builder setAdopterId(int adopterId) { |
| mAdopterId = adopterId; |
| return this; |
| } |
| |
| /** |
| * Updates the value for {@link #getDeviceFeatures()} with a new set of device features. |
| * New information overrides the old, except when feature support was unknown. |
| */ |
| @NonNull |
| public Builder updateDeviceFeatures(DeviceFeatures deviceFeatures) { |
| mDeviceFeatures = mDeviceFeatures.toBuilder().update(deviceFeatures).build(); |
| return this; |
| } |
| } |
| } |