14efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver/*
24efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver * Copyright (C) 2013 The Android Open Source Project
34efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver *
44efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver * Licensed under the Apache License, Version 2.0 (the "License");
54efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver * you may not use this file except in compliance with the License.
64efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver * You may obtain a copy of the License at
74efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver *
84efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver *      http://www.apache.org/licenses/LICENSE-2.0
94efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver *
104efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver * Unless required by applicable law or agreed to in writing, software
114efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver * distributed under the License is distributed on an "AS IS" BASIS,
124efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver * See the License for the specific language governing permissions and
144efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver * limitations under the License.
154efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver */
164efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
174efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruverpackage com.android.server.firewall;
184efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
194efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruverimport android.content.ComponentName;
204efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruverimport android.content.Intent;
214efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruverimport android.net.Uri;
224efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruverimport android.os.PatternMatcher;
234efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruverimport org.xmlpull.v1.XmlPullParser;
244efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruverimport org.xmlpull.v1.XmlPullParserException;
254efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
264efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruverimport java.io.IOException;
274efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruverimport java.util.regex.Pattern;
284efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
294efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruverabstract class StringFilter implements Filter {
304efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    private static final String ATTR_EQUALS = "equals";
314efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    private static final String ATTR_STARTS_WITH = "startsWith";
324efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    private static final String ATTR_CONTAINS = "contains";
334efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    private static final String ATTR_PATTERN = "pattern";
344efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    private static final String ATTR_REGEX = "regex";
354efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    private static final String ATTR_IS_NULL = "isNull";
364efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
374efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    private final ValueProvider mValueProvider;
384efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
394efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    private StringFilter(ValueProvider valueProvider) {
404efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        this.mValueProvider = valueProvider;
414efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    }
424efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
434efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    /**
444efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver     * Constructs a new StringFilter based on the string filter attribute on the current
454efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver     * element, and the given StringValueMatcher.
464efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver     *
474efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver     * The current node should contain exactly 1 string filter attribute. E.g. equals,
484efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver     * contains, etc. Otherwise, an XmlPullParserException will be thrown.
494efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver     *
504efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver     * @param parser      An XmlPullParser object positioned at an element that should
514efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver     *                    contain a string filter attribute
524efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver     * @return This StringFilter object
534efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver     */
544efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    public static StringFilter readFromXml(ValueProvider valueProvider, XmlPullParser parser)
554efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            throws IOException, XmlPullParserException {
564efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        StringFilter filter = null;
574efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
584efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        for (int i=0; i<parser.getAttributeCount(); i++) {
594efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            StringFilter newFilter = getFilter(valueProvider, parser, i);
604efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            if (newFilter != null) {
614efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                if (filter != null) {
624efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                    throw new XmlPullParserException("Multiple string filter attributes found");
634efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                }
644efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                filter = newFilter;
654efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            }
664efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
674efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
684efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        if (filter == null) {
694efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            // if there are no string filter attributes, we default to isNull="false" so that an
704efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            // empty filter is equivalent to an existence check
714efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            filter = new IsNullFilter(valueProvider, false);
724efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
734efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
744efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        return filter;
754efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    }
764efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
774efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    private static StringFilter getFilter(ValueProvider valueProvider, XmlPullParser parser,
784efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            int attributeIndex) {
794efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        String attributeName = parser.getAttributeName(attributeIndex);
804efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
814efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        switch (attributeName.charAt(0)) {
824efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            case 'e':
834efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                if (!attributeName.equals(ATTR_EQUALS)) {
844efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                    return null;
854efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                }
864efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                return new EqualsFilter(valueProvider, parser.getAttributeValue(attributeIndex));
874efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            case 'i':
884efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                if (!attributeName.equals(ATTR_IS_NULL)) {
894efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                    return null;
904efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                }
914efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                return new IsNullFilter(valueProvider, parser.getAttributeValue(attributeIndex));
924efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            case 's':
934efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                if (!attributeName.equals(ATTR_STARTS_WITH)) {
944efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                    return null;
954efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                }
964efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                return new StartsWithFilter(valueProvider,
974efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                        parser.getAttributeValue(attributeIndex));
984efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            case 'c':
994efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                if (!attributeName.equals(ATTR_CONTAINS)) {
1004efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                    return null;
1014efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                }
1024efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                return new ContainsFilter(valueProvider, parser.getAttributeValue(attributeIndex));
1034efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            case 'p':
1044efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                if (!attributeName.equals(ATTR_PATTERN)) {
1054efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                    return null;
1064efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                }
1074efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                return new PatternStringFilter(valueProvider,
1084efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                        parser.getAttributeValue(attributeIndex));
1094efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            case 'r':
1104efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                if (!attributeName.equals(ATTR_REGEX)) {
1114efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                    return null;
1124efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                }
1134efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                return new RegexFilter(valueProvider, parser.getAttributeValue(attributeIndex));
1144efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
1154efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        return null;
1164efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    }
1174efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
1184efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    protected abstract boolean matchesValue(String value);
1194efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
1204efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    @Override
121f5323fee2a7deaf264ed10fbe3d9c69055987e55Ben Gruver    public boolean matches(IntentFirewall ifw, ComponentName resolvedComponent, Intent intent,
12249660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver            int callerUid, int callerPid, String resolvedType, int receivingUid) {
12349660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver        String value = mValueProvider.getValue(resolvedComponent, intent, resolvedType);
1244efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        return matchesValue(value);
1254efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    }
1264efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
1274efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    private static abstract class ValueProvider extends FilterFactory {
1284efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        protected ValueProvider(String tag) {
1294efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            super(tag);
1304efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
1314efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
1324efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        public Filter newFilter(XmlPullParser parser)
1334efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                throws IOException, XmlPullParserException {
1344efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            return StringFilter.readFromXml(this, parser);
1354efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
1364efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
137f5323fee2a7deaf264ed10fbe3d9c69055987e55Ben Gruver        public abstract String getValue(ComponentName resolvedComponent, Intent intent,
13849660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver                String resolvedType);
1394efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    }
1404efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
1414efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    private static class EqualsFilter extends StringFilter {
1424efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        private final String mFilterValue;
1434efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
1444efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        public EqualsFilter(ValueProvider valueProvider, String attrValue) {
1454efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            super(valueProvider);
1464efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            mFilterValue = attrValue;
1474efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
1484efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
1494efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        @Override
1504efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        public boolean matchesValue(String value) {
1514efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            return value != null && value.equals(mFilterValue);
1524efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
1534efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    }
1544efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
1554efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    private static class ContainsFilter extends StringFilter {
1564efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        private final String mFilterValue;
1574efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
1584efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        public ContainsFilter(ValueProvider valueProvider, String attrValue) {
1594efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            super(valueProvider);
1604efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            mFilterValue = attrValue;
1614efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
1624efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
1634efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        @Override
1644efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        public boolean matchesValue(String value) {
1654efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            return value != null && value.contains(mFilterValue);
1664efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
1674efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    }
1684efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
1694efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    private static class StartsWithFilter extends StringFilter {
1704efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        private final String mFilterValue;
1714efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
1724efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        public StartsWithFilter(ValueProvider valueProvider, String attrValue) {
1734efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            super(valueProvider);
1744efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            mFilterValue = attrValue;
1754efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
1764efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
1774efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        @Override
1784efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        public boolean matchesValue(String value) {
1794efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            return value != null && value.startsWith(mFilterValue);
1804efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
1814efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    }
1824efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
1834efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    private static class PatternStringFilter extends StringFilter {
1844efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        private final PatternMatcher mPattern;
1854efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
1864efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        public PatternStringFilter(ValueProvider valueProvider, String attrValue) {
1874efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            super(valueProvider);
1884efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            mPattern = new PatternMatcher(attrValue, PatternMatcher.PATTERN_SIMPLE_GLOB);
1894efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
1904efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
1914efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        @Override
1924efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        public boolean matchesValue(String value) {
1934efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            return value != null && mPattern.match(value);
1944efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
1954efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    }
1964efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
1974efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    private static class RegexFilter extends StringFilter {
1984efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        private final Pattern mPattern;
1994efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
2004efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        public RegexFilter(ValueProvider valueProvider, String attrValue) {
2014efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            super(valueProvider);
2024efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            this.mPattern = Pattern.compile(attrValue);
2034efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
2044efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
2054efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        @Override
2064efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        public boolean matchesValue(String value) {
2074efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            return value != null && mPattern.matcher(value).matches();
2084efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
2094efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    }
2104efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
2114efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    private static class IsNullFilter extends StringFilter {
2124efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        private final boolean mIsNull;
2134efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
2144efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        public IsNullFilter(ValueProvider valueProvider, String attrValue) {
2154efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            super(valueProvider);
2164efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            mIsNull = Boolean.parseBoolean(attrValue);
2174efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
2184efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
2194efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        public IsNullFilter(ValueProvider valueProvider, boolean isNull) {
2204efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            super(valueProvider);
2214efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            mIsNull = isNull;
2224efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
2234efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
2244efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        @Override
2254efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        public boolean matchesValue(String value) {
2264efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            return (value == null) == mIsNull;
2274efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
2284efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    }
2294efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
2304efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    public static final ValueProvider COMPONENT = new ValueProvider("component") {
2314efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        @Override
23249660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver        public String getValue(ComponentName resolvedComponent, Intent intent,
23349660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver                String resolvedType) {
234f5323fee2a7deaf264ed10fbe3d9c69055987e55Ben Gruver            if (resolvedComponent != null) {
235f5323fee2a7deaf264ed10fbe3d9c69055987e55Ben Gruver                return resolvedComponent.flattenToString();
2364efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            }
2374efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            return null;
2384efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
2394efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    };
2404efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
2414efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    public static final ValueProvider COMPONENT_NAME = new ValueProvider("component-name") {
2424efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        @Override
24349660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver        public String getValue(ComponentName resolvedComponent, Intent intent,
24449660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver                String resolvedType) {
245f5323fee2a7deaf264ed10fbe3d9c69055987e55Ben Gruver            if (resolvedComponent != null) {
246f5323fee2a7deaf264ed10fbe3d9c69055987e55Ben Gruver                return resolvedComponent.getClassName();
2474efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            }
2484efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            return null;
2494efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
2504efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    };
2514efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
2524efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    public static final ValueProvider COMPONENT_PACKAGE = new ValueProvider("component-package") {
2534efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        @Override
25449660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver        public String getValue(ComponentName resolvedComponent, Intent intent,
25549660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver                String resolvedType) {
256f5323fee2a7deaf264ed10fbe3d9c69055987e55Ben Gruver            if (resolvedComponent != null) {
257f5323fee2a7deaf264ed10fbe3d9c69055987e55Ben Gruver                return resolvedComponent.getPackageName();
2584efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            }
2594efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            return null;
2604efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
2614efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    };
2624efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
2634efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    public static final FilterFactory ACTION = new ValueProvider("action") {
2644efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        @Override
26549660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver        public String getValue(ComponentName resolvedComponent, Intent intent,
26649660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver                String resolvedType) {
2674efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            return intent.getAction();
2684efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
2694efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    };
2704efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
2714efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    public static final ValueProvider DATA = new ValueProvider("data") {
2724efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        @Override
27349660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver        public String getValue(ComponentName resolvedComponent, Intent intent,
27449660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver                String resolvedType) {
2754efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            Uri data = intent.getData();
2764efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            if (data != null) {
2774efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                return data.toString();
2784efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            }
2794efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            return null;
2804efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
2814efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    };
2824efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
2834efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    public static final ValueProvider MIME_TYPE = new ValueProvider("mime-type") {
2844efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        @Override
28549660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver        public String getValue(ComponentName resolvedComponent, Intent intent,
28649660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver                String resolvedType) {
2874efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            return resolvedType;
2884efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
2894efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    };
2904efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
2914efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    public static final ValueProvider SCHEME = new ValueProvider("scheme") {
2924efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        @Override
29349660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver        public String getValue(ComponentName resolvedComponent, Intent intent,
29449660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver                String resolvedType) {
2954efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            Uri data = intent.getData();
2964efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            if (data != null) {
2974efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                return data.getScheme();
2984efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            }
2994efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            return null;
3004efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
3014efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    };
3024efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
3034efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    public static final ValueProvider SSP = new ValueProvider("scheme-specific-part") {
3044efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        @Override
30549660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver        public String getValue(ComponentName resolvedComponent, Intent intent,
30649660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver                String resolvedType) {
3074efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            Uri data = intent.getData();
3084efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            if (data != null) {
3094efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                return data.getSchemeSpecificPart();
3104efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            }
3114efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            return null;
3124efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
3134efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    };
3144efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
3154efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    public static final ValueProvider HOST = new ValueProvider("host") {
3164efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        @Override
31749660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver        public String getValue(ComponentName resolvedComponent, Intent intent,
31849660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver                String resolvedType) {
3194efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            Uri data = intent.getData();
3204efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            if (data != null) {
3214efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                return data.getHost();
3224efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            }
3234efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            return null;
3244efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
3254efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    };
3264efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver
3274efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    public static final ValueProvider PATH = new ValueProvider("path") {
3284efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        @Override
32949660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver        public String getValue(ComponentName resolvedComponent, Intent intent,
33049660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver                String resolvedType) {
3314efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            Uri data = intent.getData();
3324efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            if (data != null) {
3334efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver                return data.getPath();
3344efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            }
3354efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver            return null;
3364efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver        }
3374efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver    };
3384efe9403afb0ba3b83fa647eb82e4f90d29f131bBen Gruver}
339