package com.android.node;

import android.R;
import android.view.inspector.InspectionCompanion;
import android.view.inspector.PropertyMapper;
import android.view.inspector.PropertyReader;
import java.lang.Override;

/**
 * Inspection companion for {@link TestNode}.
 *
 * Generated by {@link android.processor.view.inspector.InspectionCompanionGenerator}
 * on behalf of {@link android.processor.view.inspector.InspectionCompanionGeneratorTest}.
 */
public final class TestNode$InspectionCompanion implements InspectionCompanion<TestNode> {
    /**
     * Set by {@link #mapProperties(PropertyMapper)} once properties have been mapped.
     */
    private boolean mPropertiesMapped = false;

    /**
     * Property ID of {@code boolean}.
     */
    private int mBooleanId;

    /**
     * Property ID of {@code byte}.
     */
    private int mByteId;

    /**
     * Property ID of {@code char}.
     */
    private int mCharId;

    /**
     * Property ID of {@code color}.
     */
    private int mColorId;

    /**
     * Property ID of {@code double}.
     */
    private int mDoubleId;

    /**
     * Property ID of {@code float}.
     */
    private int mFloatId;

    /**
     * Property ID of {@code gravity}.
     */
    private int mGravityId;

    /**
     * Property ID of {@code int}.
     */
    private int mIntId;

    /**
     * Property ID of {@code long}.
     */
    private int mLongId;

    /**
     * Property ID of {@code object}.
     */
    private int mObjectId;

    /**
     * Property ID of {@code resourceId}.
     */
    private int mResourceIdId;

    /**
     * Property ID of {@code short}.
     */
    private int mShortId;

    @Override
    public void mapProperties(PropertyMapper propertyMapper) {
        mBooleanId = propertyMapper.mapBoolean("boolean", R.attr.boolean);
        mByteId = propertyMapper.mapByte("byte", R.attr.byte);
        mCharId = propertyMapper.mapChar("char", R.attr.char);
        mColorId = propertyMapper.mapColor("color", R.attr.color);
        mDoubleId = propertyMapper.mapDouble("double", R.attr.double);
        mFloatId = propertyMapper.mapFloat("float", R.attr.float);
        mGravityId = propertyMapper.mapGravity("gravity", R.attr.gravity);
        mIntId = propertyMapper.mapInt("int", R.attr.int);
        mLongId = propertyMapper.mapLong("long", R.attr.long);
        mObjectId = propertyMapper.mapObject("object", R.attr.object);
        mResourceIdId = propertyMapper.mapResourceId("resourceId", R.attr.resourceId);
        mShortId = propertyMapper.mapShort("short", R.attr.short);
        mPropertiesMapped = true;
    }

    @Override
    public void readProperties(TestNode node, PropertyReader propertyReader) {
        if (!mPropertiesMapped) {
            throw new InspectionCompanion.UninitializedPropertyMapException();
        }
        propertyReader.readBoolean(mBooleanId, node.getBoolean());
        propertyReader.readByte(mByteId, node.getByte());
        propertyReader.readChar(mCharId, node.getChar());
        propertyReader.readColor(mColorId, node.getColor());
        propertyReader.readDouble(mDoubleId, node.getDouble());
        propertyReader.readFloat(mFloatId, node.getFloat());
        propertyReader.readGravity(mGravityId, node.getGravity());
        propertyReader.readInt(mIntId, node.getInt());
        propertyReader.readLong(mLongId, node.getLong());
        propertyReader.readObject(mObjectId, node.getObject());
        propertyReader.readResourceId(mResourceIdId, node.getResourceId());
        propertyReader.readShort(mShortId, node.getShort());
    }
}
