17fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell/*
27fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell * Copyright (C) 2016 The Android Open Source Project
37fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell *
47fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell * Licensed under the Apache License, Version 2.0 (the "License");
57fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell * you may not use this file except in compliance with the License.
67fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell * You may obtain a copy of the License at
77fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell *
87fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell *      http://www.apache.org/licenses/LICENSE-2.0
97fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell *
107fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell * Unless required by applicable law or agreed to in writing, software
117fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell * distributed under the License is distributed on an "AS IS" BASIS,
127fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell * See the License for the specific language governing permissions and
147fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell * limitations under the License.
157fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell */
167fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
177fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwellpackage com.android.dialer.database;
187fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
19f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwellimport android.content.ContentUris;
200c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwellimport android.content.ContentValues;
217fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwellimport android.net.Uri;
2260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwellimport android.provider.BlockedNumberContract;
2360fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwellimport android.provider.BlockedNumberContract.BlockedNumbers;
247fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwellimport android.test.InstrumentationTestCase;
257fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwellimport android.test.mock.MockContentResolver;
2660fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwellimport android.test.suitebuilder.annotation.SmallTest;
277fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
2860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwellimport com.android.contacts.common.compat.CompatUtils;
297fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwellimport com.android.contacts.common.test.mocks.MockContentProvider;
307fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwellimport com.android.contacts.common.test.mocks.MockContentProvider.Query;
3160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwellimport com.android.dialer.compat.FilteredNumberCompat;
320c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwellimport com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnBlockNumberListener;
337fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwellimport com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
347fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwellimport com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnHasBlockedNumbersListener;
35f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwellimport com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnUnblockNumberListener;
367fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwellimport com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
370c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwellimport com.android.dialer.database.FilteredNumberContract.FilteredNumberSources;
387fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwellimport com.android.dialer.database.FilteredNumberContract.FilteredNumberTypes;
397fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
407fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwellimport java.util.concurrent.CountDownLatch;
417fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwellimport java.util.concurrent.TimeUnit;
427fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
4360fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell@SmallTest
447fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwellpublic class FilteredNumberAsyncQueryHandlerTest extends InstrumentationTestCase {
457fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
467fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell    private static final String E164_NUMBER = "+16502530000";
477fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell    private static final String NUMBER = "6502530000";
487fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell    private static final String COUNTRY_ISO = "US";
497fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell    private static final Integer ID = 1;
50fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell    private static final Integer ID2 = 2;
5160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    private static final Uri BLOCKED_NUMBER_URI_N = CompatUtils.isNCompatible() ?
5260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            Uri.withAppendedPath(BlockedNumberContract.AUTHORITY_URI, "blocked") : null;
5360fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    private static final Uri BLOCKED_NUMBER_URI_M =
547fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            Uri.withAppendedPath(FilteredNumberContract.AUTHORITY_URI, "filtered_numbers_table");
5560fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    private static final Uri BLOCKED_NUMBER_URI = CompatUtils.isNCompatible() ? BLOCKED_NUMBER_URI_N
5660fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            : BLOCKED_NUMBER_URI_M;
57f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell    private static final Uri BLOCKED_NUMBER_URI_WITH_ID =
58f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell            ContentUris.withAppendedId(BLOCKED_NUMBER_URI, ID);
590c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell    private static final Uri EXPECTED_URI = Uri.fromParts("android", "google", "dialer");
607fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
617fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell    private final MockContentResolver mContentResolver = new MockContentResolver();
627fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell    private final MockContentProvider mContentProvider = new MockContentProvider();
637fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
647fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell    @Override
657fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell    public void setUp() throws Exception {
667fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        super.setUp();
6760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        FilteredNumberCompat.setIsEnabledForTest(true);
6860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        if (CompatUtils.isNCompatible()) {
6960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            mContentResolver.addProvider(BlockedNumberContract.AUTHORITY, mContentProvider);
7060fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        } else {
7160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            mContentResolver.addProvider(FilteredNumberContract.AUTHORITY, mContentProvider);
7260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        }
737fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell    }
747fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
7560fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    public void testHasBlockedNumbers_Disabled() throws Throwable {
7660fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        if (!CompatUtils.isNCompatible()) {
7760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            return;
7860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        }
7960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        FilteredNumberCompat.setIsEnabledForTest(false);
8060fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        final MockContentResolver resolver = new MockContentResolver();
8160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        MockContentProvider disabledProvider = new MockContentProvider();
8260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        resolver.addProvider(FilteredNumberContract.AUTHORITY, disabledProvider);
837fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
8460fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        disabledProvider.expectQuery(BLOCKED_NUMBER_URI_M).withProjection(FilteredNumberColumns._ID)
8560fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                .withSelection(FilteredNumberColumns.TYPE + "="
8660fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                        + FilteredNumberTypes.BLOCKED_NUMBER, null).returnRow(ID);
8760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        final HasBlockedNumbersListener listener = new HasBlockedNumbersListener();
887fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        runTestOnUiThread(new Runnable() {
897fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            @Override
907fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            public void run() {
9160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                new FilteredNumberAsyncQueryHandler(resolver).hasBlockedNumbers(listener);
927fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            }
937fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        });
9460fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        assertTrue(listener.waitForCallback());
9560fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        disabledProvider.verify();
967fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell    }
977fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
987fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell    public void testHasBlockedNumbers_NoResults() throws Throwable {
9960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        newHasBlockedNumbersExpectedQuery().returnEmptyCursor();
1007fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        final HasBlockedNumbersListener listener = new HasBlockedNumbersListener();
1017fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        runTestOnUiThread(new Runnable() {
1027fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            @Override
1037fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            public void run() {
1047fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell                new FilteredNumberAsyncQueryHandler(mContentResolver).hasBlockedNumbers(listener);
1057fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            }
1067fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        });
1077fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        assertFalse(listener.waitForCallback());
1087fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        mContentProvider.verify();
1097fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell    }
1107fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
1117fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell    public void testHasBlockedNumbers() throws Throwable {
11260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        newHasBlockedNumbersExpectedQuery().returnRow(ID);
1137fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        final HasBlockedNumbersListener listener = new HasBlockedNumbersListener();
1147fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        runTestOnUiThread(new Runnable() {
1157fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            @Override
1167fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            public void run() {
1177fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell                new FilteredNumberAsyncQueryHandler(mContentResolver).hasBlockedNumbers(listener);
1187fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            }
1197fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        });
1207fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        assertTrue(listener.waitForCallback());
1217fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        mContentProvider.verify();
1227fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell    }
1237fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
12460fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    public void testIsBlockedNumber_Disabled() throws Throwable {
12560fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        if (!CompatUtils.isNCompatible()) {
12660fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            return;
12760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        }
12860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        FilteredNumberCompat.setIsEnabledForTest(false);
12960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        final MockContentResolver resolver = new MockContentResolver();
13060fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        MockContentProvider disabledProvider = new MockContentProvider();
13160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        resolver.addProvider(FilteredNumberContract.AUTHORITY, disabledProvider);
13260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        disabledProvider.expectQuery(BLOCKED_NUMBER_URI_M)
1337fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell                .withProjection(FilteredNumberColumns._ID, FilteredNumberColumns.TYPE)
13460fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                .withSelection(FilteredNumberColumns.NORMALIZED_NUMBER + " = ?", E164_NUMBER)
13560fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                .returnRow(ID, FilteredNumberTypes.BLOCKED_NUMBER);
13660fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        final CheckBlockedListener listener = new CheckBlockedListener();
13760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        runTestOnUiThread(new Runnable() {
13860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            @Override
13960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            public void run() {
14060fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                new FilteredNumberAsyncQueryHandler(resolver)
14160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                        .isBlockedNumber(listener, NUMBER, COUNTRY_ISO);
14260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            }
14360fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        });
14460fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        assertEquals(ID, listener.waitForCallback());
14560fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        mContentProvider.verify();
1467fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell    }
1477fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
14860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    public void testIsBlockedNumber_NoResults() throws Throwable {
14960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        newIsBlockedNumberExpectedQuery().returnEmptyCursor();
15060fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        final CheckBlockedListener listener = new CheckBlockedListener();
15160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell
15260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        runTestOnUiThread(new Runnable() {
15360fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            @Override
15460fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            public void run() {
15560fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                new FilteredNumberAsyncQueryHandler(mContentResolver)
15660fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                        .isBlockedNumber(listener, NUMBER, COUNTRY_ISO);
15760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            }
15860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        });
15960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        assertNull(listener.waitForCallback());
16060fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        mContentProvider.verify();
16160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    }
16260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell
16360fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    public void testIsBlockedNumber() throws Throwable {
16460fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        if (CompatUtils.isNCompatible()) {
16560fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            newIsBlockedNumberExpectedQuery().returnRow(ID);
16660fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        } else {
16760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            newIsBlockedNumberExpectedQuery().returnRow(ID, FilteredNumberTypes.BLOCKED_NUMBER);
16860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        }
16960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        final CheckBlockedListener listener = new CheckBlockedListener();
17060fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        runTestOnUiThread(new Runnable() {
17160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            @Override
17260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            public void run() {
17360fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                new FilteredNumberAsyncQueryHandler(mContentResolver)
17460fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                        .isBlockedNumber(listener, NUMBER, COUNTRY_ISO);
17560fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell           }
17660fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        });
17760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        assertEquals(ID, listener.waitForCallback());
17860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        mContentProvider.verify();
17960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    }
18060fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell
181fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell    public void testIsBlockedNumber_MultipleResults() throws Throwable {
182fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell        if (CompatUtils.isNCompatible()) {
183fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell            newIsBlockedNumberExpectedQuery().returnRow(ID).returnRow(ID2);
184fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell        } else {
185fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell            newIsBlockedNumberExpectedQuery().returnRow(ID, FilteredNumberTypes.BLOCKED_NUMBER)
186fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell                    .returnRow(ID2, FilteredNumberTypes.BLOCKED_NUMBER);
187fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell        }
188fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell        final CheckBlockedListener listener = new CheckBlockedListener();
189fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell        runTestOnUiThread(new Runnable() {
190fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell            @Override
191fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell            public void run() {
192fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell                new FilteredNumberAsyncQueryHandler(mContentResolver)
193fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell                        .isBlockedNumber(listener, NUMBER, COUNTRY_ISO);
194fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell            }
195fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell        });
196fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell        // When there are multiple matches, the first is returned
197fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell        assertEquals(ID, listener.waitForCallback());
198fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell        mContentProvider.verify();
199fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell    }
200fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell
20160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    public void testBlockNumber_Disabled() throws Throwable {
20260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        if (!CompatUtils.isNCompatible()) {
20360fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            return;
20460fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        }
20560fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        FilteredNumberCompat.setIsEnabledForTest(false);
20660fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        final MockContentResolver resolver = new MockContentResolver();
20760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        MockContentProvider disabledProvider = new MockContentProvider();
20860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        resolver.addProvider(FilteredNumberContract.AUTHORITY, disabledProvider);
20960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell
21060fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        disabledProvider.expectInsert(BLOCKED_NUMBER_URI_M, newBlockNumberContentValuesM(),
21160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                EXPECTED_URI);
21260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        final BlockNumberListener listener = new BlockNumberListener();
21360fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        runTestOnUiThread(new Runnable() {
21460fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            @Override
21560fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            public void run() {
21660fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                new FilteredNumberAsyncQueryHandler(resolver).blockNumber(listener, E164_NUMBER,
21760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                        NUMBER, COUNTRY_ISO);
21860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            }
21960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        });
22060fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        assertSame(EXPECTED_URI, listener.waitForCallback());
22160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        disabledProvider.verify();
2220c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell    }
2230c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell
2240c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell    public void testBlockNumber() throws Throwable {
2250c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        mContentProvider.expectInsert(BLOCKED_NUMBER_URI, newBlockNumberContentValues(),
2260c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell                EXPECTED_URI);
22760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        final BlockNumberListener listener = new BlockNumberListener();
2280c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        runTestOnUiThread(new Runnable() {
2290c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell            @Override
2300c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell            public void run() {
2310c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell                new FilteredNumberAsyncQueryHandler(mContentResolver).blockNumber(listener,
2320c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell                        E164_NUMBER, NUMBER, COUNTRY_ISO);
2330c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell            }
2340c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        });
23560fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        assertSame(EXPECTED_URI, listener.waitForCallback());
2360c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        mContentProvider.verify();
2370c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell    }
2380c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell
2390c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell    public void testBlockNumber_NullNormalizedNumber() throws Throwable {
2400c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        mContentProvider.expectInsert(BLOCKED_NUMBER_URI, newBlockNumberContentValues(),
2410c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell                EXPECTED_URI);
24260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        final BlockNumberListener listener = new BlockNumberListener();
2430c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        runTestOnUiThread(new Runnable() {
2440c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell            @Override
2450c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell            public void run() {
2460c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell                new FilteredNumberAsyncQueryHandler(mContentResolver).blockNumber(listener,
2470c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell                        NUMBER, COUNTRY_ISO);
2480c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell            }
2490c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        });
25060fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        assertSame(EXPECTED_URI, listener.waitForCallback());
2510c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        mContentProvider.verify();
2520c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell    }
2530c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell
254f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell    public void testUnblockNumber_Disabled() throws Throwable {
255f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        if (!CompatUtils.isNCompatible()) {
256f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell            return;
257f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        }
258f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        FilteredNumberCompat.setIsEnabledForTest(false);
259f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        final MockContentResolver resolver = new MockContentResolver();
260f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        MockContentProvider disabledProvider = new MockContentProvider();
261f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        resolver.addProvider(FilteredNumberContract.AUTHORITY, disabledProvider);
262f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell
263f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        Uri uriWithId = ContentUris.withAppendedId(BLOCKED_NUMBER_URI_M, ID);
264f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        disabledProvider.expectQuery(uriWithId)
265f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell                .withProjection(null)
266f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell                .withDefaultProjection(FilteredNumberCompat.getIdColumnName())
267f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell                .withSelection(null, null)
268f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell                .withSortOrder(null)
269f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell                .returnRow(ID);
270f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        disabledProvider.expectDelete(uriWithId).returnRowsAffected(1);
271f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        final UnblockNumberListener listener = new UnblockNumberListener();
272f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        runTestOnUiThread(new Runnable() {
273f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell            @Override
274f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell            public void run() {
275f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell                new FilteredNumberAsyncQueryHandler(resolver).unblock(listener, ID);
276f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell            }
277f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        });
278f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        assertNotNull(listener.waitForCallback());
279f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        disabledProvider.verify();
280f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell    }
281f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell
282f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell    public void testUnblockNumber_NullId() {
283f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        try {
284f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell            new FilteredNumberAsyncQueryHandler(mContentResolver).unblock(null, (Integer) null);
285f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell            fail();
286f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        } catch (IllegalArgumentException e) {}
287f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell    }
288f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell
289f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell    public void testUnblockNumber() throws Throwable {
290f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        mContentProvider.expectQuery(BLOCKED_NUMBER_URI_WITH_ID)
291f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell                .withProjection(null)
292f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell                .withDefaultProjection(FilteredNumberCompat.getIdColumnName())
293f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell                .withSelection(null, null)
294f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell                .withSortOrder(null)
295f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell                .returnRow(ID);
296f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        mContentProvider.expectDelete(BLOCKED_NUMBER_URI_WITH_ID).returnRowsAffected(1);
297f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        final UnblockNumberListener listener = new UnblockNumberListener();
298f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        runTestOnUiThread(new Runnable() {
299f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell            @Override
300f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell            public void run() {
301f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell                new FilteredNumberAsyncQueryHandler(mContentResolver).unblock(listener, ID);
302f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell            }
303f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        });
304f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        assertNotNull(listener.waitForCallback());
305f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        mContentProvider.verify();
306f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell    }
307f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell
30860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    private Query newIsBlockedNumberExpectedQuery() {
30960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        if (CompatUtils.isNCompatible()) {
31060fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            return newIsBlockedNumberExpectedQueryN();
31160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        }
31260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        return newIsBlockedNumberExpectedQueryM();
31360fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    }
31460fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell
31560fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    private Query newIsBlockedNumberExpectedQueryN() {
31660fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        return mContentProvider.expectQuery(BLOCKED_NUMBER_URI)
31760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                .withProjection(BlockedNumbers.COLUMN_ID)
31860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                .withSelection(BlockedNumbers.COLUMN_E164_NUMBER + " = ?", E164_NUMBER);
31960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    }
32060fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell
32160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    private Query newIsBlockedNumberExpectedQueryM() {
32260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        return mContentProvider.expectQuery(BLOCKED_NUMBER_URI)
32360fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                .withProjection(FilteredNumberColumns._ID, FilteredNumberColumns.TYPE)
32460fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                .withSelection(FilteredNumberColumns.NORMALIZED_NUMBER + " = ?", E164_NUMBER);
32560fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    }
32660fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell
32760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    private Query newHasBlockedNumbersExpectedQuery() {
32860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        if (CompatUtils.isNCompatible()) {
32960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            return newHasBlockedNumbersExpectedQueryN();
33060fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        }
33160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        return newHasBlockedNumbersExpectedQueryM();
33260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    }
33360fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell
33460fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    private Query newHasBlockedNumbersExpectedQueryN() {
33560fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        return mContentProvider.expectQuery(BLOCKED_NUMBER_URI)
33660fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                .withProjection(BlockedNumbers.COLUMN_ID)
33760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                .withSelection(null, null);
33860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    }
33960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell
34060fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    private Query newHasBlockedNumbersExpectedQueryM() {
34160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        return mContentProvider.expectQuery(BLOCKED_NUMBER_URI).withProjection(
34260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                FilteredNumberColumns._ID)
34360fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                .withSelection(FilteredNumberColumns.TYPE + "="
34460fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                        + FilteredNumberTypes.BLOCKED_NUMBER, null);
34560fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    }
34660fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell
3470c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell    private ContentValues newBlockNumberContentValues() {
34860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        if (CompatUtils.isNCompatible()) {
34960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            return newBlockNumberContentValuesN();
35060fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        }
35160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        return newBlockNumberContentValuesM();
35260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    }
35360fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell
35460fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    private ContentValues newBlockNumberContentValuesN() {
35560fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        ContentValues contentValues = new ContentValues();
35660fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        contentValues.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, NUMBER);
35760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        return contentValues;
35860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    }
35960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell
36060fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    private ContentValues newBlockNumberContentValuesM() {
3610c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        ContentValues contentValues = new ContentValues();
3620c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        contentValues.put(FilteredNumberColumns.NORMALIZED_NUMBER, E164_NUMBER);
3630c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        contentValues.put(FilteredNumberColumns.NUMBER, NUMBER);
3640c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        contentValues.put(FilteredNumberColumns.COUNTRY_ISO, COUNTRY_ISO);
3650c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        contentValues.put(FilteredNumberColumns.TYPE, FilteredNumberTypes.BLOCKED_NUMBER);
3660c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        contentValues.put(FilteredNumberColumns.SOURCE, FilteredNumberSources.USER);
3670c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        return contentValues;
3687fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell    }
3697fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
3707fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell    private class CheckBlockedListener implements OnCheckBlockedListener {
3717fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        public final CountDownLatch onCheckCompleteCalled;
3727fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        public Integer id;
3737fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
3747fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        public CheckBlockedListener() {
3757fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            onCheckCompleteCalled = new CountDownLatch(1);
3767fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        }
3777fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
3787fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        @Override
3797fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        public void onCheckComplete(Integer id) {
3807fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            this.id = id;
3817fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            onCheckCompleteCalled.countDown();
3827fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        }
3837fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
3847fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        public Integer waitForCallback() throws InterruptedException {
3857fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            if (!onCheckCompleteCalled.await(5000, TimeUnit.MILLISECONDS)) {
3867fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell                throw new IllegalStateException("Waiting on callback timed out.");
3877fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            }
3887fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            return id;
3897fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        }
3907fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell    }
3917fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
3927fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell    private class HasBlockedNumbersListener implements OnHasBlockedNumbersListener {
3937fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        public final CountDownLatch onHasBlockedNumbersCalled;
3947fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        public boolean hasBlockedNumbers;
3957fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
3967fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        public HasBlockedNumbersListener() {
3977fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            onHasBlockedNumbersCalled = new CountDownLatch(1);
3987fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        }
3997fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
4007fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        @Override
4017fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        public void onHasBlockedNumbers(boolean hasBlockedNumbers) {
4027fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            this.hasBlockedNumbers = hasBlockedNumbers;
4037fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            onHasBlockedNumbersCalled.countDown();
4047fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        }
4057fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell
4067fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        public boolean waitForCallback() throws InterruptedException {
4077fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            if (!onHasBlockedNumbersCalled.await(5000, TimeUnit.MILLISECONDS)) {
4087fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell                throw new IllegalStateException("Waiting on callback timed out.");
4097fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            }
4107fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell            return hasBlockedNumbers;
4117fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell        }
4127fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell    }
4130c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell
41460fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell    private class BlockNumberListener implements OnBlockNumberListener {
4150c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        public final CountDownLatch onBlockCompleteCalled;
4160c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        public Uri uri;
4170c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell
41860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        public BlockNumberListener() {
4190c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell            onBlockCompleteCalled = new CountDownLatch(1);
4200c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        }
4210c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell
4220c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        @Override
4230c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        public void onBlockComplete(Uri uri) {
4240c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell            this.uri = uri;
4250c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell            onBlockCompleteCalled.countDown();
4260c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell        }
42760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell
42860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        public Uri waitForCallback() throws InterruptedException {
42960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            if (!onBlockCompleteCalled.await(5000, TimeUnit.MILLISECONDS)) {
43060fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                throw new IllegalStateException("Waiting on callback timed out.");
43160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            }
43260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            return uri;
43360fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        }
4340c832119d05dcfccbc52bcce841b306ccebc56e9Brandon Maxwell    }
435f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell
436f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell    private class UnblockNumberListener implements OnUnblockNumberListener {
437f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        public final CountDownLatch onUnblockCompleteCalled;
438f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        public Integer result;
439f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell
440f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        public UnblockNumberListener() {
441f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell            onUnblockCompleteCalled = new CountDownLatch(1);
442f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        }
443f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell
444f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        @Override
445f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        public void onUnblockComplete(int rows, ContentValues values) {
446f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell            result = rows;
447f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell            onUnblockCompleteCalled.countDown();
448f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        }
449f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell
450f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        public Integer waitForCallback() throws InterruptedException {
451f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell            if (!onUnblockCompleteCalled.await(5000, TimeUnit.MILLISECONDS)) {
452f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell                throw new IllegalStateException("Waiting on callback timed out.");
453f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell            }
454f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell            return result;
455f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        }
456f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell    }
4577fa52722af646f1aa39afc0fcbcb9d956510c067Brandon Maxwell}
458