blob: 663cbfab9f85ed13f0061eecda79a290bf9b2249 [file] [log] [blame]
/*
* Copyright (C) 2008 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 android.content.cts;
import static android.content.IntentFilter.MATCH_ADJUSTMENT_NORMAL;
import static android.content.IntentFilter.MATCH_CATEGORY_HOST;
import static android.content.IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART;
import static android.content.IntentFilter.MATCH_CATEGORY_TYPE;
import static android.content.IntentFilter.NO_MATCH_DATA;
import static android.os.PatternMatcher.PATTERN_ADVANCED_GLOB;
import static android.os.PatternMatcher.PATTERN_LITERAL;
import static android.os.PatternMatcher.PATTERN_PREFIX;
import static android.os.PatternMatcher.PATTERN_SIMPLE_GLOB;
import static android.os.PatternMatcher.PATTERN_SUFFIX;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentFilter.AuthorityEntry;
import android.content.IntentFilter.MalformedMimeTypeException;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Parcel;
import android.os.PatternMatcher;
import android.provider.Contacts.People;
import android.test.AndroidTestCase;
import android.util.Printer;
import android.util.StringBuilderPrinter;
import android.util.Xml;
import com.android.internal.util.FastXmlSerializer;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class IntentFilterTest extends AndroidTestCase {
private IntentFilter mIntentFilter;
private static final String ACTION = "testAction";
private static final String CATEGORY = "testCategory";
private static final String DATA_DYNAMIC_TYPE = "type/dynamic";
private static final String DATA_STATIC_TYPE = "vnd.android.cursor.dir/person";
private static final String DATA_SCHEME = "testDataSchemes.";
private static final String MIME_GROUP = "mime_group";
private static final String SSP = "testSsp";
private static final String HOST = "testHost";
private static final int PORT = 80;
private static final String DATA_PATH = "testDataPath";
private static final Uri URI = People.CONTENT_URI;
@Override
protected void setUp() throws Exception {
super.setUp();
mIntentFilter = new IntentFilter();
}
public void testConstructor() throws MalformedMimeTypeException {
IntentFilter filter = new IntentFilter();
verifyContent(filter, null, null);
filter = new IntentFilter(ACTION);
verifyContent(filter, ACTION, null);
final IntentFilter actionTypeFilter = new IntentFilter(ACTION, DATA_STATIC_TYPE);
verifyContent(actionTypeFilter, ACTION, DATA_STATIC_TYPE);
filter = new IntentFilter(actionTypeFilter);
verifyContent(filter, ACTION, DATA_STATIC_TYPE);
final String dataType = "testdataType";
try {
new IntentFilter(ACTION, dataType);
fail("Should throw MalformedMimeTypeException ");
} catch (MalformedMimeTypeException e) {
// expected
}
}
/**
* Assert that the given filter contains the given action and dataType. If
* action or dataType are null, assert that the filter has no actions or
* dataTypes registered.
*/
private void verifyContent(IntentFilter filter, String action, String dataType) {
if (action != null) {
assertEquals(1, filter.countActions());
assertEquals(action, filter.getAction(0));
} else {
assertEquals(0, filter.countActions());
}
if (dataType != null) {
assertEquals(1, filter.countDataTypes());
assertEquals(dataType, filter.getDataType(0));
assertEquals(1, filter.countStaticDataTypes());
} else {
assertEquals(0, filter.countDataTypes());
assertEquals(0, filter.countStaticDataTypes());
}
}
public void testCategories() {
for (int i = 0; i < 10; i++) {
mIntentFilter.addCategory(CATEGORY + i);
}
assertEquals(10, mIntentFilter.countCategories());
Iterator<String> iter = mIntentFilter.categoriesIterator();
String actual = null;
int i = 0;
while (iter.hasNext()) {
actual = iter.next();
assertEquals(CATEGORY + i, actual);
assertEquals(CATEGORY + i, mIntentFilter.getCategory(i));
assertTrue(mIntentFilter.hasCategory(CATEGORY + i));
assertFalse(mIntentFilter.hasCategory(CATEGORY + i + 10));
i++;
}
IntentFilter filter = new Match(null, new String[]{"category1"}, null, null, null, null);
checkMatches(filter,
new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null, null, null, null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null,
new String[]{"category1"}, null, null),
new MatchCondition(IntentFilter.NO_MATCH_CATEGORY, null,
new String[]{"category2"}, null, null),
new MatchCondition(IntentFilter.NO_MATCH_CATEGORY, null, new String[]{
"category1", "category2"}, null, null));
filter = new Match(null, new String[]{"category1", "category2"}, null, null, null, null);
checkMatches(filter,
new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null, null, null, null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null,
new String[]{"category1"}, null, null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null,
new String[]{"category2"}, null, null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null, new String[]{
"category1", "category2"}, null, null),
new MatchCondition(IntentFilter.NO_MATCH_CATEGORY, null,
new String[]{"category3"}, null, null),
new MatchCondition(IntentFilter.NO_MATCH_CATEGORY, null, new String[]{
"category1", "category2", "category3"}, null, null));
}
public void testMimeTypes() throws Exception {
IntentFilter filter = new Match(null, null, new String[]{"which1/what1"}, null, null,
null);
checkMatches(filter,
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, null, null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what1",
null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/*", null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "*/*", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which2/what2", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which2/*", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which1/what2", null));
filter = new Match(null, null, new String[]{"which1/what1", "which2/what2"}, null, null,
null);
checkMatches(filter,
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, null, null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what1",
null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/*", null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "*/*", null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which2/what2",
null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which2/*", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which1/what2", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which3/what3", null));
filter = new Match(null, null, new String[]{"which1/*"}, null, null, null);
checkMatches(filter,
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, null, null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what1",
null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/*", null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "*/*", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which2/what2", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which2/*", null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what2",
null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which3/what3", null));
filter = new Match(null, null, new String[]{"*/*"}, null, null, null);
checkMatches(filter,
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, null, null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what1",
null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/*", null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "*/*", null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which2/what2",
null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which2/*", null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what2",
null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which3/what3",
null));
}
public void testDynamicMimeTypes() {
IntentFilter filter = new Match()
.addDynamicMimeTypes(new String[] { "which1/what1" });
checkMatches(filter,
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, null, null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what1",
null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/*", null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "*/*", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which2/what2", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which2/*", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which1/what2", null));
filter = new Match()
.addDynamicMimeTypes(new String[] { "which1/what1", "which2/what2" });
checkMatches(filter,
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, null, null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what1",
null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/*", null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "*/*", null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which2/what2",
null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which2/*", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which1/what2", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which3/what3", null));
filter = new Match()
.addDynamicMimeTypes(new String[] { "which1/*" });
checkMatches(filter,
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, null, null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what1",
null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/*", null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "*/*", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which2/what2", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which2/*", null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what2",
null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which3/what3", null));
filter = new Match()
.addDynamicMimeTypes(new String[] { "*/*" });
checkMatches(filter,
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, null, null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what1",
null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/*", null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "*/*", null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which2/what2",
null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which2/*", null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what2",
null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which3/what3",
null));
}
public void testClearDynamicMimeTypesWithStaticType() {
IntentFilter filter = new Match()
.addMimeTypes(new String[] {"which1/what1"})
.addDynamicMimeTypes(new String[] { "which2/what2" });
checkMatches(filter, new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, null, null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what1",
null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/*", null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "*/*", null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which2/what2",
null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which2/*", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which1/what2", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which3/what3", null));
filter.clearDynamicDataTypes();
checkMatches(filter,
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, null, null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what1",
null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/*", null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "*/*", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which2/what2", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which2/*", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which1/what2", null));
}
public void testClearDynamicMimeTypesWithAction() {
IntentFilter filter = new Match()
.addActions(new String[] {"action1"})
.addDynamicMimeTypes(new String[] { "which1/what1" });
checkMatches(filter,
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, null, null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what1",
null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/*", null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "*/*", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which2/what2", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which2/*", null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which1/what2", null));
filter.clearDynamicDataTypes();
checkMatches(filter,
new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null, null, null, null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, "action1", null, null, null),
new MatchCondition(IntentFilter.NO_MATCH_TYPE, "action1", null, "which2/what2",
null));
}
public void testAccessPriority() {
final int expected = 1;
mIntentFilter.setPriority(expected);
assertEquals(expected, mIntentFilter.getPriority());
}
public void testDataSchemes() {
for (int i = 0; i < 10; i++) {
mIntentFilter.addDataScheme(DATA_SCHEME + i);
}
assertEquals(10, mIntentFilter.countDataSchemes());
final Iterator<String> iter = mIntentFilter.schemesIterator();
String actual = null;
int i = 0;
while (iter.hasNext()) {
actual = iter.next();
assertEquals(DATA_SCHEME + i, actual);
assertEquals(DATA_SCHEME + i, mIntentFilter.getDataScheme(i));
assertTrue(mIntentFilter.hasDataScheme(DATA_SCHEME + i));
assertFalse(mIntentFilter.hasDataScheme(DATA_SCHEME + i + 10));
i++;
}
IntentFilter filter = new Match(null, null, null, new String[]{"scheme1"}, null, null);
checkMatches(filter,
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_SCHEME, "scheme1:foo"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme2:foo"));
filter = new Match(null, null, null, new String[]{"scheme1", "scheme2"}, null, null);
checkMatches(filter,
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_SCHEME, "scheme1:foo"),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_SCHEME, "scheme2:foo"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme3:foo"));
}
public void testCreate() {
IntentFilter filter = IntentFilter.create(ACTION, DATA_STATIC_TYPE);
assertNotNull(filter);
verifyContent(filter, ACTION, DATA_STATIC_TYPE);
}
public void testSchemeSpecificParts() throws Exception {
IntentFilter filter = new Match(null, null, null, new String[]{"scheme"},
null, null, null, null, new String[]{"ssp1", "2ssp"},
new int[]{PATTERN_LITERAL, PATTERN_LITERAL});
checkMatches(filter,
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:ssp1"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:2ssp"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:ssp"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:ssp12"));
filter = new Match(null, null, null, new String[]{"scheme"},
null, null, null, null, new String[]{"ssp1", "2ssp"},
new int[]{PATTERN_PREFIX, PATTERN_PREFIX});
checkMatches(filter,
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:ssp1"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:2ssp"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:ssp"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:ssp12"));
filter = new Match(null, null, null, new String[]{"scheme"},
null, null, null, null, new String[]{"p1", "sp", ".file"},
new int[]{PATTERN_SUFFIX, PATTERN_SUFFIX, PATTERN_SUFFIX});
checkMatches(filter,
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:ssp1"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:2ssp"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:something.file"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:ssp"),
MatchCondition.data(NO_MATCH_DATA, "scheme:ssp12"));
checkMatches(new IntentFilter[]{
filterForSchemeAndSchemeSpecificPart("scheme", "ssp.*",
PATTERN_ADVANCED_GLOB),
filterForSchemeAndSchemeSpecificPart("scheme", "ssp.*",
PATTERN_SIMPLE_GLOB)},
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:ssp1"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:ssp"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:ss"));
checkMatches(new IntentFilter[]{
filterForSchemeAndSchemeSpecificPart("scheme", ".*",
PATTERN_ADVANCED_GLOB),
filterForSchemeAndSchemeSpecificPart("scheme", ".*",
PATTERN_SIMPLE_GLOB)},
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:ssp1"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:ssp"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:"));
checkMatches(new IntentFilter[]{
filterForSchemeAndSchemeSpecificPart("scheme", "a1*b",
PATTERN_ADVANCED_GLOB),
filterForSchemeAndSchemeSpecificPart("scheme", "a1*b",
PATTERN_SIMPLE_GLOB)},
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:ab"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:a1b"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:a11b"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:a2b"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:a1bc"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:a"));
checkMatches(new IntentFilter[]{
filterForSchemeAndSchemeSpecificPart("scheme", "a1*",
PATTERN_ADVANCED_GLOB),
filterForSchemeAndSchemeSpecificPart("scheme", "a1*",
PATTERN_SIMPLE_GLOB)},
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:a1"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:ab"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:a11"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:a1b"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:a11"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:a2"));
checkMatches(new IntentFilter[]{
filterForSchemeAndSchemeSpecificPart("scheme", "a\\.*b",
PATTERN_ADVANCED_GLOB),
filterForSchemeAndSchemeSpecificPart("scheme", "a\\.*b",
PATTERN_SIMPLE_GLOB)},
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:ab"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:a.b"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:a..b"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:a2b"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:a.bc"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:"));
checkMatches(new IntentFilter[]{
filterForSchemeAndSchemeSpecificPart("scheme", "a[.1-2]*b",
PATTERN_ADVANCED_GLOB),
filterForSchemeAndSchemeSpecificPart("scheme", "a.*b",
PATTERN_SIMPLE_GLOB)},
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:ab"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:a.b"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:a.1b"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:a2b"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:a.bc"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:"));
checkMatches(new IntentFilter[]{
filterForSchemeAndSchemeSpecificPart("scheme", "a.*",
PATTERN_ADVANCED_GLOB),
filterForSchemeAndSchemeSpecificPart("scheme", "a.*",
PATTERN_SIMPLE_GLOB)},
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:ab"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:a.b"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:a.1b"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:a2b"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:a.bc"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:"));
checkMatches(new IntentFilter[]{
filterForSchemeAndSchemeSpecificPart("scheme", "a.\\*b",
PATTERN_ADVANCED_GLOB),
filterForSchemeAndSchemeSpecificPart("scheme", "a.\\*b",
PATTERN_SIMPLE_GLOB)},
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:ab"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:a.*b"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:a1*b"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:a2b"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:a.bc"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:"));
checkMatches(new IntentFilter[]{
filterForSchemeAndSchemeSpecificPart("scheme", "a.\\*",
PATTERN_ADVANCED_GLOB),
filterForSchemeAndSchemeSpecificPart("scheme", "a.\\*",
PATTERN_SIMPLE_GLOB)},
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:ab"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:a.*"),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:a1*"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:a1b"));
}
private Match filterForSchemeAndSchemeSpecificPart(String scheme, String ssp, int matchType) {
return new Match(null, null, null, new String[]{scheme},
null, null, null, null, new String[]{ssp},
new int[]{matchType});
}
public void testSchemeSpecificPartsWithWildCards() throws Exception {
IntentFilter filter = new Match(null, null, null, new String[]{"scheme"},
null, null, null, null, new String[]{"ssp1"},
new int[]{PATTERN_LITERAL, PATTERN_LITERAL});
checkMatches(filter,
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null, true),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:ssp1", true),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "*:ssp1", true),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "scheme:*", true),
MatchCondition.data(MATCH_CATEGORY_SCHEME_SPECIFIC_PART, "*:*", true),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:ssp12", true));
checkMatches(filter,
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "*:ssp1", false),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme:*", false),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "*:*", false));
}
public void testAuthorities() {
for (int i = 0; i < 10; i++) {
mIntentFilter.addDataAuthority(HOST + i, String.valueOf(PORT + i));
}
assertEquals(10, mIntentFilter.countDataAuthorities());
final Iterator<AuthorityEntry> iter = mIntentFilter.authoritiesIterator();
AuthorityEntry actual = null;
int i = 0;
while (iter.hasNext()) {
actual = iter.next();
assertEquals(HOST + i, actual.getHost());
assertEquals(PORT + i, actual.getPort());
AuthorityEntry ae = new AuthorityEntry(HOST + i, String.valueOf(PORT + i));
assertEquals(ae.getHost(), mIntentFilter.getDataAuthority(i).getHost());
assertEquals(ae.getPort(), mIntentFilter.getDataAuthority(i).getPort());
Uri uri = Uri.parse("http://" + HOST + i + ":" + String.valueOf(PORT + i));
assertTrue(mIntentFilter.hasDataAuthority(uri));
Uri uri2 = Uri.parse("http://" + HOST + i + 10 + ":" + PORT + i + 10);
assertFalse(mIntentFilter.hasDataAuthority(uri2));
i++;
}
IntentFilter filter = new Match(null, null, null, new String[]{"scheme1"},
new String[]{"authority1"}, new String[]{null});
checkMatches(filter,
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1:foo"),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_HOST, "scheme1://authority1/"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1://authority2/"),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_HOST, "scheme1://authority1:100/"));
filter = new Match(null, null, null, new String[]{"scheme1"},
new String[]{"authority1"}, new String[]{"100"});
checkMatches(filter,
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1:foo"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1://authority1/"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1://authority2/"),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_PORT, "scheme1://authority1:100/"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1://authority1:200/"));
filter = new Match(null, null, null, new String[]{"scheme1"},
new String[]{"authority1", "authority2"}, new String[]{"100", null});
checkMatches(filter,
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1:foo"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1://authority1/"),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_HOST, "scheme1://authority2/"),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_PORT, "scheme1://authority1:100/"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1://authority1:200/"));
}
public void testAuthoritiesWithWildcards() throws Exception {
IntentFilter filter = new Match(null, null, null, new String[]{"scheme1"},
new String[]{"authority1"}, new String[]{null});
checkMatches(filter,
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null, true),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1:*", true),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_HOST, "scheme1://*/", true),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_HOST, "scheme1://*:100/", true),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1://*/", false),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1://*:100/", false));
filter = new Match(null, null, null, new String[]{"scheme1"},
new String[]{"authority1"}, new String[]{"100"});
checkMatches(filter,
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null, true),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1:*", true),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_HOST, "scheme1://*/", true),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_HOST, "scheme1://*:100/", true),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_HOST, "scheme1://*:200/", true),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "*:foo", true),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_HOST, "*://authority1/", true),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_HOST, "*://authority1:100/", true),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_HOST, "*://authority1:200/", true),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "*:*", true),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_HOST, "*://*/", true),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_HOST, "*://*:100/", true),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_HOST, "*://*:200/", true));
checkMatches(filter,
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1://*/", false),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1://*:100/", false),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "*://authority1:100/", false),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "*://*/", false),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "*://*:100/", false));
filter = new Match(null, null, null, new String[]{"scheme1"},
new String[]{"*"}, null);
checkMatches(filter,
MatchCondition.data(IntentFilter.MATCH_CATEGORY_HOST, "scheme1://", true),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_HOST, "scheme1://", false),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_HOST, "scheme1://*", true));
}
public void testDataTypes() throws MalformedMimeTypeException {
for (int i = 0; i < 10; i++) {
mIntentFilter.addDataType(DATA_STATIC_TYPE + i);
}
assertEquals(10, mIntentFilter.countDataTypes());
assertEquals(10, mIntentFilter.countStaticDataTypes());
final Iterator<String> iter = mIntentFilter.typesIterator();
String actual;
int i = 0;
while (iter.hasNext()) {
actual = iter.next();
assertEquals(DATA_STATIC_TYPE + i, actual);
assertEquals(DATA_STATIC_TYPE + i, mIntentFilter.getDataType(i));
assertTrue(mIntentFilter.hasDataType(DATA_STATIC_TYPE + i));
assertFalse(mIntentFilter.hasDataType(DATA_STATIC_TYPE + i + 10));
i++;
}
}
public void testDynamicDataTypes() throws MalformedMimeTypeException {
for (int i = 0; i < 10; i++) {
mIntentFilter.addDynamicDataType(DATA_DYNAMIC_TYPE + i);
}
assertEquals(10, mIntentFilter.countDataTypes());
assertEquals(0, mIntentFilter.countStaticDataTypes());
final Iterator<String> iter = mIntentFilter.typesIterator();
String actual;
int i = 0;
while (iter.hasNext()) {
actual = iter.next();
assertEquals(DATA_DYNAMIC_TYPE + i, actual);
assertEquals(DATA_DYNAMIC_TYPE + i, mIntentFilter.getDataType(i));
assertTrue(mIntentFilter.hasDataType(DATA_DYNAMIC_TYPE + i));
assertFalse(mIntentFilter.hasDataType(DATA_DYNAMIC_TYPE + i + 10));
i++;
}
}
public void testClearDynamicDataTypes() throws MalformedMimeTypeException {
for (int i = 0; i < 10; i++) {
mIntentFilter.addDataType(DATA_STATIC_TYPE + i);
mIntentFilter.addDynamicDataType(DATA_DYNAMIC_TYPE + i);
}
assertEquals(20, mIntentFilter.countDataTypes());
assertEquals(10, mIntentFilter.countStaticDataTypes());
mIntentFilter.clearDynamicDataTypes();
assertEquals(10, mIntentFilter.countDataTypes());
assertEquals(10, mIntentFilter.countStaticDataTypes());
final Iterator<String> iter = mIntentFilter.typesIterator();
String actual;
int i = 0;
while (iter.hasNext()) {
actual = iter.next();
assertEquals(DATA_STATIC_TYPE + i, actual);
assertEquals(DATA_STATIC_TYPE + i, mIntentFilter.getDataType(i));
assertTrue(mIntentFilter.hasDataType(DATA_STATIC_TYPE + i));
assertFalse(mIntentFilter.hasDataType(DATA_DYNAMIC_TYPE + i));
i++;
}
}
public void testMimeGroups() {
for (int i = 0; i < 10; i++) {
mIntentFilter.addMimeGroup(MIME_GROUP + i);
}
assertEquals(10, mIntentFilter.countMimeGroups());
final Iterator<String> iter = mIntentFilter.mimeGroupsIterator();
String actual = null;
int i = 0;
while (iter.hasNext()) {
actual = iter.next();
assertEquals(MIME_GROUP + i, actual);
assertEquals(MIME_GROUP + i, mIntentFilter.getMimeGroup(i));
assertTrue(mIntentFilter.hasMimeGroup(MIME_GROUP + i));
assertFalse(mIntentFilter.hasMimeGroup(MIME_GROUP + i + 10));
i++;
}
}
public void testAppEnumerationMatchesMimeGroups() {
IntentFilter filter = new Match(new String[]{ACTION}, null, null, new String[]{"scheme1"},
new String[]{"authority1"}, null).addMimeGroups(new String[]{"test"});
// assume any mime type or no mime type matches a filter with a mimegroup defined.
checkMatches(filter,
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE,
ACTION, null, "img/jpeg", "scheme1://authority1", true),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE,
ACTION, null, null, "scheme1://authority1", true),
new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE,
ACTION, null, "*/*", "scheme1://authority1", true));
}
public void testMatchData() throws MalformedMimeTypeException {
int expected = IntentFilter.MATCH_CATEGORY_EMPTY + IntentFilter.MATCH_ADJUSTMENT_NORMAL;
assertEquals(expected, mIntentFilter.matchData(null, null, null));
assertEquals(expected, mIntentFilter.matchData(null, DATA_SCHEME, null));
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(null, DATA_SCHEME, URI));
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(DATA_STATIC_TYPE,
DATA_SCHEME, URI));
mIntentFilter.addDataScheme(DATA_SCHEME);
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(DATA_STATIC_TYPE,
"mDataSchemestest", URI));
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(DATA_STATIC_TYPE, "",
URI));
expected = IntentFilter.MATCH_CATEGORY_SCHEME + IntentFilter.MATCH_ADJUSTMENT_NORMAL;
assertEquals(expected, mIntentFilter.matchData(null, DATA_SCHEME, URI));
assertEquals(IntentFilter.NO_MATCH_TYPE, mIntentFilter.matchData(DATA_STATIC_TYPE,
DATA_SCHEME, URI));
mIntentFilter.addDataType(DATA_STATIC_TYPE);
assertEquals(IntentFilter.MATCH_CATEGORY_TYPE + IntentFilter.MATCH_ADJUSTMENT_NORMAL,
mIntentFilter.matchData(DATA_STATIC_TYPE, DATA_SCHEME, URI));
mIntentFilter.addDataAuthority(HOST, String.valueOf(PORT));
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(null, DATA_SCHEME, URI));
final Uri uri = Uri.parse("http://" + HOST + ":" + PORT);
mIntentFilter.addDataPath(DATA_PATH, PatternMatcher.PATTERN_LITERAL);
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(null, DATA_SCHEME, uri));
}
public void testActions() {
for (int i = 0; i < 10; i++) {
mIntentFilter.addAction(ACTION + i);
}
assertEquals(10, mIntentFilter.countActions());
final Iterator<String> iter = mIntentFilter.actionsIterator();
String actual = null;
int i = 0;
while (iter.hasNext()) {
actual = iter.next();
assertEquals(ACTION + i, actual);
assertEquals(ACTION + i, mIntentFilter.getAction(i));
assertTrue(mIntentFilter.hasAction(ACTION + i));
assertFalse(mIntentFilter.hasAction(ACTION + i + 10));
assertTrue(mIntentFilter.matchAction(ACTION + i));
assertFalse(mIntentFilter.matchAction(ACTION + i + 10));
i++;
}
IntentFilter filter = new Match(new String[]{"action1"}, null, null, null, null, null);
checkMatches(filter,
new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null, null, null, null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, "action1", null, null, null),
new MatchCondition(IntentFilter.NO_MATCH_ACTION, "action2", null, null, null));
filter = new Match(new String[]{"action1", "action2"}, null, null, null, null, null);
checkMatches(filter,
new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null, null, null, null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, "action1", null, null, null),
new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, "action2", null, null, null),
new MatchCondition(IntentFilter.NO_MATCH_ACTION, "action3", null, null, null),
new MatchCondition(IntentFilter.NO_MATCH_ACTION, "action1", null, null, null, false,
Arrays.asList("action1", "action2")),
new MatchCondition(IntentFilter.NO_MATCH_ACTION, "action2", null, null, null, false,
Arrays.asList("action1", "action2")),
new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, "action1", null, null, null,
false, Arrays.asList("action2")));
}
public void testActionWildCards() throws Exception {
IntentFilter filter =
new Match(new String[]{"action1", "action2"}, null, null, null, null, null);
checkMatches(filter,
new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null, null, null, null, true),
new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, "*", null, null, null, true),
new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, "*", null, null, null, true,
Arrays.asList("action1")),
new MatchCondition(IntentFilter.NO_MATCH_ACTION, "*", null, null, null, true,
Arrays.asList("action1", "action2")),
new MatchCondition(
IntentFilter.NO_MATCH_ACTION, "action3", null, null, null, true));
checkMatches(filter,
new MatchCondition(IntentFilter.NO_MATCH_ACTION, "*", null, null, null, false));
}
public void testAppEnumerationContactProviders() throws Exception {
// sample contact source
IntentFilter filter = new Match(new String[]{Intent.ACTION_VIEW},
new String[]{Intent.CATEGORY_DEFAULT},
new String[]{"vnd.android.cursor.item/vnd.com.someapp.profile"},
new String[]{"content"},
new String[]{"com.android.contacts"},
null /*ports*/);
// app that would like to match all contact sources
checkMatches(filter,
new MatchCondition(MATCH_CATEGORY_TYPE,
Intent.ACTION_VIEW,
null /*categories*/,
"vnd.android.cursor.item/*",
"content://com.android.contacts",
true));
}
public void testAppEnumerationDocumentEditor() throws Exception {
// sample document editor
IntentFilter filter = new Match(
new String[]{
Intent.ACTION_VIEW,
Intent.ACTION_EDIT,
"com.app.android.intent.action.APP_EDIT",
"com.app.android.intent.action.APP_VIEW"},
new String[]{Intent.CATEGORY_DEFAULT},
new String[]{
"application/msword",
"application/vnd.oasis.opendocument.text",
"application/rtf",
"text/rtf",
"text/plain",
"application/pdf",
"application/x-pdf",
"application/docm"},
null /*schemes*/,
null /*authorities*/,
null /*ports*/);
// app that would like to match all doc editors
checkMatches(filter,
new MatchCondition(MATCH_CATEGORY_TYPE,
Intent.ACTION_VIEW,
new String[]{Intent.CATEGORY_DEFAULT},
"*/*",
"content://com.example.fileprovider",
true));
}
public void testAppEnumerationDeepLinks() throws Exception {
// Sample app that supports deep-links
IntentFilter filter = new Match(
new String[]{Intent.ACTION_VIEW},
new String[]{
Intent.CATEGORY_DEFAULT,
Intent.CATEGORY_BROWSABLE},
null /*types*/,
new String[]{"http", "https"},
new String[]{"arbitrary-site.com"},
null /*ports*/);
// Browser that would like to see all deep-linkable http/s app, but not all apps
checkMatches(filter,
new MatchCondition(MATCH_CATEGORY_HOST,
Intent.ACTION_VIEW,
new String[]{Intent.CATEGORY_BROWSABLE},
null,
"https://*",
true));
checkMatches(filter,
new MatchCondition(MATCH_CATEGORY_HOST,
Intent.ACTION_VIEW,
new String[]{Intent.CATEGORY_BROWSABLE},
null,
"http://*",
true));
}
public void testAppEnumerationCustomShareSheet() throws Exception {
// Sample share target
IntentFilter filter = new Match(
new String[]{Intent.ACTION_SEND},
new String[]{Intent.CATEGORY_DEFAULT},
new String[]{"*/*"},
null /*schemes*/,
null /*authorities*/,
null /*ports*/);
// App with custom share sheet that would like to see all jpeg targets
checkMatches(filter,
new MatchCondition(MATCH_CATEGORY_TYPE,
Intent.ACTION_SEND,
null /*categories*/,
"image/jpeg",
"content://com.example.fileprovider",
true));
// App with custom share sheet that would like to see all jpeg targets that don't specify
// a host
checkMatches(filter,
new MatchCondition(MATCH_CATEGORY_TYPE,
Intent.ACTION_SEND,
null /*categories*/,
"image/jpeg",
"content:",
true));
}
public void testAppEnumerationNoHostMatchesWildcardHost() throws Exception {
IntentFilter filter = new Match(
new String[]{Intent.ACTION_VIEW},
new String[]{Intent.CATEGORY_BROWSABLE},
null,
new String[]{"http", "https"},
new String[]{"*"},
null /*ports*/);
checkMatches(filter,
new MatchCondition(MATCH_CATEGORY_HOST,
Intent.ACTION_VIEW,
new String[]{Intent.CATEGORY_BROWSABLE},
null,
"https://*",
true));
checkMatches(filter,
new MatchCondition(MATCH_CATEGORY_HOST,
Intent.ACTION_VIEW,
new String[]{Intent.CATEGORY_BROWSABLE},
null,
"https://",
true));
}
public void testAppEnumerationNoPortMatchesPortFilter() throws Exception {
IntentFilter filter = new Match(
new String[]{Intent.ACTION_VIEW},
new String[]{Intent.CATEGORY_BROWSABLE},
null,
new String[]{"http", "https"},
new String[]{"*"},
new String[]{"81"});
checkMatches(filter,
new MatchCondition(MATCH_CATEGORY_HOST,
Intent.ACTION_VIEW,
new String[]{Intent.CATEGORY_BROWSABLE},
null,
"https://something",
true));
}
public void testAppEnumerationBrowser() throws Exception {
IntentFilter appWithWebLink = new Match(
new String[]{Intent.ACTION_VIEW},
new String[]{Intent.CATEGORY_BROWSABLE},
null,
new String[]{"http", "https"},
new String[]{"some.app.domain"},
null);
IntentFilter browserFilterWithWildcard = new Match(
new String[]{Intent.ACTION_VIEW},
new String[]{Intent.CATEGORY_BROWSABLE},
null,
new String[]{"http", "https"},
new String[]{"*"},
null);
IntentFilter browserFilterWithoutWildcard = new Match(
new String[]{Intent.ACTION_VIEW},
new String[]{Intent.CATEGORY_BROWSABLE},
null,
new String[]{"http", "https"},
null,
null);
checkMatches(browserFilterWithWildcard,
new MatchCondition(MATCH_CATEGORY_HOST,
Intent.ACTION_VIEW,
new String[]{Intent.CATEGORY_BROWSABLE},
null,
"https://",
true));
checkMatches(browserFilterWithoutWildcard,
new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME | MATCH_ADJUSTMENT_NORMAL,
Intent.ACTION_VIEW,
new String[]{Intent.CATEGORY_BROWSABLE},
null,
"https://",
true));
checkMatches(appWithWebLink,
new MatchCondition(NO_MATCH_DATA,
Intent.ACTION_VIEW,
new String[]{Intent.CATEGORY_BROWSABLE},
null,
"https://",
true));
}
public void testWriteToXml() throws IllegalArgumentException, IllegalStateException,
IOException, MalformedMimeTypeException, XmlPullParserException {
XmlSerializer xml;
ByteArrayOutputStream out;
xml = new FastXmlSerializer();
out = new ByteArrayOutputStream();
xml.setOutput(out, "utf-8");
mIntentFilter.addAction(ACTION);
mIntentFilter.addCategory(CATEGORY);
mIntentFilter.addDataAuthority(HOST, String.valueOf(PORT));
mIntentFilter.addDataPath(DATA_PATH, 1);
mIntentFilter.addDataScheme(DATA_SCHEME);
mIntentFilter.addDataType(DATA_STATIC_TYPE);
mIntentFilter.addDynamicDataType(DATA_DYNAMIC_TYPE);
mIntentFilter.addMimeGroup(MIME_GROUP);
mIntentFilter.writeToXml(xml);
xml.flush();
final XmlPullParser parser = Xml.newPullParser();
final InputStream in = new ByteArrayInputStream(out.toByteArray());
parser.setInput(in, "utf-8");
final IntentFilter intentFilter = new IntentFilter();
intentFilter.readFromXml(parser);
assertEquals(ACTION, intentFilter.getAction(0));
assertEquals(CATEGORY, intentFilter.getCategory(0));
assertTrue(intentFilter.hasExactStaticDataType(DATA_STATIC_TYPE));
assertTrue(intentFilter.hasExactDynamicDataType(DATA_DYNAMIC_TYPE));
assertEquals(MIME_GROUP, intentFilter.getMimeGroup(0));
assertEquals(DATA_SCHEME, intentFilter.getDataScheme(0));
assertEquals(DATA_PATH, intentFilter.getDataPath(0).getPath());
assertEquals(HOST, intentFilter.getDataAuthority(0).getHost());
assertEquals(PORT, intentFilter.getDataAuthority(0).getPort());
out.close();
}
public void testMatchCategories() {
assertNull(mIntentFilter.matchCategories(null));
Set<String> cat = new HashSet<String>();
assertNull(mIntentFilter.matchCategories(cat));
final String expected = "mytest";
cat.add(expected);
assertEquals(expected, mIntentFilter.matchCategories(cat));
cat = new HashSet<String>();
cat.add(CATEGORY);
mIntentFilter.addCategory(CATEGORY);
assertNull(mIntentFilter.matchCategories(cat));
cat.add(expected);
assertEquals(expected, mIntentFilter.matchCategories(cat));
}
public void testMatchDataAuthority() {
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchDataAuthority(null));
mIntentFilter.addDataAuthority(HOST, String.valueOf(PORT));
final Uri uri = Uri.parse("http://" + HOST + ":" + PORT);
assertEquals(IntentFilter.MATCH_CATEGORY_PORT, mIntentFilter.matchDataAuthority(uri));
}
public void testDescribeContents() {
assertEquals(0, mIntentFilter.describeContents());
}
public void testReadFromXml()
throws NameNotFoundException, XmlPullParserException, IOException {
XmlPullParser parser = null;
ActivityInfo ai = null;
final ComponentName mComponentName = new ComponentName(mContext, MockActivity.class);
final PackageManager pm = mContext.getPackageManager();
ai = pm.getActivityInfo(mComponentName, PackageManager.GET_META_DATA);
parser = ai.loadXmlMetaData(pm, "android.app.intent.filter");
int type;
while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
&& type != XmlPullParser.START_TAG) {
}
final String nodeName = parser.getName();
if (!"intent-filter".equals(nodeName)) {
throw new RuntimeException();
}
mIntentFilter.readFromXml(parser);
assertEquals("testAction", mIntentFilter.getAction(0));
assertEquals("testCategory", mIntentFilter.getCategory(0));
assertTrue(mIntentFilter.hasExactDynamicDataType("vnd.android.cursor.dir/person"));
assertTrue(mIntentFilter.hasExactStaticDataType("text/plain"));
assertEquals("testMimeGroup", mIntentFilter.getMimeGroup(0));
assertEquals("testScheme", mIntentFilter.getDataScheme(0));
assertEquals("testHost", mIntentFilter.getDataAuthority(0).getHost());
assertEquals(80, mIntentFilter.getDataAuthority(0).getPort());
assertEquals("test", mIntentFilter.getDataPath(0).getPath());
assertEquals("test", mIntentFilter.getDataPath(1).getPath());
assertEquals("test", mIntentFilter.getDataPath(2).getPath());
}
public void testDataPaths() {
for (int i = 0; i < 10; i++) {
mIntentFilter.addDataPath(DATA_PATH + i, PatternMatcher.PATTERN_PREFIX);
}
assertEquals(10, mIntentFilter.countDataPaths());
Iterator<PatternMatcher> iter = mIntentFilter.pathsIterator();
PatternMatcher actual = null;
int i = 0;
while (iter.hasNext()) {
actual = iter.next();
assertEquals(DATA_PATH + i, actual.getPath());
assertEquals(PatternMatcher.PATTERN_PREFIX, actual.getType());
PatternMatcher p = new PatternMatcher(DATA_PATH + i, PatternMatcher.PATTERN_PREFIX);
assertEquals(p.getPath(), mIntentFilter.getDataPath(i).getPath());
assertEquals(p.getType(), mIntentFilter.getDataPath(i).getType());
assertTrue(mIntentFilter.hasDataPath(DATA_PATH + i));
assertTrue(mIntentFilter.hasDataPath(DATA_PATH + i + 10));
i++;
}
mIntentFilter = new IntentFilter();
for (i = 0; i < 10; i++) {
mIntentFilter.addDataPath(DATA_PATH + i, PatternMatcher.PATTERN_SUFFIX);
}
assertEquals(10, mIntentFilter.countDataPaths());
iter = mIntentFilter.pathsIterator();
i = 0;
while (iter.hasNext()) {
actual = iter.next();
assertEquals(DATA_PATH + i, actual.getPath());
assertEquals(PatternMatcher.PATTERN_SUFFIX, actual.getType());
PatternMatcher p = new PatternMatcher(DATA_PATH + i, PatternMatcher.PATTERN_SUFFIX);
assertEquals(p.getPath(), mIntentFilter.getDataPath(i).getPath());
assertEquals(p.getType(), mIntentFilter.getDataPath(i).getType());
assertTrue(mIntentFilter.hasDataPath(DATA_PATH + i));
assertTrue(mIntentFilter.hasDataPath("a" + DATA_PATH + i));
i++;
}
mIntentFilter = new IntentFilter();
i = 0;
for (i = 0; i < 10; i++) {
mIntentFilter.addDataPath(DATA_PATH + i, PatternMatcher.PATTERN_LITERAL);
}
assertEquals(10, mIntentFilter.countDataPaths());
iter = mIntentFilter.pathsIterator();
i = 0;
while (iter.hasNext()) {
actual = iter.next();
assertEquals(DATA_PATH + i, actual.getPath());
assertEquals(PatternMatcher.PATTERN_LITERAL, actual.getType());
PatternMatcher p = new PatternMatcher(DATA_PATH + i, PatternMatcher.PATTERN_LITERAL);
assertEquals(p.getPath(), mIntentFilter.getDataPath(i).getPath());
assertEquals(p.getType(), mIntentFilter.getDataPath(i).getType());
assertTrue(mIntentFilter.hasDataPath(DATA_PATH + i));
assertFalse(mIntentFilter.hasDataPath(DATA_PATH + i + 10));
i++;
}
mIntentFilter = new IntentFilter();
i = 0;
for (i = 0; i < 10; i++) {
mIntentFilter.addDataPath(DATA_PATH + i, PatternMatcher.PATTERN_SIMPLE_GLOB);
}
assertEquals(10, mIntentFilter.countDataPaths());
iter = mIntentFilter.pathsIterator();
i = 0;
while (iter.hasNext()) {
actual = iter.next();
assertEquals(DATA_PATH + i, actual.getPath());
assertEquals(PatternMatcher.PATTERN_SIMPLE_GLOB, actual.getType());
PatternMatcher p = new PatternMatcher(DATA_PATH + i,
PatternMatcher.PATTERN_SIMPLE_GLOB);
assertEquals(p.getPath(), mIntentFilter.getDataPath(i).getPath());
assertEquals(p.getType(), mIntentFilter.getDataPath(i).getType());
assertTrue(mIntentFilter.hasDataPath(DATA_PATH + i));
assertFalse(mIntentFilter.hasDataPath(DATA_PATH + i + 10));
i++;
}
mIntentFilter = new IntentFilter();
for (i = 0; i < 10; i++) {
mIntentFilter.addDataPath(DATA_PATH + i, PatternMatcher.PATTERN_ADVANCED_GLOB);
}
assertEquals(10, mIntentFilter.countDataPaths());
iter = mIntentFilter.pathsIterator();
i = 0;
while (iter.hasNext()) {
actual = iter.next();
assertEquals(DATA_PATH + i, actual.getPath());
assertEquals(PatternMatcher.PATTERN_ADVANCED_GLOB, actual.getType());
PatternMatcher p = new PatternMatcher(DATA_PATH + i,
PatternMatcher.PATTERN_ADVANCED_GLOB);
assertEquals(p.getPath(), mIntentFilter.getDataPath(i).getPath());
assertEquals(p.getType(), mIntentFilter.getDataPath(i).getType());
assertTrue(mIntentFilter.hasDataPath(DATA_PATH + i));
assertFalse(mIntentFilter.hasDataPath(DATA_PATH + i + 10));
i++;
}
IntentFilter filter = new Match(null, null, null, new String[]{"scheme1"},
new String[]{"authority1"}, new String[]{null});
checkMatches(filter,
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1:foo"),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_HOST, "scheme1://authority1/"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1://authority2/"),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_HOST, "scheme1://authority1:100/"));
filter = new Match(null, null, null, new String[]{"scheme1"},
new String[]{"authority1"}, new String[]{"100"});
checkMatches(filter,
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1:foo"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1://authority1/"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1://authority2/"),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_PORT, "scheme1://authority1:100/"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1://authority1:200/"));
filter = new Match(null, null, null, new String[]{"scheme1"},
new String[]{"authority1", "authority2"}, new String[]{"100", null});
checkMatches(filter,
MatchCondition.data(IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1:foo"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1://authority1/"),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_HOST, "scheme1://authority2/"),
MatchCondition.data(IntentFilter.MATCH_CATEGORY_PORT, "scheme1://authority1:100/"),
MatchCondition.data(IntentFilter.NO_MATCH_DATA, "scheme1://authority1:200/"));
}
public void testMatchWithIntent() throws MalformedMimeTypeException {
final ContentResolver resolver = mContext.getContentResolver();
Intent intent = new Intent(ACTION);
assertEquals(IntentFilter.NO_MATCH_ACTION, mIntentFilter.match(resolver, intent, true,
null));
mIntentFilter.addAction(ACTION);
assertEquals(IntentFilter.MATCH_CATEGORY_EMPTY + IntentFilter.MATCH_ADJUSTMENT_NORMAL,
mIntentFilter.match(resolver, intent, true, null));
final Uri uri = Uri.parse(DATA_SCHEME + "://" + HOST + ":" + PORT);
intent.setData(uri);
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(resolver, intent, true, null));
mIntentFilter.addDataAuthority(HOST, String.valueOf(PORT));
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(resolver, intent, true, null));
intent.setType(DATA_STATIC_TYPE);
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(resolver, intent, true, null));
mIntentFilter.addDataType(DATA_STATIC_TYPE);
assertEquals(IntentFilter.MATCH_CATEGORY_TYPE + IntentFilter.MATCH_ADJUSTMENT_NORMAL,
mIntentFilter.match(resolver, intent, true, null));
assertEquals(IntentFilter.MATCH_CATEGORY_TYPE + IntentFilter.MATCH_ADJUSTMENT_NORMAL,
mIntentFilter.match(resolver, intent, false, null));
intent.addCategory(CATEGORY);
assertEquals(IntentFilter.NO_MATCH_CATEGORY, mIntentFilter.match(resolver, intent, true,
null));
mIntentFilter.addCategory(CATEGORY);
assertEquals(IntentFilter.MATCH_CATEGORY_TYPE + IntentFilter.MATCH_ADJUSTMENT_NORMAL,
mIntentFilter.match(resolver, intent, true, null));
intent.setDataAndType(uri, DATA_STATIC_TYPE);
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(resolver, intent, true, null));
}
public void testMatchWithIntentData() throws MalformedMimeTypeException {
Set<String> cat = new HashSet<String>();
assertEquals(IntentFilter.NO_MATCH_ACTION, mIntentFilter.match(ACTION, null, null, null,
null, null));
mIntentFilter.addAction(ACTION);
assertEquals(IntentFilter.MATCH_CATEGORY_EMPTY + IntentFilter.MATCH_ADJUSTMENT_NORMAL,
mIntentFilter.match(ACTION, null, null, null, null, null));
assertEquals(IntentFilter.MATCH_CATEGORY_EMPTY + IntentFilter.MATCH_ADJUSTMENT_NORMAL,
mIntentFilter.match(ACTION, null, DATA_SCHEME, null, null, null));
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(null, DATA_SCHEME, URI));
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_STATIC_TYPE,
DATA_SCHEME, URI, null, null));
mIntentFilter.addDataScheme(DATA_SCHEME);
assertEquals(IntentFilter.NO_MATCH_TYPE, mIntentFilter.match(ACTION, DATA_STATIC_TYPE,
DATA_SCHEME, URI, null, null));
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_STATIC_TYPE, "",
URI, null, null));
mIntentFilter.addDataType(DATA_STATIC_TYPE);
assertEquals(IntentFilter.MATCH_CATEGORY_TYPE + IntentFilter.MATCH_ADJUSTMENT_NORMAL,
mIntentFilter.match(ACTION, DATA_STATIC_TYPE, DATA_SCHEME, URI, null, null));
assertEquals(IntentFilter.NO_MATCH_TYPE, mIntentFilter.match(ACTION, null, DATA_SCHEME,
URI, null, null));
assertEquals(IntentFilter.NO_MATCH_TYPE, mIntentFilter.match(ACTION, null, DATA_SCHEME,
URI, cat, null));
cat.add(CATEGORY);
assertEquals(IntentFilter.NO_MATCH_CATEGORY, mIntentFilter.match(ACTION, DATA_STATIC_TYPE,
DATA_SCHEME, URI, cat, null));
cat = new HashSet<String>();
mIntentFilter.addDataAuthority(HOST, String.valueOf(PORT));
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, null, DATA_SCHEME,
URI, null, null));
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_STATIC_TYPE,
DATA_SCHEME, URI, null, null));
final Uri uri = Uri.parse(DATA_SCHEME + "://" + HOST + ":" + PORT);
mIntentFilter.addDataPath(DATA_PATH, PatternMatcher.PATTERN_LITERAL);
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_STATIC_TYPE,
DATA_SCHEME, uri, null, null));
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_STATIC_TYPE,
DATA_SCHEME, URI, null, null));
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_STATIC_TYPE,
DATA_SCHEME, URI, cat, null));
cat.add(CATEGORY);
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_STATIC_TYPE,
DATA_SCHEME, URI, cat, null));
mIntentFilter.addCategory(CATEGORY);
assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_STATIC_TYPE,
DATA_SCHEME, URI, cat, null));
}
public void testWriteToParcel() throws MalformedMimeTypeException {
mIntentFilter.addAction(ACTION);
mIntentFilter.addCategory(CATEGORY);
mIntentFilter.addDataAuthority(HOST, String.valueOf(PORT));
mIntentFilter.addDataPath(DATA_PATH, 1);
mIntentFilter.addDataScheme(DATA_SCHEME);
mIntentFilter.addDataType(DATA_STATIC_TYPE);
mIntentFilter.addDynamicDataType(DATA_DYNAMIC_TYPE);
mIntentFilter.addMimeGroup(MIME_GROUP);
Parcel parcel = Parcel.obtain();
mIntentFilter.writeToParcel(parcel, 1);
parcel.setDataPosition(0);
IntentFilter target = IntentFilter.CREATOR.createFromParcel(parcel);
assertEquals(mIntentFilter.getAction(0), target.getAction(0));
assertEquals(mIntentFilter.getCategory(0), target.getCategory(0));
assertEquals(mIntentFilter.getDataAuthority(0).getHost(),
target.getDataAuthority(0).getHost());
assertEquals(mIntentFilter.getDataAuthority(0).getPort(),
target.getDataAuthority(0).getPort());
assertEquals(mIntentFilter.getDataPath(0).getPath(), target.getDataPath(0).getPath());
assertEquals(mIntentFilter.getDataScheme(0), target.getDataScheme(0));
assertEquals(mIntentFilter.getDataType(0), target.getDataType(0));
assertEquals(mIntentFilter.getDataType(1), target.getDataType(1));
assertEquals(mIntentFilter.countStaticDataTypes(), target.countStaticDataTypes());
assertEquals(mIntentFilter.countDataTypes(), target.countDataTypes());
assertEquals(mIntentFilter.getMimeGroup(0), target.getMimeGroup(0));
}
public void testAddDataType() throws MalformedMimeTypeException {
try {
mIntentFilter.addDataType("test");
fail("should throw MalformedMimeTypeException");
} catch (MalformedMimeTypeException e) {
// expected
}
mIntentFilter.addDataType(DATA_STATIC_TYPE);
assertEquals(DATA_STATIC_TYPE, mIntentFilter.getDataType(0));
}
private static class Match extends IntentFilter {
Match() {
}
Match(String[] actions, String[] categories, String[] mimeTypes, String[] schemes,
String[] authorities, String[] ports) {
if (actions != null) {
addActions(actions);
}
if (categories != null) {
for (int i = 0; i < categories.length; i++) {
addCategory(categories[i]);
}
}
if (mimeTypes != null) {
for (int i = 0; i < mimeTypes.length; i++) {
try {
addDataType(mimeTypes[i]);
} catch (IntentFilter.MalformedMimeTypeException e) {
throw new RuntimeException("Bad mime type", e);
}
}
}
if (schemes != null) {
for (int i = 0; i < schemes.length; i++) {
addDataScheme(schemes[i]);
}
}
if (authorities != null) {
for (int i = 0; i < authorities.length; i++) {
addDataAuthority(authorities[i], ports != null ? ports[i] : null);
}
}
}
Match(String[] actions, String[] categories, String[] mimeTypes, String[] schemes,
String[] authorities, String[] ports, String[] paths, int[] pathTypes) {
this(actions, categories, mimeTypes, schemes, authorities, ports);
if (paths != null) {
for (int i = 0; i < paths.length; i++) {
addDataPath(paths[i], pathTypes[i]);
}
}
}
Match(String[] actions, String[] categories, String[] mimeTypes, String[] schemes,
String[] authorities, String[] ports, String[] paths, int[] pathTypes,
String[] ssps, int[] sspTypes) {
this(actions, categories, mimeTypes, schemes, authorities, ports, paths, pathTypes);
if (ssps != null) {
for (int i = 0; i < ssps.length; i++) {
addDataSchemeSpecificPart(ssps[i], sspTypes[i]);
}
}
}
Match addDynamicMimeTypes(String[] dynamicMimeTypes) {
for (int i = 0; i < dynamicMimeTypes.length; i++) {
try {
addDynamicDataType(dynamicMimeTypes[i]);
} catch (IntentFilter.MalformedMimeTypeException e) {
throw new RuntimeException("Bad mime type", e);
}
}
return this;
}
Match addMimeGroups(String[] mimeGroups) {
for (int i = 0; i < mimeGroups.length; i++) {
addMimeGroup(mimeGroups[i]);
}
return this;
}
Match addMimeTypes(String[] mimeTypes) {
for (int i = 0; i < mimeTypes.length; i++) {
try {
addDataType(mimeTypes[i]);
} catch (IntentFilter.MalformedMimeTypeException e) {
throw new RuntimeException("Bad mime type", e);
}
}
return this;
}
Match addActions(String[] actions) {
for (int i = 0; i < actions.length; i++) {
addAction(actions[i]);
}
return this;
}
}
private static class MatchCondition {
public final int result;
public final String action;
public final String mimeType;
public final Uri data;
public final String[] categories;
public final boolean wildcardSupported;
public final Collection<String> ignoredActions;
public static MatchCondition data(int result, String data) {
return new MatchCondition(result, null, null, null, data);
}
public static MatchCondition data(int result, String data, boolean wildcardSupported) {
return new MatchCondition(result, null, null, null, data, wildcardSupported, null);
}
public static MatchCondition data(int result, String data, boolean wildcardSupported,
Collection<String> ignoredActions) {
return new MatchCondition(result, null, null, null, data, wildcardSupported,
ignoredActions);
}
MatchCondition(int result, String action, String[] categories, String mimeType,
String data) {
this(result, action, categories, mimeType, data, false, null);
}
MatchCondition(int result, String action, String[] categories, String mimeType,
String data, boolean wildcardSupported) {
this(result, action, categories, mimeType, data, wildcardSupported, null);
}
MatchCondition(int result, String action, String[] categories, String mimeType,
String data, boolean wildcardSupported, Collection<String> ignoredActions) {
this.result = result;
this.action = action;
this.mimeType = mimeType;
this.data = data != null ? Uri.parse(data) : null;
this.categories = categories;
this.wildcardSupported = wildcardSupported;
this.ignoredActions = ignoredActions;
}
}
private static void checkMatches(IntentFilter[] filters, MatchCondition... results) {
for (IntentFilter filter : filters) {
checkMatches(filter, results);
}
}
private static void checkMatches(IntentFilter filter, MatchCondition... results) {
for (int i = 0; i < results.length; i++) {
MatchCondition mc = results[i];
HashSet<String> categories = null;
if (mc.categories != null) {
for (int j = 0; j < mc.categories.length; j++) {
if (categories == null) {
categories = new HashSet<String>();
}
categories.add(mc.categories[j]);
}
}
int result = filter.match(mc.action, mc.mimeType, mc.data != null ? mc.data.getScheme()
: null, mc.data, categories, "test", mc.wildcardSupported, mc.ignoredActions);
if ((result & IntentFilter.MATCH_CATEGORY_MASK) !=
(mc.result & IntentFilter.MATCH_CATEGORY_MASK)) {
StringBuilder msg = new StringBuilder();
msg.append("Error matching against IntentFilter:\n");
filter.dump(new StringBuilderPrinter(msg), " ");
msg.append("Match action: ");
msg.append(mc.action);
msg.append("\nMatch mimeType: ");
msg.append(mc.mimeType);
msg.append("\nMatch data: ");
msg.append(mc.data);
msg.append("\nMatch categories: ");
if (mc.categories != null) {
for (int j = 0; j < mc.categories.length; j++) {
if (j > 0) {
msg.append(", ");
}
msg.append(mc.categories[j]);
}
}
msg.append("\nExpected result: 0x");
msg.append(Integer.toHexString(mc.result));
msg.append(", got result: 0x");
msg.append(Integer.toHexString(result));
throw new RuntimeException(msg.toString());
}
}
}
public void testPaths() throws Exception {
IntentFilter filter = new Match(null, null, null,
new String[]{"scheme"}, new String[]{"authority"}, null,
new String[]{"/literal1", "/2literal"},
new int[]{PATTERN_LITERAL, PATTERN_LITERAL});
checkMatches(filter,
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/literal1"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/2literal"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/literal"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/literal12"));
filter = new Match(null, null, null,
new String[]{"scheme"}, new String[]{"authority"}, null,
new String[]{"/literal1", "/2literal"}, new int[]{PATTERN_PREFIX, PATTERN_PREFIX});
checkMatches(filter,
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/literal1"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/2literal"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/literal"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/literal12"));
filter = new Match(null, null, null,
new String[]{"scheme"}, new String[]{"authority"}, null,
new String[]{"literal1", "2literal"}, new int[]{PATTERN_SUFFIX, PATTERN_SUFFIX});
checkMatches(filter,
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/aliteral1"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/2literal"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/literal"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/literal1"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/2literal1"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/literal1a"));
filter = new Match(null, null, null,
new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/.*"},
new int[]{PATTERN_SIMPLE_GLOB});
checkMatches(filter,
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/literal1"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority"));
filter = new Match(null, null, null,
new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{".*"},
new int[]{PATTERN_SIMPLE_GLOB});
checkMatches(filter,
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/literal1"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority"));
filter = new Match(null, null, null,
new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a1*b"},
new int[]{PATTERN_SIMPLE_GLOB});
checkMatches(filter,
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/ab"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/a1b"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/a11b"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/a2b"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/a1bc"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/"));
filter = new Match(null, null, null,
new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a1*"},
new int[]{PATTERN_SIMPLE_GLOB});
checkMatches(filter,
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/a1"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/ab"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/a11"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/a1b"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/a11"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/a2"));
filter = new Match(null, null, null,
new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a\\.*b"},
new int[]{PATTERN_SIMPLE_GLOB});
checkMatches(filter,
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/ab"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/a.b"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/a..b"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/a2b"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/a.bc"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/"));
filter = new Match(null, null, null,
new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a.*b"},
new int[]{PATTERN_SIMPLE_GLOB});
checkMatches(filter,
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/ab"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/a.b"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/a.1b"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/a2b"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/a.bc"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/"));
filter = new Match(null, null, null,
new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a.*"},
new int[]{PATTERN_SIMPLE_GLOB});
checkMatches(filter,
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/ab"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/a.b"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/a.1b"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/a2b"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/a.bc"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/"));
filter = new Match(null, null, null,
new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a.\\*b"},
new int[]{PATTERN_SIMPLE_GLOB});
checkMatches(filter,
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/ab"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/a.*b"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/a1*b"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/a2b"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/a.bc"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/"));
filter = new Match(null, null, null,
new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a.\\*"},
new int[]{PATTERN_SIMPLE_GLOB});
checkMatches(filter,
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, null),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/ab"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/a.*"),
MatchCondition.data(
IntentFilter.MATCH_CATEGORY_PATH, "scheme://authority/a1*"),
MatchCondition.data(
IntentFilter.NO_MATCH_DATA, "scheme://authority/a1b"));
}
public void testDump() throws MalformedMimeTypeException {
TestPrinter printer = new TestPrinter();
String prefix = "TestIntentFilter";
IntentFilter filter = new IntentFilter(ACTION, DATA_STATIC_TYPE);
filter.dump(printer, prefix);
assertTrue(printer.isPrintlnCalled);
}
private class TestPrinter implements Printer {
public boolean isPrintlnCalled;
public void println(String x) {
isPrintlnCalled = true;
}
}
}