133a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong/*
233a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong * Copyright (C) 2015 The Android Open Source Project
333a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong *
433a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong * Licensed under the Apache License, Version 2.0 (the "License");
533a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong * you may not use this file except in compliance with the License.
633a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong * You may obtain a copy of the License at
733a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong *
833a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong *      http://www.apache.org/licenses/LICENSE-2.0
933a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong *
1033a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong * Unless required by applicable law or agreed to in writing, software
1133a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong * distributed under the License is distributed on an "AS IS" BASIS,
1233a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1333a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong * See the License for the specific language governing permissions and
1433a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong * limitations under the License
1533a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong */
1633a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong
1733a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rongpackage com.android.dialer.database;
1833a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong
1933a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rongimport android.content.AsyncQueryHandler;
2033a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rongimport android.content.ContentResolver;
2133a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rongimport android.content.ContentUris;
2233a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rongimport android.content.ContentValues;
2333a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rongimport android.database.Cursor;
249bd094118e920b732394c29657f26b062f3e916bAnne Rongimport android.database.DatabaseUtils;
259bd094118e920b732394c29657f26b062f3e916bAnne Rongimport android.database.sqlite.SQLiteDatabaseCorruptException;
2633a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rongimport android.net.Uri;
2760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwellimport android.support.annotation.Nullable;
2833a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rongimport android.telephony.PhoneNumberUtils;
294805ae099d7540ee42b1428bf5fb6ca75a4855edAndrew Leeimport android.text.TextUtils;
3033a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong
3160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwellimport com.android.dialer.compat.FilteredNumberCompat;
3233a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rongimport com.android.dialer.database.FilteredNumberContract.FilteredNumber;
3333a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rongimport com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
3433a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rongimport com.android.dialer.database.FilteredNumberContract.FilteredNumberTypes;
3533a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong
3633a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rongpublic class FilteredNumberAsyncQueryHandler extends AsyncQueryHandler {
3733a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    private static final int NO_TOKEN = 0;
3833a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong
3933a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    public FilteredNumberAsyncQueryHandler(ContentResolver cr) {
4033a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong        super(cr);
4133a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    }
4233a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong
4333a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    /**
4433a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong     * Methods for FilteredNumberAsyncQueryHandler result returns.
4533a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong     */
4633a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    private static abstract class Listener {
4733a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
4833a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong        }
4933a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong        protected void onInsertComplete(int token, Object cookie, Uri uri) {
5033a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong        }
5133a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong        protected void onUpdateComplete(int token, Object cookie, int result) {
5233a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong        }
5333a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong        protected void onDeleteComplete(int token, Object cookie, int result) {
5433a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong        }
5533a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    }
5633a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong
5733a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    public interface OnCheckBlockedListener {
589bd094118e920b732394c29657f26b062f3e916bAnne Rong        /**
599bd094118e920b732394c29657f26b062f3e916bAnne Rong         * Invoked after querying if a number is blocked.
609bd094118e920b732394c29657f26b062f3e916bAnne Rong         * @param id The ID of the row if blocked, null otherwise.
619bd094118e920b732394c29657f26b062f3e916bAnne Rong         */
6260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        void onCheckComplete(Integer id);
6333a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    }
6433a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong
6533a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    public interface OnBlockNumberListener {
669bd094118e920b732394c29657f26b062f3e916bAnne Rong        /**
679bd094118e920b732394c29657f26b062f3e916bAnne Rong         * Invoked after inserting a blocked number.
689bd094118e920b732394c29657f26b062f3e916bAnne Rong         * @param uri The uri of the newly created row.
699bd094118e920b732394c29657f26b062f3e916bAnne Rong         */
7060fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        void onBlockComplete(Uri uri);
7133a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    }
7233a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong
7333a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    public interface OnUnblockNumberListener {
749bd094118e920b732394c29657f26b062f3e916bAnne Rong        /**
759bd094118e920b732394c29657f26b062f3e916bAnne Rong         * Invoked after removing a blocked number
769bd094118e920b732394c29657f26b062f3e916bAnne Rong         * @param rows The number of rows affected (expected value 1).
779bd094118e920b732394c29657f26b062f3e916bAnne Rong         * @param values The deleted data (used for restoration).
789bd094118e920b732394c29657f26b062f3e916bAnne Rong         */
7960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        void onUnblockComplete(int rows, ContentValues values);
8033a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    }
8133a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong
829155416b1679a84b184959ce83c81d42d2dc7380Andrew Lee    public interface OnHasBlockedNumbersListener {
839155416b1679a84b184959ce83c81d42d2dc7380Andrew Lee        /**
849155416b1679a84b184959ce83c81d42d2dc7380Andrew Lee         * @param hasBlockedNumbers {@code true} if any blocked numbers are stored.
859155416b1679a84b184959ce83c81d42d2dc7380Andrew Lee         *     {@code false} otherwise.
869155416b1679a84b184959ce83c81d42d2dc7380Andrew Lee         */
8760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        void onHasBlockedNumbers(boolean hasBlockedNumbers);
889155416b1679a84b184959ce83c81d42d2dc7380Andrew Lee    }
899155416b1679a84b184959ce83c81d42d2dc7380Andrew Lee
9033a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    @Override
9133a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
921b4545d7b500e4e18a0f5be43a8052fce2112ae0Anne Rong        if (cookie != null) {
931b4545d7b500e4e18a0f5be43a8052fce2112ae0Anne Rong            ((Listener) cookie).onQueryComplete(token, cookie, cursor);
941b4545d7b500e4e18a0f5be43a8052fce2112ae0Anne Rong        }
9533a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    }
9633a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong
9733a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    @Override
9833a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    protected void onInsertComplete(int token, Object cookie, Uri uri) {
991b4545d7b500e4e18a0f5be43a8052fce2112ae0Anne Rong        if (cookie != null) {
1001b4545d7b500e4e18a0f5be43a8052fce2112ae0Anne Rong            ((Listener) cookie).onInsertComplete(token, cookie, uri);
1011b4545d7b500e4e18a0f5be43a8052fce2112ae0Anne Rong        }
10233a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    }
10333a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong
10433a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    @Override
10533a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    protected void onUpdateComplete(int token, Object cookie, int result) {
1061b4545d7b500e4e18a0f5be43a8052fce2112ae0Anne Rong        if (cookie != null) {
1071b4545d7b500e4e18a0f5be43a8052fce2112ae0Anne Rong            ((Listener) cookie).onUpdateComplete(token, cookie, result);
1081b4545d7b500e4e18a0f5be43a8052fce2112ae0Anne Rong        }
10933a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    }
11033a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong
11133a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    @Override
11233a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    protected void onDeleteComplete(int token, Object cookie, int result) {
1131b4545d7b500e4e18a0f5be43a8052fce2112ae0Anne Rong        if (cookie != null) {
1141b4545d7b500e4e18a0f5be43a8052fce2112ae0Anne Rong            ((Listener) cookie).onDeleteComplete(token, cookie, result);
1151b4545d7b500e4e18a0f5be43a8052fce2112ae0Anne Rong        }
11633a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    }
11733a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong
1181b4545d7b500e4e18a0f5be43a8052fce2112ae0Anne Rong    public final void incrementFilteredCount(Integer id) {
11960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        // No concept of counts with new filtering
12060fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        if (FilteredNumberCompat.useNewFiltering()) {
12160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            return;
12260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        }
1231b4545d7b500e4e18a0f5be43a8052fce2112ae0Anne Rong        startUpdate(NO_TOKEN, null,
1241b4545d7b500e4e18a0f5be43a8052fce2112ae0Anne Rong                ContentUris.withAppendedId(FilteredNumber.CONTENT_URI_INCREMENT_FILTERED_COUNT, id),
1251b4545d7b500e4e18a0f5be43a8052fce2112ae0Anne Rong                null, null, null);
1261b4545d7b500e4e18a0f5be43a8052fce2112ae0Anne Rong    }
1271b4545d7b500e4e18a0f5be43a8052fce2112ae0Anne Rong
12803dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell    public void hasBlockedNumbers(final OnHasBlockedNumbersListener listener) {
1299155416b1679a84b184959ce83c81d42d2dc7380Andrew Lee        startQuery(NO_TOKEN,
1309155416b1679a84b184959ce83c81d42d2dc7380Andrew Lee                new Listener() {
1319155416b1679a84b184959ce83c81d42d2dc7380Andrew Lee                    @Override
1329155416b1679a84b184959ce83c81d42d2dc7380Andrew Lee                    protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
1336773df0b1a6f8fd7f50c7ddc7a0fcf21c9df0253Brandon Maxwell                        listener.onHasBlockedNumbers(cursor != null && cursor.getCount() > 0);
1349155416b1679a84b184959ce83c81d42d2dc7380Andrew Lee                    }
1359155416b1679a84b184959ce83c81d42d2dc7380Andrew Lee                },
13660fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                FilteredNumberCompat.getContentUri(null),
13760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                new String[]{ FilteredNumberCompat.getIdColumnName() },
13860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                FilteredNumberCompat.useNewFiltering() ? null : FilteredNumberColumns.TYPE
13960fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                        + "=" + FilteredNumberTypes.BLOCKED_NUMBER,
1409155416b1679a84b184959ce83c81d42d2dc7380Andrew Lee                null,
1419155416b1679a84b184959ce83c81d42d2dc7380Andrew Lee                null);
1429155416b1679a84b184959ce83c81d42d2dc7380Andrew Lee    }
1439155416b1679a84b184959ce83c81d42d2dc7380Andrew Lee
14433a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    /**
1454805ae099d7540ee42b1428bf5fb6ca75a4855edAndrew Lee     * Check if this number has been blocked.
1464805ae099d7540ee42b1428bf5fb6ca75a4855edAndrew Lee     *
1474805ae099d7540ee42b1428bf5fb6ca75a4855edAndrew Lee     * @return {@code false} if the number was invalid and couldn't be checked,
1484805ae099d7540ee42b1428bf5fb6ca75a4855edAndrew Lee     *     {@code true} otherwise,
14933a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong     */
1506a87f4406af8ba5861c025bab12333ab6d40ae19Gilles Franck Mevaa    public boolean isBlockedNumber(
1514805ae099d7540ee42b1428bf5fb6ca75a4855edAndrew Lee            final OnCheckBlockedListener listener, String number, String countryIso) {
15260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        final String e164Number = PhoneNumberUtils.formatNumberToE164(number, countryIso);
15360fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        if (TextUtils.isEmpty(e164Number)) {
1544805ae099d7540ee42b1428bf5fb6ca75a4855edAndrew Lee            return false;
15533a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong        }
15633a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong
15733a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong        startQuery(NO_TOKEN,
15833a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong                new Listener() {
15933a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong                    @Override
16033a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong                    protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
161fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell                        /*
162fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell                         * In the frameworking blocking, numbers can be blocked in both e164 format
163fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell                         * and not, resulting in multiple rows being returned for this query. For
164fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell                         * example, both '16502530000' and '6502530000' can exist at the same time
165fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell                         * and will be returned by this query.
166fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell                         */
167fd75e4c3b3c1a8f5a6ee5d3ce6a8503cf83ea424Brandon Maxwell                        if (cursor == null || cursor.getCount() == 0) {
1689bd094118e920b732394c29657f26b062f3e916bAnne Rong                            listener.onCheckComplete(null);
16933a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong                            return;
17033a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong                        }
17133a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong                        cursor.moveToFirst();
17260fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                        // New filtering doesn't have a concept of type
17360fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                        if (!FilteredNumberCompat.useNewFiltering()
17460fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                                && cursor.getInt(cursor.getColumnIndex(FilteredNumberColumns.TYPE))
17533a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong                                != FilteredNumberTypes.BLOCKED_NUMBER) {
1769bd094118e920b732394c29657f26b062f3e916bAnne Rong                            listener.onCheckComplete(null);
17733a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong                            return;
17833a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong                        }
1799bd094118e920b732394c29657f26b062f3e916bAnne Rong                        listener.onCheckComplete(
18033a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong                                cursor.getInt(cursor.getColumnIndex(FilteredNumberColumns._ID)));
18133a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong                    }
18233a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong                },
18360fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                FilteredNumberCompat.getContentUri(null),
18460fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                FilteredNumberCompat.filter(new String[]{FilteredNumberCompat.getIdColumnName(),
18560fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                        FilteredNumberCompat.getTypeColumnName()}),
18660fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                FilteredNumberCompat.getE164NumberColumnName() + " = ?",
18760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                new String[]{e164Number},
18833a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong                null);
1894805ae099d7540ee42b1428bf5fb6ca75a4855edAndrew Lee
1904805ae099d7540ee42b1428bf5fb6ca75a4855edAndrew Lee        return true;
19133a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    }
19233a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong
1936a87f4406af8ba5861c025bab12333ab6d40ae19Gilles Franck Mevaa    public void blockNumber(
19460fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            final OnBlockNumberListener listener, String number, @Nullable String countryIso) {
1958bac84cf80f5be9c0196c49cb2e7ce2a247bba3bAndrew Lee        blockNumber(listener, null, number, countryIso);
19612dea3d2f084e0b4f349d1ab987e3b996b68a656Andrew Lee    }
19712dea3d2f084e0b4f349d1ab987e3b996b68a656Andrew Lee
19833a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    /**
19933a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong     * Add a number manually blocked by the user.
20033a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong     */
2016a87f4406af8ba5861c025bab12333ab6d40ae19Gilles Franck Mevaa    public void blockNumber(
20212dea3d2f084e0b4f349d1ab987e3b996b68a656Andrew Lee            final OnBlockNumberListener listener,
20360fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            @Nullable String normalizedNumber,
20412dea3d2f084e0b4f349d1ab987e3b996b68a656Andrew Lee            String number,
20560fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell            @Nullable String countryIso) {
20660fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell        blockNumber(listener, FilteredNumberCompat.newBlockNumberContentValues(number,
20760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                normalizedNumber, countryIso));
2089bd094118e920b732394c29657f26b062f3e916bAnne Rong    }
2099bd094118e920b732394c29657f26b062f3e916bAnne Rong
2109bd094118e920b732394c29657f26b062f3e916bAnne Rong    /**
2119bd094118e920b732394c29657f26b062f3e916bAnne Rong     * Block a number with specified ContentValues. Can be manually added or a restored row
2129bd094118e920b732394c29657f26b062f3e916bAnne Rong     * from performing the 'undo' action after unblocking.
2139bd094118e920b732394c29657f26b062f3e916bAnne Rong     */
2146a87f4406af8ba5861c025bab12333ab6d40ae19Gilles Franck Mevaa    public void blockNumber(final OnBlockNumberListener listener, ContentValues values) {
21533a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong        startInsert(NO_TOKEN,
21633a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong                new Listener() {
21733a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong                    @Override
21833a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong                    public void onInsertComplete(int token, Object cookie, Uri uri) {
219c412f94fb20db5cd177421e373fdf941e0135c81Andrew Lee                        if (listener != null ) {
220c412f94fb20db5cd177421e373fdf941e0135c81Andrew Lee                            listener.onBlockComplete(uri);
221c412f94fb20db5cd177421e373fdf941e0135c81Andrew Lee                        }
22233a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong                    }
22360fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell                }, FilteredNumberCompat.getContentUri(null), values);
22433a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    }
22533a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong
22633a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    /**
22760fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell     * Unblocks the number with the given id.
22860fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell     *
229f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell     * @param listener (optional) The {@link OnUnblockNumberListener} called after the number is
230f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell     * unblocked.
23160fb1dc7afe8fe6079785724a21bbffbdb4eac88Brandon Maxwell     * @param id The id of the number to unblock.
23233a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong     */
233f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell    public void unblock(@Nullable final OnUnblockNumberListener listener, Integer id) {
23433a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong        if (id == null) {
23533a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong            throw new IllegalArgumentException("Null id passed into unblock");
23633a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong        }
237f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell        unblock(listener, FilteredNumberCompat.getContentUri(id));
2389bd094118e920b732394c29657f26b062f3e916bAnne Rong    }
2399bd094118e920b732394c29657f26b062f3e916bAnne Rong
2409bd094118e920b732394c29657f26b062f3e916bAnne Rong    /**
2419bd094118e920b732394c29657f26b062f3e916bAnne Rong     * Removes row from database.
242f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell     * @param listener (optional) The {@link OnUnblockNumberListener} called after the number is
243f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell     * unblocked.
2449bd094118e920b732394c29657f26b062f3e916bAnne Rong     * @param uri The uri of row to remove, from
245f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell     * {@link FilteredNumberAsyncQueryHandler#blockNumber}.
2469bd094118e920b732394c29657f26b062f3e916bAnne Rong     */
247f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell    public void unblock(@Nullable final OnUnblockNumberListener listener, final Uri uri) {
2489bd094118e920b732394c29657f26b062f3e916bAnne Rong        startQuery(NO_TOKEN, new Listener() {
24933a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong            @Override
2509bd094118e920b732394c29657f26b062f3e916bAnne Rong            public void onQueryComplete(int token, Object cookie, Cursor cursor) {
2516773df0b1a6f8fd7f50c7ddc7a0fcf21c9df0253Brandon Maxwell                int rowsReturned = cursor == null ? 0 : cursor.getCount();
2526773df0b1a6f8fd7f50c7ddc7a0fcf21c9df0253Brandon Maxwell                if (rowsReturned != 1) {
2539bd094118e920b732394c29657f26b062f3e916bAnne Rong                    throw new SQLiteDatabaseCorruptException
2546773df0b1a6f8fd7f50c7ddc7a0fcf21c9df0253Brandon Maxwell                            ("Returned " + rowsReturned + " rows for uri "
2559bd094118e920b732394c29657f26b062f3e916bAnne Rong                                    + uri + "where 1 expected.");
2569bd094118e920b732394c29657f26b062f3e916bAnne Rong                }
2579bd094118e920b732394c29657f26b062f3e916bAnne Rong                cursor.moveToFirst();
2589bd094118e920b732394c29657f26b062f3e916bAnne Rong                final ContentValues values = new ContentValues();
2599bd094118e920b732394c29657f26b062f3e916bAnne Rong                DatabaseUtils.cursorRowToContentValues(cursor, values);
260f0e0ce60005a5732c65bddf290cd758c517d99dbBrandon Maxwell                values.remove(FilteredNumberCompat.getIdColumnName());
2619bd094118e920b732394c29657f26b062f3e916bAnne Rong
2629bd094118e920b732394c29657f26b062f3e916bAnne Rong                startDelete(NO_TOKEN, new Listener() {
2639bd094118e920b732394c29657f26b062f3e916bAnne Rong                    @Override
2649bd094118e920b732394c29657f26b062f3e916bAnne Rong                    public void onDeleteComplete(int token, Object cookie, int result) {
265c412f94fb20db5cd177421e373fdf941e0135c81Andrew Lee                        if (listener != null) {
266c412f94fb20db5cd177421e373fdf941e0135c81Andrew Lee                            listener.onUnblockComplete(result, values);
267c412f94fb20db5cd177421e373fdf941e0135c81Andrew Lee                        }
2689bd094118e920b732394c29657f26b062f3e916bAnne Rong                    }
2699bd094118e920b732394c29657f26b062f3e916bAnne Rong                }, uri, null, null);
27033a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong            }
2719bd094118e920b732394c29657f26b062f3e916bAnne Rong        }, uri, null, null, null, null);
27233a30ce94a74778cf895c8e0a4bf8e5936f43168Anne Rong    }
273610ac9cd2867bb714cdec50835a29f1a1dc04907Andrew Lee}
274