103dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell/*
203dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell * Copyright (C) 2016 The Android Open Source Project
303dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell *
403dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell * Licensed under the Apache License, Version 2.0 (the "License");
503dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell * you may not use this file except in compliance with the License.
603dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell * You may obtain a copy of the License at
703dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell *
803dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell *      http://www.apache.org/licenses/LICENSE-2.0
903dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell *
1003dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell * Unless required by applicable law or agreed to in writing, software
1103dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell * distributed under the License is distributed on an "AS IS" BASIS,
1203dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1303dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell * See the License for the specific language governing permissions and
1403dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell * limitations under the License.
1503dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell */
1603dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell
1703dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwellpackage com.android.dialer.filterednumber;
1803dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell
1903dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwellimport com.google.common.base.Preconditions;
2003dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell
2103dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwellimport android.content.SharedPreferences;
2203dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwellimport android.util.Log;
2303dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell
2403dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwellimport com.android.dialer.compat.FilteredNumberCompat;
2503dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwellimport com.android.dialer.database.FilteredNumberAsyncQueryHandler;
2603dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwellimport com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnHasBlockedNumbersListener;
2703dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell
2803dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell/**
2903dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell * Class responsible for checking if the user can be auto-migrated to {@link
3003dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell * android.provider.BlockedNumberContract} blocking. In order for this to happen, the user cannot
3103dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell * have any numbers that are blocked in the Dialer solution.
3203dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell */
3303dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwellpublic class BlockedNumbersAutoMigrator {
3403dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell
3503dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell    private static final String TAG = "BlockedNumbersAuto";
3603dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell
3703dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell    private static final String HAS_CHECKED_AUTO_MIGRATE_KEY = "checkedAutoMigrate";
3803dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell
3903dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell    private final SharedPreferences sharedPreferences;
4003dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell    private final FilteredNumberAsyncQueryHandler queryHandler;
4103dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell
4203dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell    /**
4303dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell     * Constructs the BlockedNumbersAutoMigrator with the given {@link SharedPreferences} and {@link
4403dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell     * FilteredNumberAsyncQueryHandler}.
4503dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell     *
4603dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell     * @param sharedPreferences The SharedPreferences used to persist information.
4703dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell     * @param queryHandler The FilteredNumberAsyncQueryHandler used to determine if there are
4803dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell     * blocked numbers.
4903dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell     * @throws NullPointerException if sharedPreferences or queryHandler are null.
5003dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell     */
5103dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell    public BlockedNumbersAutoMigrator(SharedPreferences sharedPreferences,
5203dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell            FilteredNumberAsyncQueryHandler queryHandler) {
5303dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell        this.sharedPreferences = Preconditions.checkNotNull(sharedPreferences);
5403dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell        this.queryHandler = Preconditions.checkNotNull(queryHandler);
5503dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell    }
5603dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell
5703dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell    /**
5803dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell     * Attempts to perform the auto-migration. Auto-migration will only be attempted once and can be
5903dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell     * performed only when the user has no blocked numbers. As a result of this method, the user
6003dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell     * will be migrated to the framework blocking solution, as determined by {@link
6103dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell     * FilteredNumberCompat#hasMigratedToNewBlocking()}.
6203dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell     */
6303dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell    public void autoMigrate() {
6403dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell        if (!shouldAttemptAutoMigrate()) {
6503dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell            return;
6603dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell        }
6703dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell
6803dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell        Log.i(TAG, "Attempting to auto-migrate.");
6903dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell        queryHandler.hasBlockedNumbers(new OnHasBlockedNumbersListener() {
7003dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell            @Override
7103dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell            public void onHasBlockedNumbers(boolean hasBlockedNumbers) {
7203dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell                if (hasBlockedNumbers) {
7303dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell                    Log.i(TAG, "Not auto-migrating: blocked numbers exist.");
7403dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell                    return;
7503dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell                }
7603dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell                Log.i(TAG, "Auto-migrating: no blocked numbers.");
7703dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell                FilteredNumberCompat.setHasMigratedToNewBlocking(true);
7803dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell            }
7903dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell        });
8003dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell    }
8103dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell
8203dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell    private boolean shouldAttemptAutoMigrate() {
8303dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell        if (sharedPreferences.contains(HAS_CHECKED_AUTO_MIGRATE_KEY)) {
8403dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell            Log.d(TAG, "Not attempting auto-migrate: already checked once.");
8503dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell            return false;
8603dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell        }
8703dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell        Log.i(TAG, "Updating state as already checked for auto-migrate.");
8803dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell        sharedPreferences.edit().putBoolean(HAS_CHECKED_AUTO_MIGRATE_KEY, true).apply();
8903dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell
9003dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell        if (!FilteredNumberCompat.canUseNewFiltering()) {
9103dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell            Log.i(TAG, "Not attempting auto-migrate: not available.");
9203dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell            return false;
9303dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell        }
9403dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell
9503dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell        if (FilteredNumberCompat.hasMigratedToNewBlocking()) {
9603dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell            Log.i(TAG, "Not attempting auto-migrate: already migrated.");
9703dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell            return false;
9803dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell        }
9903dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell        return true;
10003dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell    }
10103dffbf949a9758da1b296369d29ef8b3aecae38Brandon Maxwell}
102