1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.dialer.blocking; 18 19 import android.content.ContentResolver; 20 import android.content.ContentValues; 21 import android.content.Context; 22 import android.database.Cursor; 23 import android.os.AsyncTask; 24 import android.provider.BlockedNumberContract.BlockedNumbers; 25 import com.android.dialer.common.LogUtil; 26 import com.android.dialer.database.FilteredNumberContract; 27 import com.android.dialer.database.FilteredNumberContract.FilteredNumber; 28 import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns; 29 import java.util.Objects; 30 31 /** 32 * Class which should be used to migrate numbers from {@link FilteredNumberContract} blocking to 33 * {@link android.provider.BlockedNumberContract} blocking. 34 */ 35 @Deprecated 36 public class BlockedNumbersMigrator { 37 38 private final Context context; 39 40 /** 41 * Creates a new BlockedNumbersMigrate, using the given {@link ContentResolver} to perform queries 42 * against the blocked numbers tables. 43 */ BlockedNumbersMigrator(Context context)44 public BlockedNumbersMigrator(Context context) { 45 this.context = Objects.requireNonNull(context); 46 } 47 migrateToNewBlockingInBackground(ContentResolver resolver)48 private static boolean migrateToNewBlockingInBackground(ContentResolver resolver) { 49 try (Cursor cursor = 50 resolver.query( 51 FilteredNumber.CONTENT_URI, 52 new String[] {FilteredNumberColumns.NUMBER}, 53 null, 54 null, 55 null)) { 56 if (cursor == null) { 57 LogUtil.i( 58 "BlockedNumbersMigrator.migrateToNewBlockingInBackground", "migrate - cursor was null"); 59 return false; 60 } 61 62 LogUtil.i( 63 "BlockedNumbersMigrator.migrateToNewBlockingInBackground", 64 "migrate - attempting to migrate " + cursor.getCount() + "numbers"); 65 66 int numMigrated = 0; 67 while (cursor.moveToNext()) { 68 String originalNumber = 69 cursor.getString(cursor.getColumnIndex(FilteredNumberColumns.NUMBER)); 70 if (isNumberInNewBlocking(resolver, originalNumber)) { 71 LogUtil.i( 72 "BlockedNumbersMigrator.migrateToNewBlockingInBackground", 73 "migrate - number was already blocked in new blocking"); 74 continue; 75 } 76 ContentValues values = new ContentValues(); 77 values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, originalNumber); 78 resolver.insert(BlockedNumbers.CONTENT_URI, values); 79 ++numMigrated; 80 } 81 LogUtil.i( 82 "BlockedNumbersMigrator.migrateToNewBlockingInBackground", 83 "migrate - migration complete. " + numMigrated + " numbers migrated."); 84 return true; 85 } 86 } 87 isNumberInNewBlocking(ContentResolver resolver, String originalNumber)88 private static boolean isNumberInNewBlocking(ContentResolver resolver, String originalNumber) { 89 try (Cursor cursor = 90 resolver.query( 91 BlockedNumbers.CONTENT_URI, 92 new String[] {BlockedNumbers.COLUMN_ID}, 93 BlockedNumbers.COLUMN_ORIGINAL_NUMBER + " = ?", 94 new String[] {originalNumber}, 95 null)) { 96 return cursor != null && cursor.getCount() != 0; 97 } 98 } 99 100 /** 101 * Copies all of the numbers in the {@link FilteredNumberContract} block list to the {@link 102 * android.provider.BlockedNumberContract} block list. 103 * 104 * @param listener {@link Listener} called once the migration is complete. 105 * @return {@code true} if the migrate can be attempted, {@code false} otherwise. 106 * @throws NullPointerException if listener is null 107 */ migrate(final Listener listener)108 public boolean migrate(final Listener listener) { 109 LogUtil.i("BlockedNumbersMigrator.migrate", "migrate - start"); 110 if (!FilteredNumberCompat.canUseNewFiltering()) { 111 LogUtil.i("BlockedNumbersMigrator.migrate", "migrate - can't use new filtering"); 112 return false; 113 } 114 Objects.requireNonNull(listener); 115 new MigratorTask(listener).execute(); 116 return true; 117 } 118 119 /** 120 * Listener for the operation to migrate from {@link FilteredNumberContract} blocking to {@link 121 * android.provider.BlockedNumberContract} blocking. 122 */ 123 public interface Listener { 124 125 /** Called when the migration operation is finished. */ onComplete()126 void onComplete(); 127 } 128 129 private class MigratorTask extends AsyncTask<Void, Void, Boolean> { 130 131 private final Listener listener; 132 MigratorTask(Listener listener)133 public MigratorTask(Listener listener) { 134 this.listener = listener; 135 } 136 137 @Override doInBackground(Void... params)138 protected Boolean doInBackground(Void... params) { 139 LogUtil.i("BlockedNumbersMigrator.doInBackground", "migrate - start background migration"); 140 return migrateToNewBlockingInBackground(context.getContentResolver()); 141 } 142 143 @Override onPostExecute(Boolean isSuccessful)144 protected void onPostExecute(Boolean isSuccessful) { 145 LogUtil.i("BlockedNumbersMigrator.onPostExecute", "migrate - marking migration complete"); 146 FilteredNumberCompat.setHasMigratedToNewBlocking(context, isSuccessful); 147 LogUtil.i("BlockedNumbersMigrator.onPostExecute", "migrate - calling listener"); 148 listener.onComplete(); 149 } 150 } 151 } 152