Sign up ×
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It's 100% free, no registration required.

I used XML to control the theme of an InputMethod for Android. A theme in XML contains the color and the shape of keys.

XML file

<theme>


    <color name="FIRST_LINE_LETTER_COLOR" value="#263238"></color>
    <color name="SECOND_LINE_LETTER_COLOR" value="#263238"></color>
    <color name="THIRD_LINE_LETTER_COLOR" value="#263238"></color>

    <color name="PIN_KEY_COLOR" value="#263238"></color>
    <color name="PIN_KEY_PRESSED_COLOR" value="#80CBC4"></color>
    <shape name="PIN_KEY_SHAPE" value="circle"></shape>

</theme>

ThemeXmlParser.java

import android.content.Context;
import android.graphics.Color;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class ThemeXmlParser {

    private Context context;
    private static Map<String, Integer> colorMap;
    private static Map<String, String> configMap;


    private ThemeXmlParser(Context ctx) {
        context = ctx;
        colorMap = new HashMap<String, Integer>();
        configMap = new HashMap<String, String>();
    }

    public static ThemeXmlParser newInstance(Context ctx) {
        return new ThemeXmlParser(ctx);
    }

    private String selectAssetsPath(String scheme) {
        String path = "";
        if (scheme.equals(XMLStr.Theme.google_dark)) {
            path = "themes/google_dark_theme.xml";
        } else {
            //todo add other skins
        }
        return path;
    }

    public void parse(String scheme) {

        String assetsPath = selectAssetsPath(scheme);
        InputSource is = null;
        try {
            is = new InputSource(context.getAssets().open(assetsPath));
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (is != null) {
            doParse(is);
        }
    }

    public static Map<String, Integer> colorMap() {
        return colorMap;
    }

    public static Map<String, String> configMap() {
        return configMap;
    }


    private void doParse(InputSource is) {

        XMLReader xmlReader = createXMLReader();
        ColorHandler colorHandler = new ColorHandler();
        xmlReader.setContentHandler(colorHandler);
        try {
            xmlReader.parse(is);

        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private XMLReader createXMLReader() {

        XMLReader reader = null;
        SAXParser saxParser = createSAXParser();
        try {
            reader = saxParser.getXMLReader();
        } catch (SAXException e) {
            e.printStackTrace();
        }
        return reader;
    }

    private SAXParser createSAXParser() {

        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser saxParser = null;
        try {
            saxParser = factory.newSAXParser();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }
        return saxParser;
    }


    class ColorHandler extends DefaultHandler {

        @Override
        public void startElement(String uri, String localName, String qName,
                                 Attributes attrs) throws SAXException {

            String name = attrs.getValue(0);
            String value = attrs.getValue(1);
            try {
                if (value.startsWith("#")) {
                    //color
                    int color = toColor(value);
                    colorMap.put(name, color);
                } else {
                    //config
                    configMap.put(name, value);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        /**
         * @param colorStr: #FFFFFF
         * @return:Color.rgb(256, 256, 256)
         */
        private int toColor(String colorStr) {
            return Color.parseColor(colorStr);
        }
    }

}

I'd like to focus on:

  1. The best library for parsing XML
  2. The best code style that obeys software engineering
  3. The best way to handle these exceptions
share|improve this question

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Browse other questions tagged or ask your own question.