CLKey.java

/*
 * Copyright (C) 2021 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 androidx.constraintlayout.core.parser;

import java.util.ArrayList;
import java.util.Objects;

public class CLKey extends CLContainer {

    private static ArrayList<String> sSections = new ArrayList<>();

    static {
        sSections.add("ConstraintSets");
        sSections.add("Variables");
        sSections.add("Generate");
        sSections.add("Transitions");
        sSections.add("KeyFrames");
        sSections.add("KeyAttributes");
        sSections.add("KeyPositions");
        sSections.add("KeyCycles");
    }

    public CLKey(char[] content) {
        super(content);
    }

    // @TODO: add description
    public static CLElement allocate(char[] content) {
        return new CLKey(content);
    }

    // @TODO: add description
    public static CLElement allocate(String name, CLElement value) {
        CLKey key = new CLKey(name.toCharArray());
        key.setStart(0);
        key.setEnd(name.length() - 1);
        key.set(value);
        return key;
    }

    public String getName() {
        return content();
    }

    @Override
    protected String toJSON() {
        if (mElements.size() > 0) {
            return getDebugName() + content() + ": " + mElements.get(0).toJSON();
        }
        return getDebugName() + content() + ": <> ";
    }

    @Override
    protected String toFormattedJSON(int indent, int forceIndent) {
        StringBuilder json = new StringBuilder(getDebugName());
        addIndent(json, indent);
        String content = content();
        if (mElements.size() > 0) {
            json.append(content);
            json.append(": ");
            if (sSections.contains(content)) {
                forceIndent = 3;
            }
            if (forceIndent > 0) {
                json.append(mElements.get(0).toFormattedJSON(indent, forceIndent - 1));
            } else {
                String val = mElements.get(0).toJSON();
                if (val.length() + indent < sMaxLine) {
                    json.append(val);
                } else {
                    json.append(mElements.get(0).toFormattedJSON(indent, forceIndent - 1));
                }
            }
            return json.toString();
        }
        return content + ": <> ";
    }

    // @TODO: add description
    public void set(CLElement value) {
        if (mElements.size() > 0) {
            mElements.set(0, value);
        } else {
            mElements.add(value);
        }
    }

    // @TODO: add description
    public CLElement getValue() {
        if (mElements.size() > 0) {
            return mElements.get(0);
        }
        return null;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof CLKey) {
            CLKey objKey = (CLKey) obj;
            if (!Objects.equals(this.getName(), objKey.getName())) {
                return false;
            }
        }
        // Delegate the rest to parent
        return super.equals(obj);
    }

    @Override
    public int hashCode() {
        return super.hashCode();
    }
}