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