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