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 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);
        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.readShort(mShortId, node.getShort());
    }
}
