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