KeyParser.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.motion.parse;

import androidx.constraintlayout.core.motion.utils.TypedBundle;
import androidx.constraintlayout.core.motion.utils.TypedValues;
import androidx.constraintlayout.core.parser.CLElement;
import androidx.constraintlayout.core.parser.CLKey;
import androidx.constraintlayout.core.parser.CLObject;
import androidx.constraintlayout.core.parser.CLParser;
import androidx.constraintlayout.core.parser.CLParsingException;

import javax.swing.text.html.parser.Parser;

public class KeyParser {

    private interface Ids {
        int get(String str);
    }

    private interface DataType {
        int get(int str);
    }

    private static TypedBundle parse(String str, Ids table, DataType dtype) {
        TypedBundle bundle = new TypedBundle();

        try {
            CLObject parsedContent = CLParser.parse(str);
            int n = parsedContent.size();
            for (int i = 0; i < n; i++) {
                CLKey clkey = ((CLKey) parsedContent.get(i));
                String type = clkey.content();;
                CLElement value = clkey.getValue();
                int id = table.get(type);
                if (id == -1) {
                    System.err.println("unknown type " + type);
                    continue;
                }
                switch (dtype.get(id)) {
                    case TypedValues.FLOAT_MASK:
                        bundle.add(id, value.getFloat());
                        System.out.println("parse " + type + " FLOAT_MASK > " + value.getFloat());
                        break;
                    case TypedValues.STRING_MASK:
                        bundle.add(id, value.content());
                        System.out.println("parse " + type + " STRING_MASK > " + value.content());

                        break;
                    case TypedValues.INT_MASK:
                        bundle.add(id, value.getInt());
                        System.out.println("parse " + type + " INT_MASK > " + value.getInt());
                        break;
                    case TypedValues.BOOLEAN_MASK:
                        bundle.add(id, parsedContent.getBoolean(i));
                        break;
                }
            }
        } catch (CLParsingException e) {
            e.printStackTrace();
        }
        return bundle;
    }

    public static TypedBundle parseAttributes(String str) {
        return parse(str, TypedValues.Attributes::getId, TypedValues.Attributes::getType);
    }

    public static void main(String[] args) {
        String str = "{" +
                "frame:22,\n" +
                "target:'widget1',\n" +
                "easing:'easeIn',\n" +
                "curveFit:'spline',\n" +
                "progress:0.3,\n" +
                "alpha:0.2,\n" +
                "elevation:0.7,\n" +
                "rotationZ:23,\n" +
                "rotationX:25.0,\n" +
                "rotationY:27.0,\n" +
                "pivotX:15,\n" +
                "pivotY:17,\n" +
                "pivotTarget:'32',\n" +
                "pathRotate:23,\n" +
                "scaleX:0.5,\n" +
                "scaleY:0.7,\n" +
                "translationX:5,\n" +
                "translationY:7,\n" +
                "translationZ:11,\n" +
                "}";
        parseAttributes(str);
    }
}